From: Advaith Menon Date: Sat, 22 Nov 2025 23:24:54 +0000 (-0500) Subject: Add "back" functionality for clock X-Git-Url: https://git.devinivas.org/?a=commitdiff_plain;h=cc5b72f958f38b94ebd360480bd4c1a725d5c9ef;p=smartwatch.git Add "back" functionality for clock * Add button events to a FreeRTOS queue * Read button events from a FreeRTOS queue in the lcd_clock_loop function to determine when to exit the clock screen --- diff --git a/main/task_button.c b/main/task_button.c index 4d46c23..d30f033 100644 --- a/main/task_button.c +++ b/main/task_button.c @@ -9,7 +9,7 @@ /* globals */ -extern QueueHandle_t gt_btnq; +QueueHandle_t gt_btnq; static struct gt_btn_msg_t btn_evts[10] = { @@ -65,6 +65,10 @@ void gt_btn_setup(void) { }; button_handle_t gpio_btn[5] = {NULL, NULL, NULL, NULL, NULL}; + + /* create queue */ + gt_btnq = xQueueCreate(EVENT_Q_SIZE, sizeof(struct gt_btn_msg_t*)); + /* create buttons */ for (i = 0; i < NUM_BUTTONS; ++i) { ESP_ERROR_CHECK(iot_button_new_gpio_device( @@ -87,4 +91,5 @@ void button_all_cb(void *arg, void *user_data) { struct gt_btn_msg_t *msg = (struct gt_btn_msg_t*) user_data; ESP_LOGI(TAG, "Button pressed"); ESP_LOGI(TAG, "The selected event: %d; and event %d", msg->btn, msg->evt); + xQueueSendToBackFromISR(gt_btnq, (void *) &user_data, NULL); } diff --git a/main/task_button.h b/main/task_button.h index afb98ec..3db452a 100644 --- a/main/task_button.h +++ b/main/task_button.h @@ -12,6 +12,7 @@ #define NUM_BUTTONS 5 #define NUM_EVENTS 10 +#define EVENT_Q_SIZE 10 extern QueueHandle_t gt_btnq; diff --git a/main/task_lcd.c b/main/task_lcd.c index 3d1cf1c..3c4f602 100644 --- a/main/task_lcd.c +++ b/main/task_lcd.c @@ -4,12 +4,14 @@ #include "freertos/FreeRTOS.h" #include "driver/gpio.h" #include "driver/uart.h" +#include "iot_button.h" #include "Goldelox_const4D.h" #include "goldeloxSerial.h" #include "esp_system.h" #include "task_lcd.h" +#include "task_button.h" #include "pins.h" const uart_port_t uart_num = UART_NUM_1; @@ -197,6 +199,7 @@ void lcd_clock_loop(gl_display_t *disp) { gl_txt_FGcolour(disp, DARKGREEN); gl_txt_BGcolour(disp, ALICEBLUE); while (1) { + struct gt_btn_msg_t *btnmsg; time_t tm = time(NULL); char txt[12]; // snprintf(txt, 10, "%lld", (long long) tm); @@ -223,6 +226,12 @@ void lcd_clock_loop(gl_display_t *disp) { BLACK); lcd_clock_draw_hand(disp, tm % (60 * 60 * 12), (60 * 60 * 12), CLOCKSCR_TIMEHDHR, BLACK); + while (xQueueReceive(gt_btnq, (void *) &btnmsg, 0) == pdPASS) { + if (btnmsg->btn == GT_BTN_WHITE + && btnmsg->evt == BUTTON_SINGLE_CLICK) { + return; + } + } vTaskDelay(pdMS_TO_TICKS(500)); } } @@ -230,8 +239,10 @@ void lcd_clock_loop(gl_display_t *disp) { void lcd_homepage_loop(gl_display_t *disp) { uint8_t num_rows = 3; - uint8_t num_cols = 2; + uint8_t num_cols = 3; uint8_t num_padd = APPSCR_PAD; + lcd_clock_loop(disp); + gl_gfx_BGcolour(disp, BLACK); gl_gfx_Cls(disp); @@ -259,7 +270,6 @@ void lcd_homepage_loop(gl_display_t *disp) { WHITE); } } - lcd_clock_loop(disp); while(1) vTaskDelay(pdMS_TO_TICKS(1000)); }