Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r36ad88b8aad26008ed59d4213fb23dec7043f4d3 -r933a18d740285e70be9d00696ed0f5a5381bc8e4 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 36ad88b8aad26008ed59d4213fb23dec7043f4d3) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 933a18d740285e70be9d00696ed0f5a5381bc8e4) @@ -8,13 +8,14 @@ * @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" @@ -30,6 +31,7 @@ #include "Timers.h" #include "TreatmentStop.h" #include "Utilities.h" +#include "Valves.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; @@ -52,11 +54,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 ********** @@ -72,9 +77,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. @@ -84,7 +89,6 @@ // ********** private function prototypes ********** -static void broadcastTreatmentTimeAndState( void ); static void broadcastTreatmentSettingsRanges( void ); static TREATMENT_STATE_T handleTreatmentStartState( void ); static TREATMENT_STATE_T handleTreatmentDialysisState( void ); @@ -93,9 +97,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 ) @@ -124,9 +127,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 ) @@ -137,17 +139,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(); @@ -157,9 +148,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 ) @@ -171,9 +161,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 ) @@ -193,21 +182,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 ) { @@ -253,6 +241,7 @@ case TREATMENT_END_STATE: // TODO - implement + endAirTrapControl(); // TODO - move to appropriate place requestNewOperationMode( MODE_POST ); // TODO - test code - remove later break; @@ -261,12 +250,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 ) ) @@ -282,9 +272,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 ) @@ -295,12 +284,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 ); @@ -313,9 +310,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 *************************************************************************/ @@ -366,9 +362,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 ) @@ -410,9 +405,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. *************************************************************************/ @@ -481,6 +475,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; } @@ -489,9 +485,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. *************************************************************************/ @@ -592,9 +587,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. @@ -648,6 +642,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; } @@ -656,9 +652,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. @@ -803,12 +798,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; @@ -840,9 +834,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 )