Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r3ad3d957a31c79b3ff1e0da924627185d56fa642 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 3ad3d957a31c79b3ff1e0da924627185d56fa642) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -8,7 +8,7 @@ * @file ModePreTreat.c * * @author (last) Vijay Pamula -* @date (last) 12-Aug-2026 +* @date (last) 17-Aug-2026 * * @author (original) Dara Navaei * @date (original) 25-Sep-2025 @@ -19,6 +19,7 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DrySelfTests.h" #include "DDInterface.h" #include "Messaging.h" #include "ModePreTreat.h" @@ -42,6 +43,9 @@ // ********** private definitions ********** +/// Number of task cycles to delay UI transition after sub-mode completion. +#define SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) + /// Interval (ms/task time) at which the Pre-Treatment state data is published on the CAN bus. #define PRE_TREATMENT_STATE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) @@ -57,7 +61,9 @@ static TD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current Pre-Treatment sub-state static BOOL goToInstallStateRequested; ///< Flag indicating a request to transition to Install state. -static BOOL continueFromRecirculateRequested; ///< Flag indicating a request to transition to Confirm Rx state. +static BOOL alarmActionResumeReceived; ///< Flag indicates alarm action resume received. +static U32 submodeCompleteTransitionTimeCounter; ///< Sub-mode completed transition wait time counter. +static BOOL continueFromRecirculateRequested; ///< Flag indicating a request to transition to Patient Connection state. static BOOL continueFromHeparinSetupRequested; ///< Flag indicating a request to transition to Patient Connection state. static BOOL treatmentStartRequested; ///< Flag indicating the UI requested treatment start. static U32 preTreatmentStateBroadcastTimerCtr; ///< Pre-Treatment state data broadcast timer counter. @@ -66,14 +72,13 @@ static U32 lowQdTransitionStartTime; ///< Start time of the low Qd transition. static BOOL defaultQdApplied; ///< Flag indicating default Qd has been applied while Rx is unavailable. static BOOL preTreatmentRxUpdated; ///< Flag indicating a new or updated Rx was received. - static BOOL resumePreTxAlarmResponseRequest; ///< Flag indicates user has requested PreTx resume. // ********** private function prototypes ********** static void setPreTreatStateTransition( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleInstallState( void ); -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ); +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static TD_PRE_TREATMENT_MODE_STATE_T handleRxState( void ); @@ -101,6 +106,7 @@ continueFromRecirculateRequested = FALSE; continueFromHeparinSetupRequested = FALSE; treatmentStartRequested = FALSE; + submodeCompleteTransitionTimeCounter = 0; lowQdTransitionActive = FALSE; lowQdTransitionStartTime = 0U; defaultQdApplied = FALSE; @@ -114,6 +120,7 @@ PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, 0 }; + initDrySelfTests(); } /*********************************************************************//** @@ -167,7 +174,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - currentPreTreatmentState = handleSelfTestDryState(); + currentPreTreatmentState = handleDrySelfTestState(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -235,7 +242,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // TODO: actuator configuration + transitionToDrySelfTests(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -304,26 +311,43 @@ /*********************************************************************//** * @brief - * The handleSelfTestDryState function executes the Self Test Dry state - * of pre-treatment mode. - * @details \b Inputs: TODO fill up if any - * @details \b Outputs: TODO fill up if any - * @return next Pre-Treatment mode state. + * The handleDrySelfTestState function executes the Dry Self-Test + * pre-treatment sub-mode. + * @details \b Inputs: alarmActionResumeReceived, + * goToInstallStateRequested, submodeCompleteTransitionTimeCounter, + * @details \b Outputs: alarmActionResumeReceived, + * goToInstallStateRequested, submodeCompleteTransitionTimeCounter + * @return current Pre-Treatment state *************************************************************************/ -static TD_PRE_TREATMENT_MODE_STATE_T handleSelfTestDryState( void ) +static TD_PRE_TREATMENT_MODE_STATE_T handleDrySelfTestState( void ) { TD_PRE_TREATMENT_MODE_STATE_T state = TD_PRE_TREATMENT_SELF_TEST_DRY_STATE; + if ( TRUE == alarmActionResumeReceived ) + { + alarmActionResumeReceived = FALSE; + signalResumeDrySelfTests(); + } + execDrySelfTests(); if ( TRUE == goToInstallStateRequested ) { goToInstallStateRequested = FALSE; - initTubeSetInstall(); + state = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; } + else if ( DRY_SELF_TESTS_COMPLETE_STATE == getDrySelfTestsState() ) + { + if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) + { + submodeCompleteTransitionTimeCounter = 0; + state = TD_PRE_TREATMENT_PRIME_STATE; + } + } + else + { + submodeCompleteTransitionTimeCounter = 0; + } - setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); - state = TD_PRE_TREATMENT_PRIME_STATE; - return state; } @@ -611,29 +635,29 @@ *************************************************************************/ BOOL handleStartTreatmentRequest( MESSAGE_T *message ) { - TD_OP_MODE_T mode = getCurrentOperationMode(); - TD_PRE_TREATMENT_MODE_STATE_T preTxState = currentPreTreatmentState; - U32 payloadLen = message->hdr.payloadLen; - BOOL accepted = FALSE; - UI_RESPONSE_PAYLOAD_T response; + TD_OP_MODE_T mode = getCurrentOperationMode(); + TD_PRE_TREATMENT_MODE_STATE_T preTxState = currentPreTreatmentState; + U32 payloadLen = message->hdr.payloadLen; + BOOL accepted = FALSE; + UI_RESPONSE_PAYLOAD_T response; - response.accepted = FALSE; - response.rejectionReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; + response.accepted = FALSE; + response.rejectionReason = REQUEST_REJECT_REASON_ACTION_DISABLED_IN_CURRENT_STATE; - if ( ( 0U == payloadLen ) && ( MODE_PRET == mode ) && + if ( ( 0U == payloadLen ) && ( MODE_PRET == mode ) && ( TD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == preTxState ) ) - { - treatmentStartRequested = TRUE; - accepted = TRUE; - response.accepted = TRUE; - response.rejectionReason = REQUEST_REJECT_REASON_NONE; - } + { + treatmentStartRequested = TRUE; + accepted = TRUE; + response.accepted = TRUE; + response.rejectionReason = REQUEST_REJECT_REASON_NONE; + } - sendMessage( MSG_ID_TD_START_TREATMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, + sendMessage( MSG_ID_TD_START_TREATMENT_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); - return accepted; + return accepted; } /*********************************************************************//** @@ -691,9 +715,12 @@ break; case ALARM_ACTION_RESUME: - resumePreTxAlarmResponseRequest = TRUE; - if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) - { + if ( TD_PRE_TREATMENT_SELF_TEST_DRY_STATE == currentPreTreatmentState ) + { + signalResumeDrySelfTests(); + } + else if ( TD_PRE_TREATMENT_RECIRCULATE_STATE == currentPreTreatmentState ) + { signalResumePreTxRecirculate(); } else if ( TD_PRE_TREATMENT_HEPARIN_SETUP_STATE == currentPreTreatmentState ) @@ -754,6 +781,7 @@ payload.mSubMode = (U32)currentPreTreatmentState; payload.mInstallState = (U32)getTubeSetInstallState(); payload.mSelfTestDryState = 0; + payload.mSelfTestDryState = getDrySelfTestsState(); payload.mPrimeState = 0; payload.mRecirculateState = getPreTxRecirculateState(); payload.mConfirmRxState = 0; Index: firmware/App/Modes/ModePreTreat.h =================================================================== diff -u -r3ad3d957a31c79b3ff1e0da924627185d56fa642 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 3ad3d957a31c79b3ff1e0da924627185d56fa642) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -8,7 +8,7 @@ * @file ModePreTreat.h * * @author (last) Vijay Pamula -* @date (last) 12-Aug-2026 +* @date (last) 17-Aug-2026 * * @author (original) Dara Navaei * @date (original) 25-Sep-2025 @@ -38,10 +38,10 @@ void signalAlarmActionToPreTreatmentMode( ALARM_ACTION_T action ); // Execute alarm action as appropriate for pre-treatment mode BOOL signalPreTxResumeRequest( void ); // Signal resume alarm response from user -TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ); // Get the current pre-treatment sub mode. -void PreTxRequestTubeSetInstall( void ); // Request Pre-Treatment mode to transition to Install state. -void PreTxRequestContinueFromRecirculate( void ); // Request Pre-Treatment mode to transition to Patient Connection state. +TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ); // Get the current pre-treatment sub mode. void PreTxRequestTubeSetInstall( void ); // Request Pre-Treatment mode to transition to Install state. +void PreTxRequestContinueFromRecirculate( void ); // Request Pre-Treatment mode to transition to Patient Connection state. +void PreTxRequestTubeSetInstall( void ); // Request Pre-Treatment mode to transition to Install state. void PreTxRequestContinueFromRecirculate( void ); // Request Pre-Treatment mode to transition to Confirm Rx. void PreTxRequestContinueFromHeparinSetupRequested(void ); // Request Pre-Treatment mode to transition to Patient Connection state. BOOL handleStartTreatmentRequest ( MESSAGE_T *message ); // Handle UI request to start treatment. Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r3ad3d957a31c79b3ff1e0da924627185d56fa642 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 3ad3d957a31c79b3ff1e0da924627185d56fa642) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -193,6 +193,7 @@ if ( FALSE == homingInitiated ) { VALVE_T valve; + // Initiate homing for both pinch valves. for ( valve = FIRST_VALVE; valve < NUM_OF_VALVES; ++valve ) { Index: firmware/App/Modes/StatePreTxRecirculate.c =================================================================== diff -u -r6bd43a5945a9fe619348683bf85591ccd6d5b0d4 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Modes/StatePreTxRecirculate.c (.../StatePreTxRecirculate.c) (revision 6bd43a5945a9fe619348683bf85591ccd6d5b0d4) +++ firmware/App/Modes/StatePreTxRecirculate.c (.../StatePreTxRecirculate.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -212,11 +212,11 @@ activateAlarmNoData( ALARM_ID_TD_PRIME_COMPLETED_MEDIUM ); } - if ( TRUE == doesAlarmStatusIndicateStop() ) - { - signalBloodPumpHardStop(); - state = PRE_TX_RECIRCULATE_STOPPED_STATE; - } +// if ( TRUE == doesAlarmStatusIndicateStop() ) +// { +// signalBloodPumpHardStop(); +// state = PRE_TX_RECIRCULATE_STOPPED_STATE; +// } return state; } Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -r3ad3d957a31c79b3ff1e0da924627185d56fa642 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 3ad3d957a31c79b3ff1e0da924627185d56fa642) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -7,8 +7,8 @@ * * @file DDInterface.c * -* @author (last) suresh -* @date (last) 17-Aug-2026 +* @author (last) Vijay Pamula +* @date (last) 19-Aug-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -108,14 +108,6 @@ ddStarted = FALSE; ddStartCommandSent = FALSE; - preGenDialysateCmdSet.start = FALSE; - preGenDialysateCmdSet.dialRate = 0.0F; - preGenDialysateCmdSet.dialTemp = 0.0F; - preGenDialysateCmdSet.acidConvFactor = 0.0F; - preGenDialysateCmdSet.bicarbConvFactor = 0.0F; - preGenDialysateCmdSet.sodium = 0; - preGenDialysateCmdSet.bicarbonate = 0; - dialysateDeliveryCmdSet.start = FALSE; dialysateDeliveryCmdSet.dialRate = 0.0F; dialysateDeliveryCmdSet.ufRate = 0.0F; @@ -126,10 +118,8 @@ dialysateDeliveryCmdSet.sodium = 0; dialysateDeliveryCmdSet.bicarbonate = 0; dialysateDeliveryCmdSet.substitutionRate = 0.0F; - primeDataCmdSet.chamberHValveOpen = FALSE; primeDataCmdSet.primeFluidDiscardStart = FALSE; - //dialysateDeliveryCmdSet.substitutionRate = 0.0F; } /**********************************************************************//** @@ -468,7 +458,7 @@ dialysateDeliveryCmdSet.bicarbConvFactor = bicarbConvFactor; dialysateDeliveryCmdSet.sodium = sodium; dialysateDeliveryCmdSet.bicarbonate = bicarbonate; - //dialysateDeliveryCmdSet.substitutionRate = 0.0F; + dialysateDeliveryCmdSet.substitutionRate = 0.0F; #ifndef TEST_UI_ONLY sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); @@ -711,7 +701,7 @@ { if ( TRUE == dialysateDeliveryCmdSet.start ) { - //dialysateDeliveryCmdSet.substitutionRate = qs; + dialysateDeliveryCmdSet.substitutionRate = qs; #ifndef TEST_UI_ONLY sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); Index: firmware/App/Services/DDInterface.h =================================================================== diff -u -r6bd43a5945a9fe619348683bf85591ccd6d5b0d4 -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision 6bd43a5945a9fe619348683bf85591ccd6d5b0d4) +++ firmware/App/Services/DDInterface.h (.../DDInterface.h) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -52,6 +52,8 @@ U32 getDDSubMode( void ); F32 getDialysatePressure( void ); BOOL getDialysateGoodToDeliverStatus( void ); +BOOL getCurrentGenDState( void ); +BOOL getBalChamberSwitchingStatus( void ); BOOL setDDOpMode( MESSAGE_T *message ); BOOL setDialysateData( MESSAGE_T *message ); @@ -64,7 +66,9 @@ void cmdChangeDialysateTemperature( F32 dialTemp ); void cmdBypassDialyzer( BOOL bypass ); void cmdStopGenerateDialysate( void ); -void cmdSubstitutionRate (F32 qs ); +void cmdSubstitutionRate (F32 qs ); +void cmdDDChamberHValveOpen( BOOL valveOpenRequest ); +void cmdDDprimeFluidDiscard( BOOL primeFluidDiscardRequest ); void handleDDCommandResponse( DD_CMD_RESPONSE_T *ddCmdRespPtr ); BOOL getDDCommandResponse( U32 commandID, DD_CMD_RESPONSE_T *cmdRespPtr ); Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r58a7b4b8b4d84c2b1467236f38cb7d9bc98c988e -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 58a7b4b8b4d84c2b1467236f38cb7d9bc98c988e) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -16,6 +16,7 @@ ***************************************************************************/ #include // For memcpy() + #include "AirPump.h" #include "AirTrap.h" #include "AlarmMgmt.h" @@ -26,7 +27,7 @@ #include "Compatible.h" #include "CpldInterface.h" #include "DDInterface.h" -//#include "DrySelfTests.h" +#include "DrySelfTests.h" #include "Ejector.h" #include "FluidBolus.h" #include "FpgaTD.h" @@ -138,7 +139,7 @@ { MSG_ID_UI_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_REQUEST, &validateAndSetDialysateTemperature }, { MSG_ID_UI_BLOOD_PRIME_CMD_REQUEST, &bloodPrimeHandleCmdRequest }, { MSG_ID_UI_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_REQUEST, &bloodPrimeHandleBloodFlowChangeRequest }, -// { MSG_ID_UI_TUBE_SET_AUTHENTICATION_ACK_RESPONSE, &drySelfTestHandleTubingSetAuthResponse }, + { MSG_ID_UI_TUBE_SET_AUTHENTICATION_ACK_RESPONSE, &drySelfTestHandleTubingSetAuthResponse }, { MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST, &handleAutoLoadRequest }, { MSG_ID_UI_SETUP_TUBING_SET_CONNECTIONS_CONFIRM_REQUEST, &handleSetupTubingSetConnectionConfirmRequest }, { MSG_ID_UI_ADJUST_DISPOSABLES_REMOVAL_CONFIRM_REQUEST, &handleAutoEjectRequest }, Index: firmware/App/TDCommon.h =================================================================== diff -u -r96be4e95b48e3a57373c5266031215e0874df4be -rb5bdf7651e9adbcd91a28fe13ccb70c02b339c90 --- firmware/App/TDCommon.h (.../TDCommon.h) (revision 96be4e95b48e3a57373c5266031215e0874df4be) +++ firmware/App/TDCommon.h (.../TDCommon.h) (revision b5bdf7651e9adbcd91a28fe13ccb70c02b339c90) @@ -27,7 +27,6 @@ #define TD_VERSION_MICRO 0 #define TD_VERSION_BUILD 133 - // ********** development build switches ********** #ifndef _RELEASE_ @@ -38,9 +37,10 @@ // #define TEST_DEBUGGER 1 // Testing with debugger - prevents FPGA comm alarms caused by breakpoints // #define TEST_PROCESS_TASKS_WO_UI 1 // Allow task processing even when UI not connected // #define TEST_UI_ONLY 1 // Alpha test with TD and UI only - no DD +// #define TEST_UI_ONLY 1 // Alpha test with TD and UI only no DD // #define TEST_DISABLE_UI_ALARMS 1 // Disable UI alarms // #define TEST_USE_OFF_AS_STOP_BUTTON 1 // Alpha test re-purposing off button as a stop button -// #define TEST_NO_PRESSURE_CHECKS 1 // Alpha test with no pressure sensor checks +// #define TEST_NO_PRESSURE_CHECKS 1 // Alpha test with no pressure sensor checks. // #define TEST_NO_STOP_CONSUME_CHECK 1 // Alpha test with no check for stop button timeout // #define ASN_DEMO 1