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 }
