commit 743a9823b4980cc5239b28f338d3b2437c09ecd4
parent 684a955ede1ef8287883d45d1459124284bd5369
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Wed, 15 Oct 2025 16:33:03 -0300
Use second row of LCD to show current submenu value
Diffstat:
| M | app/src/task_menu.c | | | 69 | ++++++++++++++++++++++++++++++++++++++++----------------------------- |
| M | app/src/task_sensor.c | | | 512 | ++++++++++++++++++++++++++++++++++++++++---------------------------------------- |
2 files changed, 296 insertions(+), 285 deletions(-)
diff --git a/app/src/task_menu.c b/app/src/task_menu.c
@@ -93,40 +93,40 @@ 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;
+ 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_);
+ /* 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 & 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();
+ init_queue_event_task_menu();
- /* Update Task Actuator Configuration & Data Pointer */
- p_task_menu_dta = &task_menu_dta;
+ /* 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;
+ /* Init & Print out: Task execution FSM */
+ 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;
+ event = EV_MEN_ENT_IDLE;
+ p_task_menu_dta->event = event;
- b_event = false;
- p_task_menu_dta->flag = b_event;
+ b_event = false;
+ p_task_menu_dta->flag = b_event;
- /* Init & Print out: LCD Display */
- displayInit(DISPLAY_CONNECTION_GPIO_4BITS);
+ /* Init & Print out: LCD Display */
+ displayInit(DISPLAY_CONNECTION_GPIO_4BITS);
g_display_update = true;
}
@@ -200,7 +200,7 @@ void task_menu_statechart(void)
if (g_display_update)
{
g_display_update = false;
- displayCharPositionWrite(0, 0);
+ displayClear();
sprintf(menu_row_str, "> Motor %d ", g_selected_motor);
displayStringWrite(menu_row_str);
}
@@ -228,12 +228,21 @@ void task_menu_statechart(void)
case ST_MEN_MOTOR_POWER:
+ 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 ", g_selected_motor);
displayStringWrite(menu_row_str);
+ displayCharPositionWrite(16 - 4, 1);
+ sprintf(menu_row_str, "%3d%%", g_new_sel_motor_power);
+ displayStringWrite(menu_row_str);
}
if (true == p_task_menu_dta->flag)
@@ -269,8 +278,10 @@ void task_menu_statechart(void)
{
g_display_update = false;
displayCharPositionWrite(0, 0);
- sprintf(menu_row_str, "%1d> Power %3d%%", g_selected_motor,
- g_new_sel_motor_power);
+ sprintf(menu_row_str, "%1d> Power set", g_selected_motor);
+ displayStringWrite(menu_row_str);
+ displayCharPositionWrite(16 - 4, 1);
+ sprintf(menu_row_str, "%3d%%", g_new_sel_motor_power);
displayStringWrite(menu_row_str);
}
@@ -302,8 +313,8 @@ void task_menu_statechart(void)
if (g_display_update)
{
g_display_update = false;
- displayCharPositionWrite(0, 0);
- sprintf(menu_row_str, "%1d> Speed ", g_selected_motor);
+ displayClear();
+ sprintf(menu_row_str, "%1d> Speed", g_selected_motor);
displayStringWrite(menu_row_str);
}
@@ -331,7 +342,7 @@ void task_menu_statechart(void)
{
g_display_update = false;
displayCharPositionWrite(0, 0);
- sprintf(menu_row_str, "%1d> Spin ", g_selected_motor);
+ sprintf(menu_row_str, "%1d> Spin", g_selected_motor);
displayStringWrite(menu_row_str);
}
diff --git a/app/src/task_sensor.c b/app/src/task_sensor.c
@@ -1,256 +1,256 @@
-/*
- * 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_sensor.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_sensor_attribute.h"
-#include "task_menu_attribute.h"
-#include "task_menu_interface.h"
-
-/********************** macros and definitions *******************************/
-#define G_TASK_SEN_CNT_INIT 0ul
-#define G_TASK_SEN_TICK_CNT_INI 0ul
-
-#define DEL_BTN_XX_MIN 0ul
-#define DEL_BTN_XX_MED 25ul
-#define DEL_BTN_XX_MAX 50ul
-
-/********************** 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}
-};
-
-#define SENSOR_CFG_QTY (sizeof(task_sensor_cfg_list)/sizeof(task_sensor_cfg_t))
-
-task_sensor_dta_t task_sensor_dta_list[] = {
- {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
- {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
- {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}
-};
-
-#define SENSOR_DTA_QTY (sizeof(task_sensor_dta_list)/sizeof(task_sensor_dta_t))
-
-/********************** internal functions declaration ***********************/
-void task_sensor_statechart(void);
-
-/********************** internal data definition *****************************/
-const char *p_task_sensor = "Task Sensor (Sensor Statechart)";
-const char *p_task_sensor_ = "Non-Blocking & Update By Time Code";
-
-/********************** external data declaration ****************************/
-uint32_t g_task_sensor_cnt;
-volatile uint32_t g_task_sensor_tick_cnt;
-
-/********************** external functions definition ************************/
-void task_sensor_init(void *parameters)
-{
- uint32_t index;
- task_sensor_dta_t *p_task_sensor_dta;
- task_sensor_st_t state;
- task_sensor_ev_t event;
-
- /* Print out: Task Initialized */
- LOGGER_INFO(" ");
- LOGGER_INFO(" %s is running - %s", GET_NAME(task_sensor_init), p_task_sensor);
- LOGGER_INFO(" %s is a %s", GET_NAME(task_sensor), p_task_sensor_);
-
- /* Init & Print out: Task execution counter */
- g_task_sensor_cnt = G_TASK_SEN_CNT_INIT;
- LOGGER_INFO(" %s = %lu", GET_NAME(g_task_sensor_cnt), g_task_sensor_cnt);
-
- for (index = 0; SENSOR_DTA_QTY > index; index++)
- {
- /* Update Task Sensor Data Pointer */
- p_task_sensor_dta = &task_sensor_dta_list[index];
-
- /* Init & Print out: Index & Task execution FSM */
- state = ST_BTN_XX_UP;
- p_task_sensor_dta->state = state;
-
- event = EV_BTN_XX_UP;
- p_task_sensor_dta->event = event;
-
- LOGGER_INFO(" ");
- LOGGER_INFO(" %s = %lu %s = %lu %s = %lu",
- GET_NAME(index), index,
- GET_NAME(state), (uint32_t)state,
- GET_NAME(event), (uint32_t)event);
- }
-}
-
-void task_sensor_update(void *parameters)
-{
- bool b_time_update_required = false;
-
- /* Protect shared resource */
- __asm("CPSID i"); /* disable interrupts */
- if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt)
- {
- /* Update Tick Counter */
- g_task_sensor_tick_cnt--;
- b_time_update_required = true;
- }
- __asm("CPSIE i"); /* enable interrupts */
-
- while (b_time_update_required)
- {
- /* Update Task Counter */
- g_task_sensor_cnt++;
-
- /* Run Task Sensor Statechart */
- task_sensor_statechart();
-
- /* Protect shared resource */
- __asm("CPSID i"); /* disable interrupts */
- if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt)
- {
- /* Update Tick Counter */
- g_task_sensor_tick_cnt--;
- b_time_update_required = true;
- }
- else
- {
- b_time_update_required = false;
- }
- __asm("CPSIE i"); /* enable interrupts */
- }
-}
-
-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;
-
- 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 ******************************************/
+/*
+ * 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_sensor.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_sensor_attribute.h"
+#include "task_menu_attribute.h"
+#include "task_menu_interface.h"
+
+/********************** macros and definitions *******************************/
+#define G_TASK_SEN_CNT_INIT 0ul
+#define G_TASK_SEN_TICK_CNT_INI 0ul
+
+#define DEL_BTN_XX_MIN 0ul
+#define DEL_BTN_XX_MED 25ul
+#define DEL_BTN_XX_MAX 50ul
+
+/********************** 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}
+};
+
+#define SENSOR_CFG_QTY (sizeof(task_sensor_cfg_list)/sizeof(task_sensor_cfg_t))
+
+task_sensor_dta_t task_sensor_dta_list[] = {
+ {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
+ {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP},
+ {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}
+};
+
+#define SENSOR_DTA_QTY (sizeof(task_sensor_dta_list)/sizeof(task_sensor_dta_t))
+
+/********************** internal functions declaration ***********************/
+void task_sensor_statechart(void);
+
+/********************** internal data definition *****************************/
+const char *p_task_sensor = "Task Sensor (Sensor Statechart)";
+const char *p_task_sensor_ = "Non-Blocking & Update By Time Code";
+
+/********************** external data declaration ****************************/
+uint32_t g_task_sensor_cnt;
+volatile uint32_t g_task_sensor_tick_cnt;
+
+/********************** external functions definition ************************/
+void task_sensor_init(void *parameters)
+{
+ uint32_t index;
+ task_sensor_dta_t *p_task_sensor_dta;
+ task_sensor_st_t state;
+ task_sensor_ev_t event;
+
+ /* Print out: Task Initialized */
+ LOGGER_INFO(" ");
+ LOGGER_INFO(" %s is running - %s", GET_NAME(task_sensor_init), p_task_sensor);
+ LOGGER_INFO(" %s is a %s", GET_NAME(task_sensor), p_task_sensor_);
+
+ /* Init & Print out: Task execution counter */
+ g_task_sensor_cnt = G_TASK_SEN_CNT_INIT;
+ LOGGER_INFO(" %s = %lu", GET_NAME(g_task_sensor_cnt), g_task_sensor_cnt);
+
+ for (index = 0; SENSOR_DTA_QTY > index; index++)
+ {
+ /* Update Task Sensor Data Pointer */
+ p_task_sensor_dta = &task_sensor_dta_list[index];
+
+ /* Init & Print out: Index & Task execution FSM */
+ state = ST_BTN_XX_UP;
+ p_task_sensor_dta->state = state;
+
+ event = EV_BTN_XX_UP;
+ p_task_sensor_dta->event = event;
+
+ LOGGER_INFO(" ");
+ LOGGER_INFO(" %s = %lu %s = %lu %s = %lu",
+ GET_NAME(index), index,
+ GET_NAME(state), (uint32_t)state,
+ GET_NAME(event), (uint32_t)event);
+ }
+}
+
+void task_sensor_update(void *parameters)
+{
+ bool b_time_update_required = false;
+
+ /* Protect shared resource */
+ __asm("CPSID i"); /* disable interrupts */
+ if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt)
+ {
+ /* Update Tick Counter */
+ g_task_sensor_tick_cnt--;
+ b_time_update_required = true;
+ }
+ __asm("CPSIE i"); /* enable interrupts */
+
+ while (b_time_update_required)
+ {
+ /* Update Task Counter */
+ g_task_sensor_cnt++;
+
+ /* Run Task Sensor Statechart */
+ task_sensor_statechart();
+
+ /* Protect shared resource */
+ __asm("CPSID i"); /* disable interrupts */
+ if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt)
+ {
+ /* Update Tick Counter */
+ g_task_sensor_tick_cnt--;
+ b_time_update_required = true;
+ }
+ else
+ {
+ b_time_update_required = false;
+ }
+ __asm("CPSIE i"); /* enable interrupts */
+ }
+}
+
+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;
+
+ 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 ******************************************/