#include "gui.h" #include "nokia.h" #include "analog.h" #include #include static void gui_thread(void *arg); TaskHandle_t hGuiThread = NULL; void gui_init() { printf("GUI init\n"); LCD_setup(); LCD_setContrast(60); LCD_clearDisplay(0); LCD_setStr("Hello World", 0, 0, 1); LCD_updateDisplay(); int rv = xTaskCreate(gui_thread, "gui", 4096, NULL, 6, &hGuiThread); assert (rv == pdPASS); } /** * Notification API: * * 0b1 - knob CW * 0b10 - knowb CCW * 0b100 - button released * 0b1000 - button pressed * * @param arg */ static void __attribute__((noreturn)) gui_thread(void *arg) { uint32_t pos = 0; bool btn = 0; uint32_t last_wheel_time = 0; #define NMAX 60 while (1) { uint32_t value = 0; xTaskNotifyWait(0, ULONG_MAX, &value, pdMS_TO_TICKS(250)); // printf("Knob event 0x%02x ", value); if (value & 0b1000) { // printf("PUSH "); btn = 1; } else if (value & 0b100) { btn = 0; } 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; } } last_wheel_time = time; if (value & 0b01) { pos += increment; } if (value & 0b10) { pos -= increment; } } LCD_setRect(0, 15, 83, 35, 1, 1); char buf[10]; sprintf(buf, "%3d %s", pos, btn?"BTN":""); LCD_setStr(buf, 2, 17, 0); sprintf(buf, "%.0f C", analog_read()); LCD_setStr(buf, 2, 26, 0); LCD_updateDisplay(); // printf(">"); // for (int i=0; i