Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r68e6a5f41d4e9decee2658b3421f34892c9b9ac7 -rbafeddaeaa68c011354968c38ff38b8f43085151 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 68e6a5f41d4e9decee2658b3421f34892c9b9ac7) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision bafeddaeaa68c011354968c38ff38b8f43085151) @@ -77,7 +77,7 @@ #define VENOUS_PRESSURE_LIMIT_MAX_MMHG ( 400.0F ) ///< Maximum venous pressure limit (in mmHg). #define VENOUS_PRESSURE_LIMIT_MIN_MMHG ( 20.0F ) ///< Minimum venous pressure limit (in mmHg). #define VENOUS_PRESSURE_OCCL_OFFSET_MMHG ( 50.0F ) ///< Venous pressure occlusion threshold offset from max alarm limit (in mmHg). -#define VENOUS_PRESSURE_LIMIT_DELAY_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Venous pressure limit delay period following dialysis start/resume (use wider limits during this period). +#define VENOUS_PRES_AIR_TRAP_FILL_DELAY_MS ( ( 5 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Venous pressure low exemption delay (in task intervals) following an air trap fill. #define PSI_TO_MMHG ( 51.7149F ) ///< Conversion factor for converting PSI to mmHg. @@ -86,7 +86,6 @@ #define VENOUS_PRESSURE_STALE_DATA 2 ///< Venous pressure status bits indicate data is stale (no new data since last fpga read). #define VENOUS_PRESSURE_DIAG_CONDITION 3 ///< Venous pressure status bits diagnostic condition (alarm). -// The new arterial pressure sensor is the same as the venous pressure sensor #define ARTERIAL_PRESSURE_NORMAL_OP 0 ///< Arterial pressure status bits indicate normal operation. #define ARTERIAL_PRESSURE_CMD_MODE 1 ///< Arterial pressure status bits indicate sensor in command mode. #define ARTERIAL_PRESSURE_STALE_DATA 2 ///< Arterial pressure status bits indicate data is stale (no new data since last fpga read). @@ -100,7 +99,7 @@ #define MAX_OCCLUSION_COUNTS 32766 ///< Maximum occlusion sensor reading for range check. #define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 24500 ///< Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. -#define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0F ///< Threshold below which the saline bag is considered empty (in mmHg). TODO - get real threshold from Systems +#define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0F ///< Threshold below which the saline bag is considered empty (in mmHg). static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. @@ -143,7 +142,8 @@ // ********** private data ********** 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 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. /// 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 }; @@ -228,18 +228,19 @@ setPressureLimitsToOuterBounds(); - currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; - pressureLimitsActive = FALSE; - stabilizationStartTimeMs = 0; - stableArterialPressure = 0; - stableVenousPressure = 0; - longFilteredArterialPressure = 0.0F; - shortFilteredArterialPressure = 0.0F; - shortFilteredVenousPressure = 0.0F; - presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - presOcclState = PRESSURE_WAIT_FOR_POST_STATE; - presOcclPostState = PRESSURE_SELF_TEST_STATE_START; - bloodPumpOcclusionAfterCartridgeInstall = 0; + currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; + pressureLimitsActive = FALSE; + stabilizationStartTimeMs = 0; + stableArterialPressure = 0; + stableVenousPressure = 0; + venLowPresExemptAfterAirTrapFillTimerCtr = 0; + longFilteredArterialPressure = 0.0F; + shortFilteredArterialPressure = 0.0F; + shortFilteredVenousPressure = 0.0F; + presOcclDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + presOcclState = PRESSURE_WAIT_FOR_POST_STATE; + presOcclPostState = PRESSURE_SELF_TEST_STATE_START; + bloodPumpOcclusionAfterCartridgeInstall = 0; } /*********************************************************************//** @@ -722,7 +723,18 @@ static void checkVenousPressureInRange( void ) { F32 venPres = getFilteredVenousPressure(); + OPN_CLS_STATE_T airTrapValveState = getValveAirTrapStatus(); + // track time since last air trap fill + if ( STATE_OPEN == airTrapValveState ) + { + venLowPresExemptAfterAirTrapFillTimerCtr = 0; + } + else + { + venLowPresExemptAfterAirTrapFillTimerCtr++; + } + #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_VENOUS_PRESSURE_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -742,7 +754,7 @@ venPresHigh = ( venPres > (F32)currentVenousMaxLimit ? TRUE : FALSE ); // Check venous pressure is within alarm limits - if ( getValveAirTrapStatus() != STATE_OPEN ) + if ( ( airTrapValveState != STATE_OPEN ) && ( venLowPresExemptAfterAirTrapFillTimerCtr > VENOUS_PRES_AIR_TRAP_FILL_DELAY_MS ) ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPresLow ) ) {