Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r993f1edc4fe8f10aa81cae4deddafc88c616ccf6 -rf20a9bea362aeea79a6d57f0a9e7035162c39f7f --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 993f1edc4fe8f10aa81cae4deddafc88c616ccf6) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision f20a9bea362aeea79a6d57f0a9e7035162c39f7f) @@ -91,7 +91,7 @@ #define FIVE_PCT_OVER_ALLOWANCE 1.05 ///< Allow 5 percent over target before alarming on over travel. /// Expected position of empty in relation to home postion. -#define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 13.0 ) // TODO - get syringe volume from home to empty (11 mL is placeholder) +#define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 11.0 ) // TODO - get syringe volume from home to empty (11 mL is placeholder) /// Margin of error for empty position determination. #define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5 ) /// Minimum retract position. @@ -201,13 +201,6 @@ 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 U32 syringePumpEncoderDirectionErrorCtr; ///< Encoder direction error persistence timer counter. -static U32 syringePumpControllerDirectionErrorCtr; ///< Controller direction error persistence timer counter. -static U32 syringePumpRunningWhileBPOffErrorCtr; ///< Pump running while BP off error persistence timer counter. -static U32 syringePumpRunningWhileOffErrorCtr; ///< Pump running while in off state error persistence timer counter. -static U32 syringePumpRateErrorCtr; ///< Pump rate error persistence timer counter. -static U32 syringePumpOcclusionErrorCtr; ///< Pump occlusion error persistence timer counter. // ********** private function prototypes ********** @@ -271,14 +264,16 @@ syringePumpPrimeCompleted = FALSE; lastSyringePumpADCReadCtr = 0; - syringePumpADCReadErrorCtr = 0; - syringePumpEncoderDirectionErrorCtr = 0; - syringePumpControllerDirectionErrorCtr = 0; - syringePumpRunningWhileBPOffErrorCtr = 0; - syringePumpRunningWhileOffErrorCtr = 0; - syringePumpRateErrorCtr = 0; - syringePumpOcclusionErrorCtr = 0; + // Initialize persistent alarms + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, 0, SYRINGE_PUMP_ADC_READ_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR, 0, SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, 0, SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR, 0, SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, 0, SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, 0, SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE ); + // Reset request flags resetSyringePumpRequestFlags(); } @@ -854,35 +849,25 @@ syringePumpEncoderMeasuredDirection = ( getSyringePumpPosition() - syringePumpLastPosition >= 0 ? MOTOR_DIR_FORWARD : MOTOR_DIR_REVERSE ); // Check if syringe pump is on while BP is off - if ( ( ( SYRINGE_PUMP_HEP_BOLUS_STATE == syringePumpState ) || ( SYRINGE_PUMP_HEP_CONTINUOUS_STATE == syringePumpState ) ) && - ( isBloodPumpRunning() != TRUE ) ) { - if ( ++syringePumpRunningWhileBPOffErrorCtr > SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ) + BOOL runWhileOff = ( ( ( SYRINGE_PUMP_HEP_BOLUS_STATE == syringePumpState ) || ( SYRINGE_PUMP_HEP_CONTINUOUS_STATE == syringePumpState ) ) && + ( isBloodPumpRunning() != TRUE ) ); + + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, runWhileOff ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_RUNNING_WHILE_BP_OFF_ERROR, (U32)syringePumpState ); } } - else - { - syringePumpRunningWhileBPOffErrorCtr = 0; - } if ( syringePumpDACVrefWriteInProgress != TRUE ) { -#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 ) ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, + ( ( getCurrentOperationMode() > MODE_INIT ) && ( lastSyringePumpADCReadCtr == adcReadCtr ) ) ) ) { - if ( ++syringePumpADCReadErrorCtr > SYRINGE_PUMP_ADC_READ_PERSISTENCE ) - { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); - } + activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); } - else - { - syringePumpADCReadErrorCtr = 0; - } -#endif + lastSyringePumpADCReadCtr = adcReadCtr; // Check pump status @@ -986,18 +971,11 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_OFF_STATE; // Check position is not changing while stopped - if ( syringePumpLastPosition != getSyringePumpPosition() ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR, ( syringePumpLastPosition != getSyringePumpPosition() ) ) ) { - if ( ++syringePumpRunningWhileOffErrorCtr > SYRINGE_PUMP_OFF_ALARM_PERSISTENCE ) - { activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_NOT_STOPPED_ERROR ); activateSafetyShutdown(); - } } - else - { - syringePumpRunningWhileOffErrorCtr = 0; - } // Check for request flags if ( TRUE == syringePumpRetractRequested ) @@ -1365,26 +1343,16 @@ { BOOL result = stopPump; - if ( syringePumpEncoderMeasuredDirection != expDir ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR, ( syringePumpEncoderMeasuredDirection != expDir ) ) ) { - if ( ++syringePumpEncoderDirectionErrorCtr > SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ) - { - result = TRUE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR, (U32)syringePumpEncoderMeasuredDirection, (U32)syringePumpState ); - } + result = TRUE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_ENCODER_DIRECTION_ERROR, (U32)syringePumpEncoderMeasuredDirection, (U32)syringePumpState ); } - else if ( syringePumpControllerMeasuredDirection != expDir ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, ( syringePumpControllerMeasuredDirection != expDir ) ) ) { - if ( ++syringePumpControllerDirectionErrorCtr > SYRINGE_PUMP_DIR_ALARM_PERSISTENCE ) - { - result = TRUE; - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, (U32)syringePumpControllerMeasuredDirection, (U32)syringePumpState ); - } + result = TRUE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_CONTROLLER_DIRECTION_ERROR, (U32)syringePumpControllerMeasuredDirection, (U32)syringePumpState ); } - else - { - syringePumpControllerDirectionErrorCtr = 0; - } return result; } @@ -1403,28 +1371,21 @@ BOOL result = stopPump; F32 force = getSyringePumpForceV(); - if ( force >= SYRINGE_FORCE_OCCLUSION_THRESHOLD_V ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, ( force >= SYRINGE_FORCE_OCCLUSION_THRESHOLD_V ) ) ) { - if ( ++syringePumpOcclusionErrorCtr > SYRINGE_PUMP_OCCLUSION_ALARM_PERSISTENCE ) - { - S32 pos = getSyringePumpPosition(); + S32 pos = getSyringePumpPosition(); - if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) - { - heparinDeliveryState = HEPARIN_STATE_EMPTY; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) - } - else - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, (F32)pos, force ) - } - result = TRUE; + if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) + { + heparinDeliveryState = HEPARIN_STATE_EMPTY; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) } + else + { + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OCCLUSION, (F32)pos, force ) + } + result = TRUE; } - else - { - syringePumpOcclusionErrorCtr = 0; - } return result; } @@ -1506,18 +1467,11 @@ F32 error = ( max > 0.0 ? ( 1.0 - fabs( min / max ) ) : 0.0 ); // 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 ) ) + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, ( ( error > pctMargin ) && ( delta > SYRINGE_PUMP_MAX_RATE_ERROR_ML_HR ) ) ) ) { - if ( ++syringePumpRateErrorCtr > SYRINGE_PUMP_RATE_ALARM_PERSISTENCE ) - { - result = TRUE; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, syringePumpSetRate, rate ) - } + result = TRUE; + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SPEED_ERROR, syringePumpSetRate, rate ) } - else - { - syringePumpRateErrorCtr = 0; - } return result; }