Index: firmware/App/Controllers/DialOutFlow.c =================================================================== diff -u -r9302e1bd2413cbf99e80ac51aac38502d94801d9 -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision 9302e1bd2413cbf99e80ac51aac38502d94801d9) +++ firmware/App/Controllers/DialOutFlow.c (.../DialOutFlow.c) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -122,7 +122,7 @@ static DIAL_OUT_PUMP_STATE_T dialOutPumpState = DIAL_OUT_PUMP_OFF_STATE; ///< Current state of the dialysate outlet pump controller state machine. static U32 dialOutFlowDataPublicationTimerCounter = 6; ///< Timer counter controlling when to publish dialysate outlet data. Set non-zero to phase data publication to CAN bus. static BOOL isDialOutPumpOn = FALSE; ///< Flag set to TRUE when dialysate outlet pump is running. -static U32 lastGivenRate = 0.0; ///< Remembers the last given set point rate for the dialysate outlet pump. +static U32 lastGivenRate = 0; ///< Remembers the last given set point rate for the dialysate outlet pump. static F32 dialOutPumpPWMDutyCyclePct = 0.0; ///< Requested PWM duty cycle for dialysate outlet pump (based on given rate). static F32 dialOutPumpPWMDutyCyclePctSet = 0.0; ///< Currently set PWM duty cycle for dialysate outlet pump. static MOTOR_DIR_T dialOutPumpDirection = MOTOR_DIR_FORWARD; ///< Requested direction for dialysate outlet pump. @@ -242,8 +242,12 @@ // verify flow rate if ( flowRate <= MAX_DIAL_OUT_FLOW_RATE ) { - F32 adjFlow = (F32)flowRate * DPO_FLOW_ADJ_DUE_TO_HIGHER_INLET_PRES; + F32 adjFlow = (F32)flowRate; + if ( PUMP_CONTROL_MODE_CLOSED_LOOP == mode ) + { + adjFlow *= DPO_FLOW_ADJ_DUE_TO_HIGHER_INLET_PRES; + } lastGivenRate = flowRate; dialOutPumpDirection = dir; dialOutPumpControlMode = mode; Index: firmware/App/HDCommon.h =================================================================== diff -u -rc6f3b01d1b0a5e3fdf480a7ee205ca349e10d6d2 -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/HDCommon.h (.../HDCommon.h) (revision c6f3b01d1b0a5e3fdf480a7ee205ca349e10d6d2) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -30,8 +30,8 @@ // ********** build switches ********** #ifndef _RELEASE_ -//#define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) -//#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) +#define UF_TEST_ENABLED 1 // ultrafiltration test build (hard codes treatment params, re-purposes off/stop buttons) +#define UF_TEST_WITH_DG 1 // ultrafiltration test build (sets up DG in standby mode) #ifndef _VECTORCAST_ // #define RM46_EVAL_BOARD_TARGET 1 // limited build runs on RM46 eval board // #define BREADBOARD_TARGET 1 // old breadboard system build - no longer used? Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rc6f3b01d1b0a5e3fdf480a7ee205ca349e10d6d2 -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision c6f3b01d1b0a5e3fdf480a7ee205ca349e10d6d2) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -148,10 +148,12 @@ maxUFVolumeML = maxUFVol; setUFRate = uFRate; - setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); // TODO - test code - remove later - setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -// setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // TODO - restore these later -// setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + if ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) + { + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + } } /*********************************************************************//** @@ -168,8 +170,8 @@ { 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 ); + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); // TODO - Heparin pump } @@ -186,8 +188,8 @@ *************************************************************************/ void stopDialysis( void ) { - setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); } @@ -357,7 +359,7 @@ currentDialysisState = handleDialysisUltrafiltrationState(); break; - case DIALYSIS_SOLUTION_INFUSION_STATE: + case DIALYSIS_SALINE_BOLUS_STATE: currentDialysisState = handleDialysisSolutionInfusionState(); break; @@ -421,7 +423,7 @@ *************************************************************************/ static DIALYSIS_STATE_T handleDialysisSolutionInfusionState( void ) { - DIALYSIS_STATE_T result = DIALYSIS_SOLUTION_INFUSION_STATE; + DIALYSIS_STATE_T result = DIALYSIS_SALINE_BOLUS_STATE; // TODO - Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r9302e1bd2413cbf99e80ac51aac38502d94801d9 -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 9302e1bd2413cbf99e80ac51aac38502d94801d9) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -63,7 +63,7 @@ #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); #else #endif #ifdef RM46_EVAL_BOARD_TARGET Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r9302e1bd2413cbf99e80ac51aac38502d94801d9 -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 9302e1bd2413cbf99e80ac51aac38502d94801d9) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -290,12 +290,22 @@ U32 newTime = getMSTimerCount(); U32 msSinceLast = calcTimeBetween( lastTreatmentTimeStamp, newTime ); - // update treatment time - treatmentTimeMS += msSinceLast; + // update treatment time (unless delivering a saline bolus) + if ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) + { + treatmentTimeMS += msSinceLast; + } lastTreatmentTimeStamp = newTime; - // execute state machine for treatment dialysis sub-mode - execDialysis(); + if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) + { + result = TREATMENT_END_STATE; + } + else + { + // execute state machine for treatment dialysis sub-mode + execDialysis(); + } // TODO - test code - remove later if ( getOffButtonState() == BUTTON_STATE_PRESSED ) @@ -685,7 +695,7 @@ U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; DIALYSIS_STATE_T dialysisState = getDialysisState(); UF_STATE_T uFState = getUltrafiltrationState(); - BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); + BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SALINE_BOLUS_STATE ? TRUE : FALSE ); broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r07a352d02dc7e062dd5b6742891ac0b57679858c -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 07a352d02dc7e062dd5b6742891ac0b57679858c) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -54,20 +54,20 @@ /// Treatment parameter properties (types, ranges and defaults). const TREATMENT_PARAMS_PROPERTIES_T treatParamsProperties[ NUM_OF_TREATMENT_PARAMS ] = { - { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=1500}, {.uInt=10} }, // TREATMENT_PARAM_BLOOD_FLOW - { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=1600}, {.uInt=10} }, // TREATMENT_PARAM_DIALYSATE_FLOW - { CRITICAL_DATA_TYPE_U32, {.uInt=60}, {.uInt=1480}, {.uInt=10} }, // TREATMENT_PARAM_TREATMENT_DURATION - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=1120}, {.uInt=10} }, // TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME - { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=1300}, {.uInt=1100} }, // TREATMENT_PARAM_SALINE_BOLUS_VOLUME - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=12}, {.uInt=10} }, // TREATMENT_PARAM_ACID_CONCENTRATE - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=10}, {.uInt=10} }, // TREATMENT_PARAM_BICARB_CONCENTRATE - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=13}, {.uInt=10} }, // TREATMENT_PARAM_DIALYZER_TYPE + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=500}, {.uInt=100} }, // TREATMENT_PARAM_BLOOD_FLOW + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=600}, {.uInt=100} }, // TREATMENT_PARAM_DIALYSATE_FLOW + { CRITICAL_DATA_TYPE_U32, {.uInt=60}, {.uInt=480}, {.uInt=240} }, // TREATMENT_PARAM_TREATMENT_DURATION + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=120}, {.uInt=0} }, // TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME + { CRITICAL_DATA_TYPE_U32, {.uInt=100}, {.uInt=300}, {.uInt=100} }, // TREATMENT_PARAM_SALINE_BOLUS_VOLUME + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_ACID_CONCENTRATE + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=0}, {.uInt=0} }, // TREATMENT_PARAM_BICARB_CONCENTRATE + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=3}, {.uInt=0} }, // TREATMENT_PARAM_DIALYZER_TYPE + { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=60}, {.uInt=30} }, // TREATMENT_PARAM_BP_MEAS_INTERVAL + { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=150}, {.uInt=75} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=200}, {.sInt=-300} }, // TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT { CRITICAL_DATA_TYPE_S32, {.sInt=-300}, {.sInt=200}, {.sInt=100} }, // TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT { CRITICAL_DATA_TYPE_S32, {.sInt=-100}, {.sInt=600}, {.sInt=-100} }, // TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT { CRITICAL_DATA_TYPE_S32, {.sInt=-100}, {.sInt=600}, {.sInt=400} }, // TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT - { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=160}, {.uInt=130} }, // TREATMENT_PARAM_BP_MEAS_INTERVAL - { CRITICAL_DATA_TYPE_U32, {.uInt=50}, {.uInt=1150}, {.uInt=175} }, // TREATMENT_PARAM_RINSEBACK_FLOW_RATE { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=1.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_DISPENSE_RATE { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=2.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME { CRITICAL_DATA_TYPE_F32, {.sFlt=35.0}, {.sFlt=38.0}, {.sFlt=37.0} }, // TREATMENT_PARAM_DIALYSATE_TEMPERATURE @@ -94,6 +94,7 @@ static BOOL checkTreatmentParamsDependencies( U32 *reasons ); static BOOL isTreatmentParamInRange( TREATMENT_PARAM_T param, CRITICAL_DATAS_T value ); static void extractTreatmentParamsFromPayload( TREATMENT_PARAMS_DATA_PAYLOAD_T payload ); +static void sendTreatmentParamsResponse( BOOL valid, U32 *reasons ); /*********************************************************************//** * @brief @@ -367,8 +368,7 @@ } // respond to set treatment parameters request message - sendTreatmentParametersResponseMsg( paramsAreValid, (U08*)(&rejReasons[0]), - ( NUM_OF_TREATMENT_PARAMS - 1 ) * sizeof(U32) ); // UF vol. param not included in reject reasons + sendTreatmentParamsResponse( paramsAreValid, &rejReasons[0] ); return paramsAreValid; } @@ -537,6 +537,43 @@ /*********************************************************************//** * @brief + * The sendTreatmentParamsResponse function responds to the treatment parameters \n + * received from the UI. An over-all ok/rejected flag as well as individual reject \n + * reason codes for each parameter are provided back to the UI. + * @details + * Inputs : none + * Outputs : Response to treatment parameters message constructed and sent. + * @param valid 1 if valid, 0 if not + * @param reasons array of reject reason codes for each parameter (0=not rejected) + * @return none + *************************************************************************/ +static void sendTreatmentParamsResponse( BOOL valid, U32 *reasons ) +{ + U32 respPayload[NUM_OF_TREATMENT_PARAMS]; + + respPayload[ 0 ] = reasons[ TREATMENT_PARAM_BLOOD_FLOW ]; + respPayload[ 1 ] = reasons[ TREATMENT_PARAM_DIALYSATE_FLOW ]; + respPayload[ 2 ] = reasons[ TREATMENT_PARAM_TREATMENT_DURATION ]; + respPayload[ 3 ] = reasons[ TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ]; + respPayload[ 4 ] = reasons[ TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ]; + respPayload[ 5 ] = reasons[ TREATMENT_PARAM_HEPARIN_PRE_STOP_TIME ]; + respPayload[ 6 ] = reasons[ TREATMENT_PARAM_SALINE_BOLUS_VOLUME ]; + respPayload[ 7 ] = reasons[ TREATMENT_PARAM_ACID_CONCENTRATE ]; + respPayload[ 8 ] = reasons[ TREATMENT_PARAM_BICARB_CONCENTRATE ]; + respPayload[ 9 ] = reasons[ TREATMENT_PARAM_DIALYZER_TYPE ]; + respPayload[ 10 ] = reasons[ TREATMENT_PARAM_DIALYSATE_TEMPERATURE ]; + respPayload[ 11 ] = reasons[ TREATMENT_PARAM_ART_PRESSURE_LOW_LIMIT ]; + respPayload[ 12 ] = reasons[ TREATMENT_PARAM_ART_PRESSURE_HIGH_LIMIT ]; + respPayload[ 13 ] = reasons[ TREATMENT_PARAM_VEN_PRESSURE_LOW_LIMIT ]; + respPayload[ 14 ] = reasons[ TREATMENT_PARAM_VEN_PRESSURE_HIGH_LIMIT ]; + respPayload[ 15 ] = reasons[ TREATMENT_PARAM_BP_MEAS_INTERVAL ]; + respPayload[ 16 ] = reasons[ TREATMENT_PARAM_RINSEBACK_FLOW_RATE ]; + + sendTreatmentParametersResponseMsg( valid, (U08*)(&respPayload[0]), ( NUM_OF_TREATMENT_PARAMS - 1 ) * sizeof(U32) ); // UF vol. param not included in reject reasons +} + +/*********************************************************************//** + * @brief * The setTreatmentParameterU32 function sets a given unsigned integer \n * treatment parameter to a given value. * @details Index: firmware/App/Modes/ModeTreatmentParams.h =================================================================== diff -u -r07a352d02dc7e062dd5b6742891ac0b57679858c -rf88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd --- firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision 07a352d02dc7e062dd5b6742891ac0b57679858c) +++ firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision f88ce1aa5a00106b6ba51a625fe4c1d8f0408cfd) @@ -38,20 +38,20 @@ U32 bloodFlowRate_mL_min; U32 dialysateFlowRate_mL_min; U32 treatmentDuration_min; + F32 heparinDispenseRate_mL_hr; + F32 heparinBolusVolume_mL; U32 heparinPreStop_min; U32 salineBolusVolume_mL; U32 acidConcentrate; U32 bicarbConcentrate; U32 dialyzerType; + F32 dialysateTemperature_degC; S32 arterialPressureLowLimit_mmHg; S32 arterialPressureHighLimit_mmHg; S32 venousPressureLowLimit_mmHg; S32 venousPressureHighLimit_mmHg; U32 bloodPressureMeasurementInterval_min; U32 rinsebackFlowRate_mL_min; - F32 heparinDispenseRate_mL_hr; - F32 heparinBolusVolume_mL; - F32 dialysateTemperature_degC; } TREATMENT_PARAMS_DATA_PAYLOAD_T; /// Record structure for adjustable treatment parameters