1 /* 2 * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 23 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * @file : task_sensor.c 33 * @date : Set 26, 2023 34 * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar> 35 * @version v1.0.0 36 */ 37 38 /********************** inclusions *******************************************/ 39 /* Project includes */ 40 #include "main.h" 41 42 /* Demo includes */ 43 #include "logger.h" 44 #include "dwt.h" 45 46 /* Application & Tasks includes */ 47 #include "board.h" 48 #include "app.h" 49 #include "task_sensor_attribute.h" 50 #include "task_system_attribute.h" 51 #include "task_system_interface.h" 52 53 /********************** macros and definitions *******************************/ 54 #define G_TASK_SEN_CNT_INIT 0ul 55 #define G_TASK_SEN_TICK_CNT_INI 0ul 56 57 #define DEL_BTN_XX_MIN 0ul 58 #define DEL_BTN_XX_MED 25ul 59 #define DEL_BTN_XX_MAX 50ul 60 61 /********************** internal data declaration ****************************/ 62 63 const task_sensor_cfg_t task_sensor_cfg_list[] = { 64 {ID_BTN_A, BTN_A_PORT, BTN_A_PIN, BTN_A_PRESSED, 65 DEL_BTN_XX_MAX, EV_SYS_IDLE, EV_SYS_LOOP_DET}, 66 {ID_BTN_B, BTN_B_GPIO_Port, BTN_B_Pin, BTN_A_PRESSED, 67 DEL_BTN_XX_MAX, EV_SYS_IDLE, EV_SYS_LOOP_DET}, 68 {ID_BTN_C, BTN_C_GPIO_Port, BTN_C_Pin, BTN_A_PRESSED, 69 DEL_BTN_XX_MAX, EV_SYS_IDLE, EV_SYS_LOOP_DET}, 70 {ID_BTN_D, BTN_D_GPIO_Port, BTN_D_Pin, BTN_A_PRESSED, 71 DEL_BTN_XX_MAX, EV_SYS_IDLE, EV_SYS_LOOP_DET} 72 }; 73 74 #define SENSOR_CFG_QTY (sizeof(task_sensor_cfg_list)/sizeof(task_sensor_cfg_t)) 75 76 task_sensor_dta_t task_sensor_dta_list[] = { 77 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 78 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 79 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP}, 80 {DEL_BTN_XX_MIN, ST_BTN_XX_UP, EV_BTN_XX_UP} 81 }; 82 83 #define SENSOR_DTA_QTY (sizeof(task_sensor_dta_list)/sizeof(task_sensor_dta_t)) 84 85 /********************** internal functions declaration ***********************/ 86 void task_sensor_statechart(void); 87 88 /********************** internal data definition *****************************/ 89 const char *p_task_sensor = "Task Sensor (Sensor Statechart)"; 90 const char *p_task_sensor_ = "Non-Blocking & Update By Time Code"; 91 92 /********************** external data declaration ****************************/ 93 uint32_t g_task_sensor_cnt; 94 volatile uint32_t g_task_sensor_tick_cnt; 95 96 /********************** external functions definition ************************/ 97 void task_sensor_init(void *parameters) 98 { 99 uint32_t index; 100 task_sensor_dta_t *p_task_sensor_dta; 101 task_sensor_st_t state; 102 task_sensor_ev_t event; 103 104 /* Print out: Task Initialized */ 105 LOGGER_INFO(" "); 106 LOGGER_INFO(" %s is running - %s", GET_NAME(task_sensor_init), p_task_sensor); 107 LOGGER_INFO(" %s is a %s", GET_NAME(task_sensor), p_task_sensor_); 108 109 /* Init & Print out: Task execution counter */ 110 g_task_sensor_cnt = G_TASK_SEN_CNT_INIT; 111 LOGGER_INFO(" %s = %lu", GET_NAME(g_task_sensor_cnt), g_task_sensor_cnt); 112 113 for (index = 0; SENSOR_DTA_QTY > index; index++) 114 { 115 /* Update Task Sensor Data Pointer */ 116 p_task_sensor_dta = &task_sensor_dta_list[index]; 117 118 /* Init & Print out: Index & Task execution FSM */ 119 state = ST_BTN_XX_UP; 120 p_task_sensor_dta->state = state; 121 122 event = EV_BTN_XX_UP; 123 p_task_sensor_dta->event = event; 124 125 LOGGER_INFO(" "); 126 LOGGER_INFO(" %s = %lu %s = %lu %s = %lu", 127 GET_NAME(index), index, 128 GET_NAME(state), (uint32_t)state, 129 GET_NAME(event), (uint32_t)event); 130 } 131 } 132 133 void task_sensor_update(void *parameters) 134 { 135 bool b_time_update_required = false; 136 137 /* Protect shared resource */ 138 __asm("CPSID i"); /* disable interrupts */ 139 if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt) 140 { 141 /* Update Tick Counter */ 142 g_task_sensor_tick_cnt--; 143 b_time_update_required = true; 144 } 145 __asm("CPSIE i"); /* enable interrupts */ 146 147 while (b_time_update_required) 148 { 149 /* Update Task Counter */ 150 g_task_sensor_cnt++; 151 152 /* Run Task Statechart */ 153 task_sensor_statechart(); 154 155 /* Protect shared resource */ 156 __asm("CPSID i"); /* disable interrupts */ 157 if (G_TASK_SEN_TICK_CNT_INI < g_task_sensor_tick_cnt) 158 { 159 /* Update Tick Counter */ 160 g_task_sensor_tick_cnt--; 161 b_time_update_required = true; 162 } 163 else 164 { 165 b_time_update_required = false; 166 } 167 __asm("CPSIE i"); /* enable interrupts */ 168 } 169 } 170 171 void task_sensor_statechart(void) 172 { 173 uint32_t index; 174 uint8_t sensor_pin_status; 175 const task_sensor_cfg_t *p_task_sensor_cfg; 176 task_sensor_dta_t *p_task_sensor_dta; 177 178 for (index = 0; SENSOR_DTA_QTY > index; index++) 179 { 180 /* Update Task Sensor Configuration & Data Pointer */ 181 p_task_sensor_cfg = &task_sensor_cfg_list[index]; 182 p_task_sensor_dta = &task_sensor_dta_list[index]; 183 184 sensor_pin_status = HAL_GPIO_ReadPin(p_task_sensor_cfg->gpio_port, p_task_sensor_cfg->pin); 185 if (sensor_pin_status == p_task_sensor_cfg->pressed) 186 { 187 p_task_sensor_dta->event = EV_BTN_XX_DOWN; 188 } 189 else 190 { 191 p_task_sensor_dta->event = EV_BTN_XX_UP; 192 } 193 194 switch (p_task_sensor_dta->state) 195 { 196 case ST_BTN_XX_UP: 197 if (EV_BTN_XX_DOWN == p_task_sensor_dta->event) 198 { 199 p_task_sensor_dta->state = ST_BTN_XX_FALLING; 200 p_task_sensor_dta->tick = DEL_BTN_XX_MAX; 201 } 202 break; 203 204 case ST_BTN_XX_FALLING: 205 if (EV_BTN_XX_UP == p_task_sensor_dta->event) 206 { 207 if (0 == p_task_sensor_dta->tick) { 208 p_task_sensor_dta->state = ST_BTN_XX_UP; 209 } 210 211 if (p_task_sensor_dta->tick > 0) { 212 p_task_sensor_dta->state = ST_BTN_XX_FALLING; 213 p_task_sensor_dta->tick--; 214 } 215 } 216 217 if (EV_BTN_XX_DOWN == p_task_sensor_dta->event) 218 { 219 if (0 == p_task_sensor_dta->tick) { 220 p_task_sensor_dta->state = ST_BTN_XX_DOWN; 221 put_event_task_system(p_task_sensor_cfg->signal_down); 222 } 223 224 if (p_task_sensor_dta->tick > 0) { 225 p_task_sensor_dta->tick--; 226 } 227 } 228 break; 229 230 case ST_BTN_XX_DOWN: 231 if (EV_BTN_XX_UP == p_task_sensor_dta->event) 232 { 233 p_task_sensor_dta->state = ST_BTN_XX_RISING; 234 p_task_sensor_dta->tick = DEL_BTN_XX_MAX; 235 } 236 break; 237 238 case ST_BTN_XX_RISING: 239 if (EV_BTN_XX_UP == p_task_sensor_dta->event) 240 { 241 if (0 == p_task_sensor_dta->tick) { 242 put_event_task_system(p_task_sensor_cfg->signal_up); 243 p_task_sensor_dta->state = ST_BTN_XX_UP; 244 } 245 246 if (p_task_sensor_dta->tick > 0) { 247 p_task_sensor_dta->tick--; 248 } 249 } 250 251 if (EV_BTN_XX_DOWN == p_task_sensor_dta->event) 252 { 253 if (0 == p_task_sensor_dta->tick) { 254 p_task_sensor_dta->state = ST_BTN_XX_DOWN; 255 } 256 257 if (p_task_sensor_dta->tick > 0) { 258 p_task_sensor_dta->tick--; 259 } 260 } 261 break; 262 263 default: 264 p_task_sensor_dta->tick = DEL_BTN_XX_MIN; 265 p_task_sensor_dta->state = ST_BTN_XX_UP; 266 p_task_sensor_dta->event = EV_BTN_XX_UP; 267 break; 268 } 269 } 270 } 271 272 /********************** end of file ******************************************/
