Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r2464681e74fad9938b3a3c1c45bd9650939b9134 -rf1bcaa360cd1e5cdee553ca0954a083bf61ec7e6 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 2464681e74fad9938b3a3c1c45bd9650939b9134) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision f1bcaa360cd1e5cdee553ca0954a083bf61ec7e6) @@ -39,8 +39,7 @@ #define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the air trap data is published on the CAN bus. #define AIR_TRAP_FILL_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Air trap fill timeout period (in ms). #define AIR_PUMP_ON_DELAY_TIME_MS ( 10 * MS_PER_SECOND ) ///< Delay between air pump On (in ms). -#define AIR_PUMP_ON_STOP_TIME_MS 400 ///< Stop air Pump after defined time. -#define AIR_PUMP_UPPER_LEVEL_PERSISTENCE ( 100 / TASK_GENERAL_INTERVAL ) ///< Persistence time for air pump operation after air trap upper level reads air. +#define AIR_PUMP_ON_STOP_TIME_MIN_MS 200 ///< Stop air Pump time. #define AIR_PUMP_ON_ERROR_MAX_CNT 6 ///< Maximum number of air pump on events within time window before alarm triggered. Do not exceed MAX_TIME_WINDOWED_COUNT. #define AIR_PUMP_ON_ERROR_TIME_WIN_MS ( 60 * MS_PER_SECOND ) ///< Time window for Air Pump on count error. #define AIR_TRAP_LEVEL_DEBOUNCE_TIME_MS ( 400 ) ///< Air trap level sensor debounce time @@ -75,11 +74,11 @@ static BOOL pendingStartAirTrapController = FALSE; ///< Flag indicates an air trap controller start request is pending. static BOOL pendingStopAirTrapController = FALSE; ///< Flag indicates an air trap controller stop request is pending. -static U32 airPumpUpperLevelCtr = 0; ///< Timer count for air pump persistence. - static U32 fillStartTime = 0; ///< Time stamp for start of air trap fill. static U32 airPumpOnDelayStartTime = 0; ///< Air pump On start time. static U32 stopAirPumpStartTime = 0; ///< Stop air pump start time. +// 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 ) ); static BOOL airTrapValveOpenAtStablePressureState = FALSE; ///< Periodic AirTrap fill during pressure stable state, to clear any accumulated bubbles @@ -102,9 +101,8 @@ U32 i; resetAirTrap(); - - airPumpUpperLevelCtr = 0; airTrapDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + airTrapValveOpenAtStablePressureState = TRUE; airPumpOnDelayStartTime = getMSTimerCount(); airTrapValveOpenAtStablePressureState = TRUE; stopAirPumpStartTime = 0; @@ -376,6 +374,11 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; + // 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 ); + U32 airPumpStopTime = AIR_PUMP_ON_STOP_TIME_MIN_MS + ( ( qBx - MIN_SET_BLOOD_FLOW_RATE ) / 2 ); + // Transition to manual valve control state when requested if ( TRUE == pendingStopAirTrapController ) { @@ -385,7 +388,6 @@ if ( AIR_PUMP_STATE_ON == getAirPumpState() ) { setAirPumpState( AIR_PUMP_STATE_OFF ); - airPumpUpperLevelCtr = 0; } } @@ -405,22 +407,14 @@ } // Turn air pump off after defined time or air detected at upper level - else if ( ( ( AIR_PUMP_STATE_ON == getAirPumpState() ) && - ( TRUE == didTimeout( stopAirPumpStartTime, AIR_PUMP_ON_STOP_TIME_MS ) ) ) || - ( ( AIR_TRAP_LEVEL_AIR == getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) && - ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) ) ) + else if ( ( AIR_PUMP_STATE_ON == getAirPumpState() ) && + ( ( TRUE == didTimeout( stopAirPumpStartTime, airPumpStopTime ) ) || + ( ( AIR_TRAP_LEVEL_AIR == getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) && + ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) ) ) ) { - if ( AIR_PUMP_STATE_ON == getAirPumpState() ) - { - airPumpUpperLevelCtr++; - // Turn air pump off once we detect air at upper level and exceed persistence - if ( airPumpUpperLevelCtr >= AIR_PUMP_UPPER_LEVEL_PERSISTENCE ) - { - setAirPumpState( AIR_PUMP_STATE_OFF ); - airPumpOnDelayStartTime = getMSTimerCount(); - } - } + setAirPumpState( AIR_PUMP_STATE_OFF ); + airPumpOnDelayStartTime = getMSTimerCount(); } //Turn on air pump if fluid reaches upper level. @@ -431,7 +425,6 @@ { setAirPumpState( AIR_PUMP_STATE_ON ); stopAirPumpStartTime = getMSTimerCount(); - airPumpUpperLevelCtr = 0; signalInitiatePressureStabilization( USE_SHORT_STABILIZATION_PERIOD ); } } @@ -478,7 +471,7 @@ setValveAirTrap( STATE_CLOSED ); signalLowVenousPressureCheck(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); - airPumpOnDelayStartTime = getMSTimerCount(); + airPumpOnDelayStartTime = u32DiffWithWrap( AIR_PUMP_ON_DELAY_ADJUST_AFTER_FILL, getMSTimerCount() ); result = AIR_TRAP_VALVE_CLOSED_STATE; } return result;