tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
firmware-nucleo/App/Src/task_leds.c (9283B)
   1 /*
   2  * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
   3  * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
   4  *
   5  * See file `LICENSE` for full details
   6  */
   7 
   8 /* Project includes */
   9 #include "main.h"
  10 
  11 #include "logger.h"
  12 #include "dwt.h"
  13 
  14 #include "app.h"
  15 #include "task_leds_attribute.h"
  16 #include "task_leds_interface.h"
  17 
  18 #define G_TASK_LEDS_CNT_INIT     0ul
  19 #define G_TASK_LEDS_TICK_CNT_INI 0ul
  20 
  21 #define DEL_LED_XX_PUL      250ul
  22 #define DEL_LED_XX_BLI      500ul
  23 #define DEL_LED_XX_MIN      0ul
  24 
  25 #define LED_ON  GPIO_PIN_SET
  26 #define LED_OFF GPIO_PIN_RESET
  27 
  28 static const task_leds_cfg_t task_leds_cfg_list[] = {
  29     {ID_LED_A, LD2_GPIO_Port, LD2_Pin, LED_ON, LED_OFF, DEL_LED_XX_BLI, DEL_LED_XX_PUL},
  30     {ID_LED_B, LD3_GPIO_Port, LD3_Pin, LED_ON, LED_OFF, DEL_LED_XX_BLI, DEL_LED_XX_PUL},
  31 };
  32 
  33 #define LEDS_CFG_QTY (sizeof(task_leds_cfg_list)/sizeof(task_leds_cfg_t))
  34 
  35 #define LEDS_DTA_QTY (sizeof(task_leds_dta_list)/sizeof(task_leds_dta_t))
  36 
  37 // Private functions declaration
  38 static void task_leds_statechart(void);
  39 
  40 // Exported data definition
  41 uint32_t g_task_leds_cnt;
  42 volatile uint32_t g_task_leds_tick_cnt;
  43 
  44 task_leds_dta_t task_leds_dta_list[] = {
  45     {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
  46     {DEL_LED_XX_MIN, ST_LED_XX_OFF, EV_LED_XX_NOT_BLINK, false},
  47 };
  48 
  49 // External functions definition
  50 void task_leds_init(void *parameters)
  51 {
  52     uint32_t index;
  53     const task_leds_cfg_t *p_task_leds_cfg;
  54     task_leds_dta_t *p_task_leds_dta;
  55 
  56     LOGGER_INFO("Initializing `task_leds`...");
  57 
  58     g_task_leds_cnt = G_TASK_LEDS_CNT_INIT;
  59     for (index = 0; LEDS_DTA_QTY > index; index++)
  60     {
  61         p_task_leds_cfg = &task_leds_cfg_list[index];
  62         p_task_leds_dta = &task_leds_dta_list[index];
  63 
  64         p_task_leds_dta->state = ST_LED_XX_OFF;
  65         p_task_leds_dta->event = EV_LED_XX_OFF;
  66         p_task_leds_dta->flag = false;
  67 
  68         HAL_GPIO_WritePin(p_task_leds_cfg->gpio_port,
  69                 p_task_leds_cfg->pin,
  70                 p_task_leds_cfg->led_off);
  71     }
  72 }
  73 
  74 void task_leds_update(void *parameters)
  75 {
  76     bool b_time_update_required = false;
  77 
  78     __asm("CPSID i");
  79     if (G_TASK_LEDS_TICK_CNT_INI < g_task_leds_tick_cnt)
  80     {
  81         g_task_leds_tick_cnt--;
  82         b_time_update_required = true;
  83     }
  84     __asm("CPSIE i");
  85 
  86     while (b_time_update_required)
  87     {
  88         g_task_leds_cnt++;
  89 
  90         task_leds_statechart();
  91 
  92         __asm("CPSID i");
  93         if (G_TASK_LEDS_TICK_CNT_INI < g_task_leds_tick_cnt)
  94         {
  95             g_task_leds_tick_cnt--;
  96             b_time_update_required = true;
  97         }
  98         else
  99         {
 100             b_time_update_required = false;
 101         }
 102         __asm("CPSIE i");
 103     }
 104 }
 105 
 106 static void task_leds_statechart(void)
 107 {
 108     uint32_t index;
 109     const task_leds_cfg_t *p_task_leds_cfg;
 110     task_leds_dta_t *p_task_leds_dta;
 111 
 112     for (index = 0; LEDS_DTA_QTY > index; index++)
 113     {
 114         p_task_leds_cfg = &task_leds_cfg_list[index];
 115         p_task_leds_dta = &task_leds_dta_list[index];
 116 
 117         switch (p_task_leds_dta->state)
 118         {
 119             case ST_LED_XX_OFF:
 120                 if (true == p_task_leds_dta->flag)
 121                 {
 122                     p_task_leds_dta->flag = false;
 123                     switch(p_task_leds_dta->event)
 124                     {
 125                         case EV_LED_XX_ON:
 126                             p_task_leds_dta->state = ST_LED_XX_ON;
 127                             HAL_GPIO_WritePin(
 128                                     p_task_leds_cfg->gpio_port,
 129                                     p_task_leds_cfg->pin,
 130                                     p_task_leds_cfg->led_on);
 131                         break;
 132 
 133                         case EV_LED_XX_BLINK:
 134                             p_task_leds_dta->tick  = DEL_LED_XX_BLI;
 135                             p_task_leds_dta->state = ST_LED_XX_BLINK_ON;
 136                             HAL_GPIO_WritePin(
 137                                     p_task_leds_cfg->gpio_port,
 138                                     p_task_leds_cfg->pin,
 139                                     p_task_leds_cfg->led_on);
 140                         break;
 141 
 142                         case EV_LED_XX_PULSE:
 143                             p_task_leds_dta->tick  = DEL_LED_XX_PUL;
 144                             p_task_leds_dta->state = ST_LED_XX_PULSE;
 145                             HAL_GPIO_WritePin(
 146                                     p_task_leds_cfg->gpio_port,
 147                                     p_task_leds_cfg->pin,
 148                                     p_task_leds_cfg->led_on);
 149                         default:
 150                         break;
 151                     }
 152                 }
 153             break;
 154 
 155             case ST_LED_XX_ON:
 156                 if ((true == p_task_leds_dta->flag)
 157                         && (EV_LED_XX_OFF == p_task_leds_dta->event))
 158                 {
 159                     p_task_leds_dta->flag = false;
 160                     p_task_leds_dta->state = ST_LED_XX_OFF;
 161                     HAL_GPIO_WritePin(
 162                             p_task_leds_cfg->gpio_port,
 163                             p_task_leds_cfg->pin,
 164                             p_task_leds_cfg->led_off);
 165                 }
 166 
 167             break;
 168 
 169             case ST_LED_XX_BLINK_ON:
 170                 if (true == p_task_leds_dta->flag)
 171                 {
 172                     p_task_leds_dta->flag = false;
 173                     switch(p_task_leds_dta->event)
 174                     {
 175                         case EV_LED_XX_OFF:
 176                             p_task_leds_dta->state = ST_LED_XX_OFF;
 177                             HAL_GPIO_WritePin(
 178                                     p_task_leds_cfg->gpio_port,
 179                                     p_task_leds_cfg->pin,
 180                                     p_task_leds_cfg->led_off);
 181                         break;
 182                         case EV_LED_XX_ON:
 183                             p_task_leds_dta->state = ST_LED_XX_ON;
 184                             HAL_GPIO_WritePin(
 185                                     p_task_leds_cfg->gpio_port,
 186                                     p_task_leds_cfg->pin,
 187                                     p_task_leds_cfg->led_on);
 188                         default:
 189                         break;
 190                     }
 191                 }
 192 
 193                 if (DEL_LED_XX_MIN == p_task_leds_dta->tick)
 194                 {
 195                     p_task_leds_dta->state = ST_LED_XX_BLINK_OFF;
 196                     p_task_leds_dta->tick = DEL_LED_XX_BLI;
 197                     HAL_GPIO_WritePin(
 198                             p_task_leds_cfg->gpio_port,
 199                             p_task_leds_cfg->pin,
 200                             p_task_leds_cfg->led_off);
 201                 }
 202 
 203                 if (DEL_LED_XX_MIN < p_task_leds_dta->tick)
 204                 {
 205                     p_task_leds_dta->tick--;
 206                 }
 207             break;
 208 
 209             case ST_LED_XX_BLINK_OFF:
 210                 if (true == p_task_leds_dta->flag)
 211                 {
 212                     p_task_leds_dta->flag = false;
 213                     switch(p_task_leds_dta->event)
 214                     {
 215                         case EV_LED_XX_OFF:
 216                             p_task_leds_dta->state = ST_LED_XX_OFF;
 217                             HAL_GPIO_WritePin(
 218                                     p_task_leds_cfg->gpio_port,
 219                                     p_task_leds_cfg->pin,
 220                                     p_task_leds_cfg->led_off);
 221                         break;
 222                         case EV_LED_XX_ON:
 223                             p_task_leds_dta->state = ST_LED_XX_ON;
 224                             HAL_GPIO_WritePin(
 225                                     p_task_leds_cfg->gpio_port,
 226                                     p_task_leds_cfg->pin,
 227                                     p_task_leds_cfg->led_on);
 228                         default:
 229                         break;
 230                     }
 231                 }
 232 
 233                 if (DEL_LED_XX_MIN == p_task_leds_dta->tick)
 234                 {
 235                     p_task_leds_dta->state = ST_LED_XX_BLINK_ON;
 236                     p_task_leds_dta->tick = DEL_LED_XX_BLI;
 237                     HAL_GPIO_WritePin(
 238                             p_task_leds_cfg->gpio_port,
 239                             p_task_leds_cfg->pin,
 240                             p_task_leds_cfg->led_on);
 241                 }
 242 
 243                 if (DEL_LED_XX_MIN < p_task_leds_dta->tick)
 244                 {
 245                     p_task_leds_dta->tick--;
 246                 }
 247             break;
 248 
 249             case ST_LED_XX_PULSE:
 250                 if (DEL_LED_XX_MIN == p_task_leds_dta->tick)
 251                 {
 252                     p_task_leds_dta->state = ST_LED_XX_OFF;
 253                     HAL_GPIO_WritePin(
 254                             p_task_leds_cfg->gpio_port,
 255                             p_task_leds_cfg->pin,
 256                             p_task_leds_cfg->led_off);
 257                 }
 258 
 259                 if (DEL_LED_XX_MIN < p_task_leds_dta->tick)
 260                 {
 261                     p_task_leds_dta->tick--;
 262                 }
 263             break;
 264 
 265             default:
 266                 p_task_leds_dta->tick  = DEL_LED_XX_MIN;
 267                 p_task_leds_dta->state = ST_LED_XX_OFF;
 268                 p_task_leds_dta->event = EV_LED_XX_OFF;
 269                 p_task_leds_dta->flag = false;
 270             break;
 271         }
 272     }
 273 }