Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r6bd43a5945a9fe619348683bf85591ccd6d5b0d4 -r8254d0eaea0d25b62e41dc4189ec7cabbcf4c226 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6bd43a5945a9fe619348683bf85591ccd6d5b0d4) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8254d0eaea0d25b62e41dc4189ec7cabbcf4c226) @@ -19,10 +19,12 @@ #include "AirTrap.h" #include "BloodFlow.h" #include "Buttons.h" +#include "DrySelfTests.h" #include "DDInterface.h" #include "Messaging.h" #include "ModePreTreat.h" #include "OperationModes.h" +#include "TaskGeneral.h" #include "StatePreTxHeparinSetup.h" #include "StatePreTxRecirculate.h" #include "SyringePump.h" @@ -40,6 +42,8 @@ // ********** private definitions ********** +#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 ) @@ -55,7 +59,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. @@ -69,7 +75,7 @@ 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 ); @@ -88,28 +94,28 @@ **************************************************************************/ void initPreTreatmentMode( void ) { - // Start a fresh Treatment Parameters session for this run. initTreatmentParameters(); - initPreTxHeparinSetup(); - - currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; + currentPreTreatmentState = TD_PRE_TREATMENT_TUBING_SET_INSTALL_STATE; goToInstallStateRequested = FALSE; + alarmActionResumeReceived = FALSE; continueFromRecirculateRequested = FALSE; continueFromHeparinSetupRequested = FALSE; treatmentStartRequested = FALSE; + submodeCompleteTransitionTimeCounter = 0; lowQdTransitionActive = FALSE; lowQdTransitionStartTime = 0U; defaultQdApplied = FALSE; preTreatmentRxUpdated = FALSE; preTreatmentStateBroadcastTimerCtr = PRE_TREATMENT_STATE_DATA_PUB_INITIAL_OFFSET; - preTreatmentStatePublishInterval = (OVERRIDE_U32_T) { PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, PRE_TREATMENT_STATE_DATA_PUB_INTERVAL, 0 }; + initPreTxHeparinSetup(); + initDrySelfTests(); } /*********************************************************************//** @@ -163,15 +169,14 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // currentPreTreatmentState = handleSelfTestDryState(); + currentPreTreatmentState = handleDrySelfTestState(); break; case TD_PRE_TREATMENT_PRIME_STATE: - // currentPreTreatmentState = handlePrimeState(); + currentPreTreatmentState = handlePrimeState(); break; case TD_PRE_TREATMENT_CONFIRM_RX_STATE: - // Confirm Rx state currentPreTreatmentState = handleRxState(); break; @@ -202,13 +207,25 @@ { setPreTreatStateTransition(); } - publishPreTreatmentStates(); return (U32)currentPreTreatmentState; } /*********************************************************************//** + * @brief + * The getPreTreatmentSubState function gets the current + * pre-treatment mode state. + * @details \b Inputs: currentPreTreatmentState + * @details \b Outputs: none + * @return currentPreTreatmentState + *************************************************************************/ +TD_PRE_TREATMENT_MODE_STATE_T getPreTreatmentSubState( void ) +{ + return currentPreTreatmentState; +} + +/*********************************************************************//** * @brief * The setPreTreatStateTransition function sets the actuators and variables * for the state transition in Pre-Treatment mode. @@ -231,7 +248,7 @@ break; case TD_PRE_TREATMENT_SELF_TEST_DRY_STATE: - // TODO: actuator configuration + transitionToDrySelfTests(); break; case TD_PRE_TREATMENT_PRIME_STATE: @@ -273,7 +290,6 @@ } /*********************************************************************//** - * @brief * The handleInstallState function calls Tube Set Install Service and * advances to Self Test Dry state once the service signals * completion. @@ -298,26 +314,40 @@ /*********************************************************************//** * @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 performs dry self-test. + * @details \b Inputs: none + * @details \b Outputs: transition to prime state on user request + * @return current state (sub-mode) *************************************************************************/ -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_CONFIRM_RX_STATE; + } + } + else + { + submodeCompleteTransitionTimeCounter = 0; + } - // TODO: Transition to Prime state on completion when implemented - // state = TD_PRE_TREATMENT_PRIME_STATE; - return state; } @@ -676,8 +706,12 @@ break; case ALARM_ACTION_RESUME: - 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 ) @@ -686,7 +720,7 @@ } else { - // No action required. + // No action required. } break; @@ -726,7 +760,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 -r3f0d1433b3481160bf554aaf7371708380211a36 -r8254d0eaea0d25b62e41dc4189ec7cabbcf4c226 --- firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 3f0d1433b3481160bf554aaf7371708380211a36) +++ firmware/App/Modes/ModePreTreat.h (.../ModePreTreat.h) (revision 8254d0eaea0d25b62e41dc4189ec7cabbcf4c226) @@ -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 @@ -45,6 +45,7 @@ void PreTxRequestContinueFromHeparinSetupRequested(void ); // Request Pre-Treatment mode to transition to Patient Connection state. BOOL handleStartTreatmentRequest ( MESSAGE_T *message ); // Handle UI request to start treatment. BOOL signalPreTreatmentBackoutToStandby( void ); // Request transition from Pre-Treatment Install: Await Confirmation to Standby. +void signalPreTreatmentRxUpdated( void ); // Signal that a new or updated Rx was received. BOOL testPreTreatmentStatePublishIntervalOverride( MESSAGE_T *message ); Index: firmware/App/Services/DDInterface.c =================================================================== diff -u -r927dfd6e109af46160e5aef687f1b7c286d24703 -r8254d0eaea0d25b62e41dc4189ec7cabbcf4c226 --- firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 927dfd6e109af46160e5aef687f1b7c286d24703) +++ firmware/App/Services/DDInterface.c (.../DDInterface.c) (revision 8254d0eaea0d25b62e41dc4189ec7cabbcf4c226) @@ -7,8 +7,8 @@ * * @file DDInterface.c * -* @author (last) Varshini Nagabooshanam -* @date (last) 15-Jun-2026 +* @author (last) Vijay Pamula +* @date (last) 19-Aug-2026 * * @author (original) Sean Nash * @date (original) 01-Aug-2024 @@ -461,6 +461,36 @@ /*********************************************************************//** * @brief + * The cmdChangeDialysateTemperature function sends a generate dialysate + * command to the DD with a given new dialysate temperature. + * @details \b Inputs: none + * @details \b Outputs: dialysateDeliveryCmdSet + * @details \b Message \b Sent: Continue generate dialysate command w/ new + * dialysate temperature. + * @param dialTemp Target dialysate temperature in deg C. + * @return none + *************************************************************************/ +void cmdChangeDialysateTemperature( F32 dialTemp ) +{ + if ( TRUE == dialysateDeliveryCmdSet.start ) + { + dialysateDeliveryCmdSet.dialTemp = dialTemp; + +#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 ) ); +#endif + } + else + { + // TODO - s/w fault? + } +} + +/*********************************************************************//** + * @brief * The cmdBypassDialyzer function sends a generate dialysate command to the DD * with a given flag indicating whether dialyzer should be bypassed. * @details \b Inputs: none @@ -616,7 +646,8 @@ { //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 ) ); + sendMessage( MSG_ID_DD_GEN_DIALYSATE_REQUEST_DATA, COMM_BUFFER_OUT_CAN_TD_2_DD, + (U08*)(&dialysateDeliveryCmdSet), sizeof( DIALYSATE_DELIVERY_REQ_PAYLOAD_T ) ); #endif } else Index: firmware/App/Services/StateServices/DrySelfTests.c =================================================================== diff -u -ra43e8d7086cdfa6f6208306e5b23de13ffb8a014 -r8254d0eaea0d25b62e41dc4189ec7cabbcf4c226 --- firmware/App/Services/StateServices/DrySelfTests.c (.../DrySelfTests.c) (revision a43e8d7086cdfa6f6208306e5b23de13ffb8a014) +++ firmware/App/Services/StateServices/DrySelfTests.c (.../DrySelfTests.c) (revision 8254d0eaea0d25b62e41dc4189ec7cabbcf4c226) @@ -49,15 +49,17 @@ // Pressure self-test timing #define PRE_NORMAL_PRESSURE_DELAY_MS ( 5 * MS_PER_SECOND ) ///< Delay before capturing baseline arterial and venous pressures. #define STABILITY_PRESSURE_CHECK_TIME_MS ( 4 * MS_PER_SECOND ) ///< Time allowed for pressure stabilization. -#define VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor venous pressure decay (leak check). -#define ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor arterial pressure decay (leak check). +#define VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor venous pressure decay (leak check). +#define ARTERIAL_PRESSURE_LEAK_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) ///< Time to monitor arterial pressure decay (leak check). #define TUBING_SET_INSERT_PRESSURE_SETTLE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Time required for pressure settling after tubing set insertion. #define VENOUS_PRESSURE_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Max time allowed to reach venous pressure target. #define ARTERIAL_PRESSURE_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Max time allowed to reach arterial pressure target. +#define PRESSURE_RELIEF_CHECK_TIME_MS ( 30 * MS_PER_SECOND ) +#define ARTERIAL_PRESSURE_SETTLE_TIME_MS ( 1 * MS_PER_SECOND ) + #define MAX_DRY_SELF_TEST_TIME ( 12 * SEC_PER_MIN ) ///< Maximum total dry self-test duration. #define SELF_TEST_TIME_DATA_PUB_INTERVAL ( 1 * MS_PER_SECOND ) ///< Interval for publishing self-test progress data. #define TUBING_SET_AUTH_TIMEOUT_MS ( 5 * MS_PER_SECOND ) ///< Tubing set authentication timeout -#define PRESSURE_RELIEF_CHECK_TIME_MS ( 5 * MS_PER_SECOND ) //Pressure self-test pump flow #define BLOOD_PUMP_PRESSURE_SELF_TEST_FLOW 100 ///< Blood pump flow rate during arterial pressure self-test (mL/min). @@ -70,10 +72,8 @@ #define ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure variation during stabilization. #define VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed venous pressure difference during leak check. #define ARTERIAL_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG 5.0F ///< Max allowed arterial pressure difference during leak check. -//#define VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG 20.0F ///< Venous pressure must return within this threshold after relief. -//#define ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG 20.0F ///< Arterial pressure must return within this threshold after relief. -#define VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F -#define ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F +#define VENOUS_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Venous pressure must return within this threshold after relief. +#define ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG 5.0F ///< Arterial pressure must return within this threshold after relief. /// Payload record structure for dry self-test authentication response @@ -87,23 +87,29 @@ static DRY_SELF_TESTS_STATE_T currentDrySelfTestsState; ///< Current state of Dry Self-Test state machine static U32 selfTestPreviousPublishDataTime; ///< Last progress data publish time -static BOOL doorStateAfterTubingSetInstall; ///< Tracks door transition after tubing set install static U32 selfTestStartTime; ///< Start time of dry self-tests +static BOOL doorStateAfterTubingSetInstall; ///< Tracks door transition after tubing set install static BOOL selfTestsResumeRequested; ///< Resume requested from STOPPED state static BOOL tubingSetLeakChecksStarted; ///< Indicates tubing set leak check started static BOOL barcodeScanResponseReceived; ///< Barcode response received flag static U32 authenticationStartTime; ///< Authentication start timer static BOOL authResponseReceived; ///< Indicates UI auth response received static BOOL authResponseValidTubingSet; ///< Indicates tubing set is valid static BOOL authResponseModalityAccepted; ///< Indicates tubing set modality is accepted + +// Pressure normal static U32 pressureSelfTestPreNormalStartTime; ///< Start time for pre-normal pressure setup delay + +// Venous pressure static U32 venousSetupStartTime; ///< Venous setup start time static F32 peakVenousPressure; ///< Peak venous pressure during stabilization static U32 venousPressureStabilizationStartTime; ///< Start time for venous stabilization static F32 venousPressureP1; ///< First stable venous pressure sample static F32 venousPressureP2; ///< Second venous pressure sample for leak check static U32 venousPressureLeakCheckStartTime; ///< Start time for venous leak check static U32 venousPressureReliefStartTime; ///< Start time for venous pressure relief + +// Arterial pressure static U32 arterialSetupStartTime; ///< Arterial pressure setup state entry static U32 pressureSelfTestArterialStartTime; ///< Start time for arterial pressure build-up static F32 peakArterialPressure; ///< Peak arterial pressure during stabilization @@ -113,6 +119,10 @@ static U32 arterialPressureLeakCheckStartTime; ///< Start time for arterial leak check static U32 arterialPressureReliefStartTime; ///< Start time for arterial pressure relief +// Used to avoid comparing pump-running pressure against immediate post-hard-stop pressure. +static U32 arterialPressureSettleStartTime; +static BOOL arterialPressureBaselineCaptured; + // ********** private function prototypes ********** static void publishDrySelfTestProgress( void ); @@ -145,40 +155,53 @@ void initDrySelfTests( void ) { currentDrySelfTestsState = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; + selfTestStartTime = 0; selfTestPreviousPublishDataTime = 0; + pressureSelfTestPreNormalStartTime = 0; + venousSetupStartTime = 0; venousPressureStabilizationStartTime = 0; venousPressureLeakCheckStartTime = 0; venousPressureReliefStartTime = 0; + pressureSelfTestArterialStartTime = 0; arterialPressureStabilizationStartTime = 0; arterialPressureLeakCheckStartTime = 0; arterialPressureReliefStartTime = 0; + + arterialPressureSettleStartTime = 0; + authenticationStartTime = 0; + doorStateAfterTubingSetInstall = TRUE; selfTestsResumeRequested = FALSE; tubingSetLeakChecksStarted = FALSE; + barcodeScanResponseReceived = FALSE; authResponseReceived = FALSE; authResponseValidTubingSet = FALSE; authResponseModalityAccepted = FALSE; + peakVenousPressure = 0.0F; venousPressureP1 = 0.0F; venousPressureP2 = 0.0F; + peakArterialPressure = 0.0F; arterialPressureP1 = 0.0F; arterialPressureP2 = 0.0F; + + arterialPressureBaselineCaptured = FALSE; } /*********************************************************************//** * @brief * The transitionToDrySelfTests function resets anything required before * the start of dry self-tests. - * @details \b Inputs: front door state - * @details \b Outputs: Dry self-tests re-initialized, changed depending - * on front door state + * @details \b Inputs: currentDrySelfTestsState + * @details \b Outputs: selfTestStartTime, selfTestPreviousPublishDataTime, + * selfTestsResumeRequested * @return none *************************************************************************/ void transitionToDrySelfTests( void ) @@ -187,50 +210,18 @@ selfTestPreviousPublishDataTime = getMSTimerCount(); resetSelfTestsFlags(); - doorClosedRequired( TRUE ); - - // Dry Self-Test directly controls H13 and H20. endAirTrapControl(); - setCurrentSubState( (U32)currentDrySelfTestsState ); - - // Configure actuators for the initial Dry Self-Test state. + // To configure actuators for the initial Dry Self-Test state. transitionToDrySelfTestsState( currentDrySelfTestsState ); } -//void transitionToDrySelfTests( void ) -//{ -// selfTestStartTime = getMSTimerCount(); -// selfTestPreviousPublishDataTime = getMSTimerCount(); -// doorClosedRequired( TRUE ); -// setCurrentSubState( (U32)currentDrySelfTestsState ); -// transitionToDrySelfTestsState( currentDrySelfTestsState ); -// -// signalBloodPumpHardStop(); -// -// endAirTrapControl(); -// set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); -// set3WayValveState( H20_VALV, VALVE_3WAY_COMMON_TO_CLOSED_STATE ); -// setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); -// -// if ( STATE_CLOSED == getSwitchState( H9_SWCH ) ) -// { -// setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); -// } -// else -// { -// setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); -// } -// -// resetSelfTestsFlags(); -//} - /*********************************************************************//** * @brief * The execDrySelfTests function executes the dry self-tests state machine. * @details \b Inputs: currentDrySelfTestsState - * @details \b Outputs: currentDrySelfTestsState, pressureSelfTestPreNormalStartTime + * @details \b Outputs: currentDrySelfTestsState * @return none *************************************************************************/ void execDrySelfTests( void ) @@ -299,14 +290,10 @@ break; default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, - SW_FAULT_ID_TD_INVALID_DRY_SELF_TEST_STATE, currentDrySelfTestsState ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_TD_INVALID_DRY_SELF_TEST_STATE, currentDrySelfTestsState ); break; } - // Self-tests flags should be handled by now, reset if flags not handled with current state - //resetSelfTestsFlags(); - if ( priorSubState != currentDrySelfTestsState ) { transitionToDrySelfTestsState( currentDrySelfTestsState ); @@ -320,8 +307,10 @@ /*********************************************************************//** * @brief * The publishDrySelfTestProgress function publishes dry self-test progress. -* @details \b Inputs: selfTestPreviousPublishDataTime -* @details \b Outputs: progress data broadcast +* @details \b Message \b Sent: MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA +* @details \b Inputs: selfTestPreviousPublishDataTime, selfTestStartTime, +* currentDrySelfTestsState +* @details \b Outputs: selfTestPreviousPublishDataTime * @return none *************************************************************************/ static void publishDrySelfTestProgress( void ) @@ -336,9 +325,7 @@ data.substate = currentDrySelfTestsState; data.timeout = MAX_DRY_SELF_TEST_TIME; data.countdown = ( elapsedSelfTestTimeInSecs <= MAX_DRY_SELF_TEST_TIME ? ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ) : 0 ); - broadcastData( MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA, - COMM_BUFFER_OUT_CAN_TD_BROADCAST, - (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); + broadcastData( MSG_ID_TD_DRY_SELF_TEST_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_TD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); } } @@ -347,7 +334,7 @@ * The signalResumeDrySelfTests function signals the self-tests to resume * previous operation. * @details \b Inputs: none - * @details \b Outputs: primeResumeRequested + * @details \b Outputs: selfTestsResumeRequested * @return none *************************************************************************/ void signalResumeDrySelfTests( void ) @@ -359,7 +346,7 @@ * @brief * The resetSelfTestsFlags function resets all self-tests signal flags. * @details \b Inputs: none - * @details \b Outputs: signal flags set to FALSE + * @details \b Outputs: selfTestsResumeRequested * @return none *************************************************************************/ static void resetSelfTestsFlags( void ) @@ -369,10 +356,10 @@ /*********************************************************************//** * @brief -* The setAlarmResumePerDoor function enables resume only when -* required conditions are satisfied. -* @details \b Inputs: Front door switch state -* @details \b Outputs: resume alarm enabled/disabled +* The setAlarmResumePerDoor function sets the Resume alarm action +* based on the front door state. +* @details \b Inputs: doorClosed +* @details \b Outputs: none * @return none *************************************************************************/ static void setAlarmResumePerDoor( void ) @@ -406,8 +393,8 @@ * @brief * The handleDrySelfTestWaitForDoorCloseState function makes sure door is * closed before starting self-tests. - * @details \b Inputs: none - * @details \b Outputs: none + * @details \b Inputs: door + * @details \b Outputs: doorStateAfterTubingSetInstall * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ) @@ -416,11 +403,11 @@ OPN_CLS_STATE_T door = getSwitchState( H9_SWCH ); // Want to pinch off saline once door closed after tubing set install - //handleDoorCloseAfterTubingSetInsertion(); + handleDoorCloseAfterTubingSetInsertion(); if ( STATE_CLOSED == door ) { - doorClosedRequired( TRUE ); + // TODO Later - Current temporary sequential test flow bypasses tubing-set barcode/authentication states state = DRY_SELF_TESTS_PRESSURE_SENSOR_NORMAL_SETUP_STATE; } @@ -474,8 +461,10 @@ * @brief * The handleDrySelfTestTubingSetLoadedCheckState function handles barcode * scan result and transitions to authentication state if scan succeeded. -* @details \b Inputs: barcodeScanResponseReceived, barcodeScanSuccessful -* @details \b Outputs: authenticationStartTime +* @details \b Message \b Sent: MSG_ID_TD_TUBE_SET_AUTHENTICATION_REQUEST +* if barcode scan response is received +* @details \b Inputs: barcodeScanResponseReceived +* @details \b Outputs: barcodeScanResponseReceived, authenticationStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubingSetLoadedCheckState( void ) @@ -508,8 +497,8 @@ * The handleDrySelfTestTubingSetAuthenticationState function handles tubing set * authentication and processes the authentication response. * @details \b Inputs: authResponseReceived, authResponseValidTubingSet, -* authResponseModalityAccepted -* @details \b Outputs: pressureSelfTestPreNormalStartTime +* authResponseModalityAccepted, authenticationStartTime +* @details \b Outputs: authResponseReceived * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestTubingSetAuthenticationState( void ) @@ -546,8 +535,8 @@ * @brief * The handleDrySelfTestPressureSensorNormalSetupState function handles the setup * for pressure sensors dry self-test. - * @details \b Inputs: pressureSelfTestPreNormalStartTime - * @details \b Outputs: previousNormalArterialPressure, previousNormalVenousPressure + * @details \b Inputs: pressureSelfTestPreNormalStartTime, art, ven + * @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorNormalSetupState( void ) @@ -562,7 +551,7 @@ if ( ( fabs(art) < ZERO_PRESSURE_THRESHOLD_MMHG ) && ( fabs(ven) < ZERO_PRESSURE_THRESHOLD_MMHG ) ) { setArtVenPressureOffsets(); - venousSetupStartTime = getMSTimerCount(); + //venousSetupStartTime = getMSTimerCount(); state = DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE; } else @@ -579,8 +568,8 @@ * @brief * The handleDrySelfTestVenousPressureSetupState function handles the setup * for the venous pressure sensor dry self-test. -* @details \b Inputs: none -* @details \b Outputs: venousPressureStabilizationStartTime +* @details \b Inputs: venousSetupStartTime +* @details \b Outputs: peakVenousPressure, venousPressureStabilizationStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureSetupState( void ) @@ -609,30 +598,19 @@ * @brief * The handleDrySelfTestVenousPressureStabilizationState function handles * venous pressure stabilization check. - * @details \b Inputs: venousPressureStabilizationStartTime, peakVenousPressure - * @details \b Outputs: venousPressureP1 + * @details \b Inputs: venousPressureStabilizationStartTime + * @details \b Outputs: venousPressureP1, venousPressureLeakCheckStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureStabilizationState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE; - if ( TRUE == didTimeout( venousPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) + if ( TRUE == didTimeout( venousPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) { - F32 currentVenousPressure = getFilteredVenousPressure(); - F32 diff = fabs( peakVenousPressure - currentVenousPressure ); - - if ( diff <= VENOUS_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG ) - { - venousPressureP1 = currentVenousPressure; - venousPressureLeakCheckStartTime = getMSTimerCount(); - state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; - } - else - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_VENOUS_PRESSURE_DECAY, diff ); - state = DRY_SELF_TESTS_STOPPED_STATE; - } + venousPressureP1 = getFilteredVenousPressure(); + venousPressureLeakCheckStartTime = getMSTimerCount(); + state = DRY_SELF_TESTS_VENOUS_PRESSURE_LEAK_CHECK_STATE; } return state; @@ -643,7 +621,7 @@ * The handleDrySelfTestVenousPressureLeakCheckState function handles * venous pressure leak check. * @details \b Inputs: venousPressureLeakCheckStartTime, venousPressureP1 - * @details \b Outputs: venousPressureP2 + * @details \b Outputs: venousPressureP2, venousPressureReliefStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestVenousPressureLeakCheckState( void ) @@ -652,8 +630,10 @@ if ( TRUE == didTimeout( venousPressureLeakCheckStartTime, VENOUS_PRESSURE_LEAK_CHECK_TIME_MS ) ) { + F32 diff; + venousPressureP2 = getFilteredVenousPressure(); - F32 diff = fabs( venousPressureP1 - venousPressureP2 ); + diff = fabs( venousPressureP1 - venousPressureP2 ); if ( diff <= VENOUS_PRESSURE_LEAK_DIFF_TOLERANCE_MMHG ) { @@ -669,7 +649,6 @@ return state; } - /*********************************************************************//** * @brief * The handleDrySelfTestVenousPressureReliefState function handles @@ -705,24 +684,19 @@ * @brief * The handleDrySelfTestPressureArterialSetupState function handles the setup * for the arterial pressure sensor dry self-test. - * @details \b Inputs: none - * @details \b Outputs: pressureSelfTestArterialStartTime + * @details \b Inputs: pressureSelfTestArterialStartTime + * @details \b Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureSetupState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_PRESSURE_ARTERIAL_SETUP_STATE; F32 art = getFilteredArterialPressure(); - // Check the target for arterial pressure <= -200 mmHg and then transition to arterial pressure stabilization state if ( art <= ARTERIAL_PRESSURE_TARGET_MMHG ) { - peakArterialPressure = art; - arterialPressureStabilizationStartTime = getMSTimerCount(); state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; - } - // Time out alarm if it does not reach within 30 sec tolerance else if ( TRUE == didTimeout( pressureSelfTestArterialStartTime, ARTERIAL_PRESSURE_TIMEOUT_MS ) ) { SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURIZATION_TIMEOUT, art ); @@ -737,20 +711,30 @@ * The handleDrySelfTestArterialPressureStabilizationState function monitors * arterial pressure, verifies target pressure is reached, and records P1 * after stabilization. - * @details \b Inputs: pressureSelfTestArterialStartTime, - * arterialPressureStabilizationStartTime + * @details \b Inputs: pressureSelfTestArterialStartTime, peakArterialPressure, + * arterialPressureStabilizationStartTime, arterialPressureBaselineCaptured, * @details \b Outputs: peakArterialPressure, arterialPressureP1, - * arterialPressureLeakCheckStartTime + * arterialPressureLeakCheckStartTime, arterialPressureBaselineCaptured, + * arterialPressureStabilizationStartTime * @return the next state of dry self-tests state machine *************************************************************************/ static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureStabilizationState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE; - if ( TRUE == didTimeout( arterialPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) + if ( FALSE == arterialPressureBaselineCaptured ) { + if ( TRUE == didTimeout( arterialPressureSettleStartTime, ARTERIAL_PRESSURE_SETTLE_TIME_MS ) ) + { + peakArterialPressure = getFilteredArterialPressure(); + arterialPressureStabilizationStartTime = getMSTimerCount(); + arterialPressureBaselineCaptured = TRUE; + } + } + else if ( TRUE == didTimeout( arterialPressureStabilizationStartTime, STABILITY_PRESSURE_CHECK_TIME_MS ) ) + { F32 currentArterialPressure = getFilteredArterialPressure(); - F32 diff = fabs( peakArterialPressure - currentArterialPressure ); + F32 diff = fabs( peakArterialPressure - currentArterialPressure ); if ( diff <= ARTERIAL_PRESSURE_STABILITY_DIFF_TOLERANCE_MMHG ) { @@ -811,21 +795,17 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestArterialPressureReliefState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_ARTERIAL_PRESSURE_RELIEF_STATE; + F32 art = getFilteredArterialPressure(); - if ( TRUE == didTimeout( arterialPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) + if ( fabs( art ) <= ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG ) { - F32 art = getFilteredArterialPressure(); - - if ( fabs( art ) <= ARTERIAL_PRESSURE_RELIEF_THRESHOLD_MMHG ) - { - state = DRY_SELF_TESTS_COMPLETE_STATE; - } - else - { - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF, art ); - state = DRY_SELF_TESTS_STOPPED_STATE; - } + state = DRY_SELF_TESTS_COMPLETE_STATE; } + else if ( TRUE == didTimeout( arterialPressureReliefStartTime, PRESSURE_RELIEF_CHECK_TIME_MS ) ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_TD_ARTERIAL_PRESSURE_RELIEF, art ); + state = DRY_SELF_TESTS_STOPPED_STATE; + } return state; } @@ -905,7 +885,7 @@ * @brief * The transitionToDrySelfTestsState function handles the transition to * dry self-test states by setting actuators. -* @details \b Inputs: none +* @details \b Inputs: newState * @details \b Outputs: none * @param newState the targeted dry self-test state * @return none @@ -989,7 +969,7 @@ U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); - setValvePosition( H1_VALV, VALVE_POSITION_A_INSERT_EJECT ); + setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); setValvePosition( H19_VALV, VALVE_POSITION_A_INSERT_EJECT ); setAirPumpState( AIR_PUMP_STATE_OFF, AIR_PUMP_MOTOR_OFF ); set3WayValveState( H13_VALV, VALVE_3WAY_COMMON_TO_OPEN_STATE ); @@ -1004,7 +984,7 @@ case DRY_SELF_TESTS_PRESSURE_VENOUS_SETUP_STATE: { - U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); @@ -1022,6 +1002,7 @@ case DRY_SELF_TESTS_VENOUS_PRESSURE_STABILIZATION_STATE: { + U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); @@ -1088,7 +1069,7 @@ case DRY_SELF_TESTS_ARTERIAL_PRESSURE_STABILIZATION_STATE: { - U32 targetDialysateFlowMLPM = (F32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); + U32 targetDialysateFlowMLPM = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ); signalBloodPumpHardStop(); setValvePosition( H1_VALV, VALVE_POSITION_B_OPEN ); @@ -1099,6 +1080,8 @@ cmdBypassDialyzer( TRUE ); cmdChangeQd( targetDialysateFlowMLPM ); cmdChangeQuf( 0.0F ); + arterialPressureSettleStartTime = getMSTimerCount(); + arterialPressureBaselineCaptured = FALSE; } break;