Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r7f3bf72c038de385e8a0d743990069c039e13ba0 -r80a7440462a8f87ee11ed62371baba2d87bb6d89 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 7f3bf72c038de385e8a0d743990069c039e13ba0) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 80a7440462a8f87ee11ed62371baba2d87bb6d89) @@ -7,8 +7,8 @@ * * @file AirTrap.c * -* @author (last) Sameer Kalliadan Poyil -* @date (last) 23-Mar-2026 +* @author (last) Varshini Nagabooshanam +* @date (last) 18-Jun-2026 * * @author (original) Sean Nash * @date (original) 24-Oct-2024 @@ -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 ) ); @@ -82,7 +85,7 @@ static OVERRIDE_F32_T airTrapAirPumpRaisePowerLevel; ///< Air pump power level to use when raising the air trap blood level. static OVERRIDE_F32_T airTrapAirPumpLowerPowerLevel; ///< Air pump power level to use when lowering the air trap blood level. -static BOOL pendingStartAirTrapController; ///< Flag indicates an air trap controller start request is pending. +static BOOL pendingStartAirTrapController; ///< Indicates an air trap controller start request is pending. static BOOL pendingStopAirTrapController; ///< Flag indicates an air trap controller stop request is pending. static U32 airTrapFillStartTime; ///< Air trap fill (raise level) operation start time. @@ -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; } }