Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -r1a685471524555a374854c0c9ec8e208e71fe2df --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 1a685471524555a374854c0c9ec8e208e71fe2df) @@ -8,26 +8,29 @@ * @file ModeTreatment.c * * @author (last) Sean Nash -* @date (last) 28-Aug-2020 +* @date (last) 12-Oct-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; @@ -50,11 +53,14 @@ #define PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ( 10 * SEC_PER_MIN ) ///< Prevent UF volume change if treatment within this much time from end of treatment (in seconds). #define TREATMENT_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the treatment time & state data is published on the CAN bus. -#define TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. +/// Interval (ms/task time) at which updated, valid treatment setting ranges are published on the CAN bus. +#define TREATMENT_SETTINGS_RANGES_PUB_INTERVAL ( ( 60 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) -#define CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. -#define CALC_ELAPSED_TREAT_TIME_IN_MIN() ( ( treatmentTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) ///< Macro to calculate the elapsed treatment time in minutes. -#define CALC_TREAT_TIME_REMAINING_IN_SECS() ( (S32)presTreatmentTimeSecs - (S32)( treatmentTimeMS / MS_PER_SECOND ) ) ///< Macro to calculate the remaining treatment time in seconds. +#define CALC_ELAPSED_TREAT_TIME_IN_SECS() ( treatmentTimeMS / MS_PER_SECOND ) ///< Macro to calculate the elapsed treatment time in seconds. +/// Macro to calculate the elapsed treatment time in minutes. +#define CALC_ELAPSED_TREAT_TIME_IN_MIN() ( ( treatmentTimeMS / MS_PER_SECOND ) / SEC_PER_MIN ) +/// Macro to calculate the remaining treatment time in seconds. +#define CALC_TREAT_TIME_REMAINING_IN_SECS() ( (S32)presTreatmentTimeSecs - (S32)( treatmentTimeMS / MS_PER_SECOND ) ) // ********** private data ********** @@ -70,9 +76,9 @@ static U32 lastTreatmentTimeStamp; ///< Last time elapsed treatment time was recorded (a timestamp in ms). static U32 treatmentTimeBroadcastTimerCtr; ///< Treatment data broadcast timer counter used to schedule when to transmit data. static U32 treatmentParamsRangesBroadcastTimerCtr; ///< Treatment parameter ranges broadcast timer counter used to schedule when to transmit updated ranges. +// TODO - test code - remove later +static BUTTON_STATE_T lastOffButtonState = BUTTON_STATE_RELEASED; -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. @@ -82,7 +88,6 @@ // ********** private function prototypes ********** -static void broadcastTreatmentTimeAndState( void ); static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentDialysisState( void ); @@ -91,9 +96,8 @@ /*********************************************************************//** * @brief * The initTreatmentMode function initializes the Treatment Mode module. - * @details - * Inputs : none - * Outputs : Treatment Mode module initialized. + * @details Inputs: none + * @details Outputs: Treatment Mode module initialized. * @return none *************************************************************************/ void initTreatmentMode( void ) @@ -122,9 +126,8 @@ /*********************************************************************//** * @brief * The transitionToTreatmentMode function prepares for transition to treatment mode. - * @details - * Inputs : none - * Outputs : + * @details Inputs: none + * @details Outputs: * @return none *************************************************************************/ void transitionToTreatmentMode( void ) @@ -135,17 +138,6 @@ // initialize treatment sub-modes each time we transition to treatment mode initDialysis(); 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 // TODO - temporary test code for eval board start = getMSTimerCount(); @@ -155,9 +147,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 ) @@ -169,9 +160,8 @@ * @brief * The userRequestEndTreatment function conveys a user request to end the * treatment. - * @details - * Inputs : currentTreatmentState - * Outputs : response to user request sent + * @details Inputs: currentTreatmentState + * @details Outputs: response to user request sent * @return TRUE if request accepted, FALSE if not *************************************************************************/ BOOL userRequestEndTreatment( void ) @@ -191,21 +181,20 @@ /*********************************************************************//** * @brief * The execTreatmentMode function executes the Treatment Mode state machine. - * @details - * Inputs : currentTreatmentState - * Outputs : currentTreatmentState + * @details Inputs: currentTreatmentState + * @details Outputs: currentTreatmentState * @return current state (sub-mode) *************************************************************************/ U32 execTreatmentMode( void ) { -#ifndef UF_TEST_ENABLED +#ifdef DISABLE_UI_TREATMENT_WORKFLOW BOOL stop = isStopButtonPressed(); if ( TRUE == stop ) { requestNewOperationMode( MODE_POST ); } -#else +#endif // treatment mode state machine switch ( currentTreatmentState ) { @@ -251,6 +240,7 @@ case TREATMENT_END_STATE: // TODO - implement + endAirTrapControl(); // TODO - move to appropriate place requestNewOperationMode( MODE_POST ); // TODO - test code - remove later break; @@ -259,12 +249,13 @@ currentTreatmentState = TREATMENT_END_STATE; break; } - + // broadcast treatment data broadcastTreatmentTimeAndState(); broadcastTreatmentSettingsRanges(); + // call various execs for treatment mode execTreatmentReservoirMgmt(); -#endif + execAirTrapMonitorTreatment(); #ifdef RM46_EVAL_BOARD_TARGET // TODO - temporary test code for eval board - move to next mode after 5 min if ( TRUE == didTimeout( start, 300000U ) ) @@ -280,9 +271,8 @@ * @brief * The handleTreatmentStartState function handles the Start state of * the Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : treatmentTimeMS, lastTreatmentTimeStamp + * @details Inputs: none + * @details Outputs: treatmentTimeMS, lastTreatmentTimeStamp * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentStartState( void ) @@ -293,12 +283,20 @@ treatmentTimeMS = 0; lastTreatmentTimeStamp = getMSTimerCount(); - // get prescription settings TODO - hard-coded for now - presTreatmentTimeSecs = 3600; +#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 ) * (F32)ML_PER_LITER; + presUFRate = presMaxUFVolumeML / (F32)getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); +#else + // TODO - test code + presTreatmentTimeSecs = 14400; presBloodFlowRate = 300; presDialysateFlowRate = 300; - presMaxUFVolumeML = 600.0; - presUFRate = 10.0; + presMaxUFVolumeML = 2400.0; + presUFRate = 0.0; +#endif // kick dialysis sub-mode off setDialysisParams( presBloodFlowRate, presDialysateFlowRate, presMaxUFVolumeML, presUFRate ); @@ -311,9 +309,8 @@ * @brief * The handleTreatmentDialysisState function handles the Dialysis state of * the Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : treatmentTimeMS, lastTreatmentTimeStamp, dialysis sub-mode + * @details Inputs: none + * @details Outputs: treatmentTimeMS, lastTreatmentTimeStamp, dialysis sub-mode * executed. * @return next treatment mode state *************************************************************************/ @@ -364,9 +361,8 @@ * @brief * The handleTreatmentStopState function executes the Stop state of the * Treatment Mode state machine. - * @details - * Inputs : none - * Outputs : treatment stop sub-mode executed. + * @details Inputs: none + * @details Outputs: treatment stop sub-mode executed. * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentStopState( void ) @@ -408,9 +404,8 @@ * @brief * 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 + * @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. *************************************************************************/ @@ -479,6 +474,8 @@ sendChangeTreatmentDurationResponse( result, rejectReason, presTreatmentTimeSecs / SEC_PER_MIN, presMaxUFVolumeML ); // send new ranges for settings broadcastTreatmentSettingsRanges(); + // send time/state data immediately for UI update + broadcastTreatmentTimeAndState(); return result; } @@ -487,9 +484,8 @@ * @brief * 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 + * @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. *************************************************************************/ @@ -590,9 +586,8 @@ * @brief * 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 + * @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. @@ -646,6 +641,8 @@ sendChangeUFSettingsOptionResponse( result, rejectReason, presMaxUFVolumeML, presTreatmentTimeSecs / SEC_PER_MIN, presUFRate ); // send new ranges for settings broadcastTreatmentSettingsRanges(); + // send time/state data immediately for UI update + broadcastTreatmentTimeAndState(); return result; } @@ -654,9 +651,8 @@ * @brief * 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 + * @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. @@ -714,12 +710,11 @@ * @brief * 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 ) +void broadcastTreatmentTimeAndState( void ) { U32 elapsedTreatmentTimeInSecs; @@ -751,9 +746,8 @@ * 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 )