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_buzzer.c (6569B)
   1 /*
   2  * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
   3  *
   4  * See file `LICENSE` for full details
   5  */
   6 
   7 #include "main.h"
   8 
   9 #include "logger.h"
  10 #include "dwt.h"
  11 
  12 #include "app.h"
  13 #include "task_buzzer_attribute.h"
  14 #include "task_buzzer_interface.h"
  15 
  16 #define G_TASK_BUZZER_TICK_CNT_INI 0ul
  17 
  18 #define TICK_INI_MS   0ul
  19 #define BUZZER_FREQ   (1000ul)
  20 #define SHORT_BEEP_MS 35ul
  21 #define LONG_BEEP_MS  500ul
  22 
  23 static const task_buzzer_cfg_t task_buzzer_cfg_list[] = {
  24     {ID_BUZ_A, &htim3, TIM_CHANNEL_1, BUZZER_FREQ, SHORT_BEEP_MS, LONG_BEEP_MS}
  25 };
  26 
  27 #define BUZZER_CFG_QTY (sizeof(task_buzzer_cfg_list)/sizeof(task_buzzer_cfg_t))
  28 
  29 // Private functions declaration
  30 static void task_buzzer_statechart(void);
  31 static uint16_t task_buzzer_freq_to_pres(uint16_t freq);
  32 
  33 // Exported data definition
  34 volatile uint32_t g_task_buzzer_tick_cnt;
  35 task_buzzer_dta_t task_buzzer_dta_list[] = {
  36     {TICK_INI_MS, ST_BUZ_XX_OFF, EV_BUZ_XX_OFF, false},
  37 };
  38 
  39 #define BUZZER_DTA_QTY (sizeof(task_buzzer_dta_list)/sizeof(task_buzzer_dta_t))
  40 
  41 // External functions definition
  42 void task_buzzer_init(void *parameters)
  43 {
  44     uint32_t index;
  45     const task_buzzer_cfg_t *p_task_buzzer_cfg;
  46     task_buzzer_dta_t *p_task_buzzer_dta;
  47 
  48     LOGGER_INFO("Initializing `task_buzzer`...");
  49 
  50     g_task_buzzer_tick_cnt = G_TASK_BUZZER_TICK_CNT_INI;
  51 
  52     for (index = 0; BUZZER_DTA_QTY > index; index++)
  53     {
  54         p_task_buzzer_cfg = &task_buzzer_cfg_list[index];
  55         p_task_buzzer_dta = &task_buzzer_dta_list[index];
  56 
  57         p_task_buzzer_dta->tick = TICK_INI_MS;
  58         p_task_buzzer_dta->state = ST_BUZ_XX_OFF;
  59         p_task_buzzer_dta->event = EV_BUZ_XX_OFF;
  60         p_task_buzzer_dta->event_flag = false;
  61 
  62         __HAL_TIM_SET_PRESCALER(p_task_buzzer_cfg->htim,
  63                 task_buzzer_freq_to_pres(BUZZER_FREQ));
  64 
  65         HAL_TIM_PWM_Stop(p_task_buzzer_cfg->htim, p_task_buzzer_cfg->tim_channel);
  66     }
  67 }
  68 
  69 void task_buzzer_update(void *parameters)
  70 {
  71     bool b_time_update_required = false;
  72 
  73     __asm("CPSID i");
  74     if (G_TASK_BUZZER_TICK_CNT_INI < g_task_buzzer_tick_cnt)
  75     {
  76         g_task_buzzer_tick_cnt--;
  77         b_time_update_required = true;
  78     }
  79     __asm("CPSIE i");
  80 
  81     while (b_time_update_required)
  82     {
  83         task_buzzer_statechart();
  84 
  85         __asm("CPSID i");
  86         if (G_TASK_BUZZER_TICK_CNT_INI < g_task_buzzer_tick_cnt)
  87         {
  88             g_task_buzzer_tick_cnt--;
  89             b_time_update_required = true;
  90         }
  91         else
  92         {
  93             b_time_update_required = false;
  94         }
  95         __asm("CPSIE i");
  96     }
  97 }
  98 
  99 static void task_buzzer_statechart(void)
 100 {
 101     uint32_t index;
 102     const task_buzzer_cfg_t *p_task_buzzer_cfg;
 103     task_buzzer_dta_t *p_task_buzzer_dta;
 104 
 105     for (index = 0; BUZZER_DTA_QTY > index; index++)
 106     {
 107         p_task_buzzer_cfg = &task_buzzer_cfg_list[index];
 108         p_task_buzzer_dta = &task_buzzer_dta_list[index];
 109 
 110         switch (p_task_buzzer_dta->state)
 111         {
 112             case ST_BUZ_XX_OFF:
 113                 if (true == p_task_buzzer_dta->event_flag)
 114                 {
 115                     p_task_buzzer_dta->event_flag = false;
 116                     switch(p_task_buzzer_dta->event)
 117                     {
 118                         case EV_BUZ_XX_SHORT_BEEP:
 119                             p_task_buzzer_dta->tick = SHORT_BEEP_MS;
 120                             p_task_buzzer_dta->state = ST_BUZ_XX_ON;
 121                             HAL_TIM_PWM_Start(p_task_buzzer_cfg->htim,
 122                                     p_task_buzzer_cfg->tim_channel);
 123                         break;
 124 
 125                         case EV_BUZ_XX_LONG_BEEP:
 126                             p_task_buzzer_dta->tick = LONG_BEEP_MS;
 127                             p_task_buzzer_dta->state = ST_BUZ_XX_ON;
 128                             HAL_TIM_PWM_Start(p_task_buzzer_cfg->htim,
 129                                     p_task_buzzer_cfg->tim_channel);
 130                         break;
 131 
 132                         default: break;
 133                     }
 134                 }
 135             break;
 136 
 137             case ST_BUZ_XX_ON:
 138                 if (true == p_task_buzzer_dta->event_flag)
 139                 {
 140                     p_task_buzzer_dta->event_flag = false;
 141                     switch(p_task_buzzer_dta->event)
 142                     {
 143                         case EV_BUZ_XX_SHORT_BEEP:
 144                             p_task_buzzer_dta->tick = SHORT_BEEP_MS;
 145                             p_task_buzzer_dta->state = ST_BUZ_XX_ON;
 146                             HAL_TIM_PWM_Start(p_task_buzzer_cfg->htim,
 147                                     p_task_buzzer_cfg->tim_channel);
 148                         break;
 149 
 150                         case EV_BUZ_XX_LONG_BEEP:
 151                             p_task_buzzer_dta->tick = LONG_BEEP_MS;
 152                             p_task_buzzer_dta->state = ST_BUZ_XX_ON;
 153                             HAL_TIM_PWM_Start(p_task_buzzer_cfg->htim,
 154                                     p_task_buzzer_cfg->tim_channel);
 155                         break;
 156 
 157                         case EV_BUZ_XX_OFF:
 158                         default:
 159                             p_task_buzzer_dta->tick = TICK_INI_MS;
 160                             p_task_buzzer_dta->state = ST_BUZ_XX_OFF;
 161                             HAL_TIM_PWM_Stop(p_task_buzzer_cfg->htim,
 162                                     p_task_buzzer_cfg->tim_channel);
 163                         break;
 164                     }
 165                 }
 166 
 167                 if (0 == p_task_buzzer_dta->tick)
 168                 {
 169                     p_task_buzzer_dta->state = ST_BUZ_XX_OFF;
 170                     HAL_TIM_PWM_Stop(p_task_buzzer_cfg->htim,
 171                             p_task_buzzer_cfg->tim_channel);
 172                 }
 173                 else
 174                 {
 175                     p_task_buzzer_dta->tick--;
 176                 }
 177             break;
 178 
 179             default:
 180                 p_task_buzzer_dta->tick  = TICK_INI_MS;
 181                 p_task_buzzer_dta->state = ST_BUZ_XX_OFF;
 182                 p_task_buzzer_dta->event = EV_BUZ_XX_OFF;
 183                 p_task_buzzer_dta->event_flag = false;
 184                 HAL_TIM_PWM_Start(p_task_buzzer_cfg->htim,
 185                         p_task_buzzer_cfg->tim_channel);
 186             break;
 187         }
 188     }
 189 }
 190 
 191 
 192 // TODO: replace this defines with HAL variables/functions which returns the
 193 // APB1 timer clock and timer 3 auto reload value (if exists)
 194 #define APB1_TIMER_CLOCK 64000000UL
 195 #define TIMER3_ARR       8000UL
 196 
 197 static uint16_t task_buzzer_freq_to_pres(uint16_t freq)
 198 {
 199     if (0 == freq)
 200     {
 201         return 0;
 202     }
 203     return ((APB1_TIMER_CLOCK / (freq * (TIMER3_ARR - 1))) - 1);
 204 }