]> Devi Nivas Git - smartwatch.git/commitdiff
Add "back" functionality for clock
authorAdvaith Menon <noreply-git@bp4k.net>
Sat, 22 Nov 2025 23:24:54 +0000 (18:24 -0500)
committerAdvaith Menon <noreply-git@bp4k.net>
Sun, 23 Nov 2025 04:27:00 +0000 (23:27 -0500)
* 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

main/task_button.c
main/task_button.h
main/task_lcd.c

index 4d46c23bfc30c5a1c7b17155c1f88f99e2888b50..d30f033226e420740185f83c53650ef16094a1dd 100644 (file)
@@ -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);
 }
index afb98ecaed18b7639a5fc2d49bf248104e907de7..3db452a1f57db7f88eb74409351508194165b81f 100644 (file)
@@ -12,6 +12,7 @@
 
 #define NUM_BUTTONS 5
 #define NUM_EVENTS 10
+#define EVENT_Q_SIZE 10
 extern QueueHandle_t gt_btnq;
 
 
index 3d1cf1c30be55e27da955d8f70624753293d2dea..3c4f602b17a393240b11b0134ba872b0b48fd70a 100644 (file)
@@ -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));
 }