Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r59a959e90acca96b44158dcd65706e83069dc859 -r0b8f332794e830b2a9c87c7b7ba852120e1a7334 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 0b8f332794e830b2a9c87c7b7ba852120e1a7334) @@ -109,7 +109,7 @@ /// Conversion macro from mL/min to estimated PWM duty cycle %. #define BP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR + BP_PWM_ZERO_OFFSET ) /// Conversion from PWM duty cycle % to commanded pump motor speed. -#define BP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) +#define BP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - BP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) /// Conversion macro from mL/min to estimated PWM duty cycle %. #define BP_ML_PER_MIN_FROM_PWM(pwm) ( ( ( pwm - BP_PWM_ZERO_OFFSET ) / ( BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * BP_GEAR_RATIO * BP_MOTOR_RPM_TO_PWM_DC_FACTOR ) ) ) @@ -1136,8 +1136,8 @@ * 2. while pump is controlling, measured motor speed should be within allowed range of commanded speed. * 3. measured motor speed should be within allowed range of measured rotor speed. * All 3 checks have a persistence time that must be met before an alarm is triggered. - * @details Inputs: targetBloodFlowRate, bloodPumpSpeedRPM, bloodPumpRotorSpeedRPM - * @details Outputs: alarm(s) may be triggered + * @details Inputs: bloodPumpState, targetBloodFlowRate, bloodPumpPWMDutyCyclePctSet, bloodPumpDirectionSet + * @details Outputs: errorBloodRotorSpeedPersistTimerCtr, alarm(s) may be triggered * @return none *************************************************************************/ static void checkBloodPumpSpeeds( void ) Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r59a959e90acca96b44158dcd65706e83069dc859 -r0b8f332794e830b2a9c87c7b7ba852120e1a7334 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 0b8f332794e830b2a9c87c7b7ba852120e1a7334) @@ -108,7 +108,7 @@ #define DIP_PWM_ZERO_OFFSET 0.1F ///< 10% PWM duty cycle = zero speed. /// Conversion from PWM duty cycle % to commanded pump motor speed. PWM range is 10% to 90%. RPM range is 0 to 3200. 3200 / 0.8 = 4000. -#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) +#define DIP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ((pwm) - DIP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) /// Conversion from pump motor speed to PWM duty cycle. #define DIP_MOTOR_SPEED_RPM_TO_PWM(rpm) ( ( rpm / 4000.0F ) + 0.1 ) // Macro converts PWM to estimate flow rate needed to achieve it. TODO - this macro does not reverse the function that estimates PWM from target flow rate - and it should @@ -1248,8 +1248,8 @@ * 2. while pump is controlling, measured motor speed should be within allowed range of commanded speed. * 3. measured motor speed should be within allowed range of measured rotor speed. * All 3 checks have a persistence time that must be met before an alarm is triggered. - * @details Inputs: targetDialInFlowRate, dialInPumpSpeedRPM, dialInPumpRotorSpeedRPM - * @details Outputs: alarm(s) may be triggered + * @details Inputs: targetDialInFlowRate, dialInPumpState, dialInPumpPWMDutyCyclePctSet, dialInPumpDirectionSet + * @details Outputs: errorDialInMotorOffPersistTimerCtr, alarm(s) may be triggered * @return none *************************************************************************/ static void checkDialInPumpSpeeds( void ) Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r59a959e90acca96b44158dcd65706e83069dc859 -r0b8f332794e830b2a9c87c7b7ba852120e1a7334 --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 59a959e90acca96b44158dcd65706e83069dc859) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 0b8f332794e830b2a9c87c7b7ba852120e1a7334) @@ -105,7 +105,7 @@ /// Macro converts a flow rate to an estimated PWM duty cycle %. #define DOP_PWM_FROM_ML_PER_MIN(rate) ( ( ( rate ) * 0.0009F ) + 0.0972F + DOP_PWM_ZERO_OFFSET ) /// Conversion from PWM duty cycle % to commanded pump motor speed. -#define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1 : -1 ) ) +#define DOP_PWM_TO_MOTOR_SPEED_RPM(pwm,dir) ( ( ( ( pwm ) - DOP_PWM_ZERO_OFFSET) * 4000.0F ) * ( dir == MOTOR_DIR_FORWARD ? 1.0F : -1.0F ) ) /// Macro converts a PWM to an estimated flow rate. #define DOP_ML_PER_MIN_FROM_PWM(pwm) ( ( ( pwm - DOP_PWM_ZERO_OFFSET ) - 0.0972F ) / 0.0009F ) @@ -1009,8 +1009,8 @@ * 2. while pump is controlling, measured motor speed should be within allowed range of measured motor controller speed. * 3. measured motor speed should be within allowed range of measured rotor speed. * All 3 checks have a persistence time that must be met before an alarm is triggered. - * @details Inputs: targetDialOutFlowRate, dialOutPumpSpeedRPM, dialOutPumpRotorSpeedRPM - * @details Outputs: alarm(s) may be triggered + * @details Inputs: dialOutPumpPWMDutyCyclePctSet, dialOutPumpState, dialOutPumpPWMDutyCyclePctSet, dialOutPumpDirectionSet + * @details Outputs: errorDialOutMotorOffPersistTimerCtr, alarm(s) may be triggered * @return none *************************************************************************/ static void checkDialOutPumpSpeeds( void ) Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r4b17eafaab61aef5766ffd0c17769561bdbb159c -r0b8f332794e830b2a9c87c7b7ba852120e1a7334 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 4b17eafaab61aef5766ffd0c17769561bdbb159c) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 0b8f332794e830b2a9c87c7b7ba852120e1a7334) @@ -46,12 +46,12 @@ /// Interval (ms/task time) at which the post-treatment state data is published on the CAN bus. #define POST_TREATMENT_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) #define DIP_DRAIN_DG_FLOW_RATE_ML_MIN 60 ///< DG drain inlet pump flow rate in mL/min. -#define DIP_DRAIN_DG_RUNTIME_MS 20000 ///< DG drain inlet pump run time. +#define DIP_DRAIN_DG_RUNTIME_MS 20000 ///< DG drain inlet pump run time in ms. /// Post-Treatment drain reservoirs state machine. typedef enum Drain_States { - DRAIN_DG_STATE = 0, ///< Drain DG excess fluid state. + DRAIN_DG_DEPRIME_STATE = 0, ///< Drain DG De-prime dialysate lines of excess fluid state. DRAIN_RESERVOIR_SWITCH_STATE, ///< Switch reservoir state. DRAIN_RESERVOIR_START_DRAIN_STATE, ///< Drain reservoir start drain state. DRAIN_RESERVOIR_DRAIN_STATE, ///< Drain first reservoir state. @@ -65,6 +65,8 @@ static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. static BOOL rinseConcentrateLines; ///< FLag indicates to rinse concentrate lines. static BOOL isThisFirstDrain; ///< Flag to indicate whether this is the first time the reservoir is drained. +static BOOL drainDGDePrimeActive; ///< FLag to indicate DePrime DG Dialysate lines active +static U32 drainDGDePrimeStarttime; ///< DG DePrime start time static HD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current state of post-treatment mode state machine. static DRAIN_STATE_T currentDrainReservoirState; ///< Current drain reservoir state. static U32 postTreatmentPublishTimerCounter; ///< Timer counter used to schedule post-treatment data broadcast. @@ -81,7 +83,7 @@ static HD_POST_TREATMENT_STATE_T handlePostTreatmentVerifyState( void ); static void execDrainReservoirs( void ); -static DRAIN_STATE_T handleDrainDGState( void ); +static DRAIN_STATE_T handleDrainDePrimeDGDialysateLinesState( void ); static DRAIN_STATE_T handleDrainReservoirSwitchState( void ); static DRAIN_STATE_T handleDrainReservoirStartDrainState( void ); static DRAIN_STATE_T handleDrainReservoirDrainState( void ); @@ -102,7 +104,7 @@ rinseConcentrateLines = FALSE; isThisFirstDrain = TRUE; currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; - currentDrainReservoirState = DRAIN_DG_STATE; // DRAIN_RESERVOIR_SWITCH_STATE; + currentDrainReservoirState = DRAIN_DG_DEPRIME_STATE; postTreatmentPublishTimerCounter = 0; // Reset treatment log data @@ -150,6 +152,9 @@ exitBloodLeakNormalState(); + drainDGDePrimeActive = FALSE; + drainDGDePrimeStarttime = 0; + return currentPostTreatmentState; } @@ -506,8 +511,8 @@ { switch ( currentDrainReservoirState ) { - case DRAIN_DG_STATE: - currentDrainReservoirState = handleDrainDGState(); + case DRAIN_DG_DEPRIME_STATE: + currentDrainReservoirState = handleDrainDePrimeDGDialysateLinesState(); break; case DRAIN_RESERVOIR_SWITCH_STATE: @@ -534,35 +539,33 @@ /*********************************************************************//** * @brief - * The handleDrainDGState function waits for DG to complete + * The handleDrainDePrimeDGDialysateLinesState function waits for DG to complete * reservoir switch. * @details Inputs: * @details Outputs: * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainDGState( void ) +static DRAIN_STATE_T handleDrainDePrimeDGDialysateLinesState( void ) { - static BOOL drain_dg_active = FALSE; - static U32 drain_dg_starttime = 0; - DRAIN_STATE_T state = DRAIN_DG_STATE; + DRAIN_STATE_T state = DRAIN_DG_DEPRIME_STATE; if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - if ( FALSE == drain_dg_active ) + if ( FALSE == drainDGDePrimeActive ) { // First entry - Run DPi slow reverse, VDi, VDo closed in init, DPo Off in init. setDialInPumpTargetFlowRate( DIP_DRAIN_DG_FLOW_RATE_ML_MIN, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); - drain_dg_starttime = getMSTimerCount(); - drain_dg_active = TRUE; + drainDGDePrimeStarttime = getMSTimerCount(); + drainDGDePrimeActive = TRUE; } } - if ( TRUE == drain_dg_active ) + if ( TRUE == drainDGDePrimeActive ) { // Thereafter, check for time elapsed - if ( TRUE == didTimeout( drain_dg_starttime, DIP_DRAIN_DG_RUNTIME_MS ) ) + if ( TRUE == didTimeout( drainDGDePrimeStarttime, DIP_DRAIN_DG_RUNTIME_MS ) ) { - drain_dg_active = FALSE; - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + drainDGDePrimeActive = FALSE; + signalDialInPumpHardStop( ); state = DRAIN_RESERVOIR_SWITCH_STATE; } }