Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rec76cd7277fc01f63dc29328bb40da032b9ef83b -rc9df9f42e294adae397a57bf83c2a67fa831b164 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision ec76cd7277fc01f63dc29328bb40da032b9ef83b) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision c9df9f42e294adae397a57bf83c2a67fa831b164) @@ -60,15 +60,14 @@ #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). -#define OCCLUSION_THRESHOLD 25000 ///< Threshold above which an occlusion is detected. +#define OCCLUSION_THRESHOLD_OFFSET 10000 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived above which an occlusion is detected. +#define OCCLUSION_CLEAR_THRESHOLD_OFFSET 6000 ///< Threshold offset. Combined with initial reading after cartridge install, a threshold is derived below which an occlusion is cleared. #define CARTRIDGE_LOADED_THRESHOLD 5000 ///< Threshold above which a cartridge is considered loaded. +/// Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. +#define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 20000 #define EMPTY_SALINE_BAG_THRESHOLD_MMHG -300.0 ///< Threshold below which the saline bag is considered empty (in mmHg). TODO - get real threshold from Systems static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. -/// Occlusion sensors minimum pressure reading limit when no cartridge is loaded. -#define OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN 2000 -/// Occlusion sensors maximum pressure reading limit when cartridge is considered loaded. -#define OCCLUSION_CARTRIDGE_LOADED_PRESSURE_READING_MAX 20000 #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. @@ -100,8 +99,12 @@ static OVERRIDE_F32_T venousPressure = {0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure. static OVERRIDE_U32_T bloodPumpOcclusion = {0, 0, 0, 0 }; ///< Measured blood pump occlusion pressure. static OVERRIDE_U32_T dialInPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate inlet pump occlusion pressure. -static OVERRIDE_U32_T dialOutPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate outlet pump occlusion pressure. - +static OVERRIDE_U32_T dialOutPumpOcclusion = {0, 0, 0, 0 }; ///< Measured dialysate outlet pump occlusion pressure. + +static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. +static U32 dialInPumpOcclusionAfterCartridgeInstall; ///< Measured dialysate inlet pump occlusion reading taken after cartridge install. +static U32 dialOutPumpOcclusionAfterCartridgeInstall; ///< Measured dialysate outlet pump occlusion reading taken after cartridge install. + static U32 emptySalineBagCtr = 0; ///< Timer counter for empty bag detection. static U08 lastVenousPressureReadCtr; ///< Previous venous pressure read count. @@ -153,6 +156,10 @@ lastBPErrorCtr = 0; lastDPIErrorCtr = 0; lastDPOErrorCtr = 0; + + bloodPumpOcclusionAfterCartridgeInstall = 0; + dialInPumpOcclusionAfterCartridgeInstall = 0; + dialOutPumpOcclusionAfterCartridgeInstall = 0; } /*********************************************************************//** @@ -225,6 +232,22 @@ return result; } +/*********************************************************************//** + * @brief + * The setOcclusionInstallLevels function sets the occlusion sensor levels + * for an installed cartridge. This function should be called after a new + * cartridge is installed. + * @details Inputs: bloodPumpOcclusion, dialInPumpOcclusion, dialOutPumpOcclusion + * @details Outputs: bloodPumpOcclusionAfterCartridgeInstall, dialInPumpOcclusionAfterCartridgeInstall, dialOutPumpOcclusionAfterCartridgeInstall + * @return none + *************************************************************************/ +void setOcclusionInstallLevels( void ) +{ + bloodPumpOcclusionAfterCartridgeInstall = getMeasuredBloodPumpOcclusion(); + dialInPumpOcclusionAfterCartridgeInstall = getMeasuredDialInPumpOcclusion(); + dialOutPumpOcclusionAfterCartridgeInstall = getMeasuredDialOutPumpOcclusion(); +} + /*********************************************************************//** * @brief * The execPresOccl function executes the pressure and occlusion monitor. @@ -500,25 +523,44 @@ { U32 bpOccl = getMeasuredBloodPumpOcclusion(); U32 diOccl = getMeasuredDialInPumpOcclusion(); - U32 doOccl = getMeasuredDialOutPumpOcclusion(); + U32 doOccl = getMeasuredDialOutPumpOcclusion(); + BOOL alarmDetected = FALSE; -#ifndef DISABLE_PRESSURE_CHECKS - if ( bpOccl > OCCLUSION_THRESHOLD ) - { +#ifndef DISABLE_PRESSURE_CHECKS + // Check for occlusions + if ( bpOccl > ( OCCLUSION_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + alarmDetected = TRUE; SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) - // TODO - stop blood pump immediately, ... + } + else if ( bpOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + bloodPumpOcclusionAfterCartridgeInstall ) ) + { + clearAlarmCondition( ALARM_ID_OCCLUSION_BLOOD_PUMP ); } - if ( diOccl > OCCLUSION_THRESHOLD ) + if ( diOccl > ( OCCLUSION_THRESHOLD_OFFSET + dialInPumpOcclusionAfterCartridgeInstall ) ) { + alarmDetected = TRUE; SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_DIAL_IN_PUMP, diOccl ) - // TODO - stop dialysate inlet pump immediately, ... } - if ( doOccl > OCCLUSION_THRESHOLD ) + else if ( diOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + dialInPumpOcclusionAfterCartridgeInstall ) ) + { + clearAlarmCondition( ALARM_ID_OCCLUSION_DIAL_IN_PUMP ); + } + if ( doOccl > ( OCCLUSION_THRESHOLD_OFFSET + dialOutPumpOcclusionAfterCartridgeInstall ) ) { + alarmDetected = TRUE; SET_ALARM_WITH_1_U32_DATA( ALARM_ID_OCCLUSION_DIAL_OUT_PUMP, doOccl ) - // TODO - stop dialysate outlet pump immediately, ... + } + else if ( doOccl < ( OCCLUSION_CLEAR_THRESHOLD_OFFSET + dialOutPumpOcclusionAfterCartridgeInstall ) ) + { + clearAlarmCondition( ALARM_ID_OCCLUSION_DIAL_OUT_PUMP ); + } + + if ( TRUE == alarmDetected ) + { + // TODO - stop pumps immediately, ... } -#endif +#endif } /*********************************************************************//** @@ -681,17 +723,17 @@ F32 const arterialPressure = getMeasuredArterialPressure(); F32 const venousPressure = getMeasuredVenousPressure(); - if ( ( bpPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( bpPressure >= OCCLUSION_THRESHOLD ) ) + if ( bpPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_BP_OCCLUSION_SELF_TEST_FAILURE, bpPressure ); } - if ( ( dialysateInPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateInPressure >= OCCLUSION_THRESHOLD ) ) + if ( dialysateInPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DIP_OCCLUSION_SELF_TEST_FAILURE, dialysateInPressure ); } - if ( ( dialysateOutPressure <= OCCLUSION_NO_CARTRIDGE_PRESSURE_READING_MIN ) || ( dialysateOutPressure >= OCCLUSION_THRESHOLD ) ) + if ( dialysateOutPressure > CARTRIDGE_LOADED_THRESHOLD ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DOP_OCCLUSION_SELF_TEST_FAILURE, dialysateOutPressure ); }