/************************************************************************** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ModeTreatmentParams.c * * @author (last) Sean Nash * @date (last) 29-May-2020 * * @author (original) Sean Nash * @date (original) 29-May-2020 * ***************************************************************************/ #include "AlarmLamp.h" #include "BloodFlow.h" #include "Buttons.h" #include "DialInFlow.h" #include "DialOutFlow.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" #include "Utilities.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" static U32 start; #endif /** * @addtogroup HDTreatmentParamsMode * @{ */ // ********** private definitions ********** // ********** private data ********** static HD_TREATMENT_PARAMS_MODE_STATE_T treatParamsState; ///< Current state of treatment parameters mode state machine. // current treatment parameter values static CRITICAL_DATA_T treatmentParameters[ NUM_OF_TREATMENT_PARAMS ]; ///< Treatment parameters. // original treatment parameter values (for those that can be changed during treatment) static U32 origBloodFlowRate_mL_min; ///< Originally set (before treatment) blood flow rate (in mL/min). static U32 origDialysateFlowRate_mL_min; ///< Originally set (before treatment) dialysate flow rate (in mL/min). static U32 origTreatmentDuration_min; ///< Originally set (before treatment) treatment duration (in min). static U32 origArterialPressureLowLimit_mmHg; ///< Originally set (before treatment) arterial pressure lower alarm limit (in mmHg). static U32 origArterialPressureHighLimit_mmHg; ///< Originally set (before treatment) arterial pressure upper alarm limit (in mmHg). static U32 origVenousPressureLowLimit_mmHg; ///< Originally set (before treatment) venous pressure lower alarm limit (in mmHg). static U32 origVenousPressureHighLimit_mmHg; ///< Originally set (before treatment) venous pressure upper alarm limit (in mmHg). static F32 origUFVolume_L; ///< Originally set (before treatment) ultrafiltration volume (in liters). // ********** private function prototypes ********** static void resetAllTreatmentParameters( void ); static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2SendState( void ); static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2ConfirmState( void ); /************************************************************************* * @brief initOpParamsMode * The initOpParamsMode function initializes the Operating Parameters Mode module. * @details * Inputs : none * Outputs : Operating Parameters Mode module initialized. * @param none * @return none *************************************************************************/ void initTreatParamsMode( void ) { treatParamsState = HD_TREATMENT_PARAMS_MODE_STATE_START; } /************************************************************************* * @brief transitionToOpParamsMode * The transitionToOpParamsMode function prepares for transition to operating \n * parameters mode. * @details * Inputs : none * Outputs : * @param none * @return none *************************************************************************/ void transitionToTreatParamsMode( void ) { // reset all treatment parameters when transitioning to this mode resetAllTreatmentParameters(); // temporary test code. TODO - remove later #ifndef UF_TEST_ENABLED setBloodPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialInPumpTargetFlowRate( 300, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); setDialOutPumpTargetRate( 325, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); #endif #ifdef RM46_EVAL_BOARD_TARGET start = getMSTimerCount(); #endif } static void resetAllTreatmentParameters( void ) { U32 i; for ( i = 0; i < NUM_OF_TREATMENT_PARAMS; i++ ) { resetCriticalData( &treatmentParameters[ i ] ); } origBloodFlowRate_mL_min = 0; origDialysateFlowRate_mL_min = 0; origTreatmentDuration_min = 0; origArterialPressureLowLimit_mmHg = 0; origArterialPressureHighLimit_mmHg = 0; origVenousPressureLowLimit_mmHg = 0; origVenousPressureHighLimit_mmHg = 0; origUFVolume_L = 0.0; } /************************************************************************* * @brief execOpParamsMode * The execFaultMode function executes the Operating Parameters Mode state machine. * @details * Inputs : none * Outputs : * @param none * @return current state (sub-mode) *************************************************************************/ U32 execTreatParamsMode( void ) { BOOL stop = isStopButtonPressed(); #ifdef UF_TEST_ENABLED requestNewOperationMode( MODE_PRET ); #endif #ifdef RM46_EVAL_BOARD_TARGET if ( TRUE == didTimeout( start, 5000U ) ) { requestNewOperationMode( MODE_PRET ); } #endif #ifndef UF_TEST_ENABLED // execute mode state machine switch ( treatParamsState ) { case HD_TREATMENT_PARAMS_MODE_STATE_START: treatParamsState = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND; break; case HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND: break; case HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM: break; default: // TODO - s/w fault break; } #endif return (U32)treatParamsState; } static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2SendState( void ) { HD_TREATMENT_PARAMS_MODE_STATE_T result = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_SEND; return result; } static HD_TREATMENT_PARAMS_MODE_STATE_T handleWaitForUI2ConfirmState( void ) { HD_TREATMENT_PARAMS_MODE_STATE_T result = HD_TREATMENT_PARAMS_MODE_STATE_WAIT_4_UI_2_CONFIRM; return result; } void setTreatmentParameterU32( TREATMENT_PARAM_T param, U32 value ) { // validate parameter //if ( param <= TREATMENT_PARAM_LAST_U32 ) { CRITICAL_DATAS_T data = treatmentParameters[ param ].data; data.uInt = value; setCriticalData( &treatmentParameters[ param ], data ); } // else { // TODO - s/w fault } } void setTreatmentParameterF32( TREATMENT_PARAM_T param, F32 value ) { // validate parameter if ( param >= TREATMENT_PARAM_FIRST_F32 && param < NUM_OF_TREATMENT_PARAMS ) { CRITICAL_DATAS_T data = treatmentParameters[ param ].data; data.flt = value; setCriticalData( &treatmentParameters[ param ], data ); } else { // TODO - s/w fault } } U32 getTreatmentParameterU32( TREATMENT_PARAM_T param ) { U32 result = 0; // validate parameter //if ( param <= TREATMENT_PARAM_LAST_U32 ) { CRITICAL_DATAS_T data = getCriticalData( &treatmentParameters[ param ] ); result = data.uInt; } //else { // TODO - s/w fault } return result; } F32 getTreatmentParameterF32( TREATMENT_PARAM_T param ) { F32 result = 0.0; // validate parameter if ( param >= TREATMENT_PARAM_FIRST_F32 && param < NUM_OF_TREATMENT_PARAMS ) { CRITICAL_DATAS_T data = getCriticalData( &treatmentParameters[ param ] ); result = data.flt; } else { // TODO - s/w fault } return result; } U32 getOrigBloodFlowRate_mL_min( void ) { return origBloodFlowRate_mL_min; } U32 getOrigDialysateFlowRate_mL_min( void ) { return origDialysateFlowRate_mL_min; } U32 getOrigTreatmentDuration_min( void ) { return origTreatmentDuration_min; } U32 getOrigArterialPressureLowLimit_mmHg( void ) { return origArterialPressureLowLimit_mmHg; } U32 getOrigArterialPressureHighLimit_mmHg( void ) { return origArterialPressureHighLimit_mmHg; } U32 getOrigVenousPressureLowLimit_mmHg( void ) { return origVenousPressureLowLimit_mmHg; } U32 getOrigVenousPressureHighLimit_mmHg( void ) { return origVenousPressureHighLimit_mmHg; } F32 getOrigUFVolume_L( void ) { return origUFVolume_L; } /**@}*/