Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r7a754fc23436a42e61e60f66adf1cd0cc8b32ad6 -rc9df9f42e294adae397a57bf83c2a67fa831b164 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 7a754fc23436a42e61e60f66adf1cd0cc8b32ad6) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision c9df9f42e294adae397a57bf83c2a67fa831b164) @@ -257,6 +257,13 @@ MIN_BLOOD_PUMP_PWM_DUTY_CYCLE, MAX_BLOOD_PUMP_PWM_DUTY_CYCLE ); // Initialize persistent alarm for flow sensor signal strength too low + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_FLOW_VS_MOTOR_SPEED_CHECK, 0, BP_FLOW_VS_SPEED_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_OFF_CHECK, 0, BP_OFF_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MOTOR_SPEED_CHECK, 0, BP_MOTOR_SPEED_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_CHECK, 0, BP_ROTOR_SPEED_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_DIRECTION_CHECK, 0, BP_DIRECTION_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_ROTOR_SPEED_TOO_HIGH, 0, BP_MAX_ROTOR_SPEED_ERROR_PERSIST ); + initPersistentAlarm( ALARM_ID_BLOOD_PUMP_MC_CURRENT_CHECK, 0, BP_MAX_CURR_ERROR_DURATION_MS ); initPersistentAlarm( ALARM_ID_BLOOD_FLOW_SIGNAL_STRENGTH_TOO_LOW, FLOW_SIG_STRGTH_ALARM_PERSIST, FLOW_SIG_STRGTH_ALARM_PERSIST ); initPersistentAlarm( ALARM_ID_HD_BP_FLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_FAST_READ_TO_PERSIST ); initPersistentAlarm( ALARM_ID_HD_BP_FLOW_SLOW_READ_TIMEOUT_ERROR, 0, BLOOD_FLOW_SLOW_READ_TO_PERSIST ); 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 ); } Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r5d13922ee2e8c851bc5db67ef4d0120b47de6f07 -rc9df9f42e294adae397a57bf83c2a67fa831b164 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 5d13922ee2e8c851bc5db67ef4d0120b47de6f07) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision c9df9f42e294adae397a57bf83c2a67fa831b164) @@ -76,6 +76,8 @@ BOOL isCartridgeUnloaded( void ); BOOL isSalineBagEmpty( void ); +void setOcclusionInstallLevels( void ); + BOOL testSetPresOcclDataPublishIntervalOverride( U32 value ); BOOL testResetPresOcclDataPublishIntervalOverride( void ); BOOL testSetArterialPressureOverride( F32 value ); Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r5bf62ff1373f2e9eea858244a97167323bff33f8 -rc9df9f42e294adae397a57bf83c2a67fa831b164 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5bf62ff1373f2e9eea858244a97167323bff33f8) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c9df9f42e294adae397a57bf83c2a67fa831b164) @@ -22,6 +22,7 @@ #include "ModePreTreat.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "PresOccl.h" #include "PreTreatmentRecirc.h" #include "Prime.h" #include "SelfTests.h" @@ -656,6 +657,7 @@ { if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) { + setOcclusionInstallLevels(); // Record occlusion pressure levels after a new cartridge is installed. submodeCompleteTransitionTimeCounter = 0; state = HD_PRE_TREATMENT_PRIME_STATE; transitionToPrime();