Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rfa0ab419491364c1d2a28caf216e20175181372d -r21180e0b65fddfa27f66d8fb59cb55b2db304230 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision fa0ab419491364c1d2a28caf216e20175181372d) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 21180e0b65fddfa27f66d8fb59cb55b2db304230) @@ -98,7 +98,7 @@ #define SYRINGE_PUMP_RETRACT_POS_MIN ( SYRINGE_ENCODER_COUNTS_PER_ML * -0.5 ) #define SYRINGE_PUMP_START_RAMP_SPEED 300000 ///< Starting speed for all syringe pump operations to ramp up from. -#define SYRINGE_PUMP_RAMP_DIVISOR 5 ///< Used for ramping profile. +#define SYRINGE_PUMP_RAMP_DIVISOR 11 ///< Used for ramping profile. #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. @@ -143,6 +143,9 @@ #define SYRINGE_PUMP_ENCODER_DIRECTION_ERROR_BITS 0x3F ///< Syringe pump encoder direction error counter bits in FPGA register. #define SYRINGE_PUMP_ENCODER_DIRECTION_BIT 0x80 ///< Syringe pump encoder direction bit in FPGA register. +#define SYRINGE_PUMP_RAMP_STALL_TIME ( 500 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump ramp stall timeout. +#define SYRINGE_PUMP_RAMP_STALL_RETRIES 3 ///< Syringe pump ramp stall retries allowed. + /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States { @@ -206,6 +209,9 @@ static U08 lastSyringePumpADCReadCtr; ///< Remember last ADC read counter to check new reads are fresh. +static U32 syringePumpStallCtr; ///< Counts time when position is not changing during ramp. +static U32 syringePumpStallRetryCount; ///< Counts pump ramp up stall retries. + // ********** private function prototypes ********** static void resetSyringePumpRequestFlags( void ); @@ -273,6 +279,9 @@ lastSyringePumpADCReadCtr = 0; + syringePumpStallCtr = 0; + syringePumpStallRetryCount = 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 ); @@ -491,6 +500,10 @@ { syringePumpSetRate = SYRINGE_PUMP_PRIME_RATE; syringePumpPrimeRequested = TRUE; + // Reset volume and start pos before starting prime operation + syringePumpVolumeDelivered.data = 0.0; + syringePumpSafetyVolumeDelivered = 0.0; + syringePumpVolumeStartPosition = getSyringePumpPosition(); } return syringePumpPrimeRequested; @@ -518,6 +531,10 @@ { syringePumpSetRate = tgtRate; syringePumpBolusRequested = TRUE; + // Reset volume and start pos before starting bolus operation + syringePumpVolumeDelivered.data = 0.0; + syringePumpSafetyVolumeDelivered = 0.0; + syringePumpVolumeStartPosition = getSyringePumpPosition(); } } else @@ -727,10 +744,10 @@ /*********************************************************************//** * @brief - * The getSyringePumpForceV function gets the current syringe pump force. - * @details Inputs: syringePumpMeasForce + * The getSyringePumpStatus function gets the current syringe pump status. + * @details Inputs: syringePumpStatus * @details Outputs: none - * @return the current syringe pump force (in V). + * @return the current syringe pump status. *************************************************************************/ static U08 getSyringePumpStatus() { @@ -746,10 +763,11 @@ /*********************************************************************//** * @brief - * The getSyringePumpForceV function gets the current syringe pump force. - * @details Inputs: syringePumpMeasForce + * The getSyringePumpEncoderStatus function gets the current syringe pump + * encoder status. + * @details Inputs: syringePumpEncoderStatus * @details Outputs: none - * @return the current syringe pump force (in V). + * @return the current syringe pump encoder status. *************************************************************************/ static U08 getSyringePumpEncoderStatus() { @@ -765,10 +783,11 @@ /*********************************************************************//** * @brief - * The getSyringePumpForceV function gets the current syringe pump force. - * @details Inputs: syringePumpMeasForce + * The getSyringePumpADCReadCounter function gets the current syringe pump + * ADC read counter. + * @details Inputs: syringePumpADCReadCtr * @details Outputs: none - * @return the current syringe pump force (in V). + * @return the current syringe pump ADC read counter. *************************************************************************/ static U08 getSyringePumpADCReadCounter() { @@ -1601,11 +1620,37 @@ *************************************************************************/ static void rampSyringePump( void ) { + // Check for ramp stall - restart ramp if retry allowed + if ( syringePumpLastPosition == getSyringePumpPosition() ) + { + syringePumpStallCtr++; + if ( syringePumpStallCtr >= SYRINGE_PUMP_RAMP_STALL_TIME ) + { + if ( ++syringePumpStallRetryCount <= SYRINGE_PUMP_RAMP_STALL_RETRIES ) + { + // Restart ramp + syringePumpRampTimerCtr = 0; + syringePumpRampUpToggleTime = SYRINGE_PUMP_START_RAMP_SPEED; + } + else + { + // TODO - stall alarm + stopSyringePump(); + syringePumpState = SYRINGE_PUMP_OFF_STATE; + } + } + else + { + syringePumpStallCtr = 0; + } + } + + // Ramp up syringe pump toward target speed syringePumpRampTimerCtr++; if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { syringePumpRampUpToggleTime = (U32)((F32)SYRINGE_PUMP_START_RAMP_SPEED / - (F32)( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr / SYRINGE_PUMP_RAMP_DIVISOR )); + (F32)( ( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr ) / SYRINGE_PUMP_RAMP_DIVISOR ) ); if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) { setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); @@ -1640,6 +1685,9 @@ syringePumpSetToggleTime = FLOAT_TO_INT_WITH_ROUND( conv ); // Set stepper ramp toggle time to initial ramp up speed initially syringePumpRampUpToggleTime = SYRINGE_PUMP_START_RAMP_SPEED; + // Reset ramp stall timer and retry counters + syringePumpStallCtr = 0; + syringePumpStallRetryCount = 0; } /*********************************************************************//** Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u -rf20a9bea362aeea79a6d57f0a9e7035162c39f7f -r21180e0b65fddfa27f66d8fb59cb55b2db304230 --- firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision f20a9bea362aeea79a6d57f0a9e7035162c39f7f) +++ firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 21180e0b65fddfa27f66d8fb59cb55b2db304230) @@ -205,14 +205,18 @@ { if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) { +#ifndef DISABLE_VOLTAGE_MONITOR SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) +#endif } } else if ( volts < MIN_VOLTAGES[ i ] ) { if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) { +#ifndef DISABLE_VOLTAGE_MONITOR SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) +#endif } } else Index: firmware/App/HDCommon.h =================================================================== diff -u -r0798ef0a54e4ddaa551ced7b2bd9b032aa458095 -r21180e0b65fddfa27f66d8fb59cb55b2db304230 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 0798ef0a54e4ddaa551ced7b2bd9b032aa458095) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 21180e0b65fddfa27f66d8fb59cb55b2db304230) @@ -50,8 +50,8 @@ #define DISABLE_PUMP_FLOW_CHECKS 1 // Do not error on HD pump flow checks #define DISABLE_PUMP_SPEED_CHECKS 1 // Do not error on HD pump speed checks #define DISABLE_PUMP_DIRECTION_CHECKS 1 // Do not error on HD pump direction checks - #define DISABLE_SYRINGE_PUMP 1 // Disable syringe pump functionality -// #define ALWAYS_ALLOW_SYRINGE_PUMP_CMDS 1 // Allow syringe pump commands at any time except when pump is busy +// #define DISABLE_SYRINGE_PUMP 1 // Disable syringe pump functionality + #define ALWAYS_ALLOW_SYRINGE_PUMP_CMDS 1 // Allow syringe pump commands at any time except when pump is busy #define DISABLE_PRESSURE_CHECKS 1 // Do not error on HD pressure checks // #define DISABLE_UF_ALARMS 1 // Do not error on HD ultrafiltration checks // #define DISABLE_VALVE_ALARMS 1 // Do not error on HD valve position @@ -66,7 +66,7 @@ #define SKIP_PRIMING 1 // Skip Pre-treatment Prime #define SKIP_WET_SELF_TESTS 1 // Skip Pre-treatment prime wet self-tests // #define V1_5_SYSTEM 1 // Build for v1.5 system - #define V2_0_SYSTEM 1 // Build for v2.0 system +// #define V2_0_SYSTEM 1 // Build for v2.0 system #define SKIP_SAMPLE_WATER 1 // Skip pre-treatment sample water #define SKIP_CONSUMABLE_TESTS 1 // Skip pre-treatment consumable Self-tests #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests @@ -75,7 +75,8 @@ #define SKIP_AIR_BUBBLE_CHECK 1 // Skip air bubble detector self-test. #define DISABLE_OCCLUSION_SELF_TEST 1 // Skip occlusion sensor self-test. #define DISABLE_FPGA_COUNTER_CHECKS 1 // Disable alarms associated with FPGA read/error counters -// #define ALLOW_1_MIN_TREATMENT_DURATION 1 // Allow user to change treatment duration to as low as 1 minute + #define DISABLE_VOLTAGE_MONITOR 1 // Disable voltage monitoring/alarms + #define ALLOW_1_MIN_TREATMENT_DURATION 1 // Allow user to change treatment duration to as low as 1 minute #include #include