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 ) Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r722eb364d9b8d1fa9cc98da41f09c5fd73a8be39 -r49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 722eb364d9b8d1fa9cc98da41f09c5fd73a8be39) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59) @@ -226,11 +226,12 @@ { HEPARIN_STATE_T currentHeparinState = getHeparinState(); U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); + U32 minRem = getTreatmentTimeRemainingSecs() / SEC_PER_MIN; F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); - // Do not run syringe pump if no Heparin included in prescription or if Heparin should be stopped at this stage of treatment - if ( ( currentHeparinState > HEPARIN_STATE_OFF ) && ( currentHeparinState < HEPARIN_STATE_COMPLETED ) && ( getTreatmentTimeRemainingSecs() > preStop ) ) + // Do not run syringe pump if no Heparin included in prescription or it was paused or if Heparin should be stopped at this stage of treatment + if ( ( HEPARIN_STATE_STOPPED == currentHeparinState ) && ( minRem > preStop ) ) { // If not done with bolus, start/resume bolus if ( ( bolusVol > 0.0 ) && ( getSyringePumpVolumeDelivered() < bolusVol ) ) @@ -601,7 +602,8 @@ static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ) { DIALYSIS_STATE_T result = DIALYSIS_UF_STATE; - U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); + U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); + U32 minRem = getTreatmentTimeRemainingSecs() / SEC_PER_MIN; // Stop Heparin delivery if we have reached Heparin pre-stop point if ( getTreatmentTimeRemainingSecs() < preStop ) Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r6b870cd0699bb3ee22b93981d51373a6c2d56162 -r49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 6b870cd0699bb3ee22b93981d51373a6c2d56162) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 49d5fccc324cf982ac4fdd89f7f7accb0bbbfe59) @@ -373,7 +373,7 @@ { broadcastAlarmCleared( alarm ); alarmIsActive[ alarm ] = FALSE; - alarmIsDetected[ alarm ] = FALSE; + clearAlarmCondition( alarm ); alarmStartedAt[ alarm ].data = 0; // Clear FIFO if this alarm was in it