Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rd89f4eb7da7574306f45eefea5a2fc3b980fd7c9 -r49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision d89f4eb7da7574306f45eefea5a2fc3b980fd7c9) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59) @@ -79,6 +79,8 @@ #define SYRINGE_PUMP_SYRINGE_DETECT_THRESHOLD_V 2.0 ///< Syringe pump syringe detected threshold (in V). #define SYRINGE_PUMP_HOME_DETECT_THRESHOLD_V 0.25 ///< Syringe pump home detected threshold (in V). #define SYRINGE_PUMP_PRIME_VOLUME_ML 0.353 ///< Target syringe prime volume (in mL). +#define SYRINGE_PUMP_MAX_VOL_ERROR_ML 0.1 ///< Maximum Heparin volume error (in mL). +#define SYRINGE_PUMP_MAX_RATE_ERROR_ML_HR 0.1 ///< Maximum Heparin delivery rate error (in mL/hr). /// Expected position of empty in relation to home postion. #define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 11.0 ) @@ -291,7 +293,7 @@ if ( MODE_TREA == getCurrentOperationMode() ) { - if ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) + if ( ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) && ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) ) { if ( HEPARIN_CMD_PAUSE == cmd ) { @@ -311,7 +313,6 @@ if ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) { accepted = TRUE; - heparinDeliveryState = HEPARIN_STATE_DISPENSING; startHeparinContinuous(); } else @@ -512,7 +513,7 @@ if ( ( flowRate >= MIN_HEPARIN_CONTINUOUS_RATE ) && ( flowRate <= MAX_HEPARIN_CONTINUOUS_RATE ) && ( FALSE == isSyringePumpHome() ) ) { if ( ( TRUE == isSyringeDetected() ) && ( SYRINGE_PUMP_OFF_STATE == syringePumpState ) && - ( ( ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) || ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) ) ) ) + ( ( HEPARIN_STATE_STOPPED == heparinDeliveryState ) || ( HEPARIN_STATE_PAUSED == heparinDeliveryState ) ) ) { syringePumpSetRate = flowRate; syringePumpContinuousRequested = TRUE; @@ -999,13 +1000,6 @@ syringePumpPrimeCompleted = FALSE; result = SYRINGE_PUMP_OFF_STATE; } - // Stop retract if syringe is detected (should not have a syringe loaded during retract) - else if ( TRUE == isSyringeDetected() ) - { - stopSyringePump(); - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_DETECTED_IN_RETRACT ); - result = SYRINGE_PUMP_OFF_STATE; - } return result; } @@ -1315,14 +1309,17 @@ { BOOL result = stopPump; F32 rate = getSyringePumpMeasRate(); - F32 delta = fabs( syringePumpSetRate - rate ); F32 max = MAX( rate, syringePumpSetRate ); - F32 error = ( max > 0.0 ? ( 1.0 - ( delta / max ) ) : 0.0 ); + F32 min = MIN( rate, syringePumpSetRate ); + F32 delta = max - min; + F32 error = ( max > 0.0 ? ( 1.0 - fabs( min / max ) ) : 0.0 ); - if ( error > pctMargin ) + // Alarm on rate if off by more than 5% or 0.1 mL/hr, whichever is greater + if ( ( error > pctMargin ) && ( delta > SYRINGE_PUMP_MAX_RATE_ERROR_ML_HR ) ) { - result = TRUE; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, syringePumpSetRate, rate ) + // TODO - needs persistence +// result = TRUE; +// SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, syringePumpSetRate, rate ) } return result; @@ -1346,9 +1343,11 @@ F32 vol = getSyringePumpVolumeDelivered(); F32 max = MAX( vol, syringePumpSafetyVolumeDelivered ); F32 min = MIN( vol, syringePumpSafetyVolumeDelivered ); + F32 delta = max - min; F32 error = ( fabs( max ) < NEARLY_ZERO ? 0.0 : ( 1.0 - fabs( min / max ) ) ); - if ( error > pctMargin ) + // Alarm if volume delivered off by more than 5% or 0.1 mL, whichever is greater + if ( ( error > pctMargin ) && ( delta > SYRINGE_PUMP_MAX_VOL_ERROR_ML ) ) { result = TRUE; SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_VOLUME_ERROR, vol, syringePumpSafetyVolumeDelivered )