commit bef7199a8f50523866ac3ea7b15b4c80f63cfe8b
parent 290e04d0f2166043fefb6632c202d01c02b08a0a
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date: Fri, 3 Oct 2025 14:31:40 -0300
implement `task_actuator_statechart`
Diffstat:
2 files changed, 297 insertions(+), 184 deletions(-)
diff --git a/app/inc/task_actuator_attribute.h b/app/inc/task_actuator_attribute.h
@@ -49,57 +49,57 @@ extern "C" {
/********************** typedef **********************************************/
/* Actuator Statechart - State Transition Table */
-/* +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
- * | Current | Event | | Next | |
- * | State | (Parameters) | [Guard] | State | Actions |
- * |=======================+=======================+=======================+=======================+=======================|
- * | INICIAL | | | ST_LED_XX_OFF | led = LED_OFF |
- * | | | | | op_led(led) |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | ST_LED_XX_OFF | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
- * | | | | | op_led(led) |
- * | |-----------------------+-----------------------+-----------------------+-----------------------|
- * | | EV_LED_XX_BLINK | | ST_LED_XX_BLINK_ON | tick = tick_max |
- * | | | | | led = LED_ON |
- * | | | | | op_led(led) |
- * | |-----------------------+-----------------------+-----------------------+-----------------------|
- * | | EV_LED_XX_PULSE | | ST_LED_XX_PULSE | tick = tick_max |
- * | | | | | led = LED_ON |
- * | | | | | op_led(led) |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | ST_LED_XX_ON | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
- * | | | | | op_led(led) |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | ST_LED_XX_BLINK_ON | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
- * | | | | | op_led(led) |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
- * | | | | | op_led(led) |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | | [tick == 0] | ST_LED_XX_BLINK_OFF | tick = tick_max |
- * | | | | | led = LED_OFF |
- * | | | | | op_led(led) |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | | [tick > 0] | ST_LED_XX_BLINK_ON | tick-- |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | ST_LED_XX_BLINK_OFF | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
- * | | | | | op_led(led) |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
- * | | | | | op_led(led) |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | | [tick > 0] | ST_LED_XX_BLINK_OFF | tick-- |
- * | +-----------------------+-----------------------+-----------------------+-----------------------|
- * | | | [tick == 0] | ST_LED_XX_BLINK_ON | tick = tick_max |
- * | | | | | led = LED_ON |
- * | | | | | op_led(led) |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | ST_LED_XX_PULSE | | [tick == 0] | ST_LED_XX_OFF | tick = tick_max |
- * | | | | | led = LED_OFF |
- * | | | | | op_led(led) |
- * |-----------------------+-----------------------+-----------------------+-----------------------+-----------------------|
- * | | | [tick > 0] | ST_LED_XX_PULSE | tick-- |
- * +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+ */
+/* +-----------------------+-----------------------+-------------+-----------------------+-----------------------+
+ * | Current | Event | | Next | |
+ * | State | (Parameters) | [Guard] | State | Actions |
+ * |=======================+=======================+=============+=======================+=======================|
+ * | INICIAL | | | ST_LED_XX_OFF | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | ST_LED_XX_OFF | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
+ * | | | | | op_led(led) |
+ * | |-----------------------+-------------+-----------------------+-----------------------|
+ * | | EV_LED_XX_BLINK | | ST_LED_XX_BLINK_ON | tick = tick_max |
+ * | | | | | led = LED_ON |
+ * | | | | | op_led(led) |
+ * | |-----------------------+-------------+-----------------------+-----------------------|
+ * | | EV_LED_XX_PULSE | | ST_LED_XX_PULSE | tick = tick_max |
+ * | | | | | led = LED_ON |
+ * | | | | | op_led(led) |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | ST_LED_XX_ON | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | ST_LED_XX_BLINK_ON | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
+ * | | | | | op_led(led) |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | | [tick == 0] | ST_LED_XX_BLINK_OFF | tick = tick_max |
+ * | | | | | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | | [tick > 0] | ST_LED_XX_BLINK_ON | tick-- |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | ST_LED_XX_BLINK_OFF | EV_LED_XX_OFF | | ST_LED_XX_OFF | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | EV_LED_XX_ON | | ST_LED_XX_ON | led = LED_ON |
+ * | | | | | op_led(led) |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | | [tick > 0] | ST_LED_XX_BLINK_OFF | tick-- |
+ * | +-----------------------+-------------+-----------------------+-----------------------|
+ * | | | [tick == 0] | ST_LED_XX_BLINK_ON | tick = tick_max |
+ * | | | | | led = LED_ON |
+ * | | | | | op_led(led) |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | ST_LED_XX_PULSE | | [tick == 0] | ST_LED_XX_OFF | tick = tick_max |
+ * | | | | | led = LED_OFF |
+ * | | | | | op_led(led) |
+ * |-----------------------+-----------------------+-------------+-----------------------+-----------------------|
+ * | | | [tick > 0] | ST_LED_XX_PULSE | tick-- |
+ * +-----------------------+-----------------------+-------------+-----------------------+-----------------------+ */
/* Events to excite Task Actuator */
typedef enum {
diff --git a/app/src/task_actuator.c b/app/src/task_actuator.c
@@ -50,33 +50,32 @@
#include "task_actuator_interface.h"
/********************** macros and definitions *******************************/
-#define G_TASK_ACT_CNT_INIT 0ul
-#define G_TASK_ACT_TICK_CNT_INI 0ul
+#define G_TASK_ACT_CNT_INIT 0ul
+#define G_TASK_ACT_TICK_CNT_INI 0ul
-#define DEL_LED_XX_PUL 250ul
-#define DEL_LED_XX_BLI 500ul
-#define DEL_LED_XX_MIN 0ul
+#define DEL_LED_XX_PUL 250ul
+#define DEL_LED_XX_BLI 500ul
+#define DEL_LED_XX_MIN 0ul
/********************** internal data declaration ****************************/
const task_actuator_cfg_t task_actuator_cfg_list[] = {
- {ID_LED_A, LED_A_PORT, LED_A_PIN, LED_A_ON, LED_A_OFF,
- DEL_LED_XX_BLI, DEL_LED_XX_PUL}
+ {ID_LED_A, LED_A_PORT, LED_A_PIN, LED_A_ON, LED_A_OFF, DEL_LED_XX_BLI, DEL_LED_XX_PUL}
};
-#define ACTUATOR_CFG_QTY (sizeof(task_actuator_cfg_list)/sizeof(task_actuator_cfg_t))
+#define ACTUATOR_CFG_QTY (sizeof(task_actuator_cfg_list)/sizeof(task_actuator_cfg_t))
task_actuator_dta_t task_actuator_dta_list[] = {
- {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false}
+ {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false}
};
-#define ACTUATOR_DTA_QTY (sizeof(task_actuator_dta_list)/sizeof(task_actuator_dta_t))
+#define ACTUATOR_DTA_QTY (sizeof(task_actuator_dta_list)/sizeof(task_actuator_dta_t))
/********************** internal functions declaration ***********************/
void task_actuator_statechart(void);
/********************** internal data definition *****************************/
-const char *p_task_actuator = "Task Actuator (Actuator Statechart)";
-const char *p_task_actuator_ = "Non-Blocking & Update By Time Code";
+const char *p_task_actuator = "Task Actuator (Actuator Statechart)";
+const char *p_task_actuator_ = "Non-Blocking & Update By Time Code";
/********************** external data declaration ****************************/
uint32_t g_task_actuator_cnt;
@@ -85,145 +84,259 @@ volatile uint32_t g_task_actuator_tick_cnt;
/********************** external functions definition ************************/
void task_actuator_init(void *parameters)
{
- uint32_t index;
- const task_actuator_cfg_t *p_task_actuator_cfg;
- task_actuator_dta_t *p_task_actuator_dta;
- task_actuator_st_t state;
- task_actuator_ev_t event;
- bool b_event;
-
- /* Print out: Task Initialized */
- LOGGER_INFO(" ");
- LOGGER_INFO(" %s is running - %s", GET_NAME(task_actuator_init), p_task_actuator);
- LOGGER_INFO(" %s is a %s", GET_NAME(task_actuator), p_task_actuator_);
-
- /* Init & Print out: Task execution counter */
- g_task_actuator_cnt = G_TASK_ACT_CNT_INIT;
- LOGGER_INFO(" %s = %lu", GET_NAME(g_task_actuator_cnt), g_task_actuator_cnt);
-
- for (index = 0; ACTUATOR_DTA_QTY > index; index++)
- {
- /* Update Task Actuator Configuration & Data Pointer */
- p_task_actuator_cfg = &task_actuator_cfg_list[index];
- p_task_actuator_dta = &task_actuator_dta_list[index];
-
- /* Init & Print out: Index & Task execution FSM */
- state = ST_LED_XX_OFF;
- p_task_actuator_dta->state = state;
-
- event = EV_LED_XX_OFF;
- p_task_actuator_dta->event = event;
-
- b_event = false;
- p_task_actuator_dta->flag = b_event;
-
- LOGGER_INFO(" ");
- LOGGER_INFO(" %s = %lu %s = %lu %s = %lu %s = %s",
- GET_NAME(index), index,
- GET_NAME(state), (uint32_t)state,
- GET_NAME(event), (uint32_t)event,
- GET_NAME(b_event), (b_event ? "true" : "false"));
-
- HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port, p_task_actuator_cfg->pin, p_task_actuator_cfg->led_off);
- }
+ uint32_t index;
+ const task_actuator_cfg_t *p_task_actuator_cfg;
+ task_actuator_dta_t *p_task_actuator_dta;
+ task_actuator_st_t state;
+ task_actuator_ev_t event;
+ bool b_event;
+
+ /* Print out: Task Initialized */
+ LOGGER_INFO(" ");
+ LOGGER_INFO(" %s is running - %s", GET_NAME(task_actuator_init), p_task_actuator);
+ LOGGER_INFO(" %s is a %s", GET_NAME(task_actuator), p_task_actuator_);
+
+ /* Init & Print out: Task execution counter */
+ g_task_actuator_cnt = G_TASK_ACT_CNT_INIT;
+ LOGGER_INFO(" %s = %lu", GET_NAME(g_task_actuator_cnt), g_task_actuator_cnt);
+
+ for (index = 0; ACTUATOR_DTA_QTY > index; index++)
+ {
+ /* Update Task Actuator Configuration & Data Pointer */
+ p_task_actuator_cfg = &task_actuator_cfg_list[index];
+ p_task_actuator_dta = &task_actuator_dta_list[index];
+
+ /* Init & Print out: Index & Task execution FSM */
+ state = ST_LED_XX_OFF;
+ p_task_actuator_dta->state = state;
+
+ event = EV_LED_XX_OFF;
+ p_task_actuator_dta->event = event;
+
+ b_event = false;
+ p_task_actuator_dta->flag = b_event;
+
+ LOGGER_INFO(" ");
+ LOGGER_INFO(" %s = %lu %s = %lu %s = %lu %s = %s",
+ GET_NAME(index), index,
+ GET_NAME(state), (uint32_t)state,
+ GET_NAME(event), (uint32_t)event,
+ GET_NAME(b_event), (b_event ? "true" : "false"));
+
+ HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ }
}
void task_actuator_update(void *parameters)
{
- bool b_time_update_required = false;
+ bool b_time_update_required = false;
- /* Protect shared resource */
- __asm("CPSID i"); /* disable interrupts*/
+ /* Protect shared resource */
+ __asm("CPSID i"); /* disable interrupts*/
if (G_TASK_ACT_TICK_CNT_INI < g_task_actuator_tick_cnt)
{
- /* Update Tick Counter */
- g_task_actuator_tick_cnt--;
- b_time_update_required = true;
+ /* Update Tick Counter */
+ g_task_actuator_tick_cnt--;
+ b_time_update_required = true;
}
__asm("CPSIE i"); /* enable interrupts */
while (b_time_update_required)
{
- /* Update Task Counter */
- g_task_actuator_cnt++;
-
- /* Run Task Statechart */
- task_actuator_statechart();
-
- /* Protect shared resource */
- __asm("CPSID i"); /* disable interrupts */
- if (G_TASK_ACT_TICK_CNT_INI < g_task_actuator_tick_cnt)
- {
- /* Update Tick Counter */
- g_task_actuator_tick_cnt--;
- b_time_update_required = true;
- }
- else
- {
- b_time_update_required = false;
- }
- __asm("CPSIE i"); /* enable interrupts */
+ /* Update Task Counter */
+ g_task_actuator_cnt++;
+
+ /* Run Task Statechart */
+ task_actuator_statechart();
+
+ /* Protect shared resource */
+ __asm("CPSID i"); /* disable interrupts */
+ if (G_TASK_ACT_TICK_CNT_INI < g_task_actuator_tick_cnt)
+ {
+ /* Update Tick Counter */
+ g_task_actuator_tick_cnt--;
+ b_time_update_required = true;
+ }
+ else
+ {
+ b_time_update_required = false;
+ }
+ __asm("CPSIE i"); /* enable interrupts */
}
}
void task_actuator_statechart(void)
{
- uint32_t index;
- const task_actuator_cfg_t *p_task_actuator_cfg;
- task_actuator_dta_t *p_task_actuator_dta;
-
- for (index = 0; ACTUATOR_DTA_QTY > index; index++)
- {
- /* Update Task Actuator Configuration & Data Pointer */
- p_task_actuator_cfg = &task_actuator_cfg_list[index];
- p_task_actuator_dta = &task_actuator_dta_list[index];
-
- switch (p_task_actuator_dta->state)
- {
- case ST_LED_XX_OFF:
-
- if ((true == p_task_actuator_dta->flag) && (EV_LED_XX_ON == p_task_actuator_dta->event))
- {
- p_task_actuator_dta->flag = false;
- HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port, p_task_actuator_cfg->pin, p_task_actuator_cfg->led_on);
- p_task_actuator_dta->state = ST_LED_XX_ON;
- }
-
- break;
-
- case ST_LED_XX_ON:
-
- if ((true == p_task_actuator_dta->flag) && (EV_LED_XX_OFF == p_task_actuator_dta->event))
- {
- p_task_actuator_dta->flag = false;
- HAL_GPIO_WritePin(p_task_actuator_cfg->gpio_port, p_task_actuator_cfg->pin, p_task_actuator_cfg->led_off);
- p_task_actuator_dta->state = ST_LED_XX_OFF;
- }
-
- break;
-
- case ST_LED_XX_BLINK_ON:
+ uint32_t index;
+ const task_actuator_cfg_t *p_task_actuator_cfg;
+ task_actuator_dta_t *p_task_actuator_dta;
- break;
-
- case ST_LED_XX_BLINK_OFF:
-
- break;
-
- case ST_LED_XX_PULSE:
-
- break;
-
- default:
-
- p_task_actuator_dta->tick = DEL_LED_XX_MIN;
- p_task_actuator_dta->state = ST_LED_XX_OFF;
- p_task_actuator_dta->event = EV_LED_XX_OFF;
- p_task_actuator_dta->flag = false;
-
- break;
- }
- }
+ for (index = 0; ACTUATOR_DTA_QTY > index; index++)
+ {
+ /* Update Task Actuator Configuration & Data Pointer */
+ p_task_actuator_cfg = &task_actuator_cfg_list[index];
+ p_task_actuator_dta = &task_actuator_dta_list[index];
+
+ switch (p_task_actuator_dta->state)
+ {
+ case ST_LED_XX_OFF:
+ if (true == p_task_actuator_dta->flag)
+ {
+ p_task_actuator_dta->flag = false;
+ switch(p_task_actuator_dta->event)
+ {
+ case EV_LED_XX_ON:
+ p_task_actuator_dta->state = ST_LED_XX_ON;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ break;
+
+ case EV_LED_XX_BLINK:
+ p_task_actuator_dta->tick = DEL_LED_XX_BLI;
+ p_task_actuator_dta->state = ST_LED_XX_BLINK_ON;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ break;
+
+ case EV_LED_XX_PULSE:
+ p_task_actuator_dta->tick = DEL_LED_XX_PUL;
+ p_task_actuator_dta->state = ST_LED_XX_PULSE;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ default:
+ break;
+ }
+ }
+ break;
+
+ case ST_LED_XX_ON:
+ if ((true == p_task_actuator_dta->flag)
+ && (EV_LED_XX_OFF == p_task_actuator_dta->event))
+ {
+ p_task_actuator_dta->flag = false;
+ p_task_actuator_dta->state = ST_LED_XX_OFF;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ }
+
+ break;
+
+ case ST_LED_XX_BLINK_ON:
+ if (true == p_task_actuator_dta->flag)
+ {
+ p_task_actuator_dta->flag = false;
+ switch(p_task_actuator_dta->event)
+ {
+ case EV_LED_XX_OFF:
+ p_task_actuator_dta->state = ST_LED_XX_OFF;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ break;
+ case EV_LED_XX_ON:
+ p_task_actuator_dta->state = ST_LED_XX_ON;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ default:
+ break;
+ }
+ }
+
+ if (DEL_LED_XX_MIN == p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->state = ST_LED_XX_BLINK_OFF;
+ p_task_actuator_dta->tick = DEL_LED_XX_BLI;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ }
+
+ if (DEL_LED_XX_MIN < p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->state = ST_LED_XX_BLINK_ON;
+ p_task_actuator_dta->tick--;
+ }
+ break;
+
+ case ST_LED_XX_BLINK_OFF:
+ if (true == p_task_actuator_dta->flag)
+ {
+ p_task_actuator_dta->flag = false;
+ switch(p_task_actuator_dta->event)
+ {
+ case EV_LED_XX_OFF:
+ p_task_actuator_dta->state = ST_LED_XX_OFF;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ break;
+ case EV_LED_XX_ON:
+ p_task_actuator_dta->state = ST_LED_XX_ON;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ default:
+ break;
+ }
+ }
+
+ if (DEL_LED_XX_MIN == p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->state = ST_LED_XX_BLINK_ON;
+ p_task_actuator_dta->tick = DEL_LED_XX_BLI;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_on);
+ }
+
+ if (DEL_LED_XX_MIN < p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->state = ST_LED_XX_BLINK_OFF;
+ p_task_actuator_dta->tick--;
+ }
+ break;
+
+ case ST_LED_XX_PULSE:
+ if (DEL_LED_XX_MIN == p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->state = ST_LED_XX_OFF;
+ HAL_GPIO_WritePin(
+ p_task_actuator_cfg->gpio_port,
+ p_task_actuator_cfg->pin,
+ p_task_actuator_cfg->led_off);
+ }
+
+ if (DEL_LED_XX_MIN < p_task_actuator_dta->tick)
+ {
+ p_task_actuator_dta->tick--;
+ }
+ break;
+
+ default:
+ p_task_actuator_dta->tick = DEL_LED_XX_MIN;
+ p_task_actuator_dta->state = ST_LED_XX_OFF;
+ p_task_actuator_dta->event = EV_LED_XX_OFF;
+ p_task_actuator_dta->flag = false;
+ break;
+ }
+ }
}
/********************** end of file ******************************************/