firmware-nucleo/App/Src/task_buttons.c (6097B)
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 #include "main.h" 9 10 #include "logger.h" 11 #include "dwt.h" 12 13 #include "app.h" 14 #include "task_buttons_attribute.h" 15 #include "task_system_attribute.h" 16 #include "task_system_interface.h" 17 #include "task_buzzer_attribute.h" 18 #include "task_buzzer_interface.h" 19 20 #define TASK_BTN_TICK_CNT_INI 0ul 21 22 #define DEL_BTN_XX_MIN 0ul 23 #define DEL_BTN_XX_MED 25ul 24 #define DEL_BTN_XX_MAX 50ul 25 26 #define BTN_X_PRESSED GPIO_PIN_RESET 27 #define BTN_X_HOVER GPIO_PIN_SET 28 29 static const task_buttons_cfg_t task_buttons_cfg_list[] = { 30 {ID_BTN_A, BTN_A_GPIO_Port, BTN_A_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_A_IDLE, EV_SYS_BTN_A_ACTIVE}, 31 {ID_BTN_B, BTN_B_GPIO_Port, BTN_B_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_B_IDLE, EV_SYS_BTN_B_ACTIVE}, 32 {ID_BTN_C, BTN_C_GPIO_Port, BTN_C_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_C_IDLE, EV_SYS_BTN_C_ACTIVE}, 33 {ID_BTN_D, BTN_D_GPIO_Port, BTN_D_Pin, BTN_X_PRESSED, DEL_BTN_XX_MAX, EV_SYS_BTN_D_IDLE, EV_SYS_BTN_D_ACTIVE}, 34 }; 35 36 #define BUTTONS_CFG_QTY (sizeof(task_buttons_cfg_list)/sizeof(task_buttons_cfg_t)) 37 38 static task_buttons_dta_t task_buttons_dta_list[] = { 39 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 40 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 41 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 42 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 43 }; 44 45 #define BUTTONS_DTA_QTY (sizeof(task_buttons_dta_list)/sizeof(task_buttons_dta_t)) 46 47 // this variable is incremented by 1 on every ms by HAL_SysTick 48 volatile uint32_t g_task_buttons_tick_cnt; 49 50 // Private functions declaration 51 static void task_buttons_statechart(void); 52 53 void task_buttons_init(void *parameters) 54 { 55 task_buttons_dta_t *p_task_buttons_dta; 56 57 LOGGER_INFO("Initializing `task_buttons`..."); 58 59 for (uint32_t index = 0; BUTTONS_DTA_QTY > index; index++) 60 { 61 p_task_buttons_dta = &task_buttons_dta_list[index]; 62 63 p_task_buttons_dta->tick = DEL_BTN_XX_MIN; 64 p_task_buttons_dta->state = ST_BTN_XX_UP; 65 p_task_buttons_dta->event = EV_BTN_XX_UP; 66 } 67 68 LOGGER_INFO("Done initializing `task_buttons`"); 69 } 70 71 void task_buttons_update(void *parameters) 72 { 73 bool b_time_update_required = false; 74 75 __asm("CPSID i"); 76 if (TASK_BTN_TICK_CNT_INI < g_task_buttons_tick_cnt) 77 { 78 g_task_buttons_tick_cnt--; 79 b_time_update_required = true; 80 } 81 __asm("CPSIE i"); 82 83 while (b_time_update_required) 84 { 85 task_buttons_statechart(); 86 87 __asm("CPSID i"); 88 if (TASK_BTN_TICK_CNT_INI < g_task_buttons_tick_cnt) 89 { 90 g_task_buttons_tick_cnt--; 91 b_time_update_required = true; 92 } 93 else 94 { 95 b_time_update_required = false; 96 } 97 __asm("CPSIE i"); 98 99 } 100 } 101 102 static void task_buttons_statechart(void) 103 { 104 uint32_t index; 105 const task_buttons_cfg_t *p_task_buttons_cfg; 106 task_buttons_dta_t *p_task_buttons_dta; 107 uint8_t button_pin_status; 108 109 for (index = 0; BUTTONS_DTA_QTY > index; index++) 110 { 111 p_task_buttons_cfg = &task_buttons_cfg_list[index]; 112 p_task_buttons_dta = &task_buttons_dta_list[index]; 113 114 button_pin_status = HAL_GPIO_ReadPin(p_task_buttons_cfg->gpio_port, p_task_buttons_cfg->pin); 115 116 if (button_pin_status == p_task_buttons_cfg->pressed) 117 { 118 p_task_buttons_dta->event = EV_BTN_XX_DOWN; 119 } 120 else 121 { 122 p_task_buttons_dta->event = EV_BTN_XX_UP; 123 } 124 125 switch (p_task_buttons_dta->state) 126 { 127 case ST_BTN_XX_UP: 128 if (EV_BTN_XX_DOWN == p_task_buttons_dta->event) 129 { 130 p_task_buttons_dta->state = ST_BTN_XX_FALLING; 131 p_task_buttons_dta->tick = DEL_BTN_XX_MAX; 132 } 133 break; 134 135 case ST_BTN_XX_FALLING: 136 if (EV_BTN_XX_UP == p_task_buttons_dta->event) 137 { 138 if (0 == p_task_buttons_dta->tick) { 139 p_task_buttons_dta->state = ST_BTN_XX_UP; 140 } 141 else 142 { 143 p_task_buttons_dta->tick--; 144 } 145 } 146 147 if (EV_BTN_XX_DOWN == p_task_buttons_dta->event) 148 { 149 if (0 == p_task_buttons_dta->tick) { 150 p_task_buttons_dta->state = ST_BTN_XX_DOWN; 151 task_system_interface_put_event(p_task_buttons_cfg->signal_down); 152 task_buzzer_interface_put_event(EV_BUZ_XX_SHORT_BEEP, ID_BUZ_A); 153 } 154 else 155 { 156 p_task_buttons_dta->tick--; 157 } 158 } 159 break; 160 161 case ST_BTN_XX_DOWN: 162 if (EV_BTN_XX_UP == p_task_buttons_dta->event) 163 { 164 p_task_buttons_dta->state = ST_BTN_XX_RISING; 165 p_task_buttons_dta->tick = DEL_BTN_XX_MAX; 166 } 167 break; 168 169 case ST_BTN_XX_RISING: 170 if (EV_BTN_XX_UP == p_task_buttons_dta->event) 171 { 172 if (0 == p_task_buttons_dta->tick) { 173 task_system_interface_put_event(p_task_buttons_cfg->signal_up); 174 p_task_buttons_dta->state = ST_BTN_XX_UP; 175 } 176 else 177 { 178 p_task_buttons_dta->tick--; 179 } 180 } 181 182 if (EV_BTN_XX_DOWN == p_task_buttons_dta->event) 183 { 184 if (0 == p_task_buttons_dta->tick) { 185 p_task_buttons_dta->state = ST_BTN_XX_DOWN; 186 } 187 p_task_buttons_dta->tick--; 188 } 189 break; 190 default: break; 191 } 192 } 193 }
