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 }
