Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -54,10 +54,10 @@ #define BP_SPEED_ADC_TO_RPM_FACTOR 1.280938 // conversion factor from ADC counts to RPM for blood pump motor #define BP_CURRENT_ADC_TO_MA_FACTOR 3.002 // conversion factor from ADC counts to mA for blood pump motor -#define BP_REV_PER_LITER 124.0 // rotor revolutions per liter +#define BP_REV_PER_LITER 150.24 // rotor revolutions per liter #define BP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( BP_REV_PER_LITER / ML_PER_LITER ) #define BP_GEAR_RATIO 32.0 // blood pump motor to blood pump gear ratio -#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00042 // ~24 BP motor RPM = 1% PWM duty cycle +#define BP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 // ~28 BP motor RPM = 1% PWM duty cycle #define BP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed #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 ) Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r108abddcbf729f7435073116191cd3903261df8f -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 108abddcbf729f7435073116191cd3903261df8f) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -55,10 +55,10 @@ #define DIP_SPEED_ADC_TO_RPM_FACTOR 1.280938 // conversion factor from ADC counts to RPM for dialIn pump motor #define DIP_CURRENT_ADC_TO_MA_FACTOR 3.002 // conversion factor from ADC counts to mA for dialIn pump motor -#define DIP_REV_PER_LITER 124.0 // rotor revolutions per liter +#define DIP_REV_PER_LITER 150.24 // rotor revolutions per liter #define DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DIP_REV_PER_LITER / ML_PER_LITER ) #define DIP_GEAR_RATIO 32.0 // dialIn pump motor to dialIn pump gear ratio -#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00042 // ~24 BP motor RPM = 1% PWM duty cycle +#define DIP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 // ~28 BP motor RPM = 1% PWM duty cycle #define DIP_PWM_ZERO_OFFSET 0.1 // 10% PWM duty cycle = zero speed #define DIP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DIP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DIP_GEAR_RATIO * DIP_MOTOR_RPM_TO_PWM_DC_FACTOR + DIP_PWM_ZERO_OFFSET ) Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -49,7 +49,7 @@ #define MIN_DIAL_OUT_PUMP_PWM_DUTY_CYCLE 0.12 ///< Controller will error if PWM duty cycle < 10%, so set min to 12%. #define DOP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the dialysate outlet pump is controlled. -#define DOP_P_COEFFICIENT 0.0014 ///< P term for dialysate outlet pump control. +#define DOP_P_COEFFICIENT 0.0050 ///< P term for dialysate outlet pump control. #define DOP_I_COEFFICIENT 0.0001 ///< I term for dialysate outlet pump control. #define DOP_MAX_CURR_WHEN_STOPPED_MA 150.0 ///< Motor controller current should not exceed this when pump should be stopped. @@ -65,10 +65,10 @@ /*** setDialOutFlowRxTotalVolumeAndRxTime ***/ -#define DOP_REV_PER_LITER 124.0 ///< Rotor revolutions per liter. +#define DOP_REV_PER_LITER 150.24 ///< Rotor revolutions per liter. #define DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR ( DOP_REV_PER_LITER / ML_PER_LITER ) ///< Conversion factor from mL/min to pump motor RPM. #define DOP_GEAR_RATIO 32.0 ///< Pump motor to pump gear ratio. -#define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00042 ///< ~24 DPo motor RPM = 1% PWM duty cycle. +#define DOP_MOTOR_RPM_TO_PWM_DC_FACTOR 0.00035 ///< ~28 DPo motor RPM = 1% PWM duty cycle. #define DOP_PWM_ZERO_OFFSET 0.1 ///< 10% PWM duty cycle = zero speed. #define DOP_PWM_FROM_ML_PER_MIN(rate) ( (rate) * DOP_ML_PER_MIN_TO_PUMP_RPM_FACTOR * DOP_GEAR_RATIO * DOP_MOTOR_RPM_TO_PWM_DC_FACTOR + DOP_PWM_ZERO_OFFSET ) ///< Macro converts a flow rate to an estimated PWM duty cycle %. @@ -521,8 +521,17 @@ F32 refVol = getTotalTargetDialOutUFVolumeInMl(); F32 totVol = getTotalMeasuredUFVolumeInMl(); F32 newPWM; + F32 deltaPWM; + // get new PWM from PI controller newPWM = runPIController( PI_CONTROLLER_ID_ULTRAFILTRATION, refVol, totVol ); + // limit PWM change to max + deltaPWM = newPWM - dialOutPumpPWMDutyCyclePctSet; + if ( FABS( deltaPWM ) > MAX_DIAL_OUT_PUMP_PWM_STEP_CHANGE ) + { + newPWM = ( deltaPWM < 0.0 ? dialOutPumpPWMDutyCyclePctSet - MAX_DIAL_OUT_PUMP_PWM_STEP_CHANGE : dialOutPumpPWMDutyCyclePctSet + MAX_DIAL_OUT_PUMP_PWM_STEP_CHANGE ); + } + // set new PWM dialOutPumpPWMDutyCyclePctSet = newPWM; setDialOutPumpControlSignalPWM( newPWM ); } Index: firmware/App/HDCommon.h =================================================================== diff -u -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -23,8 +23,8 @@ #ifndef _VECTORCAST_ // #define RM46_EVAL_BOARD_TARGET 1 -// #define BREADBOARD_TARGET 1 - #define SIMULATE_UI 1 + #define BREADBOARD_TARGET 1 +// #define SIMULATE_UI 1 #define DEBUG_ENABLED 1 #define DISABLE_CRC_ERROR 1 #define DISABLE_MOTOR_CURRENT_ERRORS 1 @@ -35,7 +35,7 @@ #include #endif #endif -#define UF_TEST_ENABLED 1 +#define UF_TEST_ENABLED 1 #include "Common.h" Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -152,11 +152,13 @@ *************************************************************************/ void startDialysis( void ) { + U32 tempDPORate = (setDialysateFlowRate * 6) / 10; // TODO - temporary fudge factor - remove later lastUFTimeStamp = getMSTimerCount(); setDialOutUFVolumes( refUFVolume, measUFVolume ); setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( setDialysateFlowRate + FLOAT_TO_INT_WITH_ROUND( setUFRate ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + // setDialOutPumpTargetRate( setDialysateFlowRate + FLOAT_TO_INT_WITH_ROUND( setUFRate ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // TODO - restore later + setDialOutPumpTargetRate( tempDPORate + FLOAT_TO_INT_WITH_ROUND( setUFRate ), MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // TODO - test code - remove later // TODO - Heparin pump } Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -80,7 +80,6 @@ BOOL pauseUF( void ); BOOL resumeUF( void ); - /**@}*/ #endif Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r04334ed8d1e927939718b1d62fb01afef0a2b9a9 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 04334ed8d1e927939718b1d62fb01afef0a2b9a9) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -119,7 +119,7 @@ case POST_STATE_RTC: testStatus = execRTCSelfTest(); - postState = POST_STATE_STUCK_BUTTON; + postState = handlePOSTStatus( testStatus ); break; case POST_STATE_STUCK_BUTTON: Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -ra7104162b3467a67c5f4ed2f0f2ec038a8738d33 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision a7104162b3467a67c5f4ed2f0f2ec038a8738d33) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -73,7 +73,7 @@ static BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; -static U32 pendingUFVolumeChange; ///< An ultrafiltration volume change (mL) is pending user confirmation. +static F32 pendingUFVolumeChange; ///< An ultrafiltration volume change (mL) is pending user confirmation. static F32 pendingUFRateChange; ///< An ultrafiltration rate change (mL/min) is pending user confirmation. static U32 pendingTreatmentTimeChange; ///< A treatment time change (min) is pending user confirmation. @@ -254,7 +254,7 @@ // get prescription settings TODO - hard-coded for now presTreatmentTimeSecs = 3600; presBloodFlowRate = 300; - presDialysateFlowRate = 400; + presDialysateFlowRate = 300; presMaxUFVolumeML = 300.0; presUFRate = 10.0; @@ -362,11 +362,11 @@ // check if we are in an appropriate treatment state for settings adjustment if ( ( MODE_TREA == currMode ) && ( currentTreatmentState > TREATMENT_START_STATE ) && ( currentTreatmentState < TREATMENT_DIALYSIS_END_STATE ) ) { - U32 uFVolume; + F32 uFVolume; U32 dialVolume = presDialysateFlowRate * treatmentTime; // in mL // always adjust UF volume to accommodate treatment time change (not UF rate) - uFVolume = (U32)( (F32)treatmentTime * presUFRate ); + uFVolume = (F32)treatmentTime * presUFRate; if ( ( treatmentTime <= MAX_TREATMENT_TIME_MINUTES ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) { result = TRUE; @@ -403,19 +403,29 @@ if ( ( MODE_TREA == currMode ) && ( currentTreatmentState > TREATMENT_START_STATE ) && ( currentTreatmentState < TREATMENT_DIALYSIS_END_STATE ) ) { // TODO - verify not too close to end of treatment for settings change + DIALYSIS_STATE_T currDialysisState = getDialysisState(); + UF_STATE_T currUFState = getUltrafiltrationState(); F32 uFRate; U32 trtTime; + // UF should already be paused but let's make sure. + if ( ( TREATMENT_DIALYSIS_STATE == currentTreatmentState ) && + ( DIALYSIS_UF_STATE == currDialysisState ) && + ( UF_RUNNING_STATE == currUFState ) ) + { + pauseUF(); + } + // reset pending UF/time settings change - pendingUFVolumeChange = 0; + pendingUFVolumeChange = 0.0; pendingUFRateChange = 0.0; pendingTreatmentTimeChange = 0; // which setting does user want to adjust to accommodate the UF volume change? (treatment time or UF rate) if ( UF_ADJ_TREATMENT_TIME == adjustment ) { F32 uFRate = presUFRate; // no change in UF rate - U32 trtTime = ( uFVolume / uFRate ) + 1; // in minutes + U32 trtTime = (S32)( uFVolume / uFRate ) + 1; // in minutes U32 dialVolume = presDialysateFlowRate * trtTime; // in mL // verify new treatment duration is valid @@ -441,7 +451,8 @@ rateDiff = ( uFRate - presUFRate ); } } - } // current mode allows change + } + // respond to UF settings change request sendChangeUFSettingsResponse( result, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); return result; @@ -463,14 +474,31 @@ BOOL verifyUFSettingsConfirmation( BOOL confirmed, F32 uFVolume, U32 treatmentTime, F32 uFRate ) { BOOL result = FALSE; + OP_MODE currMode = getCurrentOperationMode(); // user confirmed UF settings change(s)? - if ( TRUE == confirmed ) + if ( ( MODE_TREA == currMode ) && ( TRUE == confirmed ) ) { // user confirmed changes are same as verified pending changes? - if ( ( (S32)uFVolume == pendingUFVolumeChange ) && ( treatmentTime == pendingTreatmentTimeChange ) && ( ( uFRate - pendingUFRateChange ) < NEARLY_ZERO ) ) + if ( ( FABS( uFVolume - pendingUFVolumeChange ) < NEARLY_ZERO ) && + ( treatmentTime == pendingTreatmentTimeChange ) && + ( FABS( uFRate - pendingUFRateChange ) < NEARLY_ZERO ) ) { - // TODO - implement changes, resume UF if appropriate + DIALYSIS_STATE_T currDialysisState = getDialysisState(); + UF_STATE_T currUFState = getUltrafiltrationState(); + + // set pending settings changes + presMaxUFVolumeML = pendingUFVolumeChange; + presUFRate = pendingUFRateChange; + setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); + presTreatmentTimeSecs = pendingTreatmentTimeChange * SEC_PER_MIN; + // if UF paused, resume with new settings + if ( ( TREATMENT_DIALYSIS_STATE == currentTreatmentState ) && + ( DIALYSIS_UF_STATE == currDialysisState ) && + ( UF_PAUSED_STATE == currUFState ) ) + { + resumeUF(); + } result = TRUE; } } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ra7104162b3467a67c5f4ed2f0f2ec038a8738d33 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a7104162b3467a67c5f4ed2f0f2ec038a8738d33) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -411,10 +411,10 @@ * @param rateDiff : alarm status record * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL sendChangeUFSettingsResponse( BOOL accepted, U32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ) +BOOL sendChangeUFSettingsResponse( BOOL accepted, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ) { BOOL result; - F32 volume_L = (F32)volume_mL / (F32)ML_PER_LITER; + F32 volume_L = volume_mL / (F32)ML_PER_LITER; MESSAGE_T msg; U08 *payloadPtr = msg.payload; Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -ra7104162b3467a67c5f4ed2f0f2ec038a8738d33 -r9d7ad180a18e29ba08bf65228d61b6179ddbfcca --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision a7104162b3467a67c5f4ed2f0f2ec038a8738d33) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 9d7ad180a18e29ba08bf65228d61b6179ddbfcca) @@ -45,7 +45,7 @@ // MSG_ID_USER_UF_SETTINGS_CHANGE_REQUEST void handleChangeUFSettingsRequest( MESSAGE_T *message ); // MSG_ID_USER_UF_SETTINGS_CHANGE_RESPONSE -BOOL sendChangeUFSettingsResponse( BOOL accepted, U32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ); +BOOL sendChangeUFSettingsResponse( BOOL accepted, F32 volume_mL, U32 time_min, F32 ufRate_mL_min, U32 timeDiff, F32 rateDiff ); // MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE void handleChangeUFSettingsConfirmation( MESSAGE_T *message );