Index: firmware/App/Modes/ModeInitPOST.c =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Modes/ModeInitPOST.c (.../ModeInitPOST.c) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -23,6 +23,7 @@ //#include "Buttons.h" #include "Compatible.h" #include "CpldInterface.h" +#include "Ejector.h" //#include "Fans.h" #include "FpgaTD.h" //#include "Integrity.h" @@ -53,6 +54,9 @@ /// Maximum wait time for UI to send its final POST result. #define POST_UI_MAX_WAIT_TIME ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +/// Ejector homing post test time interval (ms/task time) +#define EJECTOR_HOME_POST_TIMEOUT ( 10 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) + // ********** private data ********** static TD_POST_STATE_T postState; ///< Current state of initialize and POST mode. @@ -66,6 +70,7 @@ static BOOL dgPOSTResultReceived; ///< Have we received a final POST result from the DG? static U32 waitForUIPostTimerCtr; ///< Timer counter to limit wait for UI final POST result. static U32 postCompleteDelayTimerCtr; ///< Timer counter for 2 second delay after POST completes and before transitioning to Standbymode. +static U32 ejectorHomePostTimerCounter; ///< TImer counter for ejector homing POST test. static UI_VERSIONS_T uiVersion = { 0, 0, 0, 0, 0 }; ///< Version and compatibility information reported by UI. static DD_VERSIONS_T dgVersion = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ///< Version and compatibility information reported by DG. @@ -79,6 +84,7 @@ static TD_POST_STATE_T handlePOSTStateStart( void ); static SELF_TEST_STATUS_T execFWCompatibilityTest( void ); static SELF_TEST_STATUS_T execUITest( void ); +static SELF_TEST_STATUS_T execEjectorHomingTest( void ); /*********************************************************************//** * @brief @@ -89,17 +95,18 @@ *************************************************************************/ void initInitAndPOSTMode( void ) { - postState = POST_STATE_START; - postCompleted = FALSE; - postPassed = FALSE; - tempPOSTPassed = TRUE; - uiPOSTPassed = FALSE; - dgPOSTPassed = FALSE; - uiPOSTResultReceived = FALSE; - dgPOSTResultReceived = FALSE; - waitForUIPostTimerCtr = 0; - postCompleteDelayTimerCtr = 0; - startPOSTDelayCounter = 0; + postState = POST_STATE_START; + postCompleted = FALSE; + postPassed = FALSE; + tempPOSTPassed = TRUE; + uiPOSTPassed = FALSE; + dgPOSTPassed = FALSE; + uiPOSTResultReceived = FALSE; + dgPOSTResultReceived = FALSE; + waitForUIPostTimerCtr = 0; + postCompleteDelayTimerCtr = 0; + startPOSTDelayCounter = 0; + ejectorHomePostTimerCounter = 0; } /*********************************************************************//** @@ -250,6 +257,10 @@ postState = handlePOSTStatus( testStatus ); break; + case POST_STATE_EJECTOR_HOMING: + testStatus = execEjectorHomingTest(); + postState = handlePOSTStatus( testStatus ); + break; // Should be last POST (and last POST test must be a test that completes in a single call) case POST_STATE_FPGA: // testStatus = execFPGATest(); @@ -564,4 +575,34 @@ return result; } +/*********************************************************************//** + * @brief + * The execEjectorHomingTest function executes the ejector homing POST test. + * Commands the ejector to home on first call. + * @details \b Inputs: ejectorHomePostTimerCounter + * @details \b Outputs: ejectorHomePostTimerCounter + * @return in progress, passed, or failed + *************************************************************************/ +static SELF_TEST_STATUS_T execEjectorHomingTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; + + if ( 0U == ejectorHomePostTimerCounter ) + { + homeEjector(); + } + + if ( ++ejectorHomePostTimerCounter >= EJECTOR_HOME_POST_TIMEOUT ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_TD_EJECTOR_POST_TEST_FAILED, (U32)getEjectorState() ); + result = SELF_TEST_STATUS_FAILED; + } + else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) + { + result = SELF_TEST_STATUS_PASSED; + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u --- firmware/App/Modes/ModePostTreat.c (revision 0) +++ firmware/App/Modes/ModePostTreat.c (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -0,0 +1,347 @@ +/************************************************************************** +* +* Copyright (c) 2025-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.h +* +* @author (last) Praneeth Bunne +* @date (last) 13-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (original) 13-Apr-2026 +* +***************************************************************************/ + +#include "BloodFlow.h" +#include "Buttons.h" +#include "Ejector.h" +#include "ModePostTreat.h" +#include "OperationModes.h" +#include "PeristalticPump.h" +#include "TaskGeneral.h" +#include "TDDefs.h" + +/** + * @addtogroup TDPostTreatmentMode + * @{ + */ + +// ********** private definitions ********** + +///< Auto eject timeout interval (ms/task time) +#define AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) + +///< Blood pump flow rate (mL/min) for the ejecting operation +#define AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN 100U + +// ********** private data ********** + +static BOOL autoEjectHomePosCleared; ///< Flag indicating BP rotor has left home position during ejection revolution +static BOOL setEntryActuatorCmdIssued; ///< Flag indicates actuator command has been issued on current sub-state entry +static U32 autoEjectTimerCounter; ///< Timer counter shared across all auto-eject sub-states + +static TD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current Post-Treatment sub-state +static POST_TX_AUTO_EJECT_STATE_T currentPostTxAutoEjectState; ///< Current Post-Treatment Auto Eject sub-state + +// ********** private function prototypes ********** + +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 ); + +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ); +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ); +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ); +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ); + +/*********************************************************************//** +* @brief +* The initPostTreatmentMode function initializes the Post-Treatment mode. +* @details Inputs: none +* @details Outputs: Resets all Post-Treatment sub-state variables. +* @return none +**************************************************************************/ +void initPostTreatmentMode( void ) +{ + currentPostTreatmentState = TD_POST_TREATMENT_AUTO_EJECT_STATE; + currentPostTxAutoEjectState = POST_TX_AUTO_EJECT_STATE_HOMING; + autoEjectHomePosCleared = FALSE; + setEntryActuatorCmdIssued = FALSE; + autoEjectTimerCounter = 0; +} + +/*********************************************************************//** +* @brief +* The transitionToPostTreatmentMode function prepares the system for +* entry into Post-Treatment mode. +* @details Inputs: none +* @details Outputs: Initializes mode specific state and returns the starting +* Post-Treatment sub-state. +* @return Initial Post-Treatment sub-state +**************************************************************************/ +U32 transitionToPostTreatmentMode( void ) +{ + initPostTreatmentMode(); + signalBloodPumpHardStop(); + + return (U32)currentPostTreatmentState; +} + +/*********************************************************************//** + * @brief + * The execPostTreatmentMode function executes the Post-Treatment + * mode state machine. + * @details Inputs: stop button status and system conditions via helpers. + * @details Outputs: Advances the Post-Treatment sub-state + * @return current Post-Treatment sub-state. + *************************************************************************/ +U32 execPostTreatmentMode( void ) +{ + BOOL stop = isStopButtonPressed(); + + if ( TRUE == stop ) + { + activateAlarmNoData( ALARM_ID_TD_TREATMENT_STOPPED_BY_USER ); + } + + // 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; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, currentPostTreatmentState ); + break; + } + + return (U32)currentPostTreatmentState; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectState function executes the Post-Treatment + * mode Auto Eject state machine. + * @details Inputs: currentPostTxAutoEjectState + * @details Outputs: Advances the Post-Treatment Auto Eject sub-state + * and next Post-Treatment top-level state when eject is complete. + * @return current post-treatment sub-state + *************************************************************************/ +static TD_POST_TREATMENT_STATE_T handleAutoEjectState( void ) +{ + TD_POST_TREATMENT_STATE_T state = TD_POST_TREATMENT_AUTO_EJECT_STATE; + POST_TX_AUTO_EJECT_STATE_T prevAutoEjectSubState = currentPostTxAutoEjectState; + + switch ( currentPostTxAutoEjectState ) + { + case POST_TX_AUTO_EJECT_STATE_HOMING: + currentPostTxAutoEjectState = handleAutoEjectHomingState(); + break; + + case POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR: + currentPostTxAutoEjectState = handleAutoEjectExtendingEjectorState(); + break; + + case POST_TX_AUTO_EJECT_STATE_EJECTING: + currentPostTxAutoEjectState = handleAutoEjectEjectingState(); + break; + + case POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR: + currentPostTxAutoEjectState = handleAutoEjectRetractingEjectorState(); + + if( NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES == currentPostTxAutoEjectState ) + { + state = TD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE, (U32)currentPostTxAutoEjectState ); + break; + } + + if ( prevAutoEjectSubState != currentPostTxAutoEjectState ) + { + autoEjectTimerCounter = 0; + setEntryActuatorCmdIssued = FALSE; + } + + return state; + +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectHomingState function handles the Homing sub-state + * of the Post-Treatment Auto-Eject state machine. + * Homes both the blood pump (H4) and ejector (H5) + * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @return next Auto-Eject sub-state + *************************************************************************/ +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectHomingState( void ) +{ + POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_HOMING; + + // Issue both homing commands once on state entry + if( FALSE == setEntryActuatorCmdIssued ) + { + homeBloodPump(); + homeEjector(); + setEntryActuatorCmdIssued = TRUE; + } + + if( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL) + { + signalBloodPumpHardStop(); + + if( TRUE == isPumpHomeInProgress() ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, (U32)isPeristalticPumpHome(), autoEjectTimerCounter ); + } + + if( EJECTOR_STATE_RETRACTED != getEjectorState() ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); + } + + requestNewOperationMode( MODE_FAUL); + } + else + { + BOOL bpHomed = ( FALSE == isPumpHomeInProgress() ); + BOOL ejectorHomed = ( EJECTOR_STATE_RETRACTED == getEjectorState() ); + + if( ( TRUE == bpHomed ) && ( TRUE == ejectorHomed ) ) + { + subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; + } + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectExtendingEjectorState function handles the + * Extending Ejector sub-state of the Post-Treatment Auto-Eject + * state machine. Extends the ejector pin (H5) to engage the tubeset. + * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @return next Auto-Eject sub-state + *************************************************************************/ +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectExtendingEjectorState( void ) +{ + POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EXTENDING_EJECTOR; + + if ( FALSE == setEntryActuatorCmdIssued ) + { + extendEjector(); + setEntryActuatorCmdIssued = TRUE; + } + + if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); + requestNewOperationMode( MODE_FAUL); + } + else if ( EJECTOR_STATE_EXTENDED == getEjectorState() ) + { + subState = POST_TX_AUTO_EJECT_STATE_EJECTING; + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectEjectingState function handles the Ejecting sub-state + * of the Post-Treatment Auto-Eject state machine. Rotates the blood pump (H4) + * forward at 100 mL/min with the ejector extended to push the tubeset + * out of the rotor. + * @details Inputs: autoEjectHomePosCleared, autoEjectTimerCounter + * @details Outputs: autoEjectHomePosCleared, autoEjectTimerCounter + * @return next Auto-Eject sub-state + *************************************************************************/ +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectEjectingState( void ) +{ + POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_EJECTING; + + setBloodPumpTargetFlowRate( AUTO_EJECT_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP); + + if( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, autoEjectHomePosCleared, isPeristalticPumpHome() ); + requestNewOperationMode( MODE_FAUL); + } + else + { + if( FALSE == autoEjectHomePosCleared ) + { + if( FALSE == isPeristalticPumpHome() ) + { + autoEjectHomePosCleared = TRUE; + } + } + else if( TRUE == isPeristalticPumpHome() ) + { + signalBloodPumpHardStop(); + subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; + } + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The handleAutoEjectRetractingEjectorState function handles the + * Retracting Ejector sub-state of the Post-Treatment Auto-Eject + * state machine. Retracts the ejector pin (H5) after the tubeset has been + * ejected. + * @details Inputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @details Outputs: setEntryActuatorCmdIssued, autoEjectTimerCounter + * @return next Auto-Eject sub-state + *************************************************************************/ +static POST_TX_AUTO_EJECT_STATE_T handleAutoEjectRetractingEjectorState( void ) +{ + POST_TX_AUTO_EJECT_STATE_T subState = POST_TX_AUTO_EJECT_STATE_RETRACTING_EJECTOR; + + if ( FALSE == setEntryActuatorCmdIssued ) + { + retractEjector(); + setEntryActuatorCmdIssued = TRUE; + } + + if ( ++autoEjectTimerCounter >= AUTO_EJECT_OPERATION_TIMEOUT_INTERVAL ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_EJECT_EJECTOR_TIMEOUT, (U32)getEjectorState(), autoEjectTimerCounter ); + requestNewOperationMode( MODE_FAUL); + } + else if ( EJECTOR_STATE_RETRACTED == getEjectorState() ) + { + subState = NUM_OF_POST_TX_AUTO_EJECT_SUB_STATES; + } + + return subState; +} + +/**@}*/ Index: firmware/App/Modes/ModePostTreat.h =================================================================== diff -u --- firmware/App/Modes/ModePostTreat.h (revision 0) +++ firmware/App/Modes/ModePostTreat.h (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -0,0 +1,40 @@ +/************************************************************************** +* +* Copyright (c) 2025-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.h +* +* @author (last) Praneeth Bunne +* @date (last) 13-Apr-2026 +* +* @author (original) Praneeth Bunne +* @date (original) 13-Apr-2026 +* +***************************************************************************/ + +#ifndef __MODE_POST_TREATMENT_H__ +#define __MODE_POST_TREATMENT_H__ + +#include "TDCommon.h" +#include "TDDefs.h" + +/** + * @defgroup TDPostTreatmentMode TDPostTreatmentMode + * @brief Post-treatment Mode module. + * + * @addtogroup TDPostTreatmentMode + * @{ + */ + +// ********** public function prototypes ********** + +void initPostTreatmentMode( void ); // Initialize this module +U32 transitionToPostTreatmentMode( void ); // Prepares for transition to post-treatment mode +U32 execPostTreatmentMode( void ); // Execute the post-treatment mode state machine (call from OperationModes) + +/**@}*/ + +#endif Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6f02ff4686ec9dfc60247e9ed3fc9c5cc7771543) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -15,9 +15,14 @@ * ***************************************************************************/ +#include "BloodFlow.h" #include "Buttons.h" +#include "Messaging.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "PeristalticPump.h" +#include "TaskGeneral.h" +#include "TDDefs.h" #include "Timers.h" #include "TxParams.h" @@ -28,13 +33,27 @@ // ********** private definitions ********** +///< Auto-Load timeout interval (ms/task time) +#define AUTO_LOAD_TIMEOUT_INTERVAL ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) + +//< Blood pump flow rate (mL/min) for Auto-Load operation +#define AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN 100U + // ********** private data ********** +static BOOL confirmTubesetPlaced; ///< Flag indicating user has confirmed tubeset is placed +static U32 autoLoadTimerCounter; ///< Auto-Load operation timer counter +static BOOL autoLoadHomePosCleared; ///< Flag indicating blood pump rotor has left home position during auto-load + static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state +static PRE_TX_INSTALL_STATE_T currentPreTxInstallState; ///< Current Pre-Treatment Install sub-state // ********** private function prototypes ********** static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); ///< Handle Confirm Rx state during Pre-Treatment +static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); ///< Handle Install state during Pre-Treatment +static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ); ///< Handle Await Tubset Install Confirmation sub-state +static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ); ///< Handle Auto-Load sub-state /*********************************************************************//** * @brief @@ -48,7 +67,11 @@ { // Start a fresh Treatment Parameters session for this run. resetTreatmentParameters(); - currentPreTreatmentState = TD_PRE_TREATMENT_CONFIRM_RX_STATE; + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + currentPreTxInstallState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; + confirmTubesetPlaced = FALSE; + autoLoadTimerCounter = 0; + autoLoadHomePosCleared = FALSE; } /*********************************************************************//** @@ -100,8 +123,8 @@ // currentPreTreatmentState = handleSelfTestNoCartState(); break; - case TD_PRE_TREATMENT_CART_INSTALL_STATE: - // currentPreTreatmentState = handleInstallState(); + case TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE: + currentPreTreatmentState = handleInstallState(); break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: @@ -158,4 +181,132 @@ return state; } +/*********************************************************************//** + * @brief + * The handleInstallState function executes the Pre-Treatment Install + * state machine. + * @details Inputs: currentPreTxInstallState + * @details Outputs: Advances the Pre-Treatment Install sub-state and + * next Pre-Treatment top-level state when install is complete. + * @return current Pre-Treatment sub-state. + *************************************************************************/ +static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ) +{ + TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + + switch(currentPreTxInstallState) + { + case PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION: + currentPreTxInstallState = handleAwaitTubesetConfirmationState(); + break; + + case PRE_TX_INSTALL_STATE_AUTO_LOAD: + currentPreTxInstallState = handleAutoLoadState(); + + if ( NUM_OF_PRE_TX_INSTALL_SUB_STATES == currentPreTxInstallState ) + { + state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE, (U32)currentPreTxInstallState ); + break; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleAwaitTubesetConfirmationState function handles the Await + * tubeset confirmation state of Pre-Treatement mode install state + * machine. Should wait for the user to confirm the tubeset is placed. + * @details Inputs: confirmTubsetPlaced + * @details Outputs: confirmTubsetPlaced, autoLoadHomePosCleared + * returns next Pre-Treatment install sub-state + *************************************************************************/ +static PRE_TX_INSTALL_STATE_T handleAwaitTubesetConfirmationState( void ) +{ + PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AWAIT_TUBING_SET_CONFIRMATION; + + if ( TRUE == confirmTubesetPlaced ) + { + confirmTubesetPlaced = FALSE; + autoLoadHomePosCleared = FALSE; + subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The handleAutoLoadState function handles the Auto-Load state of + * Pre-Treatement mode install state. + * @details Inputs: autoLoadHomePosCleared, autoLoadTimerCounter + * @details Outputs: autoLoadHomePosCleared, autoLoadTimerCounter + * returns next Pre-Treatment install sub-state + *************************************************************************/ +static PRE_TX_INSTALL_STATE_T handleAutoLoadState( void ) +{ + PRE_TX_INSTALL_STATE_T subState = PRE_TX_INSTALL_STATE_AUTO_LOAD; + + // Set H4 to 100 mL/min forward + setBloodPumpTargetFlowRate( AUTO_LOAD_BLOOD_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + + // Timeout check + if ( ++autoLoadTimerCounter >= AUTO_LOAD_TIMEOUT_INTERVAL ) + { + signalBloodPumpHardStop(); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_AUTO_LOAD_EJECT_BP_TIMEOUT, autoLoadHomePosCleared, isPeristalticPumpHome() ); + requestNewOperationMode( MODE_FAUL ); + } + else + { + if ( FALSE == autoLoadHomePosCleared ) + { + if ( FALSE == isPeristalticPumpHome() ) + { + autoLoadHomePosCleared = TRUE; + } + } + else if ( TRUE == isPeristalticPumpHome() ) + { + signalBloodPumpHardStop(); + subState = NUM_OF_PRE_TX_INSTALL_SUB_STATES; + } + } + + return subState; +} + +/*********************************************************************//** + * @brief + * The signalUserConfirmTubesetInstallation function sets the user + * confirmation flag signaling user has confirmed tubset installation + * @details Inputs: none + * @details Outputs: confirmTubesetPlaced + * @param message confirmation message from UI which includes the user + * confirmation of tubset installation. + * @return TRUE if confirmation/rejection accepted, FALSE if not + *************************************************************************/ +BOOL signalUserConfirmTubesetInstallation( MESSAGE_T *message ) +{ + BOOL confirmed = FALSE; + BOOL result = FALSE; + + if ( sizeof( BOOL ) == message->hdr.payloadLen ) + { + memcpy( &confirmed, message->payload, sizeof( BOOL ) ); + if( TRUE == confirmed ) + { + confirmTubesetPlaced = TRUE; + result = TRUE; + } + } + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -36,6 +36,8 @@ U32 transitionToPreTreatmentMode( void ); // Prepares for transition to pre-treatment mode U32 execPreTreatmentMode( void ); // Execute the pre-treatment mode state machine (call from OperationModes) +BOOL signalUserConfirmTubesetInstallation( MESSAGE_T *message ); // Signal that user confirms cartridge has been installed + /**@}*/ #endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -reef41b7363d82763095a1317f1757f360f0d9ec1 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision eef41b7363d82763095a1317f1757f360f0d9ec1) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -24,7 +24,7 @@ #include "ModeStandby.h" #include "ModePreTreat.h" #include "ModeTreatment.h" -//#include "ModePostTreat.h" +#include "ModePostTreat.h" //#include "NVDataMgmt.h" #include "OperationModes.h" #include "TaskGeneral.h" @@ -124,7 +124,7 @@ initStandbyMode(); initPreTreatmentMode(); initTreatmentMode(); -// initPostTreatmentMode(); + initPostTreatmentMode(); } /*********************************************************************//** @@ -208,9 +208,9 @@ currentSubMode = execTreatmentMode(); break; -// case MODE_POST: -// currentSubMode = execPostTreatmentMode(); -// break; + case MODE_POST: + currentSubMode = execPostTreatmentMode(); + break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, currentMode ) @@ -408,9 +408,9 @@ case MODE_TREA: currentSubMode = transitionToTreatmentMode(); break; -// case MODE_POST: -// currentSubMode = transitionToPostTreatmentMode(); -// break; + case MODE_POST: + currentSubMode = transitionToPostTreatmentMode(); + break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, newMode ) break; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rc049177f4d18a4740a357941b48a833d7115b581 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision c049177f4d18a4740a357941b48a833d7115b581) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -184,6 +184,7 @@ SW_FAULT_ID_BLOOD_PRIME_INVALID_STATE = 153, SW_FAULT_ID_MODE_PRE_TREATMENT_INVALID_STATE = 148, SW_FAULT_ID_TD_AIR_PUMP_DUTY_CYCLE_OUT_OF_RANGE = 149, + SW_FAULT_ID_MODE_POST_TREATMENT_INVALID_STATE = 150, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r72bc0d5f33dbb07afc8a7cd9015e4861c6c371a1 -r5a29e093e8a11f971c312cab5f6e7fedae2953db --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 72bc0d5f33dbb07afc8a7cd9015e4861c6c371a1) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 5a29e093e8a11f971c312cab5f6e7fedae2953db) @@ -30,6 +30,7 @@ #include "FpgaTD.h" #include "LevelSensors.h" #include "Messaging.h" +#include "ModePreTreat.h" #include "ModeStandby.h" #include "OperationModes.h" #include "PAL.h" @@ -116,6 +117,7 @@ { MSG_ID_UI_PRESSURE_LIMIT_WIDEN_REQUEST, &pressureLimitHandleWidenRequest }, { MSG_ID_UI_BLOOD_PRIME_CMD_REQUEST, &bloodPrimeHandleCmdRequest }, { MSG_ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_REQUEST, &bloodPrimeHandleBloodFlowChangeRequest }, + { MSG_ID_UI_CONFIRM_TUBESET_INSTALLATION, &signalUserConfirmTubesetInstallation }, { MSG_ID_TD_SOFTWARE_RESET_REQUEST, &testTDSoftwareResetRequest }, { MSG_ID_TD_BUBBLE_OVERRIDE_REQUEST, &testBubbleDetectOverride }, { MSG_ID_TD_BUBBLE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, &testBubblesDataPublishIntervalOverride },