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 "board.h" 14 #include "app.h" 15 #include "task_system_attribute.h" 16 #include "task_system_interface.h" 17 #include "task_actuator_attribute.h" 18 #include "task_actuator_interface.h" 19 20 #define G_TASK_SYS_CNT_INI 0ul 21 #define G_TASK_SYS_TICK_CNT_INI 0ul 22 23 #define G_LED_PERIOD_MS 2000ul 24 #define G_LED_T_ON_MS 1500ul 25 26 task_system_dta_t task_system_dta = { 27 G_LED_PERIOD_MS, ST_SYS_LED_ON 28 }; 29 30 #define SYSTEM_DTA_QTY (sizeof(task_system_dta)/sizeof(task_system_dta_t)) 31 32 void task_system_statechart(void); 33 34 uint32_t g_task_system_cnt; 35 36 // this is updated every ms by the HAL_SysTick 37 volatile uint32_t g_task_system_tick_cnt; 38 39 void task_system_init(void *parameters) 40 { 41 task_system_dta_t *p_task_system_dta; 42 task_system_st_t state; 43 // task_system_ev_t event; 44 // bool b_event; 45 46 LOGGER_INFO("Initializing `task_system`..."); 47 48 g_task_system_cnt = G_TASK_SYS_CNT_INI; 49 50 init_queue_event_task_system(); 51 52 p_task_system_dta = &task_system_dta; 53 54 state = ST_SYS_LED_ON; 55 p_task_system_dta->state = state; 56 57 LOGGER_INFO("Done initializing `task_system`"); 58 } 59 60 void task_system_update(void *parameters) 61 { 62 bool b_time_update_required = false; 63 64 __asm("CPSID i"); 65 if (G_TASK_SYS_TICK_CNT_INI < g_task_system_tick_cnt) 66 { 67 g_task_system_tick_cnt--; 68 b_time_update_required = true; 69 } 70 __asm("CPSIE i"); 71 72 while (b_time_update_required) 73 { 74 // increment task tick counter 75 g_task_system_cnt++; 76 77 task_system_statechart(); 78 79 __asm("CPSID i"); 80 if (G_TASK_SYS_TICK_CNT_INI < g_task_system_tick_cnt) 81 { 82 g_task_system_tick_cnt--; 83 b_time_update_required = true; 84 } 85 else 86 { 87 b_time_update_required = false; 88 } 89 __asm("CPSIE i"); 90 } 91 } 92 93 void task_system_statechart(void) 94 { 95 task_system_dta_t *p_task_system_dta = &task_system_dta; 96 97 /* 98 // system events unused 99 100 if (true == any_event_task_system()) 101 { 102 p_task_system_dta->flag = true; 103 p_task_system_dta->event = get_event_task_system(); 104 } 105 */ 106 107 switch (p_task_system_dta->state) 108 { 109 case ST_SYS_LED_ON: 110 111 if (G_LED_T_ON_MS < g_task_system_cnt) 112 { 113 put_event_task_actuator(EV_LED_OFF, ID_LED_A); 114 p_task_system_dta->state = ST_SYS_LED_OFF; 115 } 116 117 break; 118 119 case ST_SYS_LED_OFF: 120 121 if (G_LED_PERIOD_MS < g_task_system_cnt) 122 { 123 g_task_system_cnt = G_TASK_SYS_CNT_INI; 124 put_event_task_actuator(EV_LED_ON, ID_LED_A); 125 p_task_system_dta->state = ST_SYS_LED_ON; 126 } 127 128 break; 129 130 default: 131 132 p_task_system_dta->tick = 0; 133 p_task_system_dta->state = ST_SYS_LED_ON; 134 135 break; 136 } 137 }
