Line data Source code
1 : // standard includes
2 : #include <string.h>
3 : #include <stdint.h>
4 : #include <stdbool.h>
5 :
6 : // Application include
7 : #include "appSensorRead.hpp"
8 : #include "appLogger.hpp"
9 : #include "sysManager.hpp"
10 :
11 : namespace FreeRTOS_Cpp
12 : {
13 2 : systemManager::systemManager(IRTOS* rtos, IHardware* hw, appSensorRead* sensorTask,
14 2 : void* sysEvents, void* wdgEvents, void* watchDog_Handle)
15 2 : : _rtos(rtos), _hw(hw), _sensorTask(sensorTask),
16 2 : _sysEvents(sysEvents), _wdgEvents(wdgEvents),
17 2 : _watchDog_Handle(watchDog_Handle), currentState(SYS_STATE_INIT_HARDWARE)
18 : {
19 :
20 2 : }
21 :
22 : /* sysManager.cpp */
23 :
24 1 : void systemManager::reportInitFailure(uint8_t sensorStatus, uint8_t qspiStatus)
25 : {
26 : // Use independent 'if' blocks to report all current failures
27 1 : if ((sensorStatus & _sensorTask->getTempSensorID()) == 0U)
28 : {
29 1 : appLogger::logMessage("Temperature Sensor Initialization Failed!\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
30 : }
31 :
32 : // FIXED: Corrected ID check for Humidity
33 1 : if ((sensorStatus & _sensorTask->getHumiditySensorID()) == 0U)
34 : {
35 0 : appLogger::logMessage("Humidity Sensor Initialization Failed!\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
36 : }
37 :
38 1 : if (qspiStatus == 0U) // pdFAIL is usually 0
39 : {
40 0 : appLogger::logMessage("QSPI Initialization Failed!\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
41 : }
42 1 : }
43 :
44 2 : void systemManager::handleHardwareInit(void)
45 : {
46 2 : appLogger::logMessage("Starting Hardware Init...\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
47 :
48 : /* 1. Init Watchdog FIRST so storageBulkErase can safely pet it */
49 2 : uint32_t iwdgInitStatus = _hw->watchdog_Init(_watchDog_Handle);
50 :
51 : /* The Power-On Reset (POR) Delay
52 : Give the physical I2C sensors 200ms to boot up and stabilize
53 : their logic before we start probing the I2C bus. */
54 2 : _rtos->delay(200);
55 2 : _hw->watchdog_refresh(_watchDog_Handle); // Pet the dog while we wait!
56 :
57 : /* 2. Init Sensors */
58 2 : uint8_t sensorInitStatus = _sensorTask->appSensorRead_Init();
59 :
60 : /* 3. Init Storage */
61 2 : appLogger::storageInitStatus = appLogger::instance->storageInit();
62 :
63 : /* Combined Success Check */
64 2 : uint32_t sensorMask = (_sensorTask->getTempSensorID() | _sensorTask->getHumiditySensorID());
65 :
66 2 : if (((sensorInitStatus & sensorMask) == sensorMask) &&
67 1 : (appLogger::storageInitStatus) && (!iwdgInitStatus))
68 : {
69 1 : currentState = SYS_STATE_OPERATIONAL;
70 1 : appLogger::logMessage("Hardware Init successful\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
71 :
72 1 : _rtos->clearEventBits(_sysEvents, EVENT_BIT_INIT_FAILED | EVENT_BIT_FAULT_DETECTED);
73 1 : _rtos->setEventBits(_sysEvents, EVENT_BIT_INIT_SUCCESS);
74 : }
75 : else
76 : {
77 1 : reportInitFailure(sensorInitStatus, appLogger::storageInitStatus);
78 1 : appLogger::logMessage("Hardware Initialization Failed!\r\n", sAPPLOGGER_EVENT_CODE_PRINT_MESSAGE);
79 :
80 1 : currentState = SYS_STATE_FAULT;
81 1 : _rtos->setEventBits(_sysEvents, EVENT_BIT_INIT_FAILED);
82 : }
83 2 : }
84 :
85 0 : void systemManager::systemManagerTask(void *pvParameters)
86 : {
87 0 : systemManager* self = static_cast<systemManager*>(pvParameters);
88 :
89 0 : self->currentState = SYS_STATE_INIT_HARDWARE;
90 :
91 : while(1) {
92 0 : switch(self->currentState) {
93 0 : case SYS_STATE_INIT_HARDWARE:
94 0 : self->handleHardwareInit();
95 :
96 0 : break;
97 :
98 0 : case SYS_STATE_OPERATIONAL:
99 :
100 : //vTaskDelay(SYS_MANAGER_SLEEP_DURATION); // Run check loop every 1s
101 0 : break;
102 :
103 0 : case SYS_STATE_FAULT:
104 : //vTaskDelay(SYS_MANAGER_SLEEP_DURATION);
105 0 : break;
106 :
107 0 : default:
108 : /* Defensive: handle unknown states */
109 0 : break;
110 : }
111 :
112 0 : uint32_t uxBits = self->_rtos->WaitBits(
113 : self->_wdgEvents,
114 : WATCHDOG_MANDATORY_BITMASK,
115 : true, /* Clear bits on exit so they must report again */
116 : true, /* Wait for ALL bits */
117 : (IWDG_TIMEOUT_ms)
118 : );
119 :
120 0 : if ((uxBits & WATCHDOG_MANDATORY_BITMASK) == WATCHDOG_MANDATORY_BITMASK) {
121 : /* All tasks are healthy! Pet the hardware dog. */
122 0 : self->_hw->watchdog_refresh(self->_watchDog_Handle);
123 : } else {
124 : /* * If we reach here, at least one task is hung!
125 : * Do NOT refresh the IWDG. Let the hardware reset the MCU.
126 : */
127 0 : appLogger::logMessage("CRITICAL: Task Hang Detected! Starving Watchdog...\r\n",
128 : sAPPLOGGER_EVENT_CODE_LOG_ERROR);
129 : }
130 0 : }
131 : }
132 : }
|