Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r61be28695d75fc3ba795be4f4f77e435dde1dd11 -r0edfb69c6bfe5bcac0dcf032939521be32aa50df --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 61be28695d75fc3ba795be4f4f77e435dde1dd11) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 0edfb69c6bfe5bcac0dcf032939521be32aa50df) @@ -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;