Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r46b163d19c65e8c21db7b0247bbb1af0dba1ece5 -rd6709b7cdfe6d32b48520065ae5f3bccbeec2a74 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 46b163d19c65e8c21db7b0247bbb1af0dba1ece5) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision d6709b7cdfe6d32b48520065ae5f3bccbeec2a74) @@ -154,6 +154,11 @@ #define SYRINGE_PUMP_RAMP_STALL_RETRIES 3 ///< Syringe pump ramp stall retries allowed. #define SYRINGE_PUMP_STALL_SPEED_THRESHOLD 0.05F ///< Minimum syringe pump speed to be considered not stalled. +#define SYRINGE_PUMP_ADC_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Syringe pump ADC FPGA error timeout in milliseconds. + +#define SYRINGE_PUMP_DAC_RETRIES 5 ///< Syringe pump DAC retries to write +#define SYRINGE_PUMP_DAC_TIMER ( 200 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump DAC timer between retries + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { @@ -228,6 +233,9 @@ static U32 syringePumpStallRetryCount; ///< Counts pump ramp up stall retries. static HD_HEPARIN_FORCE_SENSOR_CAL_RECORD_T forceSensorCalRecord; ///< HD heparin force sensor calibration record. +static U32 syringePumpDACRetryCount; +static U32 syringePumpDACRetryTimer; + // ********** private function prototypes ********** static void resetSyringePumpRequestFlags( void ); @@ -316,6 +324,8 @@ syringePumpStallCtr = 0; syringePumpStallRetryCount = 0; + syringePumpDACRetryCount = 0; + syringePumpDACRetryTimer = 0; // Initialize persistent alarms initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, 0, SYRINGE_PUMP_ADC_READ_PERSISTENCE ); @@ -1111,6 +1121,11 @@ isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR, FALSE ); } + if ( syringePumpDACRetryCount > 0 ) + { + syringePumpDACRetryTimer++; + } + // Execute syringe pump control state machine switch ( syringePumpState ) { @@ -1269,14 +1284,17 @@ sendTreatmentLogEventData( HEPARIN_START_RESUME_EVENT, 0.0, syringePumpSetRate ); result = SYRINGE_PUMP_HEP_CONTINUOUS_STATE; } - else if ( TRUE == syringePumpDACVrefSetRequested ) + else if ( TRUE == syringePumpDACVrefSetRequested || + ( syringePumpDACRetryCount > 0 && syringePumpDACRetryTimer > SYRINGE_PUMP_DAC_TIMER ) ) { U16 vRef = (U16)( ( syringePumpDACVref / SYRINGE_PUMP_ADC_REF_V ) * SYRINGE_PUMP_DAC_FULL_SCALE_BITS ); setFPGASyringePumpDACOutputLevel( vRef ); setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_DAC ); syringePumpDACVrefWriteInProgress = TRUE; + result = SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE; + } // If we are starting an active pump state, set direction and calculate target toggle time to achieve desired rate @@ -1585,21 +1603,56 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_CONFIG_FORCE_SENSOR_STATE; U08 adcDACStatus = getSyringePumpADCandDACStatus(); + // Check DAC write error + if ( ( adcDACStatus & SYRINGE_PUMP_DAC_WRITE_ERROR_BIT ) != 0 ) + { + + syringePumpDACRetryCount++; + + + if ( syringePumpDACRetryCount > SYRINGE_PUMP_DAC_RETRIES ) + { + syringePumpDACRetryCount = 0; + activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_DAC_WRITE_ERROR ); + } + + syringePumpDACVrefWriteInProgress = FALSE; + // Switch back from DAC to ADC control + setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_RD_DAC_ON_ADC | SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_ADC ); + // Back to off state + result = SYRINGE_PUMP_OFF_STATE; + } + // Wait for DAC setting write to EEPROM to complete - if ( ( adcDACStatus & SYRINGE_PUMP_ADC_DAC_ERROR_COUNT_DAC_WR_DONE ) != 0 ) + else if ( ( adcDACStatus & SYRINGE_PUMP_ADC_DAC_ERROR_COUNT_DAC_WR_DONE ) != 0 ) { + // We're done and no error bit found. + // Clear retry attempts. + syringePumpDACRetryCount = 0; + syringePumpDACRetryTimer = 0; syringePumpDACVrefWriteInProgress = FALSE; // Switch back from DAC to ADC control setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_RD_DAC_ON_ADC | SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_ADC ); // Back to off state result = SYRINGE_PUMP_OFF_STATE; } - // Check DAC write error - else if ( ( adcDACStatus & SYRINGE_PUMP_DAC_WRITE_ERROR_BIT ) != 0 ) +/* + * + * #define SYRINGE_LENGTH 20 +static BOOL syringeTick; +static U32 syringepumpDACstatus[SYRINGE_LENGTH]; +static U32 syringeReadingIDX = 0; + syringepumpDACstatus[syringeReadingIDX] = getSyringePumpADCandDACStatus(); + syringeReadingIDX++; + syringepumpDACstatus[i] = 0xFFFF; + if (syringeReadingIDX == SYRINGE_LENGTH) { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_DAC_WRITE_ERROR ); + syringePumpDACVrefWriteInProgress = FALSE; + setFPGASyringePumpADCandDACControlFlags( SYRINGE_PUMP_ADC_DAC_CONTROL_RD_DAC_ON_ADC | SYRINGE_PUMP_ADC_DAC_CONTROL_ENABLE_ADC ); + syringeReadingIDX = 0; + result = SYRINGE_PUMP_OFF_STATE; } - + */ return result; }