/************************************************************************** * * Copyright (c) 2026-2026 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 ModePostTreat.c * * @author (last) Praneeth Bunne * @date (last) 15-May-2026 * * @author (original) Praneeth Bunne * @date (original) 17-Apr-2026 * ***************************************************************************/ #include "BloodFlow.h" #include "Buttons.h" #include "ModePostTreat.h" #include "OperationModes.h" #include "Switches.h" #include "SyringePump.h" #include "TubeSetAutoEject.h" #include "TxParams.h" /** * @addtogroup TDPostTreatmentMode * @{ */ // ********** private definitions ********** static BOOL patientDisconnectionConfirmed; ///< Flag indicates user confirms patient disconnection. static bool patientDisconnectHandled; ///< Flag indicates patient disconnect actions have been handled static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state // ********** private function prototypes ********** static void setPostTreatStateTransition( void ); static TD_POST_TREATMENT_STATE_T handlePatientDisconnectionState( void ); static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ); static TD_POST_TREATMENT_STATE_T handleDisposableRemovalState(void ); static TD_POST_TREATMENT_STATE_T handleVerifyState( void ); /*********************************************************************//** * @brief * The initPostTreatmentMode function initializes the Post-Treatment mode. * @details \b Inputs: none * @details \b Outputs: Resets all Post-Treatment sub-state variables. * @return none **************************************************************************/ void initPostTreatmentMode( void ) { patientDisconnectionConfirmed = FALSE; patientDisconnectHandled = FALSE; disposableRemovalConfirmed = FALSE; currentPostTreatmentState = TD_POST_TREATMENT_AUTO_EJECT_STATE; } /*********************************************************************//** * @brief * The transitionToPostTreatmentMode function prepares the system for * entry into Post-Treatment mode. * @details \b Inputs: none * @details \b Outputs: Initializes mode specific state and returns the starting * Post-Treatment sub-state. * @return Initial Post-Treatment sub-state **************************************************************************/ U32 transitionToPostTreatmentMode( void ) { initPostTreatmentMode(); initTubeSetAutoEject(); doorClosedRequired(TRUE); setPostTreatStateTransition(); return (U32)currentPostTreatmentState; } /*********************************************************************//** * @brief * The setPostTreatStateTransition function sets the actuators and variables * for the state transition in Post-Treatment mode. * @details \b Inputs: Valve states, Pump speed * @details \b Outputs: Actuate valves, pumps as desired * @Param state Post-Treatment state enum * @return none **************************************************************************/ static void setPostTreatStateTransition( void ) { switch( currentPostTreatmentState ) { case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: //TODO: actuator configuration; break; case TD_POST_TREATMENT_AUTO_EJECT_STATE: signalBloodPumpHardStop(); break; case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: //TODO: actuator configuration; break; case TD_POST_TREATMENT_VERIFY_STATE: //TODO: actuator configuration; break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE1, currentPostTreatmentState ); break; } } /*********************************************************************//** * @brief * The execPostTreatmentMode function executes the Post-Treatment * mode state machine. * @details \b Inputs: stop button status and system conditions via helpers. * @details \b Outputs: Advances the Post-Treatment sub-state * @return current Post-Treatment sub-state. *************************************************************************/ U32 execPostTreatmentMode( void ) { BOOL stop = isStopButtonPressed(); TD_POST_TREATMENT_STATE_T prevPostTreatmentState = currentPostTreatmentState; // Execute mode state machine switch ( currentPostTreatmentState ) { case TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: currentPostTreatmentState = handlePatientDisconnectionState(); break; case TD_POST_TREATMENT_AUTO_EJECT_STATE: currentPostTreatmentState = handleAutoEjectState(); break; case TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: currentPostTreatmentState = handleDisposableRemovalState(); break; case TD_POST_TREATMENT_VERIFY_STATE: currentPostTreatmentState = handleVerifyState(); break; case TD_POST_TREATMENT_DISINFECTION_STATE: //currentPostTreatmentState = handleDisinfectionState(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, currentPostTreatmentState ); break; } if ( prevPostTreatmentState != currentPostTreatmentState) { setPostTreatStateTransition(); } return (U32)currentPostTreatmentState; } /*********************************************************************//** * @brief * The checkPostTreatmentPatientDisconnect function checks UI patient * disconnect and handles valve release, pump homing, door requirement. * @details \b Inputs: patientDisconnectionConfirmed, patientDisconnectHandled * @details \b Outputs: patientDisconnectHandled, home pumps, open valves, * retract syringe, door closed requirement. * @return none *************************************************************************/ static void checkPostTreatmentPatientDisconnect( void ) { // VALVE_T valve; if ( ( TRUE == patientDisconnectionConfirmed ) && ( FALSE == patientDisconnectHandled ) ) { // home valves and pumps while front door is still closed. homeBloodPump(); // for ( valve = VDI; valve < NUM_OF_VALVES; valve++ ) { // setValvePosition( valve, VALVE_POSITION_A_INSERT_EJECT ); } if ( ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ) > 0.0 ) || ( getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DELIVERY_RATE ) > 0.0 ) ) { retractSyringePump(); } doorClosedRequired( FALSE ); // NOTE: patientDisconnectionConfirmed is NOT reset because // Patient Disconnect State needs it to move to next state patientDisconnectHandled = TRUE; } } /*********************************************************************//** * @brief * The handlePatientDisconnectionState function executes the Post-Treatment * mode Patient Disconnection state machine. * @details \b Inputs: none * @details \b Outputs: processed patient disconnection confirmation * @return next post-treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handlePatientDisconnectionState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; checkPostTreatmentPatientDisconnect(); if ( TRUE == patientDisconnectionConfirmed ) { patientDisconnectionConfirmed = FALSE; patientDisconnectHandled = FALSE; state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; } return state; } /*********************************************************************//** * @brief * The handleAutoEjectState function calls Tube Set Auto-Eject Service and * advances to Disposable removal state once the service signals * completion. * @details \b Inputs: none * @details \b Outputs: Advances Post-Treatment state when eject is complete. * @return next Post-Treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_AUTO_EJECT_STATE; // call tube set eject service to auto-eject tube set execTubeSetAutoEject(); if( TRUE == isTubeSetAutoEjectComplete() ) { state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; } return state; } /*********************************************************************//** * @brief * The handleDisposableRemovalState function executes the Post-Treatment * mode Disposable Removal state machine. * @details \b Inputs: disposableRemovalConfirmed * @details \b Outputs: processed disposable removal confirmation * @return next post-treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleDisposableRemovalState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; if ( TRUE == disposableRemovalConfirmed ) { disposableRemovalConfirmed = FALSE; state = TD_POST_TREATMENT_VERIFY_STATE; } return state; } /*********************************************************************//** * @brief * The handleVerifyState function executes the Post-Treatment * mode Verify state machine. * @details \b Inputs: TODO fill up if any * @details \b Outputs: TODO fill up if any * @return next post-treatment mode state *************************************************************************/ static TD_POST_TREATMENT_STATE_T handleVerifyState( void ) { TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_VERIFY_STATE; // TODO return state; } /*********************************************************************//** * @brief * The signalUserConfirmPatientDisconnection signals post-treatment mode * user has confirmed patient disconnection. * @details \b Inputs: none * @details \b Outputs: patientDisconnectedConfirm * @return none *************************************************************************/ void signalUserConfirmPatientDisconnection( void ) { patientDisconnectionConfirmed = TRUE; } /*********************************************************************//** * @brief * The signalUserConfirmDisposableRemoval signals post-treatment mode * user has confirmed disposable removal. * @details \b Inputs: none * @details \b Outputs: disposableRemovalConfirmed * @return none *************************************************************************/ void signalUserConfirmDisposableRemoval( void ) { disposableRemovalConfirmed = TRUE; } /**@}*/