Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r8cd20927bc9f03f3ca5b04bc42f409a588880a7c -r19af1d113cfeaac76d848a031fc8896c172e677f --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8cd20927bc9f03f3ca5b04bc42f409a588880a7c) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 19af1d113cfeaac76d848a031fc8896c172e677f) @@ -83,15 +83,17 @@ // ********** private data ********** -static BOOL confirmInstallRequested = FALSE; ///< Flag indicates user confirms disposable installation. -static BOOL continueToTreatmentRequested = FALSE; ///< Flag indicates user requests to continue to treatment from re-circ. -static BOOL setUFVolStatus; ///< The status of set UF volume operation. +static BOOL confirmInstallRequested; ///< Flag indicates user confirms disposable installation. +static BOOL continueToTreatmentRequested; ///< Flag indicates user requests to continue to treatment from re-circ. +static BOOL setUFVolStatus; ///< Flag indicates user has set UF volume parameter. +static BOOL doorOpened; ///< Flag indicates user has opened door (to invert dialyzer). static BOOL patientConnectionConfirm; ///< Flag indicates user has confirmed patient connection complete. -static BOOL treatmentStartRequested = FALSE; ///< Flag indicates user requests treatment begin. +static BOOL treatmentStartRequested; ///< Flag indicates user requests treatment begin. -static BOOL alarmActionResumeReceived = FALSE; ///< Flag indicates alarm action resume received. +static BOOL alarmActionResumeReceived; ///< Flag indicates alarm action resume received. static HD_PRE_TREATMENT_MODE_STATE_T currentPreTreatmentState; ///< Current state of pre-treatment mode state machine. +static HD_PRE_TREATMENT_PAT_CONN_STATE_T currentPreTxPatConnState; ///< Current state of pre-treatment patient connect sub-mode state machine. static BOOL fillReservoirOneStartRequested; ///< Flag indicates fill reservoir one has been requested. static U32 preTreatmentPublishTimerCounter; ///< Pre-treatment data broadcast timer counter used to schedule when to transmit data. /// Interval (in task intervals) at which to publish pre-treatment mode data to CAN bus. @@ -121,6 +123,10 @@ static HD_PRE_TREATMENT_MODE_STATE_T handlePrimeState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handleRecirculateState( void ); static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ); +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4UFVolState( void ); +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4DialyzerInvertState( void ); +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4UserConfirmState( void ); +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4TreatmentStartState( void ); static void execPreTreatmentReservoirMgmt( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtStartState( void ); @@ -146,10 +152,18 @@ U32 reservoirIndex = 0; currentPreTreatmentState = HD_PRE_TREATMENT_WATER_SAMPLE_STATE; + currentPreTxPatConnState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_UF_VOL_STATE; currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; + + alarmActionResumeReceived = FALSE; + fillReservoirOneStartRequested = FALSE; + confirmInstallRequested = FALSE; + continueToTreatmentRequested = FALSE; setUFVolStatus = FALSE; + doorOpened = FALSE; patientConnectionConfirm = FALSE; - fillReservoirOneStartRequested = FALSE; + treatmentStartRequested = FALSE; + submodeCompleteTransitionTimeCounter = 0; #ifndef _RELEASE_ @@ -406,19 +420,19 @@ void signalUserConfirmPatientConnection( void ) { BOOL accepted = FALSE; - REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_UF_VOLUME_NOT_SET; + REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; - if ( TRUE == setUFVolStatus ) + if ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) { - if ( HD_PRE_TREATMENT_PATIENT_CONNECTION_STATE == currentPreTreatmentState ) + if ( PRE_TREATMENT_PAT_CONN_WAIT_FOR_USER_CONFIRM_STATE == currentPreTxPatConnState ) { patientConnectionConfirm = TRUE; accepted = TRUE; rejReason = REQUEST_REJECT_REASON_NONE; } else { - rejReason = REQUEST_REJECT_REASON_NOT_ALLOWED_IN_CURRENT_MODE; + rejReason = REQUEST_REJECT_REASON_DIALYZER_NOT_INVERTED; } } @@ -596,7 +610,7 @@ preTreatmentData.drySelfTestsState = getDrySelfTestsState(); preTreatmentData.primeState = getPrimeState(); preTreatmentData.recircState = getPreTreatmentRecircState(); - preTreatmentData.patientConnectionState = 0; + preTreatmentData.patientConnectionState = (U32)currentPreTxPatConnState; preTreatmentData.wetSelfTestsState = getWetSelfTestState(); preTreatmentData.preTreatmentRsrvrState = currentReservoirMgmtState; @@ -661,6 +675,7 @@ { VALVE_T valve; setUFVolStatus = FALSE; + doorOpened = FALSE; patientConnectionConfirm = FALSE; treatmentStartRequested = FALSE; @@ -921,20 +936,36 @@ * @brief * The handlePatientConnectionState function handles patient connection state * during pre-treatment mode. - * @details Inputs: alarmActionResumeReceived - * @details Outputs: requested mode transition to treatment mode + * @details Inputs: currentPreTxPatConnState, alarmActionResumeReceived + * @details Outputs: currentPreTxPatConnState * @return current state (sub-mode) *************************************************************************/ static HD_PRE_TREATMENT_MODE_STATE_T handlePatientConnectionState( void ) { - if ( TRUE == treatmentStartRequested ) + switch ( currentPreTxPatConnState ) { - DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + case PRE_TREATMENT_PAT_CONN_WAIT_FOR_UF_VOL_STATE: + currentPreTxPatConnState = handlePatientConnectionWait4UFVolState(); + break; - setStartReservoirVolume( activeRes ); - requestNewOperationMode( MODE_TREA ); + case PRE_TREATMENT_PAT_CONN_WAIT_FOR_DLZR_INVERT_STATE: + currentPreTxPatConnState = handlePatientConnectionWait4DialyzerInvertState(); + break; + + case PRE_TREATMENT_PAT_CONN_WAIT_FOR_USER_CONFIRM_STATE: + currentPreTxPatConnState = handlePatientConnectionWait4UserConfirmState(); + break; + + case PRE_TREATMENT_PAT_CONN_WAIT_FOR_TREATMENT_START_STATE: + currentPreTxPatConnState = handlePatientConnectionWait4TreatmentStartState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_PAT_CONN_STATE, currentPreTxPatConnState ); + break; } + // handle alarms w/ stop property if ( TRUE == doesAlarmStatusIndicateStop() ) { signalDialInPumpHardStop(); @@ -955,6 +986,98 @@ /*********************************************************************//** * @brief + * The handlePatientConnectionWait4UFVolState function handles the wait + * for ultrafiltration volume setting state of pre-treatment patient connection + * sub-mode. + * @details Inputs: setUFVolStatus + * @details Outputs: setUFVolStatus + * @return next patient connection state + *************************************************************************/ +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4UFVolState( void ) +{ + HD_PRE_TREATMENT_PAT_CONN_STATE_T nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_UF_VOL_STATE; + + if ( TRUE == setUFVolStatus ) + { + setUFVolStatus = FALSE; + nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_DLZR_INVERT_STATE; + } + + return nextState; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionWait4DialyzerInvertState function handles the wait + * for dialyzer invert confirmation state of pre-treatment patient connection + * sub-mode. + * @details Inputs: doorOpened + * @details Outputs: doorOpened + * @return next patient connection state + *************************************************************************/ +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4DialyzerInvertState( void ) +{ + HD_PRE_TREATMENT_PAT_CONN_STATE_T nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_DLZR_INVERT_STATE; + + // Look for cartridge door to open and then close (indicating user inverted dialyzer) + if ( STATE_OPEN == getSwitchStatus( FRONT_DOOR ) ) + { + doorOpened = TRUE; + } + if ( ( TRUE == doorOpened ) && ( STATE_CLOSED == getSwitchStatus( FRONT_DOOR ) ) ) + { + nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_USER_CONFIRM_STATE; + } + + return nextState; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionWait4UserConfirmState function handles the wait + * for dialyzer invert confirmation state of pre-treatment patient connection + * sub-mode. + * @details Inputs: patientConnectionConfirm + * @details Outputs: none + * @return next patient connection state + *************************************************************************/ +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4UserConfirmState( void ) +{ + HD_PRE_TREATMENT_PAT_CONN_STATE_T nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_USER_CONFIRM_STATE; + + if ( TRUE == patientConnectionConfirm ) + { + nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_TREATMENT_START_STATE; + } + + return nextState; +} + +/*********************************************************************//** + * @brief + * The handlePatientConnectionWait4TreatmentStartState function handles the wait + * for treatment start state of pre-treatment patient connection sub-mode. + * @details Inputs: treatmentStartRequested + * @details Outputs: none + * @return next patient connection state + *************************************************************************/ +static HD_PRE_TREATMENT_PAT_CONN_STATE_T handlePatientConnectionWait4TreatmentStartState( void ) +{ + HD_PRE_TREATMENT_PAT_CONN_STATE_T nextState = PRE_TREATMENT_PAT_CONN_WAIT_FOR_TREATMENT_START_STATE; + + if ( TRUE == treatmentStartRequested ) + { + DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + + setStartReservoirVolume( activeRes ); + requestNewOperationMode( MODE_TREA ); + } + + return nextState; +} + +/*********************************************************************//** + * @brief * The execPreTreatmentReservoirMgmt function executes the state machine for * reservoir management during pre-treatment mode. * @details Inputs: currentReservoirMgmtState