LCOV - code coverage report
Current view: top level - App/Src - sysManager.cpp (source / functions) Coverage Total Hit
Test: filtered_coverage.info Lines: 60.8 % 51 31
Test Date: 2026-03-21 17:55:27 Functions: 75.0 % 4 3

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

Generated by: LCOV version 2.0-1