tdse-tp3_04-interactive_menu

Index Commits Files Refs
commit 491f3d85ed9649e3aa5a86bf83a1999c1d36c7d3
parent ad0de1422a9e4873bc6c2ab036976267f74fd11e
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Wed, 15 Oct 2025 15:41:43 -0300

Implement `Motor X > Power > Power select` menu

Diffstat:
Mapp/inc/task_menu_attribute.h | 5+++--
Mapp/src/display.c | 12++++++------
Mapp/src/task_menu.c | 162+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
3 files changed, 134 insertions(+), 45 deletions(-)
diff --git a/app/inc/task_menu_attribute.h b/app/inc/task_menu_attribute.h
@@ -98,11 +98,12 @@ typedef enum {
 /* State of Task Menu */
 typedef enum {
     ST_MEN_MOTOR_SELECT,
-    ST_MEN_MOTOR_SELECT_MOTOR_1,
-    ST_MEN_MOTOR_SELECT_MOTOR_2,
     ST_MEN_MOTOR_POWER,
+    ST_MEN_MOTOR_POWER_SEL,
     ST_MEN_MOTOR_SPEED,
+    ST_MEN_MOTOR_SPEED_SEL,
     ST_MEN_MOTOR_SPIN,
+    ST_MEN_MOTOR_SPIN_SEL
 } task_menu_st_t;
 
 typedef struct {
diff --git a/app/src/display.c b/app/src/display.c
@@ -267,12 +267,12 @@ static void displayPinWrite( uint8_t pinName, int value )
 
         case DISPLAY_CONNECTION_GPIO_4BITS:
             switch( pinName ) {
-                case DISPLAY_PIN_D4: HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, value);   break;
-                case DISPLAY_PIN_D5: HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, value);   break;
-                case DISPLAY_PIN_D6: HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, value);   break;
-                case DISPLAY_PIN_D7: HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, value);   break;
-                case DISPLAY_PIN_RS: HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, value);   break;
-                case DISPLAY_PIN_EN: HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, value);   break;
+                case DISPLAY_PIN_D4: HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, value);   break;
+                case DISPLAY_PIN_D5: HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, value);   break;
+                case DISPLAY_PIN_D6: HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, value);   break;
+                case DISPLAY_PIN_D7: HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, value);   break;
+                case DISPLAY_PIN_RS: HAL_GPIO_WritePin(D8_GPIO_Port, D8_Pin, value);   break;
+                case DISPLAY_PIN_EN: HAL_GPIO_WritePin(D9_GPIO_Port, D9_Pin, value);   break;
                 case DISPLAY_PIN_RW: break;
                 default: break;
             }
diff --git a/app/src/task_menu.c b/app/src/task_menu.c
@@ -51,12 +51,12 @@
 #include "display.h"
 
 /********************** macros and definitions *******************************/
-#define G_TASK_MEN_CNT_INI            0ul
-#define G_TASK_MEN_TICK_CNT_INI        0ul
+#define G_TASK_MEN_CNT_INI          0ul
+#define G_TASK_MEN_TICK_CNT_INI     0ul
 
-#define DEL_MEN_XX_MIN                0ul
-#define DEL_MEN_XX_MED                50ul
-#define DEL_MEN_XX_MAX                200ul
+#define DEL_MEN_XX_MIN              0ul
+#define DEL_MEN_XX_MED             50ul
+#define DEL_MEN_XX_MAX            200ul
 
 /********************** internal data declaration ****************************/
 task_menu_dta_t task_menu_dta =
@@ -64,12 +64,27 @@ task_menu_dta_t task_menu_dta =
 
 #define MENU_DTA_QTY    (sizeof(task_menu_dta)/sizeof(task_menu_dta_t))
 
+typedef struct {
+    uint8_t power, speed, spin;
+} motor_data_t;
+
 /********************** internal functions declaration ***********************/
 void task_menu_statechart(void);
 
 /********************** internal data definition *****************************/
-const char *p_task_menu         = "Task Menu (Interactive Menu)";
-const char *p_task_menu_         = "Non-Blocking & Update By Time Code";
+const char *p_task_menu = "Task Menu (Interactive Menu)";
+const char *p_task_menu_ = "Non-Blocking & Update By Time Code";
+bool g_display_update = false;
+
+#define MOTOR_QTY 2
+
+motor_data_t g_motor_data[MOTOR_QTY];
+
+uint8_t g_selected_motor = 0;
+uint8_t g_new_sel_motor_spin;
+uint8_t g_new_sel_motor_power;
+uint8_t g_new_sel_motor_speed;
+task_menu_st_t g_menu_prev_state;
 
 /********************** external data declaration ****************************/
 uint32_t g_task_menu_cnt;
@@ -101,22 +116,18 @@ void task_menu_init(void *parameters)
     state = ST_MEN_MOTOR_SELECT;
     p_task_menu_dta->state = state;
 
+    g_menu_prev_state = state;
+    g_selected_motor = 1;
+
     event = EV_MEN_ENT_IDLE;
     p_task_menu_dta->event = event;
 
     b_event = false;
     p_task_menu_dta->flag = b_event;
 
-    LOGGER_INFO(" ");
-    LOGGER_INFO("   %s = %lu   %s = %lu   %s = %s",
-                 GET_NAME(state), (uint32_t)state,
-                 GET_NAME(event), (uint32_t)event,
-                 GET_NAME(b_event), (b_event ? "true" : "false"));
-
     /* Init & Print out: LCD Display */
     displayInit(DISPLAY_CONNECTION_GPIO_4BITS);
-    displayCharPositionWrite(0, 0);
-    displayStringWrite("> Motor         ");
+    g_display_update = true;
 }
 
 void task_menu_update(void *parameters)
@@ -157,10 +168,21 @@ void task_menu_update(void *parameters)
     }
 }
 
+void menu_set_state(task_menu_st_t new_state)
+{
+    task_menu_dta_t *p_task_menu_dta;
+    p_task_menu_dta = &task_menu_dta;
+
+    g_menu_prev_state = p_task_menu_dta->state;
+    p_task_menu_dta->state = new_state;
+
+    g_display_update = true;
+}
+
 void task_menu_statechart(void)
 {
     task_menu_dta_t *p_task_menu_dta;
-    // char menu_str[8];
+    char menu_row_str[16 + 4];
 
     /* Update Task Menu Data Pointer */
     p_task_menu_dta = &task_menu_dta;
@@ -175,15 +197,25 @@ void task_menu_statechart(void)
     {
         case ST_MEN_MOTOR_SELECT:
 
+            if (g_display_update)
+            {
+                g_display_update = false;
+                displayCharPositionWrite(0, 0);
+                sprintf(menu_row_str, "> Motor %d     ", g_selected_motor);
+                displayStringWrite(menu_row_str);
+            }
+
             if (true == p_task_menu_dta->flag)
             {
                 p_task_menu_dta->flag = false;
                 switch (p_task_menu_dta->event)
                 {
                     case EV_MEN_ENT_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_POWER;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Power         ");
+                        menu_set_state(ST_MEN_MOTOR_POWER);
+                    break;
+                    case EV_MEN_NEX_ACTIVE:
+                        g_selected_motor = (g_selected_motor % MOTOR_QTY) + 1;
+                        g_display_update = true;
                     break;
                     case EV_MEN_ESC_ACTIVE:
                     break;
@@ -196,20 +228,67 @@ void task_menu_statechart(void)
 
         case ST_MEN_MOTOR_POWER:
 
+            if (g_display_update)
+            {
+                g_display_update = false;
+                displayCharPositionWrite(0, 0);
+                sprintf(menu_row_str, "%1d> Power        ", g_selected_motor);
+                displayStringWrite(menu_row_str);
+            }
+
             if (true == p_task_menu_dta->flag)
             {
                 p_task_menu_dta->flag = false;
                 switch (p_task_menu_dta->event)
                 {
+                    case EV_MEN_ENT_ACTIVE:
+                        menu_set_state(ST_MEN_MOTOR_POWER_SEL);
+                    break;
                     case EV_MEN_NEX_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_SPEED;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Speed         ");
+                        menu_set_state(ST_MEN_MOTOR_SPEED);
                     break;
                     case EV_MEN_ESC_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Motor         ");
+                        menu_set_state(ST_MEN_MOTOR_SELECT);
+                    break;
+                    default:
+                    break;
+                }
+            }
+
+        break;
+
+        case ST_MEN_MOTOR_POWER_SEL:
+
+            if (g_menu_prev_state != p_task_menu_dta->state)
+            {
+                g_menu_prev_state = p_task_menu_dta->state;
+                g_new_sel_motor_power = g_motor_data[g_selected_motor - 1].power;
+            }
+
+            if (g_display_update)
+            {
+                g_display_update = false;
+                displayCharPositionWrite(0, 0);
+                sprintf(menu_row_str, "%1d> Power    %3d%%", g_selected_motor,
+                        g_new_sel_motor_power);
+                displayStringWrite(menu_row_str);
+            }
+
+            if (true == p_task_menu_dta->flag)
+            {
+                p_task_menu_dta->flag = false;
+                switch (p_task_menu_dta->event)
+                {
+                    case EV_MEN_ENT_ACTIVE:
+                        g_motor_data[g_selected_motor - 1].power = g_new_sel_motor_power;
+                        menu_set_state(ST_MEN_MOTOR_POWER);
+                    break;
+                    case EV_MEN_NEX_ACTIVE:
+                        g_new_sel_motor_power = ((g_new_sel_motor_power + 10) % 110);
+                        g_display_update = true;
+                    break;
+                    case EV_MEN_ESC_ACTIVE:
+                        menu_set_state(ST_MEN_MOTOR_POWER);
                     break;
                     default:
                     break;
@@ -220,20 +299,24 @@ void task_menu_statechart(void)
 
         case ST_MEN_MOTOR_SPEED:
 
+            if (g_display_update)
+            {
+                g_display_update = false;
+                displayCharPositionWrite(0, 0);
+                sprintf(menu_row_str, "%1d> Speed        ", g_selected_motor);
+                displayStringWrite(menu_row_str);
+            }
+
             if (true == p_task_menu_dta->flag)
             {
                 p_task_menu_dta->flag = false;
                 switch (p_task_menu_dta->event)
                 {
                     case EV_MEN_NEX_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_SPIN;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Spin           ");
+                        menu_set_state(ST_MEN_MOTOR_SPIN);
                     break;
                     case EV_MEN_ESC_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Motor         ");
+                        menu_set_state(ST_MEN_MOTOR_SELECT);
                     break;
                     default:
                     break;
@@ -244,21 +327,25 @@ void task_menu_statechart(void)
 
         case ST_MEN_MOTOR_SPIN:
 
+            if (g_display_update)
+            {
+                g_display_update = false;
+                displayCharPositionWrite(0, 0);
+                sprintf(menu_row_str, "%1d> Spin         ", g_selected_motor);
+                displayStringWrite(menu_row_str);
+            }
+
             if (true == p_task_menu_dta->flag)
             {
                 p_task_menu_dta->flag = false;
                 switch (p_task_menu_dta->event)
                 {
                     case EV_MEN_NEX_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_POWER;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Power         ");
+                        menu_set_state(ST_MEN_MOTOR_POWER);
                     break;
 
                     case EV_MEN_ESC_ACTIVE:
-                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
-                        displayCharPositionWrite(0, 0);
-                        displayStringWrite("> Motor         ");
+                        menu_set_state(ST_MEN_MOTOR_SELECT);
                     break;
                     default:
                     break;
@@ -273,6 +360,7 @@ void task_menu_statechart(void)
             p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
             p_task_menu_dta->event = EV_MEN_ENT_IDLE;
             p_task_menu_dta->flag  = false;
+            g_display_update = false;
 
             break;
     }