Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rd951c4a673f308306d48650182c3af3814e9ab4b -r185d29637c348c3106737da35a88d409e65093ad --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision d951c4a673f308306d48650182c3af3814e9ab4b) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 185d29637c348c3106737da35a88d409e65093ad) @@ -96,6 +96,8 @@ #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). @@ -201,6 +203,7 @@ static F32 syringePumpDACVref; ///< DAC Vref setting for force sensor. static U08 lastSyringePumpADCReadCtr; ///< Remember last ADC read counter to check new reads are fresh. +static U32 syringePumpADCReadErrorCtr; ///< Stale ADC read error persistence timer counter. static SYRINGE_PUMP_SELF_TEST_STATE_T syringePumpSelfTestState; ///< Current syringe pump self-test state. static U32 syringePumpSelfTestTimerCount; ///< Timer counter for syringe pump self-test. @@ -266,6 +269,7 @@ syringePumpPrimeCompleted = FALSE; lastSyringePumpADCReadCtr = 0; + syringePumpADCReadErrorCtr = 0; // Reset request flags resetSyringePumpRequestFlags(); @@ -832,10 +836,17 @@ { #ifndef USING_DEBUGGER // Check ADC read is fresh (takes FPGA a while to configure ADC so don't check until after init/POST mode - if ( ( getCurrentOperationMode() > MODE_INIT ) && ( lastSyringePumpADCReadCtr == adcReadCtr ) ) // TODO - add persistence or time window + if ( ( getCurrentOperationMode() > MODE_INIT ) && ( lastSyringePumpADCReadCtr == adcReadCtr ) ) { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); + if ( ++syringePumpADCReadErrorCtr > SYRINGE_PUMP_ADC_READ_PERSISTENCE ) + { + activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); + } } + else + { + syringePumpADCReadErrorCtr = 0; + } #endif lastSyringePumpADCReadCtr = adcReadCtr; Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rea0047d0cb48b899475cf519e7e4997d96f5e538 -r185d29637c348c3106737da35a88d409e65093ad --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ea0047d0cb48b899475cf519e7e4997d96f5e538) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 185d29637c348c3106737da35a88d409e65093ad) @@ -232,12 +232,12 @@ { HEPARIN_STATE_T currentHeparinState = getHeparinState(); U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); - U32 minRem = getTreatmentTimeRemainingSecs() / SEC_PER_MIN; + F32 minRem = (F32)getTreatmentTimeRemainingSecs() / (F32)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 it was paused or if Heparin should be stopped at this stage of treatment - if ( ( minRem > preStop ) && ( HEPARIN_STATE_STOPPED == currentHeparinState ) ) + if ( ( minRem > (F32)preStop ) && ( HEPARIN_STATE_STOPPED == currentHeparinState ) ) { // If not done with bolus, start/resume bolus if ( ( bolusVol > 0.0 ) && ( getSyringePumpVolumeDelivered() < bolusVol ) ) @@ -607,10 +607,10 @@ { DIALYSIS_STATE_T result = DIALYSIS_UF_STATE; U32 preStop = getTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ); - U32 minRem = getTreatmentTimeRemainingSecs() / SEC_PER_MIN; + F32 minRem = (F32)getTreatmentTimeRemainingSecs() / (F32)SEC_PER_MIN; // Stop Heparin delivery if we have reached Heparin pre-stop point - if ( getTreatmentTimeRemainingSecs() < preStop ) + if ( minRem <= (F32)preStop ) { stopSyringePump(); setHeparinCompleted();