Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r158b4394cb66d4585bbcef39471193a7396709c6 -rc08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 158b4394cb66d4585bbcef39471193a7396709c6) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision c08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5) @@ -70,6 +70,8 @@ #define SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Alarm persistence period for syringe pump speed check alarms. #define SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Alarm persistence period for syringe pump direction check alarms. #define SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ( 500 / TASK_PRIORITY_INTERVAL ) ///< Alarm persistence period for syringe pump off check alarms. +#define SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE ( 30 / TASK_PRIORITY_INTERVAL ) ///< Alarm persistence period for syringe pump occlusion alarms. +#define SYRINGE_PUMP_ADC_READ_PERSISTENCE ( 100 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump ADC stale read alarm persistence time (100 ms). #define STEPS_TO_MICROSTEPS( s ) ( (s) * 32.0 ) ///< Macro conversion from steps to microsteps. #define MICROSTEPS_TO_STEPS( m ) ( (m) / 32.0 ) ///< Macro conversion from microsteps to steps. @@ -102,8 +104,6 @@ #define SYRINGE_PUMP_RATE_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. measured rate check. #define SYRINGE_PUMP_VOLUME_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. encoder based volume check. -#define SYRINGE_PUMP_ADC_READ_PERSISTENCE ( 100 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump ADC stale read alarm persistence time (100 ms). - // Bit definitions for syringe pump control register #define SYRINGE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Syringe pump control register bit for sleep mode (active low). #define SYRINGE_PUMP_CONTROL_NOT_RESET 0x20 ///< Syringe pump control register bit for resetting stepper motor (active low). @@ -206,7 +206,8 @@ static U32 syringePumpRunningWhileBPOffErrorCtr; ///< Pump running while BP off error persistence timer counter. static U32 syringePumpRunningWhileOffErrorCtr; ///< Pump running while in off state error persistence timer counter. static U32 syringePumpRateErrorCtr; ///< Pump rate error persistence timer counter. - +static U32 syringePumpOcclusionErrorCtr; ///< Pump occlusion error persistence timer counter. + // ********** private function prototypes ********** static void resetSyringePumpRequestFlags( void ); @@ -272,6 +273,7 @@ syringePumpRunningWhileBPOffErrorCtr = 0; syringePumpRunningWhileOffErrorCtr = 0; syringePumpRateErrorCtr = 0; + syringePumpOcclusionErrorCtr = 0; // Reset request flags resetSyringePumpRequestFlags(); @@ -287,7 +289,7 @@ static void resetSyringePumpRequestFlags( void ) { syringePumpRetractRequested = FALSE; - syringePumpSeekRequested = FALSE;;; + syringePumpSeekRequested = FALSE; syringePumpPrimeRequested = FALSE; syringePumpBolusRequested = FALSE; syringePumpContinuousRequested = FALSE; @@ -1079,8 +1081,6 @@ return result; } -ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR = 187, ///< HD syringe pump direction (from encoder) error -ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR = 188, ///< HD syringe pump direction (from controller) error /*********************************************************************//** * @brief @@ -1311,18 +1311,25 @@ if ( force >= SYRINGE_FORCE_OCCLUSION_THRESHOLD_V ) { - S32 pos = getSyringePumpPosition(); - - if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) + if ( ++syringePumpOcclusionErrorCtr > SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE ) { - heparinDeliveryState = HEPARIN_STATE_EMPTY; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) + S32 pos = getSyringePumpPosition(); + + if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) + { + heparinDeliveryState = HEPARIN_STATE_EMPTY; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) + } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, (F32)pos, force ) + } + result = TRUE; } else { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, (F32)pos, force ) + syringePumpOcclusionErrorCtr = 0; } - result = TRUE; } return result; Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r185d29637c348c3106737da35a88d409e65093ad -rc08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 185d29637c348c3106737da35a88d409e65093ad) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision c08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5) @@ -247,7 +247,14 @@ // Otherwise, start/resume continuous delivery else { - startHeparinContinuous(); // TODO - check return status + if ( hepRate > 0.0 ) + { + startHeparinContinuous(); // TODO - check return status + } + else + { + setHeparinCompleted(); + } } } else Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -r62200ed6423dfd6ff7881bd0fc308162384e663e -rc08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 62200ed6423dfd6ff7881bd0fc308162384e663e) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision c08182ef9b9ae04e8d3a0aae96c015ce0f7a2fa5) @@ -216,7 +216,7 @@ F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); #ifndef DISABLE_SYRINGE_PUMP - useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); + useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ? TRUE : FALSE ); #else useHeparin = FALSE; #endif @@ -342,14 +342,6 @@ *************************************************************************/ void transitionToDrySelfTests() { - F32 const bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - F32 const hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); - -#ifndef DISABLE_SYRINGE_PUMP - useHeparin = ( ( bolusVol > 0.0 ) || ( hepRate > 0.0 ) ); -#else - useHeparin = FALSE; -#endif currentDrySelfTestsState = DRY_SELF_TESTS_START_STATE; pressureSelfTestBloodPumpRunStartTime = 0; pressureSelfTestNormalizedStartTime = 0; @@ -674,7 +666,7 @@ if ( TRUE == useHeparin ) { - if ( ( FALSE == isSyringePumpHome() ) && ( TRUE == isSyringePumpStopped() ) ) + if ( TRUE == isSyringePumpStopped() ) { retractSyringePump(); }