Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -raa3d4f93029367d911d15cd0fbcd265a1522cc74 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision aa3d4f93029367d911d15cd0fbcd265a1522cc74) @@ -367,7 +367,7 @@ setValveAirTrap( STATE_OPEN ); fillStartTime = getMSTimerCount(); - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, 0, 0 ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_OPEN, 0 ); result = AIR_TRAP_VALVE_OPEN_STATE; } @@ -396,6 +396,7 @@ else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) { setValveAirTrap( STATE_CLOSED ); + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); result = AIR_TRAP_VALVE_CLOSED_STATE; } return result; Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -raa3d4f93029367d911d15cd0fbcd265a1522cc74 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision aa3d4f93029367d911d15cd0fbcd265a1522cc74) @@ -83,6 +83,10 @@ /// Venous pressure low exemption period (in task intervals) conversion factor (from Qb in mL/min) following an air trap fill. static const U32 VENOUS_PRES_AT_FILL_DELAY_FACTOR = (U32)( VENOUS_PRES_AT_FILL_DELAY_MAX_BLOOD_VOL_ML * (F32)SEC_PER_MIN * ( (F32)MS_PER_SECOND / (F32)TASK_GENERAL_INTERVAL ) ); +#define LOW_VENOUS_PRES_MONITOR_TIME ( 1200 ) ///< Time in millisecond to monitor low Venous pressure +#define LOW_VENOUS_PRES_MONITOR_WINDOW ( LOW_VENOUS_PRES_MONITOR_TIME / \ + TASK_GENERAL_INTERVAL ) ///< Low Venous pressure monitoring window + #define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. #define VENOUS_PRESSURE_NORMAL_OP 0 ///< Venous pressure status bits indicate normal operation. @@ -151,6 +155,7 @@ static PRESSURE_STATE_T presOcclState; ///< Current state of pressure monitor state machine. static U32 presOcclDataPublicationTimerCounter = 0; ///< Used to schedule pressure data publication to CAN bus. static U32 venLowPresExemptAfterAirTrapFillTimerCtr; ///< Exempt low ven pressure limit alarm for a time following an air trap fill. +static U32 prevVenLowPresExemptAfterAirTrapFillTimerCtr; ///< previous venous low pressure exempt fill time counter /// Interval (in ms) at which to publish pressure/occlusion data to CAN bus. static OVERRIDE_U32_T presOcclDataPublishInterval = { PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL, 0, 0 }; @@ -173,6 +178,7 @@ static F32 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. static OVERRIDE_F32_T shortFilteredVenousPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure after short (1 s) filter. static BOOL useShortStabilizeTime; ///< Flag to use short stabilize time. +static BOOL resetFillExemptPeriod; ///< Flag to reset the exempt period after defined time expire. static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. @@ -245,22 +251,24 @@ setPressureLimitsToOuterBounds(); - currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; - pressureLimitsActive = FALSE; - stabilizationStartTimeMs = 0; - stableArterialPressure = 0; - stableVenousPressure = 0; - venLowPresExemptAfterAirTrapFillTimerCtr = 0; + currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; + pressureLimitsActive = FALSE; + stabilizationStartTimeMs = 0; + stableArterialPressure = 0; + stableVenousPressure = 0; + venLowPresExemptAfterAirTrapFillTimerCtr = 0; + prevVenLowPresExemptAfterAirTrapFillTimerCtr = 0; resetArtVenPressureOffsets(); - longFilteredArterialPressure = 0.0F; - shortFilteredArterialPressure.data = 0.0F; - longFilteredVenousPressure = 0.0F; - shortFilteredVenousPressure.data = 0.0F; - presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - presOcclState = PRESSURE_WAIT_FOR_POST_STATE; - presOcclPostState = PRESSURE_SELF_TEST_STATE_START; - bloodPumpOcclusionAfterCartridgeInstall = 0; - useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + longFilteredArterialPressure = 0.0F; + shortFilteredArterialPressure.data = 0.0F; + longFilteredVenousPressure = 0.0F; + shortFilteredVenousPressure.data = 0.0F; + presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + presOcclState = PRESSURE_WAIT_FOR_POST_STATE; + presOcclPostState = PRESSURE_SELF_TEST_STATE_START; + bloodPumpOcclusionAfterCartridgeInstall = 0; + useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + resetFillExemptPeriod = TRUE; } /*********************************************************************//** @@ -809,9 +817,9 @@ * @brief * The checkVenousPressureInRange function checks that venous pressure is * within the set alarm limits. Alarm is triggered if not. - * @details Inputs: venousPressure, pressureLimitsActive, currentVenousMinLimit - * currentVenousMaxLimit, venLowPresExemptAfterAirTrapFillTimerCtr - * @details Outputs: venLowPresExemptAfterAirTrapFillTimerCtr, alarm if out of range + * @details Inputs: venousPressure, pressureLimitsActive, currentVenousMinLimit, resetFillExemptPeriod + * currentVenousMaxLimit, venLowPresExemptAfterAirTrapFillTimerCtr, prevVenLowPresExemptAfterAirTrapFillTimerCtr + * @details Outputs: venLowPresExemptAfterAirTrapFillTimerCtr,alarm if out of range * @return none *************************************************************************/ static void checkVenousPressureInRange( void ) @@ -820,9 +828,10 @@ OPN_CLS_STATE_T airTrapValveState = getValveAirTrapStatus(); // track time since last air trap fill - if ( STATE_OPEN == airTrapValveState ) + if ( ( STATE_OPEN == airTrapValveState ) && ( TRUE == resetFillExemptPeriod ) ) { venLowPresExemptAfterAirTrapFillTimerCtr = 0; + resetFillExemptPeriod = FALSE; } else { @@ -843,30 +852,41 @@ if ( pressureLimitsActive != FALSE ) { BOOL venPresLow, venPresHigh; - S32 qB = abs( getTargetBloodFlowRate() ); - U32 qBx = ( 0 == qB ? MIN_SET_BLOOD_FLOW_RATE : (U32)qB ); - // compute exemption period (in general task intervals) for low venous pressure alarms after air trap fills - U32 exemptPeriod = VENOUS_PRES_AT_FILL_DELAY_FACTOR / qBx; + // compute fixed exemption period (in general task intervals) for low venous pressure alarms after air trap fills + U32 exemptPeriod = VENOUS_PRES_AT_FILL_DELAY_FACTOR / MAX_SET_BLOOD_FLOW_RATE ; + // minimumMonitoring Window helps to check and raise low venous pressure alarm on a case where repeated fill events occurrence. + U32 minimumMonitoringWindow = exemptPeriod + LOW_VENOUS_PRES_MONITOR_WINDOW ; venPresLow = ( venPres < (F32)currentVenousMinLimit ? TRUE : FALSE ); venPresHigh = ( venPres > (F32)currentVenousMaxLimit ? TRUE : FALSE ); // Check venous pressure is within alarm limits - if ( ( airTrapValveState != STATE_OPEN ) && ( venLowPresExemptAfterAirTrapFillTimerCtr > exemptPeriod ) ) + // Low venous pressure is checked after exemption period and before end of reset period(minimum monitoring window) or until next air trap fill occurs + if ( ( venLowPresExemptAfterAirTrapFillTimerCtr > exemptPeriod ) && + ( ( venLowPresExemptAfterAirTrapFillTimerCtr <= minimumMonitoringWindow ) || + ( venLowPresExemptAfterAirTrapFillTimerCtr > prevVenLowPresExemptAfterAirTrapFillTimerCtr ) ) ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPresLow ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPres, (F32)currentVenousMinLimit ); } } - else - { // clear persistence if air trap valve is open + // during reset period, if airTrapValve open, still alarm needs to be raised , hence persistence clearance should happen before or after reset period. + if ( ( airTrapValveState == STATE_OPEN ) && + ( ( venLowPresExemptAfterAirTrapFillTimerCtr < exemptPeriod ) || + ( venLowPresExemptAfterAirTrapFillTimerCtr > minimumMonitoringWindow ) ) ) + { isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, FALSE ); } + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPresHigh ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPres, (F32)currentVenousMaxLimit ); } + + // Reset exempt flag only after exempt period for the last fill and after reset period (minimum monitoring window) + resetFillExemptPeriod = ( venLowPresExemptAfterAirTrapFillTimerCtr > minimumMonitoringWindow ? TRUE : FALSE ); + prevVenLowPresExemptAfterAirTrapFillTimerCtr = venLowPresExemptAfterAirTrapFillTimerCtr ; } else { // Reset persistence if limits inactive