Index: firmware/App/Modes/BloodPrime.c =================================================================== diff -u -r4151ee46ace3cc66b6b7c0f276040889fe0d75e6 -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision 4151ee46ace3cc66b6b7c0f276040889fe0d75e6) +++ firmware/App/Modes/BloodPrime.c (.../BloodPrime.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -139,6 +139,8 @@ *************************************************************************/ void transitionToBloodPrime( void ) { + initBloodPrime(); + // Set valves setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); @@ -213,22 +215,26 @@ // Has blood prime completed? if ( cumulativeBloodPrimeVolume_mL >= TARGET_BLOOD_PRIME_VOLUME_ML ) { +#ifndef DISABLE_PUMP_FLOW_CHECKS // check for under-delivery if ( bloodPrimeVolumeDelivered_Safety < MIN_BLOOD_PRIME_SAFETY_VOLUME_ML ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); } else +#endif { setBloodIsPrimed( TRUE ); signalBloodPrimeToDialysis(); } } +#ifndef DISABLE_PUMP_FLOW_CHECKS // Has independent safety volume exceeded safety limit? else if ( bloodPrimeVolumeDelivered_Safety > MAX_BLOOD_PRIME_SAFETY_VOLUME_ML ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_BLOOD_PRIME_VOLUME_CHECK_FAILURE, TARGET_BLOOD_PRIME_VOLUME_ML, bloodPrimeVolumeDelivered_Safety ); } +#endif else { // ramp blood pump on ramp interval Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rfa356a2bce909141f45c6832659fa1ceea5bfbba -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision fa356a2bce909141f45c6832659fa1ceea5bfbba) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -184,8 +184,31 @@ *************************************************************************/ void transitionToDialysis( void ) { - startAirTrapControl(); // TODO - do we need to start this sooner? After prime? start/stop as needed depending on mode/sub-mode (e.g. dialysis, rinseback, prime, ...)? + // Set last UF timestamp so UF ref is resumed from this time + lastUFTimeStamp = getMSTimerCount(); + // Send dialysate outlet pump latest UF volumes + setDialOutUFVolumes( refUFVolume, measUFVolume ); + // Set valves for dialysis + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setValvePosition( VDO, VALVE_POSITION_B_OPEN ); + setValvePosition( VBA, VALVE_POSITION_B_OPEN ); + setValvePosition( VBV, VALVE_POSITION_B_OPEN ); + // Restart pumps +#ifndef RUN_PUMPS_OPEN_LOOP + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); +#else + setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); +#endif + setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); + // TODO - Heparin pump + // Tell DG to start heating dialysate + cmdStartDGTrimmerHeater(); + + startAirTrapControl(); + // Set user alarm recovery actions allowed in this sub-mode setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, TRUE ); @@ -229,41 +252,6 @@ /*********************************************************************//** * @brief - * The startDialysis function starts/resumes dialysis. This function - * will be called by Treatment Mode when beginning or resuming dialysis - * treatment. - * @details Inputs: none - * @details Outputs: Dialysis module prepared for immediate resumption. - * @return none - *************************************************************************/ -void startDialysis( void ) -{ - // Set last UF timestamp so UF ref is resumed from this time - lastUFTimeStamp = getMSTimerCount(); - // Send dialysate outlet pump latest UF volumes - setDialOutUFVolumes( refUFVolume, measUFVolume ); - - // Set valves for dialysis - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); - setValvePosition( VBA, VALVE_POSITION_B_OPEN ); - setValvePosition( VBV, VALVE_POSITION_B_OPEN ); - // Restart pumps -#ifndef RUN_PUMPS_OPEN_LOOP - setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); -#else - setBloodPumpTargetFlowRate( setBloodFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialInPumpTargetFlowRate( setDialysateFlowRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#endif - setDialOutPumpTargetRate( setDialysateFlowRate + (S32)setUFRate, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - // TODO - Heparin pump - // Tell DG to start heating dialysate - cmdStartDGTrimmerHeater(); -} - -/*********************************************************************//** - * @brief * The stopDialysis function stops dialysis. This function will be called * by Treatment Mode when an alarm occurs or the user pressed the stop button. * Dialysis may be resumed later. @@ -1008,7 +996,7 @@ currentUFState = UF_RUNNING_STATE; } // Resume dialysis - startDialysis(); + transitionToDialysis(); } } Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r212288307f429c25b9b49cbb60bf2a7c4c5f2786 -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 212288307f429c25b9b49cbb60bf2a7c4c5f2786) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -51,7 +51,6 @@ void execDialysis( void ); void setDialysisParams( U32 bPFlow, U32 dPFlow, F32 maxUFVol, F32 uFRate ); -void startDialysis( void ); void stopDialysis( void ); void signalStartSalineBolus( void ); Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r6af31d047bdeb79e6bdb97fc9fd7433a70e9de74 -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 6af31d047bdeb79e6bdb97fc9fd7433a70e9de74) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -23,10 +23,14 @@ #include "DialInFlow.h" #include "DialOutFlow.h" #include "Dialysis.h" +#include "ModePostTreat.h" +#include "ModePreTreat.h" +#include "ModeStandby.h" +#include "ModeTreatment.h" +#include "ModeTreatmentParams.h" #include "OperationModes.h" #include "SystemComm.h" #include "SystemCommMessages.h" -#include "ModeStandby.h" #ifdef EMC_TEST_BUILD // TODO - test code #include "FPGA.h" #endif @@ -120,6 +124,12 @@ case STANDBY_WAIT_FOR_TREATMENT_STATE: if ( TRUE == treatStartReqReceived ) { + // Initialize treatment modes before starting a new treatment + initTreatParamsMode(); + initPreTreatmentMode(); + initTreatmentMode(); + initPostTreatmentMode(); + // Start treatment workflow with treatment parameters mode requestNewOperationMode( MODE_TPAR ); treatStartReqReceived = FALSE; } Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rc46815918e7cf33e8736f180094843758f1e21b2 -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c46815918e7cf33e8736f180094843758f1e21b2) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -98,6 +98,7 @@ // ********** private function prototypes ********** static void resetSignalFlags( void ); +static void resetAlarmSignalFlags( void ); static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentBloodPrimeState( void ); @@ -142,17 +143,13 @@ /*********************************************************************//** * @brief - * The resetSignalFlags function resets all signal flags. + * The resetSignalFlags function resets all non-alarm signal flags. * @details Inputs: none - * @details Outputs: signal flags set to FALSE + * @details Outputs: non-alarm signal flags set to FALSE * @return none *************************************************************************/ static void resetSignalFlags( void ) { - alarmStopSignalled = FALSE; - resumeTreatmentAlarmResponseRequest = FALSE; - initiateRinsebackAlarmResponseRequest = FALSE; - endTreatmentAlarmResponseRequest = FALSE; rinsebackToStoppedRequest = FALSE; endTreatmentRequest = FALSE; rinsebackToRecircRequest = FALSE; @@ -162,6 +159,21 @@ /*********************************************************************//** * @brief + * The resetAlarmSignalFlags function resets all alarm signal flags. + * @details Inputs: none + * @details Outputs: alarm signal flags set to FALSE + * @return none + *************************************************************************/ +static void resetAlarmSignalFlags( void ) +{ + alarmStopSignalled = FALSE; + resumeTreatmentAlarmResponseRequest = FALSE; + initiateRinsebackAlarmResponseRequest = FALSE; + endTreatmentAlarmResponseRequest = FALSE; +} + +/*********************************************************************//** + * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. * @details Inputs: none * @details Outputs: @@ -371,6 +383,9 @@ activateAlarmNoData( ALARM_ID_TREATMENT_STOPPED_BY_USER ); } + // clear signal flags from sub-modes before calling sub-mode executives + resetSignalFlags(); + // Treatment mode state machine switch ( currentTreatmentState ) { @@ -414,7 +429,7 @@ } // Alarm response request flags should be handled at this point, reset in case not handled in current state - resetSignalFlags(); + resetAlarmSignalFlags(); // Broadcast treatment data broadcastTreatmentTimeAndState(); @@ -480,7 +495,7 @@ { // Kick dialysis sub-mode off setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); - startDialysis(); + transitionToDialysis(); result = TREATMENT_DIALYSIS_STATE; } else @@ -561,13 +576,12 @@ if ( TRUE == getBloodIsPrimed() ) { lastTreatmentTimeStamp = getMSTimerCount(); - startDialysis(); transitionToDialysis(); result = TREATMENT_DIALYSIS_STATE; } else { - // TODO - transitionToBloodPrime(); + transitionToBloodPrime(); result = TREATMENT_BLOOD_PRIME_STATE; } } Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r1c1a8d0528f19da5d94bdf75f687bbb1d1de6f0e -rf4199248340b66e66abbe99599d5d30ce980ea5f --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 1c1a8d0528f19da5d94bdf75f687bbb1d1de6f0e) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision f4199248340b66e66abbe99599d5d30ce980ea5f) @@ -64,7 +64,7 @@ /// PI Controllers -- initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = { // Kp Ki uMax uMin ref meas err esw esum ctrl Ilimit controller type - { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 10.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_ULTRAFILTRATION + { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_ULTRAFILTRATION { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_BLOOD_FLOW { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 100.0, CONTROLLER_UNIDIRECTIONAL } // PI_CONTROLLER_ID_DIALYSATE_FLOW };