esp32 firmware for a toaster reflow oven WIP!!!!!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
reflower/main/gui.c

108 lines
2.7 KiB

5 years ago
#include "gui.h"
#include "graphics/nokia.h"
#include "analog.h"
5 years ago
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <liquid.h>
#include <freertos/timers.h>
5 years ago
static void gui_thread(void *arg);
static void gui_tick(TimerHandle_t xTimer);
5 years ago
TaskHandle_t hGuiThread = NULL;
TimerHandle_t hTicker = NULL;
5 years ago
void gui_init() {
printf("GUI init\n");
LCD_setup();
LCD_setContrast(48);
5 years ago
LCD_clearDisplay(0);
LCD_setStr("Hello World", 0, 0, 1);
LCD_updateDisplay();
int rv = xTaskCreate(gui_thread, "gui", 4096, NULL, 6, &hGuiThread);
5 years ago
assert (rv == pdPASS);
hTicker = xTimerCreate(
"gui_tick", /* name */
pdMS_TO_TICKS(10), /* period/time */
pdTRUE, /* auto reload */
(void*)0, /* timer ID */
gui_tick); /* callback */
assert(hTicker != NULL);
xTimerStart(hTicker, portMAX_DELAY);
}
static void gui_tick(TimerHandle_t xTimer) {
xTaskNotify(hGuiThread, 0b10000, eSetBits);
5 years ago
}
/**
* Notification API:
*
* 0b1 - knob CW
* 0b10 - knowb CCW
* 0b100 - button released
* 0b1000 - button pressed
* 0b10000 - ticker event
*
* @param arg
*/
5 years ago
static void __attribute__((noreturn)) gui_thread(void *arg) {
struct Liquid *liquid = Liquid_start();
uint32_t last_wheel_time = 0;
5 years ago
while (1) {
uint32_t value = 0;
xTaskNotifyWait(0, ULONG_MAX, &value, pdMS_TO_TICKS(10));
bool want_repaint = false;
// printf("Knob event 0x%02x ", value);
5 years ago
if (value & 0b10000) {
// TICK
want_repaint |= Liquid_handleTick(liquid);
}
5 years ago
if (value & 0b1000) {
want_repaint |= Liquid_handleInput(liquid, InputEvent_Button(1));
} else if (value & 0b100) {
want_repaint |= Liquid_handleInput(liquid, InputEvent_Button(0));
5 years ago
}
if (value & 0b11) {
uint32_t time = xTaskGetTickCount();
uint32_t increment = 1;
if (last_wheel_time != 0) {
uint32_t ela = time - last_wheel_time;
if (ela < pdMS_TO_TICKS(20)) {
increment = 25;
} else if (ela < pdMS_TO_TICKS(35)) {
increment = 10;
} else if (ela < pdMS_TO_TICKS(75)) {
increment = 5;
}
5 years ago
}
last_wheel_time = time;
5 years ago
if (value & 0b01) {
want_repaint |= Liquid_handleInput(liquid, InputEvent_Wheel(increment));
}
if (value & 0b10) {
want_repaint |= Liquid_handleInput(liquid, InputEvent_Wheel(-increment));
}
5 years ago
}
if (want_repaint) {
Liquid_paint(liquid);
}
5 years ago
}
}