Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rcd2ba56ddf9443fc624c21764e6478766b7fd6ed -r8ec630363568c635c5dfea0ede32a6ed1bfff781 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision cd2ba56ddf9443fc624c21764e6478766b7fd6ed) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 8ec630363568c635c5dfea0ede32a6ed1bfff781) @@ -8,35 +8,38 @@ * @file ModeTreatment.c * * @author (last) Sean Nash -* @date (last) 02-Jul-2020 +* @date (last) 28-Aug-2020 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 * ***************************************************************************/ +#include "AirTrap.h" #include "AlarmLamp.h" #include "BloodFlow.h" #include "Buttons.h" #include "DGInterface.h" #include "DialInFlow.h" #include "DialOutFlow.h" #include "Dialysis.h" -#include "TaskGeneral.h" +#include "ModeTreatment.h" +#include "ModeTreatmentParams.h" #include "OperationModes.h" #include "SystemCommMessages.h" +#include "TaskGeneral.h" #include "Timers.h" #include "TreatmentStop.h" -#include "ModeTreatment.h" +#include "Valves.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; #endif - /** - * @addtogroup HDTreatmentMode - * @{ - */ +/** + * @addtogroup HDTreatmentMode + * @{ + */ // ********** private definitions ********** @@ -73,6 +76,8 @@ static BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; // TODO - test code - remove later +static BOOL pendingUserEndTreatmentRequest; ///< Flag indicates user has requested treatment end. + static U32 pendingParamChangesTimer; ///< User required to confirm UF volume change within 1 minute. 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. @@ -89,10 +94,8 @@ /*********************************************************************//** * @brief * The initTreatmentMode function initializes the Treatment Mode module. - * @details - * Inputs : none - * Outputs : Treatment Mode module initialized. - * @param none + * @details Inputs: none + * @details Outputs: Treatment Mode module initialized. * @return none *************************************************************************/ void initTreatmentMode( void ) @@ -110,6 +113,8 @@ presMaxUFVolumeML = 0.0; presUFRate = 0.0; + pendingUserEndTreatmentRequest = FALSE; + pendingParamChangesTimer = 0; pendingUFVolumeChange = 0.0; pendingUFRateChange = 0.0; @@ -119,10 +124,8 @@ /*********************************************************************//** * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. - * @details - * Inputs : none - * Outputs : - * @param none + * @details Inputs: none + * @details Outputs: * @return none *************************************************************************/ void transitionToTreatmentMode( void ) @@ -135,8 +138,13 @@ initTreatmentStop(); // temporary test code. TODO - remove later #ifndef UF_TEST_ENABLED +#ifndef RUN_PUMPS_OPEN_LOOP + setBloodPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setDialInPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_CLOSED_LOOP ); +#else setBloodPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); +#endif setDialOutPumpTargetRate( 400, MOTOR_DIR_REVERSE, PUMP_CONTROL_MODE_OPEN_LOOP ); #endif #ifdef RM46_EVAL_BOARD_TARGET @@ -148,9 +156,8 @@ /*********************************************************************//** * @brief * The getTreatmentState function gets the current treatment mode state. - * @details - * Inputs : currentTreatmentState - * Outputs : none + * @details Inputs: currentTreatmentState + * @details Outputs: none * @return currentTreatmentState *************************************************************************/ TREATMENT_STATE_T getTreatmentState( void ) @@ -160,22 +167,44 @@ /*********************************************************************//** * @brief + * The userRequestEndTreatment function conveys a user request to end the + * treatment. + * @details Inputs: currentTreatmentState + * @details Outputs: response to user request sent + * @return TRUE if request accepted, FALSE if not + *************************************************************************/ +BOOL userRequestEndTreatment( void ) +{ + BOOL result = FALSE; + + if ( TREATMENT_STOP_STATE == currentTreatmentState ) + { + pendingUserEndTreatmentRequest = TRUE; + result = TRUE; + } + sendTreatmentEndResponseMsg( result ); + + return result; +} + +/*********************************************************************//** + * @brief * The execTreatmentMode function executes the Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : - * @param none + * @details Inputs: currentTreatmentState + * @details Outputs: currentTreatmentState * @return current state (sub-mode) *************************************************************************/ U32 execTreatmentMode( void ) { -#ifndef UF_TEST_ENABLED +#if 0 BOOL stop = isStopButtonPressed(); if ( TRUE == stop ) { requestNewOperationMode( MODE_POST ); } + broadcastTreatmentTimeAndState(); + broadcastTreatmentSettingsRanges(); #else // treatment mode state machine switch ( currentTreatmentState ) @@ -222,6 +251,7 @@ case TREATMENT_END_STATE: // TODO - implement + endAirTrapControl(); // TODO - move to appropriate place requestNewOperationMode( MODE_POST ); // TODO - test code - remove later break; @@ -230,11 +260,13 @@ currentTreatmentState = TREATMENT_END_STATE; break; } - + // broadcast treatment data broadcastTreatmentTimeAndState(); broadcastTreatmentSettingsRanges(); + // call various execs for treatment mode execTreatmentReservoirMgmt(); + execAirTrapMonitorTreatment(); #endif #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 5 min @@ -249,12 +281,10 @@ /*********************************************************************//** * @brief - * The handleTreatmentStartState function handles the Start state of \n + * The handleTreatmentStartState function handles the Start state of * the Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : none - * @param none + * @details Inputs: none + * @details Outputs: treatmentTimeMS, lastTreatmentTimeStamp * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentStartState( void ) @@ -265,12 +295,20 @@ treatmentTimeMS = 0; lastTreatmentTimeStamp = getMSTimerCount(); - // get prescription settings TODO - hard-coded for now +#ifndef DISABLE_UI_TREATMENT_WORKFLOW + presTreatmentTimeSecs = SEC_PER_MIN * getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); + presBloodFlowRate = getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ); + presDialysateFlowRate = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + presMaxUFVolumeML = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ); + presUFRate = presMaxUFVolumeML / (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); +#else + // TODO - test code presTreatmentTimeSecs = 3600; presBloodFlowRate = 300; presDialysateFlowRate = 300; presMaxUFVolumeML = 600.0; presUFRate = 10.0; +#endif // kick dialysis sub-mode off setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); @@ -281,12 +319,11 @@ /*********************************************************************//** * @brief - * The handleTreatmentDialysisState function handles the Dialysis state of \n + * The handleTreatmentDialysisState function handles the Dialysis state of * the Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : none - * @param none + * @details Inputs: none + * @details Outputs: treatmentTimeMS, lastTreatmentTimeStamp, dialysis sub-mode + * executed. * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentDialysisState( void ) @@ -295,12 +332,23 @@ 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(); + // end treatment if treatment duration has been reached + if ( CALC_ELAPSED_TREAT_TIME_IN_SECS() >= presTreatmentTimeSecs ) + { + result = TREATMENT_END_STATE; + } + // otherwise, execute state machine for treatment dialysis sub-mode + else + { + execDialysis(); + } // TODO - test code - remove later if ( getOffButtonState() == BUTTON_STATE_PRESSED ) @@ -323,20 +371,26 @@ /*********************************************************************//** * @brief - * The handleTreatmentStopState function executes the Stop state of the \n + * The handleTreatmentStopState function executes the Stop state of the * Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : none - * @param none + * @details Inputs: none + * @details Outputs: treatment stop sub-mode executed. * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentStopState( void ) { TREATMENT_STATE_T result = TREATMENT_STOP_STATE; - // execute state machine for treatment stop sub-mode - execTreatmentStop(); + // if user requests treatment end, end treatment + if ( TRUE == pendingUserEndTreatmentRequest ) + { + result = TREATMENT_END_STATE; + } + else + { + // execute state machine for treatment stop sub-mode + execTreatmentStop(); + } // TODO - test code - remove later if ( getOffButtonState() == BUTTON_STATE_PRESSED ) @@ -360,12 +414,11 @@ /*********************************************************************//** * @brief - * The verifyTreatmentDurationSettingChange function verifies and responds to \n + * The verifyTreatmentDurationSettingChange function verifies and responds to * the user treatment duration setting change request. - * @details - * Inputs : current operating mode, treatment states and parameters - * Outputs : response message sent - * @param treatmentTime : Proposed new treatment duration (in min). + * @details Inputs: current operating mode, treatment states and parameters + * @details Outputs: response message sent + * @param treatmentTime Proposed new treatment duration (in min) * @return TRUE if new treatment duration setting valid, FALSE if not. *************************************************************************/ BOOL verifyTreatmentDurationSettingChange( U32 treatmentTime ) @@ -439,12 +492,11 @@ /*********************************************************************//** * @brief - * The verifyUFSettingsChange function verifies and responds to a new \n + * The verifyUFSettingsChange function verifies and responds to a new * ultrafiltration volume setting from the user. - * @details - * Inputs : current operating mode, treatment states and parameters - * Outputs : response message sent - * @param uFVolume : New ultrafiltration volume requested by the user. + * @details Inputs: current operating mode, treatment states and parameters + * @details Outputs: response message sent + * @param uFVolume New ultrafiltration volume requested by the user * @return TRUE if new UF voluem is valid, FALSE if not. *************************************************************************/ BOOL verifyUFSettingsChange( F32 uFVolume ) @@ -542,13 +594,12 @@ /*********************************************************************//** * @brief - * The verifyUFSettingsConfirmation function verifies the user confirmed \n + * The verifyUFSettingsConfirmation function verifies the user confirmed * ultrafiltration settings change(s) and, if valid, accepts the new settings. - * @details - * Inputs : current operating mode, treatment states and parameters - * Outputs : response message sent - * @param uFVolume : New ultrafiltration volume confirmed by the user. - * @param adjustment : The adjustment selected by the user. + * @details Inputs: current operating mode, treatment states and parameters + * @details Outputs: response message sent + * @param uFVolume New ultrafiltration volume confirmed by the user + * @param adjustment The adjustment selected by the user * @return TRUE if new UF settings accepted, FALSE if not. *************************************************************************/ BOOL verifyUFSettingsConfirmation( F32 uFVolume, U32 adjustment ) @@ -606,13 +657,12 @@ /*********************************************************************//** * @brief - * The verifyBloodAndDialysateRateSettingsChange function verifies the \n + * The verifyBloodAndDialysateRateSettingsChange function verifies the * user blood & dialysate flow rate settings change. - * @details - * Inputs : current operating mode, treatment states and parameters - * Outputs : response message sent - * @param bloodRate : Proposed new blood flow rate (in mL/min). - * @param dialRate : Proposed new dialysate flow rate (in mL/min). + * @details Inputs: current operating mode, treatment states and parameters + * @details Outputs: response message sent + * @param bloodRate Proposed new blood flow rate (in mL/min) + * @param dialRate Proposed new dialysate flow rate (in mL/min) * @return TRUE if new blood & dialysate rate settings are valid, FALSE if not. *************************************************************************/ BOOL verifyBloodAndDialysateRateSettingsChange( U32 bloodRate, U32 dialRate ) @@ -666,11 +716,10 @@ /*********************************************************************//** * @brief - * The broadcastTreatmentTimeAndState function broadcasts treatment time and \n + * The broadcastTreatmentTimeAndState function broadcasts treatment time and * state data during treatment. - * @details - * Inputs : treatment time and state data - * Outputs : treatment time and state messages sent on interval + * @details Inputs: treatment time and state data + * @details Outputs: treatment time and state messages sent on interval * @return none *************************************************************************/ static void broadcastTreatmentTimeAndState( void ) @@ -691,7 +740,7 @@ U32 timeRemaining = presTreatmentTimeSecs - elapsedTreatmentTimeInSecs; DIALYSIS_STATE_T dialysisState = getDialysisState(); UF_STATE_T uFState = getUltrafiltrationState(); - BOOL salineBolusInProgress = ( dialysisState == DIALYSIS_SOLUTION_INFUSION_STATE ? TRUE : FALSE ); + SALINE_BOLUS_STATE_T salineBolusInProgress = getSalineBolusState(); broadcastTreatmentTime( presTreatmentTimeSecs, elapsedTreatmentTimeInSecs, timeRemaining ); broadcastTreatmentState( currentTreatmentState, uFState, salineBolusInProgress ); @@ -701,13 +750,12 @@ /*********************************************************************//** * @brief - * The broadcastTreatmentSettingsRanges function computes and broadcasts \n - * updated treatment parameter ranges that the user may change during treatment. \n - * It is assumed that prescription settings have already been set prior to calling \n + * The broadcastTreatmentSettingsRanges function computes and broadcasts + * updated treatment parameter ranges that the user may change during treatment. + * It is assumed that prescription settings have already been set prior to calling * this function. - * @details - * Inputs : current operating mode, treatment states and parameters - * Outputs : valid ranges message sent on interval + * @details Inputs: current operating mode, treatment states and parameters + * @details Outputs: valid ranges message sent on interval * @return none *************************************************************************/ static void broadcastTreatmentSettingsRanges( void )