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_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 }