Index: firmware/App/Controllers/Valves.c =================================================================== diff -u -rcff72ec53660ec3ff6775c0508e3c721240ffba2 -r6f2991204047ccbceeb5461f7c35af6d8f5dfd0b --- firmware/App/Controllers/Valves.c (.../Valves.c) (revision cff72ec53660ec3ff6775c0508e3c721240ffba2) +++ firmware/App/Controllers/Valves.c (.../Valves.c) (revision 6f2991204047ccbceeb5461f7c35af6d8f5dfd0b) @@ -18,7 +18,8 @@ #include "FPGA.h" #include "MessageSupport.h" #include "SystemCommMessages.h" -#include "TaskPriority.h" +#include "TaskPriority.h" +#include "Timers.h" #include "Valves.h" /** @@ -28,14 +29,25 @@ // ********** private definitions ********** -#define DEENERGIZED 0 ///< 0 for de-energized valve. -#define ENERGIZED 1 ///< 1 for energized valve. -#define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. +#define DEENERGIZED 0 ///< 0 for de-energized valve. +#define ENERGIZED 1 ///< 1 for energized valve. +#define ALL_VALVES_DEENERGIZED 0x0000 ///< 0 in U16 bit field for all valves. -#define MAX_VALVE_STATE_MISMATCH_COUNT 3 ///< Maximum number of times commanded valves state can fail to match read back valve states in a row. +#define MAX_VALVE_STATE_MISMATCH_COUNT 3 ///< Maximum number of times commanded valves state can fail to match read back valve states in a row. -#define VALVES_STATE_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval ( ms / task time) at which valves states are published on CAN bus. -#define DATA_PUBLISH_COUNTER_START_COUNT 50 ///< Data publish counter start count. +#define VALVES_STATE_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval ( ms / task time) at which valves states are published on CAN bus. +#define DATA_PUBLISH_COUNTER_START_COUNT 50 ///< Data publish counter start count. + +#define VPI_MIN_OPEN_TO_SKIP_DISINFECT_FLUSH_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< VPi minimum required time to be open to skip disinfects flush state in milliseconds. +#define VPI_MAX_OPEN_WINDOW_TO_SKIP_DISINFECT_FLUSH_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< VPi maximum allowed time window that VPi could have been open in milliseconds. + +/// VPi open/close time status for disinfects +typedef struct +{ + U32 vpiOpenStartTimeMS; ///< VPi open start time in milliseconds. + U32 vpiOpenDurationMS; ///< VPi duration that is has been open in milliseconds. + U32 vpiClosedStartTimeMS; ///< VPi closed start time in milliseconds. +} VPI_OPEN_CLOSE_TIME_T; // ********** private data ********** @@ -48,6 +60,7 @@ static OVERRIDE_U32_T valveStates[ NUM_OF_VALVES ]; ///< Currently commanded valves states. static OVERRIDE_U32_T valveSensedStates[ NUM_OF_VALVES ]; ///< Valve sensed states override. static OVERRIDE_U32_T valvesStatesPublishInterval = { VALVES_STATE_PUB_INTERVAL, VALVES_STATE_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms/task interval) at which to publish valves state to CAN bus. +static VPI_OPEN_CLOSE_TIME_T vpiTime; ///< VPi open/close time structure. // ********** private function prototypes ********** @@ -56,6 +69,7 @@ static U16 fromU32ArrayToU16( void ); static void publishValvesStates( void ); static U32 getValveState( U32 valveID ); +static void checkVPiTimeStatus( void ); /*********************************************************************//** * @brief @@ -66,6 +80,7 @@ * commandedValvesStates * @return none *************************************************************************/ + void initValves( void ) { U32 i; @@ -85,6 +100,8 @@ valveSensedStates[ i ].override = OVERRIDE_RESET; } + memset( &vpiTime, 0, sizeof( VPI_OPEN_CLOSE_TIME_T ) ); + valveStateMismatchCounter = 0; commandedValvesStates = fromU32ArrayToU16(); setFPGAValveStates( commandedValvesStates ); // initially set all valves to de-energized state via FPGA @@ -136,6 +153,8 @@ commandedValvesStates = fromU32ArrayToU16(); setFPGAValveStates( commandedValvesStates ); + checkVPiTimeStatus(); + // Publish valve states on interval publishValvesStates(); } @@ -403,8 +422,8 @@ /*********************************************************************//** * @brief * The getValveStateName function gets the current valve state enum for given valve. - * @details Inputs: valveStates[], valveSensedStates - * @details Outputs: valveSensedStates + * @details Inputs: valveStates[] + * @details Outputs: none * @param valveID ID of valve to get state for * @return the current valve state for given valve in enum *************************************************************************/ @@ -462,6 +481,26 @@ } return name; +} + +/*********************************************************************//** + * @brief + * The isFliterFlushRequired function checks whether filter flush is required in + * cleaning modes. + * @details Inputs: vpiTime + * @details Outputs: none + * @return TRUE if filter flush is required otherwise, FALSE + *************************************************************************/ +BOOL isFliterFlushRequired( void ) +{ + BOOL status = TRUE; + + if ( vpiTime.vpiOpenDurationMS >= VPI_MIN_OPEN_TO_SKIP_DISINFECT_FLUSH_MS ) + { + status = ( calcTimeSince( vpiTime.vpiClosedStartTimeMS ) <= VPI_MAX_OPEN_WINDOW_TO_SKIP_DISINFECT_FLUSH_MS ? FALSE : TRUE ); + } + + return status; } /*********************************************************************//** @@ -516,6 +555,29 @@ return valveState; } +/*********************************************************************//** + * @brief + * The checkVPiTimeStatus function checks the status of the VPi to see if + * it was open or closed. + * @details Inputs: vpiTime + * @details Outputs: vpiTime + * @return none + *************************************************************************/ +static void checkVPiTimeStatus( void ) +{ + if ( ( VALVE_STATE_OPEN == getValveStateName( VPI ) ) && ( 0 == vpiTime.vpiOpenStartTimeMS ) ) + { + vpiTime.vpiOpenStartTimeMS = getMSTimerCount(); + vpiTime.vpiClosedStartTimeMS = 0; + } + else if ( ( VALVE_STATE_CLOSED == getValveStateName( VPI ) ) && ( 0 == vpiTime.vpiClosedStartTimeMS ) ) + { + vpiTime.vpiOpenDurationMS = calcTimeSince( vpiTime.vpiOpenStartTimeMS ); + vpiTime.vpiOpenStartTimeMS = 0; + vpiTime.vpiClosedStartTimeMS = getMSTimerCount(); + } +} + /************************************************************************* * TEST SUPPORT FUNCTIONS