Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r13a064292b5a36a85593f53eabae268ae2bf4bc6 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 13a064292b5a36a85593f53eabae268ae2bf4bc6) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -45,6 +45,7 @@ #define AIR_TRAP_LEVEL_DEBOUNCE_TIME_MS ( 400 ) ///< Air trap level sensor debounce time /// Persistence period for illegal level sensors fault. #define AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Air trap illegal values timeout (in ms) +#define AIR_TRAP_UPPER_LEVEL_FLUID_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Air trap upper level fluid timeout in milliseconds. /// Volume (in mL) of venous portion of blood circuit line. TODO - get actual volume from Systems. #define VENOUS_LINE_VOLUME_ML ( 200.0F ) @@ -87,6 +88,7 @@ static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ); static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ); +static void checkAirTrapUpperLevelFluidTimeout( void ); static void publishAirTrapData( void ); /*********************************************************************//** @@ -120,7 +122,7 @@ } initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ); - + initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, 0, AIR_TRAP_UPPER_LEVEL_FLUID_TIMEOUT_MS ); } /*********************************************************************//** @@ -347,8 +349,11 @@ setValveAirTrap( STATE_CLOSED ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); result = AIR_TRAP_VALVE_CLOSED_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_MANUAL_CONTROL_STATE, (U32)result ) } + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, FALSE, (F32)AIR_TRAP_LEVEL_FLUID, (F32)AIR_TRAP_LEVEL_FLUID ); + return result; } @@ -364,6 +369,9 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; + // Check whether the air trap upper level is detecting fluid all the time and if it is, trigger an alarm + checkAirTrapUpperLevelFluidTimeout(); + // Air pump stop time based on the blood flow rate S32 qB = abs( getTargetBloodFlowRate() ); U32 qBx = ( 0 == qB ? MIN_SET_BLOOD_FLOW_RATE : (U32)qB ); @@ -374,6 +382,7 @@ { pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) if ( AIR_PUMP_STATE_ON == getAirPumpState() ) { @@ -394,6 +403,7 @@ fillStartTime = getMSTimerCount(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_OPEN, 0 ); result = AIR_TRAP_VALVE_OPEN_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) } // Turn air pump off after defined time or air detected at upper level @@ -432,6 +442,7 @@ fillStartTime = getMSTimerCount(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_OPEN, 0 ); result = AIR_TRAP_VALVE_OPEN_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) } return result; @@ -449,11 +460,14 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_OPEN_STATE; + checkAirTrapUpperLevelFluidTimeout(); + // Transition to manual valve control state when requested if ( TRUE == pendingStopAirTrapController ) { pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_OPEN_STATE, (U32)result ) } // Transition to closed valve state when fluid detected at upper level else if ( AIR_TRAP_LEVEL_FLUID == getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) @@ -463,6 +477,7 @@ signalLowVenousPressureCheck(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); result = AIR_TRAP_VALVE_CLOSED_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_OPEN_STATE, (U32)result ) } return result; } @@ -521,6 +536,22 @@ /*********************************************************************//** * @brief + * The checkAirTrapUpperLevelFluidTimeout function checks whether the air + * trap upper level is detecting fluid and then updates the persistent alarm. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +static void checkAirTrapUpperLevelFluidTimeout( void ) +{ + AIR_TRAP_LEVELS_T upperLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + BOOL isUpperLevelFluid = ( AIR_TRAP_LEVEL_FLUID == upperLevel ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, isUpperLevelFluid, (F32)AIR_TRAP_LEVEL_FLUID, (F32)AIR_TRAP_LEVEL_FLUID ); +} + +/*********************************************************************//** + * @brief * The publishAirTrapData function publishes air trap data at the set interval. * @details Inputs: airTrapLevels[], rawAirTrapLevels[] * @details Outputs: if broadcast is due, send air trap data