Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r7f3bf72c038de385e8a0d743990069c039e13ba0 -r98bd6dd355e8736e020b3900ca971120c26ad8a6 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 7f3bf72c038de385e8a0d743990069c039e13ba0) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 98bd6dd355e8736e020b3900ca971120c26ad8a6) @@ -47,6 +47,9 @@ #define AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Air trap illegal values timeout (in ms) #define DATA_PUBLISH_COUNTER_START_COUNT 7 ///< Data publish counter start count. +#define AIR_TRAP_REPEATED_LOWER_EVENT_LIMIT 5 ///< Air trap repeated lower event limit +#define AIR_TRAP_REPEATED_LOWER_EVENTS_TIMEOUT_MS ( 300 * MS_PER_SECOND ) ///< Air trap repeated lower events timeout period (in ms). Maximum 5 air trap lower events are allowed within 5 minutes. + /// Air pump on delay after fill adjustment static const U32 AIR_PUMP_ON_DELAY_ADJUST_AFTER_FILL = ( AIR_PUMP_ON_DELAY_TIME_MS - ( 1 * MS_PER_SECOND ) ); @@ -93,6 +96,9 @@ static BOOL airTrapHasDetectedFaultMode; ///< Flag indicates air trap unit has handled transition to fault mode. +static U32 airTrapLowerEventCount; ///< Air trap lower event count +static U32 airTrapLowerEventStartTime; ///< Air trap lower event start time + // ********** private function prototypes ********** static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ); @@ -139,6 +145,8 @@ airTrapLowerDelayStartTime = 0; airTrapLowerStartTime = 0; airTrapHasDetectedFaultMode = FALSE; + airTrapLowerEventCount = 0; + airTrapLowerEventStartTime = 0; } /*********************************************************************//** @@ -249,10 +257,12 @@ * @brief * The execAirTrapMonitorTreatment function executes the air trap monitor * for treatment mode. - * @details \b Alarm: ALARM_ID_TD_AIR_TRAP_FILL_DURING_TREATMENT if air trap + * @details \b Alarm: ALARM_ID_TD_REPEATED_AIR_TRAP_LOWER_EVENTS, + * ALARM_ID_TD_AIR_TRAP_FILL_DURING_TREATMENT, if air trap * fill exceeds maximum allowed time to complete. - * @details \b Inputs: airTrapControllerState, fillStartTime - * @details \b Outputs: none + * @details \b Inputs: airTrapControllerState, fillStartTime, + * airTrapLowerEventCount, airTrapLowerEventStartTime + * @details \b Outputs: airTrapLowerEventCount, airTrapLowerEventStartTime * @return none *************************************************************************/ void execAirTrapMonitorTreatment( void ) @@ -282,6 +292,17 @@ } } } + // Check repeated air trap lower events alarm + if ( ( airTrapLowerEventCount >= AIR_TRAP_REPEATED_LOWER_EVENT_LIMIT ) && + ( FALSE == didTimeout( airTrapLowerEventStartTime, AIR_TRAP_REPEATED_LOWER_EVENTS_TIMEOUT_MS ) ) ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_REPEATED_AIR_TRAP_LOWER_EVENTS, airTrapLowerEventCount, 0 ) + } + else if ( TRUE == didTimeout( airTrapLowerEventStartTime, AIR_TRAP_REPEATED_LOWER_EVENTS_TIMEOUT_MS ) ) + { + airTrapLowerEventCount = 0; + airTrapLowerEventStartTime = 0; + } } /*********************************************************************//** @@ -385,8 +406,8 @@ * The handleAirTrapClosedState function handles the closed state of the * air trap. * @details \b Message \b Sent: MSG_ID_TD_EVENT if starting a level change. - * @details \b Inputs: pendingStopAirTrapController - * @details \b Outputs: none + * @details \b Inputs: pendingStopAirTrapController, airTrapLowerEventCount + * @details \b Outputs: airTrapLowerEventStartTime, airTrapLowerEventCount * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapClosedState( void ) @@ -423,6 +444,12 @@ SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_AIR_TRAP_LOWER, ON, 0 ); + if ( 0 == airTrapLowerEventCount ) + { + airTrapLowerEventStartTime = getMSTimerCount(); + } + airTrapLowerEventCount++; + result = AIR_TRAP_LOWER_LEVEL_STATE; } }