/************************************************************************** * * Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file TaskGeneral.c * * @author (last) Dara Navaei * @date (last) 06-Jul-2022 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 * ***************************************************************************/ #include "gio.h" #include "lin.h" #include "AlarmMgmt.h" #include "ConcentratePumps.h" #include "DrainPump.h" #include "Fans.h" #include "Heaters.h" #include "NVDataMgmt.h" #include "OperationModes.h" #include "Reservoirs.h" #include "ROPump.h" #include "RTC.h" #include "Switches.h" #include "SystemComm.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Thermistors.h" #include "UVReactors.h" #include "Voltages.h" #include "WatchdogMgmt.h" /** * @addtogroup TaskGeneral * @{ */ #ifdef TASK_TIMING_OUTPUT_ENABLED #include "mibspi.h" #define TASK_TIMING_TEST_PIN_SPI1_PORT_MASK 0x00000020 // (CS5 - re-purposed as output GPIO) #define SET_TASK_ON() { mibspiREG3->PC3 |= TASK_TIMING_TEST_PIN_SPI1_PORT_MASK; } #define SET_TASK_OFF() { mibspiREG3->PC3 &= ~TASK_TIMING_TEST_PIN_SPI1_PORT_MASK; } #endif /*********************************************************************//** * @brief * The taskGeneral function handles the scheduled general task interrupt. * Calls the executive functions for most monitors and controllers, the * operation modes, the system communications, and alarms. * @details Inputs: none * @details Outputs: Executed all general task functions. * @return none *************************************************************************/ void taskGeneral( void ) { /* Order of exec functions * 1. Comm Rx * 2. Monitors * 3. Op modes * 4. Controllers * 5. Comm Tx * */ #ifdef TASK_TIMING_OUTPUT_ENABLED // SET_TASK_ON(); // TODO - uncomment and define TASK_TIMING_OUTPUT_ENABLED to monitor this tasks timing #endif // check in with watchdog manager checkInWithWatchdogMgmt( TASK_GENERAL ); // do this first to keep timing consistent with watchdog management // manage data received from other sub-systems execSystemCommRx(); // Control and monitor RTC execRTC(); #ifndef BOARD_WITH_NO_HARDWARE // monitor concentrate pumps execConcentratePumpMonitor(); // Monitor DG voltages execVoltagesMonitor(); #endif // run operation mode state machine execOperationModes(); #ifndef BOARD_WITH_NO_HARDWARE // Monitor thermistors state machine execThermistors(); // manage RO pump execROPumpController(); // manage drain pump execDrainPumpController(); // manage concentrate pumps execConcentratePumpController(); // Manage fans controller execFans(); // manage time-based reservoir tasks execReservoirs(); // Manage UV reactors controller execUVReactors(); // Manage switches monitor execSwitches(); // Heaters controller execHeaters(); #endif // Run non-volatile data management state machine that sends the data record // to Dialin execNVDataMgmtProcessRecord(); // Run alarm management execAlarmMgmt(); // manage data to be transmitted to other sub-systems execSystemCommTx(); #ifdef TASK_TIMING_OUTPUT_ENABLED // SET_TASK_OFF(); // TODO - uncomment and define TASK_TIMING_OUTPUT_ENABLED to monitor this tasks timing #endif } /**@}*/