Index: firmware/App/Controllers/FluidLeak.c =================================================================== diff -u -rf9faa852e6768e386171a1ca3b8337f88cdc3e82 -r136fcc50a87793eeb55b20031f3d12b24fa16d81 --- firmware/App/Controllers/FluidLeak.c (.../FluidLeak.c) (revision f9faa852e6768e386171a1ca3b8337f88cdc3e82) +++ firmware/App/Controllers/FluidLeak.c (.../FluidLeak.c) (revision 136fcc50a87793eeb55b20031f3d12b24fa16d81) @@ -32,21 +32,20 @@ // ********** private definitions ********** -#define FLUID_LEAK_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the fluid leak data is published on the CAN bus. -#define FLUID_LEAK_DETECTED 1 ///< Fluid leak detected state +#define FLUID_LEAK_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the fluid leak data is published on the CAN bus. // ********** private data ********** -static U32 fluidLeakDataPublicationTimerCounter = 0; ///< Used to schedule fluid leak data publication to CAN bus. +static U32 fluidLeakStatePublicationTimerCounter = 0; ///< Timer counter used to schedule fluid leak publication to CAN bus. /// Interval (in ms) at which to publish fluid leak data to CAN bus. -static OVERRIDE_U32_T fluidLeakDataPublishInterval = { FLUID_LEAK_DATA_PUB_INTERVAL, FLUID_LEAK_DATA_PUB_INTERVAL, 0, 0 }; -static OVERRIDE_U32_T fluidLeakStates[ NUM_OF_FLUID_LEAK_DETECTORS ]; ///< Detected fluid leak state for each fluid leak detector. +static OVERRIDE_U32_T fluidLeakStatePublishInterval = { FLUID_LEAK_PUB_INTERVAL, FLUID_LEAK_PUB_INTERVAL, 0, 0 }; +static OVERRIDE_U32_T fluidLeakState; ///< Detected fluid leak state for fluid leak detector. // ********** private function prototypes ********** -static void publishFluidLeakData( void ); -static U32 getPublishFluidLeakDataInterval( void ); +static void publishFluidLeakState( void ); +static U32 getPublishFluidLeakStateInterval( void ); /*********************************************************************//** * @brief @@ -57,375 +56,114 @@ *************************************************************************/ void initFluidLeak( void ) { - resetAirTrap(); - airTrapSelfTestState = AIR_TRAP_SELF_TEST_STATE_START; - airTrapIllegalLevelSensorsCtr = 0; + fluidLeakState.data = FLUID_LEAK_STATE_DRY; } /*********************************************************************//** * @brief - * The resetAirTrap function resets certain parts of the air trap module - * between treatments. - * @details Inputs: none - * @details Outputs: Air Trap module reset. + * The execFluidLeak function executes the fluid leak monitor. + * @details Inputs: FPGA fluid leak state GPIO pin state + * @details Outputs: fluidLeakState * @return none *************************************************************************/ -void resetAirTrap( void ) +void execFluidLeak( void ) { - airTrapControllerState = AIR_TRAP_INIT_STATE; - pendingStartAirTrapController = FALSE; - pendingStopAirTrapController = FALSE; -} - -/*********************************************************************//** - * @brief - * The startAirTrapControl function requests a start to air trap control. - * @details Inputs: airTrapControllerState - * @details Outputs: pendingStartAirTrapController - * @return none - *************************************************************************/ -void startAirTrapControl( void ) -{ - if ( FALSE == isAirTrapControlling() ) - { - pendingStartAirTrapController = TRUE; - } -} - -/*********************************************************************//** - * @brief - * The endAirTrapControl function requests a stop to air trap control. - * @details Inputs: airTrapControllerState - * @details Outputs: pendingStopAirTrapController - * @return none - *************************************************************************/ -void endAirTrapControl( void ) -{ - if ( TRUE == isAirTrapControlling() ) - { - pendingStopAirTrapController = TRUE; - setValveAirTrap( STATE_CLOSED ); // Always exit air trap valve control w/ valve closed. - } -} - -/*********************************************************************//** - * @brief - * The isAirTrapControlling function determines whether the air trap is - * currently controlling. - * @details Inputs: airTrapControllerState - * @details Outputs: none - * @return TRUE if air trap is currently controlling, FALSE if not. - *************************************************************************/ -BOOL isAirTrapControlling( void ) -{ - BOOL result = FALSE; - - if ( airTrapControllerState >= AIR_TRAP_VALVE_CLOSED_STATE ) - { - result = TRUE; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The execAirTrapMonitor function executes the air trap monitor. - * @details Inputs: FPGA air trap levels GPIO pin levels, airTrapIllegalLevelSensorsCtr - * @details Outputs: airTrapLevels[], airTrapIllegalLevelSensorsCtr - * @return none - *************************************************************************/ -void execAirTrapMonitor( void ) -{ BOOL state; - // Get latest level readings + // Get latest state readings getFPGAFluidLeakState( &state ); - airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_LOWER ].data = (U32)( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); - airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_UPPER ].data = (U32)( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); - // Check level readings are valid - if ( FLUID_LEAK_DETECTED == getFluidLeakState( ) + // Check state readings and act upon + if ( FLUID_LEAK_STATE_WET == getFluidLeakState() ) { - activateAlarmNoData( ALARM_ID_HD_FLUID_LEAK_DETECTED ); } else { - if ( airTrapIllegalLevelSensorsCtr > 0 ) - { - airTrapIllegalLevelSensorsCtr--; - } + // Do nothing } -} -/*********************************************************************//** - * @brief - * The execAirTrapMonitorPriming function executes the air trap monitor - * for cartridge priming during pre-treatment mode. - * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr - * @details Outputs: airTrapFillAlarmCtr - * @return none - *************************************************************************/ -void execAirTrapMonitorPriming( void ) -{ - // TODO - Implement when priming sub-mode of pre-treatment mode is implemented. - // ActivateAlarmNoData( ALARM_ID_AIR_TRAP_FILL_DURING_PRIME ); + // Publish fluid leak state if due + publishFluidLeakState(); } /*********************************************************************//** * @brief - * The execAirTrapMonitorTreatment function executes the air trap monitor - * for treatment mode. - * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr - * @details Outputs: airTrapFillAlarmCtr - * @return none - *************************************************************************/ -void execAirTrapMonitorTreatment( void ) -{ - // Check air trap fill timeout during treatment - if ( AIR_TRAP_VALVE_OPEN_STATE == airTrapControllerState ) - { - F32 bldFlowRate = (F32)getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); // Function will never return zero - F32 fillTimeoutMS = ( VENOUS_LINE_VOLUME_ML / bldFlowRate ) * (F32)SEC_PER_MIN * (F32)MS_PER_SECOND; - - if ( TRUE == didTimeout( fillStartTime, fillTimeoutMS ) ) - { -#ifndef DISABLE_AIR_TRAP_LEVELING - activateAlarmNoData( ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT ); -#endif - } - } -} - -/*********************************************************************//** - * @brief - * The execAirTrapController function executes the air trap control state machine. - * @details Inputs: airTrapControllerState - * @details Outputs: airTrapControllerState - * @return none - *************************************************************************/ -void execAirTrapController( void ) -{ - // If we have faulted, close valve and go to manual control - if ( MODE_FAUL == getCurrentOperationMode() ) - { - airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; - pendingStartAirTrapController = FALSE; - } - - // Execute air trap state machine - switch( airTrapControllerState ) - { - case AIR_TRAP_INIT_STATE: - airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; - break; - - case AIR_TRAP_MANUAL_CONTROL_STATE: - airTrapControllerState = handleAirTrapManualControlState(); - break; - - case AIR_TRAP_VALVE_CLOSED_STATE: - airTrapControllerState = handleAirTrapValveClosedState(); - break; - - case AIR_TRAP_VALVE_OPEN_STATE: - airTrapControllerState = handleAirTrapValveOpenState(); - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_AIR_TRAP_INVALID_STATE, (U32)airTrapControllerState ) - airTrapControllerState = AIR_TRAP_INIT_STATE; - break; - } - - // Publish air trap data if due - publishAirTrapData(); -} - -/*********************************************************************//** - * @brief - * The handleAirTrapManualControlState function handles the manual control - * state of the air trap. - * @details Inputs: pendingStartAirTrapController + * The getFluidLeakState function gets the current reading for the fluid + * leak detector. + * @details Inputs: fluidLeakState * @details Outputs: none - * @return next state + * @param none + * @return the current fluid leak state. *************************************************************************/ -static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ) +FLUID_LEAK_STATES_T getFluidLeakState( void ) { - AIR_TRAP_STATE_T result = AIR_TRAP_MANUAL_CONTROL_STATE; + FLUID_LEAK_STATES_T result = FLUID_LEAK_STATE_DRY; - // Transition to valve control states when requested - if ( TRUE == pendingStartAirTrapController ) + result = (FLUID_LEAK_STATES_T)fluidLeakState.data; + if ( OVERRIDE_KEY == fluidLeakState.override ) { - pendingStartAirTrapController = FALSE; - setValveAirTrap( STATE_CLOSED ); - result = AIR_TRAP_VALVE_CLOSED_STATE; + result = (AIR_TRAP_LEVELS_T)fluidLeakState.ovData; } return result; } /*********************************************************************//** * @brief - * The handleAirTrapValveClosedState function handles the valve closed state - * of the air trap. - * @details Inputs: pendingStopAirTrapController, airTrapLevels[] - * @details Outputs: none - * @return next state - *************************************************************************/ -static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ) -{ - AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; - - // Transition to manual valve control state when requested - if ( TRUE == pendingStopAirTrapController ) - { - pendingStopAirTrapController = FALSE; - result = AIR_TRAP_MANUAL_CONTROL_STATE; - } - // Transition to open valve state when air detected at lower level - else if ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) - { - setValveAirTrap( STATE_OPEN ); - fillStartTime = getMSTimerCount(); - result = AIR_TRAP_VALVE_OPEN_STATE; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handleAirTrapValveOpenState function handles the valve open state of - * the air trap. - * @details Inputs: pendingStopAirTrapController, airTrapLevels[] - * @details Outputs: none - * @return next state - *************************************************************************/ -static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ) -{ - AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_OPEN_STATE; - - // Transition to manual valve control state when requested - if ( TRUE == pendingStopAirTrapController ) - { - pendingStopAirTrapController = FALSE; - result = AIR_TRAP_MANUAL_CONTROL_STATE; - } - // Transition to closed valve state when fluid detected at upper level - else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) - { - setValveAirTrap( STATE_CLOSED ); - result = AIR_TRAP_VALVE_CLOSED_STATE; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The getAirTrapLevel function gets the current reading for the given - * level sensor. - * @details Inputs: airTrapLevels[] - * @details Outputs: none - * @param sensor ID of level sensor to get reading for - * @return the current level sensor reading for the given sensor (air or fluid). - *************************************************************************/ -AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ) -{ - AIR_TRAP_LEVELS_T result; - - if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) - { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].data; - if ( OVERRIDE_KEY == airTrapLevels[ sensor ].override ) - { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].ovData; - } - } - else - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_AIR_TRAP_INVALID_LEVEL_SENSOR, (U32)sensor ) - result = AIR_TRAP_LEVEL_AIR; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The getPublishAirTrapDataInterval function gets the air trap data + * The getPublishFluidLeakStateInterval function gets the fluid leak state * publication interval. - * @details Inputs: airTrapDataPublishInterval + * @details Inputs: fluidLeakStatePublishInterval * @details Outputs: none - * @return the current air trap data publication interval (in task intervals). + * @return the current fluid leak state publication interval (in task intervals). *************************************************************************/ -static U32 getPublishAirTrapDataInterval( void ) +static U32 getPublishFluidLeakStateInterval( void ) { - U32 result = airTrapDataPublishInterval.data; + U32 result = fluidLeakStatePublishInterval.data; - if ( OVERRIDE_KEY == airTrapDataPublishInterval.override ) + if ( OVERRIDE_KEY == fluidLeakStatePublishInterval.override ) { - result = airTrapDataPublishInterval.ovData; + result = fluidLeakStatePublishInterval.ovData; } return result; } /*********************************************************************//** * @brief - * The publishAirTrapData function publishes air trap data at the set interval. - * @details Inputs: airTrapLevels[] - * @details Outputs: if broadcast is due, send air trap data + * The publishFluidLeakState function publishes fluid leak state at the set interval. + * @details Inputs: fluidLeakState + * @details Outputs: if broadcast is due, send fluid leak state * @return none *************************************************************************/ -static void publishAirTrapData( void ) +static void publishFluidLeakState( void ) { - // Publish air trap data on interval - if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) + // Publish fluid leak state on interval + if ( ++fluidLeakStatePublicationTimerCounter >= getPublishFluidLeakStateInterval() ) { - AIR_TRAP_LEVELS_T lowLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); - AIR_TRAP_LEVELS_T highLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + FLUID_LEAK_STATES_T state = getFluidLeakState(); - broadcastAirTrapData( lowLevel, highLevel ); - airTrapDataPublicationTimerCounter = 0; + broadcastFluidLeakState( state ); + fluidLeakStatePublicationTimerCounter = 0; } } -/*********************************************************************//** - * @brief - * The execAirTrapTest function executes the state machine for the air trap - * self-test. - * @details Inputs: none - * @details Outputs: none - * @return the current state of the PresOccl self-test. - *************************************************************************/ -SELF_TEST_STATUS_T execAirTrapTest( void ) -{ - SELF_TEST_STATUS_T status = SELF_TEST_STATUS_PASSED; - // TODO - Implement POST - - return status; -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief - * The testSetAirTrapDataPublishIntervalOverride function overrides the - * air trap data publish interval. + * The testSetFluidLeakStatePublishIntervalOverride function overrides the + * fluid leak state publish interval. * @details Inputs: none - * @details Outputs: airTrapDataPublishInterval - * @param value override air trap data publish interval with (in ms) + * @details Outputs: fluidLeakStatePublishInterval + * @param value override fluid leak state publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetAirTrapDataPublishIntervalOverride( U32 value ) +BOOL testSetFluidLeakStatePublishIntervalOverride( U32 value ) { BOOL result = FALSE; @@ -434,56 +172,56 @@ U32 intvl = value / TASK_GENERAL_INTERVAL; result = TRUE; - airTrapDataPublishInterval.ovData = intvl; - airTrapDataPublishInterval.override = OVERRIDE_KEY; + fluidLeakStatePublishInterval.ovData = intvl; + fluidLeakStatePublishInterval.override = OVERRIDE_KEY; } return result; } /*********************************************************************//** * @brief - * The testResetAirTrapDataPublishIntervalOverride function resets the override - * of the air trap data publish interval. + * The testResetFluidLeakStatePublishIntervalOverride function resets the override + * of the fluid leak state publish interval. * @details Inputs: none - * @details Outputs: airTrapDataPublishInterval + * @details Outputs: fluidLeakStatePublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ -BOOL testResetAirTrapDataPublishIntervalOverride( void ) +BOOL testResetFluidLeakStatePublishIntervalOverride( void ) { BOOL result = FALSE; if ( TRUE == isTestingActivated() ) { result = TRUE; - airTrapDataPublishInterval.override = OVERRIDE_RESET; - airTrapDataPublishInterval.ovData = airTrapDataPublishInterval.ovInitData; + fluidLeakStatePublishInterval.override = OVERRIDE_RESET; + fluidLeakStatePublishInterval.ovData = fluidLeakStatePublishInterval.ovInitData; } return result; } /*********************************************************************//** * @brief - * The testSetAirTrapLevelOverride function overrides the measured level - * for a given level sensor. + * The testSetFluidLeakStateOverride function overrides the state + * of the fluid leak detector. * @details Inputs: none - * @details Outputs: airTrapLevels[] - * @param sensor ID of level sensor to override - * @param level override level sensor with this + * @details Outputs: fluidLeakState + * @param none + * @param state override fluid leak detector with this * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ) +BOOL testSetFluidLeakStateOverride( FLUID_LEAK_STATES_T state ) { BOOL result = FALSE; - if ( ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) && ( level < NUM_OF_AIR_TRAP_LEVELS ) ) + if ( ( state < NUM_OF_FLUID_LEAK_STATES ) ) { if ( TRUE == isTestingActivated() ) { result = TRUE; - airTrapLevels[ sensor ].ovData = (U32)level; - airTrapLevels[ sensor ].override = OVERRIDE_KEY; + fluidLeakState.ovData = (U32)state; + fluidLeakState.override = OVERRIDE_KEY; } } @@ -492,25 +230,22 @@ /*********************************************************************//** * @brief - * The testResetAirTrapLevelOverride function resets the override of the - * level sensor. + * The testResetFluidLeakStateOverride function resets the override of the + * fluid leak detector. * @details Inputs: none - * @details Outputs: airTrapLevels[] - * @param sensor ID of level sensor to reset override + * @details Outputs: fluidLeakState + * @param none * @return TRUE if reset successful, FALSE if not *************************************************************************/ -BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ) +BOOL testResetFluidLeakStateOverride( void ) { BOOL result = FALSE; - if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) + if ( TRUE == isTestingActivated() ) { - if ( TRUE == isTestingActivated() ) - { - result = TRUE; - airTrapLevels[ sensor ].override = OVERRIDE_RESET; - airTrapLevels[ sensor ].ovData = airTrapLevels[ sensor ].ovInitData; - } + result = TRUE; + fluidLeakState.override = OVERRIDE_RESET; + fluidLeakState.ovData = fluidLeakState.ovInitData; } return result; Index: firmware/App/Controllers/FluidLeak.h =================================================================== diff -u -rf9faa852e6768e386171a1ca3b8337f88cdc3e82 -r136fcc50a87793eeb55b20031f3d12b24fa16d81 --- firmware/App/Controllers/FluidLeak.h (.../FluidLeak.h) (revision f9faa852e6768e386171a1ca3b8337f88cdc3e82) +++ firmware/App/Controllers/FluidLeak.h (.../FluidLeak.h) (revision 136fcc50a87793eeb55b20031f3d12b24fa16d81) @@ -42,13 +42,12 @@ // ********** public function prototypes ********** void initFluidLeak( void ); -void execFluidLeakMonitor( void ); -void resetFluidLeak( void ); +void execFluidLeak( void ); -FLUID_LEAK_STATES_T getFluidLeakState( FLUID_LEAK_STATE_DETECTORS_T detector ); +FLUID_LEAK_STATES_T getFluidLeakState( void ); -BOOL testSetFluidLeakDataPublishIntervalOverride( U32 value ); -BOOL testResetFluidLeakDataPublishIntervalOverride( void ); +BOOL testSetFluidLeakStatePublishIntervalOverride( U32 value ); +BOOL testResetFluidLeakStatePublishIntervalOverride( void ); BOOL testSetFluidLeakStateOverride( FLUID_LEAK_STATES_T state ); BOOL testResetFluidLeakStateOverride( void ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rf9faa852e6768e386171a1ca3b8337f88cdc3e82 -r136fcc50a87793eeb55b20031f3d12b24fa16d81 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision f9faa852e6768e386171a1ca3b8337f88cdc3e82) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 136fcc50a87793eeb55b20031f3d12b24fa16d81) @@ -34,7 +34,8 @@ #include "SystemComm.h" #include "SystemCommMessages.h" #include "Utilities.h" -#include "Valves.h" +#include "Valves.h" +#include "FluidLeak.h" #include "WatchdogMgmt.h" /** @@ -1262,10 +1263,38 @@ /***********************************************************************//** * @brief - * The broadcastAirTrapData function constructs an HD air trap data msg to \n + * The broadcastFluidLeakState function constructs an HD air trap data msg to \n + * be broadcasted and queues the msg for transmit on the appropriate CAN channel. + * @details Inputs: none + * @details Outputs: fluid leak state msg constructed and queued + * @param state fluid leak state + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastFluidLeakState( FLUID_LEAK_STATES_T state ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + + // Create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_AIR_TRAP_DATA; + msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ); + + memcpy( payloadPtr, &state, sizeof( U32 ) ); + + // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + +/***********************************************************************//** + * @brief + * The broadcastPrimeData function constructs a prime data msg to \n * be broadcast and queues the msg for transmit on the appropriate CAN channel. * @details Inputs: none - * @details Outputs: air trap data msg constructed and queued + * @details Outputs: prime data msg constructed and queued * @param primeDataPtr prime data record pointer * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ Index: firmware/source/sys_main.c =================================================================== diff -u -r30f049651877229042e3f8700c8596e5b9a1e0f4 -r136fcc50a87793eeb55b20031f3d12b24fa16d81 --- firmware/source/sys_main.c (.../sys_main.c) (revision 30f049651877229042e3f8700c8596e5b9a1e0f4) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 136fcc50a87793eeb55b20031f3d12b24fa16d81) @@ -84,6 +84,7 @@ #include "TaskBG.h" #include "Timers.h" #include "Valves.h" +#include "FluidLeak.h" #include "WatchdogMgmt.h" static void initProcessor( void ); @@ -189,6 +190,7 @@ initDialInFlow(); initDialOutFlow(); initValves(); + initFluidLeak(); // Initialize modes initOperationModes(); // Initialize async interrupt handlers