Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -ra41d3d07226e77ca19f14a6c3542424af86e1f21 -rf0d3223059562f5aaad33e860f7c63ba1968c01b --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision a41d3d07226e77ca19f14a6c3542424af86e1f21) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision f0d3223059562f5aaad33e860f7c63ba1968c01b) @@ -49,22 +49,17 @@ /// Post-Treatment drain reservoirs state machine. typedef enum Drain_States { - DRAIN_SWITCH_RESERVOIR_STATE = 0, ///< Switch reservoir state. - DRAIN_RESERVOIR_START_STATE, ///< Drain first reservoir start state. - DRAIN_RESERVOIR_DRAIN_STATE, ///< Drain first reservoir state. - DRAIN_SECOND_RESERVOIR_STATE, ///< Drain second reservoir state. - DRAIN_COMPLETE_STATE, ///< Drain complete state. - NUM_OF_DRAIN_STATES ///< Number of drain states. + DRAIN_RESERVOIR_SWITCH_STATE = 0, ///< Switch reservoir state. + DRAIN_RESERVOIR_START_DRAIN_STATE, ///< Drain reservoir start drain state. + DRAIN_RESERVOIR_DRAIN_STATE, ///< Drain first reservoir state. + DRAIN_RESERVOIR_COMPLETE_STATE, ///< Drain complete state. + NUM_OF_DRAIN_STATES ///< Number of drain states. } DRAIN_STATE_T; // ********** private data ********** static BOOL patientDisconnectionConfirmed; ///< Flag indicates user confirms patient disconnection. static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. - -static BOOL isDrainStarted; ///< Flag indicates a drain operation has been started. TODO remove -static BOOL isDrainCompleted = FALSE; ///< Flag indicates drain has completed. TODO remove - static BOOL rinseConcentrateLines; ///< FLag indicates to rinse concentrate lines. static BOOL isThisFirstDrain; ///< Flag to indicate whether this is the first time the reservoir is drained. static HD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current state of post-treatment mode state machine. @@ -83,29 +78,27 @@ static HD_POST_TREATMENT_STATE_T handlePostTreatmentVerifyState( void ); static void execDrainReservoirs( void ); -static BOOL isReservoirDrainStarted( void ); -static DRAIN_STATE_T handleDrainSwitchReservoirState( void ); -static DRAIN_STATE_T handleDrainReservoirStartState( void ); +static DRAIN_STATE_T handleDrainReservoirSwitchState( void ); +static DRAIN_STATE_T handleDrainReservoirStartDrainState( void ); static DRAIN_STATE_T handleDrainReservoirDrainState( void ); -static DRAIN_STATE_T handleDrainSecondReservoirState( void ); /*********************************************************************//** * @brief * The initPostTreatmentMode function initializes the Post-Treatment Mode module. * @details Inputs: none - * @details Outputs: Post-Treatment Mode module initialized. + * @details Outputs: patientDisconnectionConfirmed, disposableRemovalConfirmed, + * rinseConcentrateLines, isThisFirstDrain, currentPostTreatmentState, + * currentDrainReservoirState, postTreatmentPublishTimerCounter * @return none *************************************************************************/ void initPostTreatmentMode( void ) { patientDisconnectionConfirmed = FALSE; disposableRemovalConfirmed = FALSE; - isDrainStarted = FALSE; - isDrainCompleted = FALSE; rinseConcentrateLines = FALSE; isThisFirstDrain = TRUE; currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; - currentDrainReservoirState = DRAIN_SWITCH_RESERVOIR_STATE; + currentDrainReservoirState = DRAIN_RESERVOIR_SWITCH_STATE; postTreatmentPublishTimerCounter = 0; // Reset treatment log data @@ -308,7 +301,7 @@ BOOL accepted = FALSE; REQUEST_REJECT_REASON_CODE_T rejReason = REQUEST_REJECT_REASON_DRAIN_NOT_COMPLETE; - if ( DRAIN_COMPLETE_STATE == currentDrainReservoirState ) + if ( DRAIN_RESERVOIR_COMPLETE_STATE == currentDrainReservoirState ) { disposableRemovalConfirmed = TRUE; accepted = TRUE; @@ -346,8 +339,9 @@ execDrainReservoirs(); - if ( DRAIN_COMPLETE_STATE == currentDrainReservoirState ) + if ( DRAIN_RESERVOIR_COMPLETE_STATE == currentDrainReservoirState ) { + // Done with draining the reservoirs state = HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; } @@ -392,7 +386,7 @@ if ( TRUE == patientDisconnectionConfirmed ) { patientDisconnectionConfirmed = FALSE; - state = HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; + state = HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; for ( valve = VDI; valve < NUM_OF_VALVES; valve++ ) { @@ -447,7 +441,7 @@ if ( TRUE == disposableRemovalConfirmed ) { disposableRemovalConfirmed = FALSE; - state = HD_POST_TREATMENT_VERIFY_STATE; + state = HD_POST_TREATMENT_VERIFY_STATE; } return state; @@ -518,220 +512,114 @@ { switch ( currentDrainReservoirState ) { - case DRAIN_RESERVOIR_START_STATE: - currentDrainReservoirState = handleDrainReservoirStartState(); + case DRAIN_RESERVOIR_SWITCH_STATE: + currentDrainReservoirState = handleDrainReservoirSwitchState(); break; + case DRAIN_RESERVOIR_START_DRAIN_STATE: + currentDrainReservoirState = handleDrainReservoirStartDrainState(); + break; + case DRAIN_RESERVOIR_DRAIN_STATE: currentDrainReservoirState = handleDrainReservoirDrainState(); break; - case DRAIN_SWITCH_RESERVOIR_STATE: - currentDrainReservoirState = handleDrainSwitchReservoirState(); + case DRAIN_RESERVOIR_COMPLETE_STATE: break; - case DRAIN_SECOND_RESERVOIR_STATE: - currentDrainReservoirState = handleDrainSecondReservoirState(); - break; - - case DRAIN_COMPLETE_STATE: - break; - default: - currentDrainReservoirState = DRAIN_RESERVOIR_START_STATE; + currentDrainReservoirState = DRAIN_RESERVOIR_SWITCH_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_POST_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, currentDrainReservoirState ); break; } } /*********************************************************************//** * @brief - * The isReservoirDrainStarted function checks if reservoir drain has started. - * @details Inputs: none - * @details Outputs: processed drain command response - * @return TRUE if reservoir drain has started, otherwise FALSE - *************************************************************************/ -static BOOL isReservoirDrainStarted( void ) -{ - DG_CMD_RESPONSE_T dgCmdResp; - - BOOL result = FALSE; - - if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) - { - if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) - { - result = TRUE; - } - else - { - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines, TRUE ); - } - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handleDrainSwitchReservoirState function waits for DG to complete - * reservoir switch and sends drain command. - * @details Inputs: none - * @details Outputs: proceed to next state after DG switched reservoir + * The handleDrainReservoirSwitchState function waits for DG to complete + * reservoir switch. + * @details Inputs: isThisFirstDrain + * @details Outputs: rinseConcentrateLines * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainSwitchReservoirState( void ) +static DRAIN_STATE_T handleDrainReservoirSwitchState( void ) { - DRAIN_STATE_T state = DRAIN_SWITCH_RESERVOIR_STATE; + DRAIN_STATE_T state = DRAIN_RESERVOIR_SWITCH_STATE; if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { + // The first drain starts with setting the reservoir 2 as active and then the first reservoir is drained DG_RESERVOIR_ID_T id = ( TRUE == isThisFirstDrain ? DG_RESERVOIR_2 : DG_RESERVOIR_1 ); cmdSetDGActiveReservoir( id ); if ( TRUE == hasDGCompletedReservoirSwitch() ) { + // Check if the reservoir switch has been completed + // If this is the first drain, rinse the concentrate lines too rinseConcentrateLines = ( TRUE == isThisFirstDrain ? TRUE : FALSE ); - - state = DRAIN_RESERVOIR_START_STATE; + state = DRAIN_RESERVOIR_START_DRAIN_STATE; } } - /*if ( ( TRUE == hasDGCompletedReservoirSwitch() ) && ( DG_MODE_GENE == getDGOpMode() ) ) - { - DG_CMD_RESPONSE_T dgCmdResp; - - if ( FALSE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) - { - rinseConcentrateLines = FALSE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); - } - } - else if ( DG_MODE_DRAI == getDGOpMode() ) - { - state = DRAIN_SECOND_RESERVOIR_STATE; - }*/ - return state; } /*********************************************************************//** * @brief - * The handleDrainReservoirOneState function sends command to DG to - * drain first reservoir. - * @details Inputs: none - * @details Outputs: drained reservoir one + * The handleDrainReservoirStartDrainState function sends command to DG to + * send the drain command to DG. + * @details Inputs: rinseConcentrateLines + * @details Outputs: none * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainReservoirStartState( void ) +static DRAIN_STATE_T handleDrainReservoirStartDrainState( void ) { - DRAIN_STATE_T state = DRAIN_RESERVOIR_START_STATE; + DRAIN_STATE_T state = DRAIN_RESERVOIR_START_DRAIN_STATE; if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { DG_CMD_RESPONSE_T dgCmdResp; + // If DG is still in the Idle mode in the flush water state and the drain command has not been sent, send the drain command if ( FALSE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) { cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines, TRUE ); } } else if ( DG_MODE_DRAI == getDGOpMode() ) { + // If the drain has started, transition to drain state state = DRAIN_RESERVOIR_DRAIN_STATE; } - - /*if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) - { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); - - if ( TRUE == hasDGCompletedReservoirSwitch() ) - { - state = DRAIN_FIRST_RESERVOIR_STATE; - } - }*/ - return state; } /*********************************************************************//** * @brief - * The handleDrainFirstReservoirState function waits for DG to finish draining - * first reservoir and sends command to switch reservoir. - * @details Inputs: none - * @details Outputs: drained first reservoir + * The handleDrainReservoirDrainState function waits for DG to finish draining + * a reservoir. + * @details Inputs: isThisFirstDrain + * @details Outputs: isThisFirstDrain * @return next state *************************************************************************/ static DRAIN_STATE_T handleDrainReservoirDrainState( void ) { - DG_CMD_RESPONSE_T dgCmdResp; - DRAIN_STATE_T state = DRAIN_RESERVOIR_DRAIN_STATE; - /*if ( TRUE == isReservoirDrainStarted() ) - { - isDrainStarted = TRUE; - } - - // Drain has started and DG goes to re-circ mode flush lines state means drain completed - if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) - { - isDrainCompleted = TRUE; - } - - if ( TRUE == isDrainCompleted )*/ - if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - //isDrainStarted = FALSE; - //isDrainCompleted = FALSE; - state = ( TRUE == isThisFirstDrain ? DRAIN_SWITCH_RESERVOIR_STATE : DRAIN_COMPLETE_STATE ); + // Decide which state should the state machine transition + state = ( TRUE == isThisFirstDrain ? DRAIN_RESERVOIR_SWITCH_STATE : DRAIN_RESERVOIR_COMPLETE_STATE ); + // At least the first reservoir has been drained so far so set the variable to false. isThisFirstDrain = FALSE; } return state; } -/*********************************************************************//** - * @brief - * The handleDrainReservoirTwoState function waits for DG to finish draining - * second reservoir. - * @details Inputs: none - * @details Outputs: drained second reservoir - * @return next state - *************************************************************************/ -static DRAIN_STATE_T handleDrainSecondReservoirState( void ) -{ - DRAIN_STATE_T state = DRAIN_SECOND_RESERVOIR_STATE; - /*if ( TRUE == isReservoirDrainStarted() ) - { - isDrainStarted = TRUE; - } - - // Drain has started and DG goes to generation idle mode flush lines state means drain completed - if ( ( TRUE == isDrainStarted ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) - { - isDrainCompleted = TRUE; - } - - if ( TRUE == isDrainCompleted )*/ - { - if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) - { - isDrainStarted = FALSE; - isDrainCompleted = FALSE; - rinseConcentrateLines = FALSE; - state = DRAIN_COMPLETE_STATE; - } - } - - return state; -} - - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/