tdse-tp3_04-interactive_menu

Index Commits Files Refs
commit 28485fcdcd7691e42fb87ea19d02342d55486eff
parent a3b912969fd5a851a31fcd9d8936d9ea40b01764
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Tue, 14 Oct 2025 18:15:36 -0300

Implement part of menu statechart

Diffstat:
Mapp/inc/logger.h | 2+-
Mapp/inc/task_menu_attribute.h | 227++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mapp/src/task_menu.c | 506++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Mapp/src/task_sensor.c | 182++++++++++++++++++++++++++++++++++++++++----------------------------------------
Mtdse-tp3_04-interactive_menu.cfg | 2+-
5 files changed, 501 insertions(+), 418 deletions(-)
diff --git a/app/inc/logger.h b/app/inc/logger.h
@@ -51,7 +51,7 @@ extern "C" {
 
 /********************** macros ***********************************************/
 
-#define LOGGER_CONFIG_ENABLE                    (1)
+#define LOGGER_CONFIG_ENABLE                    (0)
 #define LOGGER_CONFIG_MAXLEN                    (64)
 #define LOGGER_CONFIG_USE_SEMIHOSTING           (1)
 
diff --git a/app/inc/task_menu_attribute.h b/app/inc/task_menu_attribute.h
@@ -1,100 +1,127 @@
-/*
- * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @file   : task_menu_attribute.h
- * @date   : Set 26, 2023
- * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>
- * @version    v1.0.0
- */
-
-#ifndef TASK_INC_TASK_MENU_ATTRIBUTE_H_
-#define TASK_INC_TASK_MENU_ATTRIBUTE_H_
-
-/********************** CPP guard ********************************************/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/********************** inclusions *******************************************/
-
-/********************** macros ***********************************************/
-
-/********************** typedef **********************************************/
-/* Menu Statechart - State Transition Table */
-/*     ------------------------+-----------------------+-----------------------+-----------------------+------------------------
- *     | Current               | Event                 |                       | Next                  |                       |
- *     | State                 | (Parameters)          | [Guard]               | State                 | Actions               |
- *     |=======================+=======================+=======================+=======================+=======================|
- *     | INICIAL               |                       |                       | ST_MEN_XX_IDLE        |                       |
- *     |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- *     | ST_MEN_XX_IDLE        | EV_MEN_MEN_ACTIVE     |                       | ST_MEN_XX_ACTIVE      |                       |
- *     |                       |                       |                       |                       |                       |
- *     |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- *     | ST_MEN_XX_ACTIVE      | EV_MEN_MEN_IDLE       |                       | ST_MEN_XX_IDLE        |                       |
- *     |                       |                       |                       |                       |                       |
- *     ------------------------+-----------------------+-----------------------+-----------------------+------------------------
- */
-
-/* Events to excite Task Menu */
-typedef enum task_menu_ev {EV_MEN_ENT_IDLE,
-                           EV_MEN_ENT_ACTIVE,
-                           EV_MEN_NEX_IDLE,
-                           EV_MEN_NEX_ACTIVE,
-                           EV_MEN_ESC_IDLE,
-                           EV_MEN_ESC_ACTIVE} task_menu_ev_t;
-
-/* State of Task Menu */
-typedef enum {
-    ST_MEN_XX_IDLE,
-    ST_MEN_XX_ACTIVE
-} task_menu_st_t;
-
-typedef struct
-{
-    uint32_t        tick;
-    task_menu_st_t    state;
-    task_menu_ev_t    event;
-    bool            flag;
-} task_menu_dta_t;
-
-/********************** external data declaration ****************************/
-extern task_menu_dta_t task_menu_dta;
-
-/********************** external functions declaration ***********************/
-
-/********************** End of CPP guard *************************************/
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* TASK_INC_TASK_MENU_ATTRIBUTE_H_ */
-
-/********************** end of file ******************************************/
+/*
+ * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @file   : task_menu_attribute.h
+ * @date   : Set 26, 2023
+ * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>
+ * @version    v1.0.0
+ */
+
+#ifndef TASK_INC_TASK_MENU_ATTRIBUTE_H_
+#define TASK_INC_TASK_MENU_ATTRIBUTE_H_
+
+/********************** CPP guard ********************************************/
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/********************** inclusions *******************************************/
+
+/********************** macros ***********************************************/
+
+/********************** typedef **********************************************/
+/*
+* Menu Statechart - State Transition Table
+* Every state is also a state machine (nested state machines)
+* +---------------------+--------------------+---------+---------------------+---------+
+* | Current State       | Event (Parameters) | [Guard] | Next State          | Actions |
+* +=====================+====================+=========+=====================+=========+
+* | INICIAL             |                    |         | ST_MEN_MOTOR_SELECT |         |
+* +---------------------+--------------------+---------+---------------------+---------+
+* | ST_MEN_MOTOR_SELECT | EV_MEN_ENTER_BTN   |         | ST_MEN_MOTOR_POWER  |         |
+* +---------------------+--------------------+---------+---------------------+---------+
+* | ST_MEN_MOTOR_POWER  | EV_MEN_NEXT_BTN    |         | ST_MEN_MOTOR_SPEED  |         |
+* |                     | EV_MEN_BACK_BTN    |         | ST_MEN_MOTOR_SELECT |         |
+* +---------------------+--------------------+---------+---------------------+---------+
+* | ST_MEN_MOTOR_SPEED  | EV_MEN_NEXT_BTN    |         | ST_MEN_MOTOR_SPIN   |         |
+* |                     | EV_MEN_BACK_BTN    |         | ST_MEN_MOTOR_SELECT |         |
+* +---------------------+--------------------+---------+---------------------+---------+
+* | ST_MEN_MOTOR_SPIN   | EV_MEN_NEXT_BTN    |         | ST_MEN_MOTOR_POWER  |         |
+* |                     | EV_MEN_BACK_BTN    |         | ST_MEN_MOTOR_SELECT |         |
+* +---------------------+--------------------+---------+---------------------+---------+
+*
+* Menu Statechart - ST_MEN_MOTOR_SELECT - State Transition Table
+
+* +-----------------------------+--------------+---------+---------------------------------+--------------------+
+* | Current State               | Event        | [Guard] | Next State                      | Actions            |
+* +=============================+==============+=========+=================================+====================+
+* |                             | EV_NEXT_BTN  |         | ST_MEN_MOTOR_SELECT_MOTOR_2     |                    |
+* | ST_MEN_MOTOR_SELECT_MOTOR_1 |--------------+---------+---------------------------------+--------------------+
+* |                             | EV_ENTER_BTN |         | ST_MOTOR_POWER                  | selected_motor = 1 |
+* +-----------------------------+--------------+---------+---------------------------------+--------------------+
+* |                             | EV_NEXT_BTN  |         | ST_MEN_MOTOR_SELECT_MOTOR_1     |                    |
+* | ST_MEN_MOTOR_SELECT_MOTOR_2 |--------------+---------+---------------------------------+--------------------+
+* |                             | EV_ENTER_BTN |         | ST_MOTOR_POWER                  | selected_motor = 2 |
+* +-----------------------------+--------------+---------+---------------------------------+--------------------+
+*/
+
+/* Events to excite Task Menu */
+typedef enum {
+    EV_MEN_ENT_IDLE,
+    EV_MEN_ENT_ACTIVE,
+
+    EV_MEN_NEX_IDLE,
+    EV_MEN_NEX_ACTIVE,
+
+    EV_MEN_ESC_IDLE,
+    EV_MEN_ESC_ACTIVE
+} task_menu_ev_t;
+
+/* 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_SPEED,
+    ST_MEN_MOTOR_SPIN,
+} task_menu_st_t;
+
+typedef struct {
+    uint32_t tick;
+    task_menu_st_t state;
+    task_menu_ev_t event;
+    bool flag;
+} task_menu_dta_t;
+
+/********************** external data declaration ****************************/
+extern task_menu_dta_t task_menu_dta;
+
+/********************** external functions declaration ***********************/
+
+/********************** End of CPP guard *************************************/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TASK_INC_TASK_MENU_ATTRIBUTE_H_ */
+
+/********************** end of file ******************************************/
diff --git a/app/src/task_menu.c b/app/src/task_menu.c
@@ -1,225 +1,281 @@
-/*
- * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the copyright holder nor the names of its
- *    contributors may be used to endorse or promote products derived from
- *    this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @file   : task_menu.c
- * @date   : Set 26, 2023
- * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>
- * @version    v1.0.0
- */
-
-/********************** inclusions *******************************************/
-/* Project includes */
-#include "main.h"
-
-/* Demo includes */
-#include "logger.h"
-#include "dwt.h"
-
-/* Application & Tasks includes */
-#include "board.h"
-#include "app.h"
-#include "task_menu_attribute.h"
-#include "task_menu_interface.h"
-#include "display.h"
-
-/********************** macros and definitions *******************************/
-#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
-
-/********************** internal data declaration ****************************/
-task_menu_dta_t task_menu_dta =
-    {DEL_MEN_XX_MIN, ST_MEN_XX_IDLE, EV_MEN_ENT_IDLE, false};
-
-#define MENU_DTA_QTY    (sizeof(task_menu_dta)/sizeof(task_menu_dta_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";
-
-/********************** external data declaration ****************************/
-uint32_t g_task_menu_cnt;
-volatile uint32_t g_task_menu_tick_cnt;
-
-/********************** external functions definition ************************/
-void task_menu_init(void *parameters)
-{
-    task_menu_dta_t *p_task_menu_dta;
-    task_menu_st_t    state;
-    task_menu_ev_t    event;
-    bool b_event;
-
-    /* Print out: Task Initialized */
-    LOGGER_INFO(" ");
-    LOGGER_INFO("  %s is running - %s", GET_NAME(task_menu_init), p_task_menu);
-    LOGGER_INFO("  %s is a %s", GET_NAME(task_menu), p_task_menu_);
-
-    /* Init & Print out: Task execution counter */
-    g_task_menu_cnt = G_TASK_MEN_CNT_INI;
-    LOGGER_INFO("   %s = %lu", GET_NAME(g_task_menu_cnt), g_task_menu_cnt);
-
-    init_queue_event_task_menu();
-
-    /* Update Task Actuator Configuration & Data Pointer */
-    p_task_menu_dta = &task_menu_dta;
-
-    /* Init & Print out: Task execution FSM */
-    state = ST_MEN_XX_IDLE;
-    p_task_menu_dta->state = state;
-
-    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("TdSE Bienvenidos");
-
-    displayCharPositionWrite(0, 1);
-    displayStringWrite("Test Nro: ");
-}
-
-void task_menu_update(void *parameters)
-{
-    bool b_time_update_required = false;
-
-    /* Protect shared resource */
-    __asm("CPSID i");    /* disable interrupts */
-    if (G_TASK_MEN_TICK_CNT_INI < g_task_menu_tick_cnt)
-    {
-        /* Update Tick Counter */
-        g_task_menu_tick_cnt--;
-        b_time_update_required = true;
-    }
-    __asm("CPSIE i");    /* enable interrupts */
-
-    while (b_time_update_required)
-    {
-        /* Update Task Counter */
-        g_task_menu_cnt++;
-
-        /* Run Task Menu Statechart */
-        task_menu_statechart();
-
-        /* Protect shared resource */
-        __asm("CPSID i");    /* disable interrupts */
-        if (G_TASK_MEN_TICK_CNT_INI < g_task_menu_tick_cnt)
-        {
-            /* Update Tick Counter */
-            g_task_menu_tick_cnt--;
-            b_time_update_required = true;
-        }
-        else
-        {
-            b_time_update_required = false;
-        }
-        __asm("CPSIE i");    /* enable interrupts */
-    }
-}
-
-void task_menu_statechart(void)
-{
-    task_menu_dta_t *p_task_menu_dta;
-    char menu_str[8];
-
-    /* Update Task Menu Data Pointer */
-    p_task_menu_dta = &task_menu_dta;
-
-    if (true == any_event_task_menu())
-    {
-        p_task_menu_dta->flag = true;
-        p_task_menu_dta->event = get_event_task_menu();
-    }
-
-    switch (p_task_menu_dta->state)
-    {
-        case ST_MEN_XX_IDLE:
-
-            if ((true == p_task_menu_dta->flag) && (EV_MEN_ENT_ACTIVE == p_task_menu_dta->event))
-            {
-                p_task_menu_dta->tick = DEL_MEN_XX_MAX;
-                p_task_menu_dta->flag = false;
-                p_task_menu_dta->state = ST_MEN_XX_ACTIVE;
-            }
-
-            break;
-
-        case ST_MEN_XX_ACTIVE:
-
-            if ((true == p_task_menu_dta->flag) && (EV_MEN_ENT_IDLE == p_task_menu_dta->event))
-            {
-                p_task_menu_dta->flag = false;
-                p_task_menu_dta->state = ST_MEN_XX_IDLE;
-            }
-            else
-            {
-                p_task_menu_dta->tick--;
-                if (DEL_MEN_XX_MIN == p_task_menu_dta->tick)
-                {
-                    p_task_menu_dta->tick = DEL_MEN_XX_MAX;
-
-                    /* Print out: LCD Display */
-                    snprintf(menu_str, sizeof(menu_str), "%lu", (g_task_menu_cnt/1000ul));
-                    displayCharPositionWrite(10, 1);
-                    displayStringWrite(menu_str);
-                }
-            }
-
-            break;
-
-        default:
-
-            p_task_menu_dta->tick  = DEL_MEN_XX_MIN;
-            p_task_menu_dta->state = ST_MEN_XX_IDLE;
-            p_task_menu_dta->event = EV_MEN_ENT_IDLE;
-            p_task_menu_dta->flag  = false;
-
-            break;
-    }
-}
-
-/********************** end of file ******************************************/
+/*
+ * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ *    contributors may be used to endorse or promote products derived from
+ *    this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @file   : task_menu.c
+ * @date   : Set 26, 2023
+ * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>
+ * @version    v1.0.0
+ */
+
+/********************** inclusions *******************************************/
+/* Project includes */
+#include "main.h"
+
+/* Demo includes */
+#include "logger.h"
+#include "dwt.h"
+
+/* Application & Tasks includes */
+#include "board.h"
+#include "app.h"
+#include "task_menu_attribute.h"
+#include "task_menu_interface.h"
+#include "display.h"
+
+/********************** macros and definitions *******************************/
+#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
+
+/********************** internal data declaration ****************************/
+task_menu_dta_t task_menu_dta =
+    {DEL_MEN_XX_MIN, ST_MEN_MOTOR_SELECT, EV_MEN_ENT_IDLE, false};
+
+#define MENU_DTA_QTY    (sizeof(task_menu_dta)/sizeof(task_menu_dta_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";
+
+/********************** external data declaration ****************************/
+uint32_t g_task_menu_cnt;
+volatile uint32_t g_task_menu_tick_cnt;
+
+/********************** external functions definition ************************/
+void task_menu_init(void *parameters)
+{
+    task_menu_dta_t *p_task_menu_dta;
+    task_menu_st_t    state;
+    task_menu_ev_t    event;
+    bool b_event;
+
+    /* Print out: Task Initialized */
+    LOGGER_INFO(" ");
+    LOGGER_INFO("  %s is running - %s", GET_NAME(task_menu_init), p_task_menu);
+    LOGGER_INFO("  %s is a %s", GET_NAME(task_menu), p_task_menu_);
+
+    /* Init & Print out: Task execution counter */
+    g_task_menu_cnt = G_TASK_MEN_CNT_INI;
+    LOGGER_INFO("   %s = %lu", GET_NAME(g_task_menu_cnt), g_task_menu_cnt);
+
+    init_queue_event_task_menu();
+
+    /* Update Task Actuator Configuration & Data Pointer */
+    p_task_menu_dta = &task_menu_dta;
+
+    /* Init & Print out: Task execution FSM */
+    state = ST_MEN_MOTOR_SELECT;
+    p_task_menu_dta->state = state;
+
+    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         ");
+}
+
+void task_menu_update(void *parameters)
+{
+    bool b_time_update_required = false;
+
+    /* Protect shared resource */
+    __asm("CPSID i");    /* disable interrupts */
+    if (G_TASK_MEN_TICK_CNT_INI < g_task_menu_tick_cnt)
+    {
+        /* Update Tick Counter */
+        g_task_menu_tick_cnt--;
+        b_time_update_required = true;
+    }
+    __asm("CPSIE i");    /* enable interrupts */
+
+    while (b_time_update_required)
+    {
+        /* Update Task Counter */
+        g_task_menu_cnt++;
+
+        /* Run Task Menu Statechart */
+        task_menu_statechart();
+
+        /* Protect shared resource */
+        __asm("CPSID i");    /* disable interrupts */
+        if (G_TASK_MEN_TICK_CNT_INI < g_task_menu_tick_cnt)
+        {
+            /* Update Tick Counter */
+            g_task_menu_tick_cnt--;
+            b_time_update_required = true;
+        }
+        else
+        {
+            b_time_update_required = false;
+        }
+        __asm("CPSIE i");    /* enable interrupts */
+    }
+}
+
+void task_menu_statechart(void)
+{
+    task_menu_dta_t *p_task_menu_dta;
+    // char menu_str[8];
+
+    /* Update Task Menu Data Pointer */
+    p_task_menu_dta = &task_menu_dta;
+
+    if (true == any_event_task_menu())
+    {
+        p_task_menu_dta->flag = true;
+        p_task_menu_dta->event = get_event_task_menu();
+    }
+
+    switch (p_task_menu_dta->state)
+    {
+        case ST_MEN_MOTOR_SELECT:
+
+            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         ");
+                    break;
+                    case EV_MEN_ESC_ACTIVE:
+                    break;
+                    default:
+                    break;
+                }
+            }
+
+        break;
+
+        case ST_MEN_MOTOR_POWER:
+
+            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_SPEED;
+                        displayCharPositionWrite(0, 0);
+                        displayStringWrite("> Speed         ");
+                    break;
+                    case EV_MEN_ESC_ACTIVE:
+                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
+                        displayCharPositionWrite(0, 0);
+                        displayStringWrite("> Motor         ");
+                    break;
+                    default:
+                    break;
+                }
+            }
+
+        break;
+
+        case ST_MEN_MOTOR_SPEED:
+
+            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           ");
+                    break;
+                    case EV_MEN_ESC_ACTIVE:
+                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
+                        displayCharPositionWrite(0, 0);
+                        displayStringWrite("> Motor         ");
+                    break;
+                    default:
+                    break;
+                }
+            }
+
+        break;
+
+        case ST_MEN_MOTOR_SPIN:
+
+            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         ");
+                    break;
+
+                    case EV_MEN_ESC_ACTIVE:
+                        p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
+                        displayCharPositionWrite(0, 0);
+                        displayStringWrite("> Motor         ");
+                    break;
+                    default:
+                    break;
+                }
+            }
+
+        break;
+
+        default:
+
+            p_task_menu_dta->tick  = DEL_MEN_XX_MIN;
+            p_task_menu_dta->state = ST_MEN_MOTOR_SELECT;
+            p_task_menu_dta->event = EV_MEN_ENT_IDLE;
+            p_task_menu_dta->flag  = false;
+
+            break;
+    }
+}
+
+/********************** end of file ******************************************/
diff --git a/app/src/task_sensor.c b/app/src/task_sensor.c
@@ -60,12 +60,12 @@
 
 /********************** internal data declaration ****************************/
 const task_sensor_cfg_t task_sensor_cfg_list[] = {
-    {ID_BTN_ENT,  BTN_ENT_PORT,  BTN_ENT_PIN,  BTN_ENT_PRESSED, DEL_BTN_XX_MAX,
-     EV_MEN_ENT_IDLE,  EV_MEN_ENT_ACTIVE},
-    {ID_BTN_NEX,  BTN_NEX_PORT,  BTN_NEX_PIN,  BTN_NEX_PRESSED, DEL_BTN_XX_MAX,
-     EV_MEN_NEX_IDLE,  EV_MEN_NEX_ACTIVE},
-    {ID_BTN_ESC,  BTN_ESC_PORT,  BTN_ESC_PIN,  BTN_ESC_PRESSED, DEL_BTN_XX_MAX,
-     EV_MEN_ESC_IDLE,  EV_MEN_ESC_ACTIVE}
+    {ID_BTN_ENT,  BTN_ENT_PORT,  BTN_ENT_PIN,  BTN_ENT_PRESSED, DEL_BTN_XX_MAX,
+        EV_MEN_ENT_IDLE,  EV_MEN_ENT_ACTIVE},
+    {ID_BTN_NEX,  BTN_NEX_PORT,  BTN_NEX_PIN,  BTN_NEX_PRESSED, DEL_BTN_XX_MAX,
+        EV_MEN_NEX_IDLE,  EV_MEN_NEX_ACTIVE},
+    {ID_BTN_ESC,  BTN_ESC_PORT,  BTN_ESC_PIN,  BTN_ESC_PRESSED, DEL_BTN_XX_MAX,
+        EV_MEN_ESC_IDLE,  EV_MEN_ESC_ACTIVE}
 };
 
 #define SENSOR_CFG_QTY    (sizeof(task_sensor_cfg_list)/sizeof(task_sensor_cfg_t))
@@ -166,91 +166,91 @@ void task_sensor_update(void *parameters)
 
 void task_sensor_statechart(void)
 {
-    uint32_t index;
-    const task_sensor_cfg_t *p_task_sensor_cfg;
-    task_sensor_dta_t *p_task_sensor_dta;
+    uint32_t index;
+    const task_sensor_cfg_t *p_task_sensor_cfg;
+    task_sensor_dta_t *p_task_sensor_dta;
 
-    for (index = 0; SENSOR_DTA_QTY > index; index++)
-    {
-        /* Update Task Sensor Configuration & Data Pointer */
-        p_task_sensor_cfg = &task_sensor_cfg_list[index];
-        p_task_sensor_dta = &task_sensor_dta_list[index];
-
-        if (p_task_sensor_cfg->pressed == HAL_GPIO_ReadPin(p_task_sensor_cfg->gpio_port, p_task_sensor_cfg->pin))
-        {
-            p_task_sensor_dta->event =    EV_BTN_XX_DOWN;
-        }
-        else
-        {
-            p_task_sensor_dta->event =    EV_BTN_XX_UP;
-        }
-
-        switch (p_task_sensor_dta->state)
-        {
-            case ST_BTN_XX_UP:
-
-                if (EV_BTN_XX_DOWN == p_task_sensor_dta->event)
-                {
-                    p_task_sensor_dta->tick = p_task_sensor_cfg->tick_max;
-                    p_task_sensor_dta->state = ST_BTN_XX_FALLING;
-                }
-
-                break;
-
-            case ST_BTN_XX_FALLING:
-
-                p_task_sensor_dta->tick--;
-                if (DEL_BTN_XX_MIN == p_task_sensor_dta->tick)
-                {
-                    if (EV_BTN_XX_DOWN == p_task_sensor_dta->event)
-                    {
-                        put_event_task_menu(p_task_sensor_cfg->signal_down);
-                        p_task_sensor_dta->state = ST_BTN_XX_DOWN;
-                    }
-                    else
-                    {
-                        p_task_sensor_dta->state = ST_BTN_XX_UP;
-                    }
-                }
-
-                break;
-
-            case ST_BTN_XX_DOWN:
-
-                if (EV_BTN_XX_UP == p_task_sensor_dta->event)
-                {
-                    p_task_sensor_dta->state = ST_BTN_XX_RISING;
-                    p_task_sensor_dta->tick = p_task_sensor_cfg->tick_max;
-                }
-
-                break;
-
-            case ST_BTN_XX_RISING:
-
-                p_task_sensor_dta->tick--;
-                if (DEL_BTN_XX_MIN == p_task_sensor_dta->tick)
-                {
-                    if (EV_BTN_XX_UP == p_task_sensor_dta->event)
-                    {
-                        put_event_task_menu(p_task_sensor_cfg->signal_up);
-                        p_task_sensor_dta->state = ST_BTN_XX_UP;
-                    }
-                    else
-                    {
-                        p_task_sensor_dta->state = ST_BTN_XX_DOWN;
-                    }
-                }
-
-                break;
-
-            default:
-
-                p_task_sensor_dta->tick  = DEL_BTN_XX_MIN;
-                p_task_sensor_dta->state = ST_BTN_XX_UP;
-                p_task_sensor_dta->event = EV_BTN_XX_UP;
-
-                break;
-        }
-    }
+    for (index = 0; SENSOR_DTA_QTY > index; index++)
+    {
+        /* Update Task Sensor Configuration & Data Pointer */
+        p_task_sensor_cfg = &task_sensor_cfg_list[index];
+        p_task_sensor_dta = &task_sensor_dta_list[index];
+
+        if (p_task_sensor_cfg->pressed == HAL_GPIO_ReadPin(p_task_sensor_cfg->gpio_port, p_task_sensor_cfg->pin))
+        {
+            p_task_sensor_dta->event =    EV_BTN_XX_DOWN;
+        }
+        else
+        {
+            p_task_sensor_dta->event =    EV_BTN_XX_UP;
+        }
+
+        switch (p_task_sensor_dta->state)
+        {
+            case ST_BTN_XX_UP:
+
+                if (EV_BTN_XX_DOWN == p_task_sensor_dta->event)
+                {
+                    p_task_sensor_dta->tick = p_task_sensor_cfg->tick_max;
+                    p_task_sensor_dta->state = ST_BTN_XX_FALLING;
+                }
+
+                break;
+
+            case ST_BTN_XX_FALLING:
+
+                p_task_sensor_dta->tick--;
+                if (DEL_BTN_XX_MIN == p_task_sensor_dta->tick)
+                {
+                    if (EV_BTN_XX_DOWN == p_task_sensor_dta->event)
+                    {
+                        put_event_task_menu(p_task_sensor_cfg->signal_down);
+                        p_task_sensor_dta->state = ST_BTN_XX_DOWN;
+                    }
+                    else
+                    {
+                        p_task_sensor_dta->state = ST_BTN_XX_UP;
+                    }
+                }
+
+                break;
+
+            case ST_BTN_XX_DOWN:
+
+                if (EV_BTN_XX_UP == p_task_sensor_dta->event)
+                {
+                    p_task_sensor_dta->state = ST_BTN_XX_RISING;
+                    p_task_sensor_dta->tick = p_task_sensor_cfg->tick_max;
+                }
+
+                break;
+
+            case ST_BTN_XX_RISING:
+
+                p_task_sensor_dta->tick--;
+                if (DEL_BTN_XX_MIN == p_task_sensor_dta->tick)
+                {
+                    if (EV_BTN_XX_UP == p_task_sensor_dta->event)
+                    {
+                        put_event_task_menu(p_task_sensor_cfg->signal_up);
+                        p_task_sensor_dta->state = ST_BTN_XX_UP;
+                    }
+                    else
+                    {
+                        p_task_sensor_dta->state = ST_BTN_XX_DOWN;
+                    }
+                }
+
+                break;
+
+            default:
+
+                p_task_sensor_dta->tick  = DEL_BTN_XX_MIN;
+                p_task_sensor_dta->state = ST_BTN_XX_UP;
+                p_task_sensor_dta->event = EV_BTN_XX_UP;
+
+                break;
+        }
+    }
 }
 /********************** end of file ******************************************/
diff --git a/tdse-tp3_04-interactive_menu.cfg b/tdse-tp3_04-interactive_menu.cfg
@@ -20,7 +20,7 @@ set ENABLE_LOW_POWER 1
 set STOP_WATCHDOG 1
 
 # STlink Debug clock frequency
-set CLOCK_FREQ 8000
+set CLOCK_FREQ 24000
 
 # Reset configuration
 # use software system reset if reset done