Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rdd50aca0744c3338f5c629b437fe58b269c8f457 -ra41d3d07226e77ca19f14a6c3542424af86e1f21 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision dd50aca0744c3338f5c629b437fe58b269c8f457) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision a41d3d07226e77ca19f14a6c3542424af86e1f21) @@ -49,23 +49,24 @@ /// Post-Treatment drain reservoirs state machine. typedef enum Drain_States { - DRAIN_FIRST_RESERVOIR_START_STATE = 0, ///< Drain first reservoir start state. - DRAIN_FIRST_RESERVOIR_STATE, ///< Drain first reservoir state. - DRAIN_SWITCH_RESERVOIR_STATE, ///< Switch reservoir state. + 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_STATE_T; // ********** private data ********** -static BOOL patientDisconnectionConfirmed = FALSE; ///< Flag indicates user confirms patient disconnection. -static BOOL disposableRemovalConfirmed = FALSE; ///< Flag indicates user confirms disposable removal. +static BOOL patientDisconnectionConfirmed; ///< Flag indicates user confirms patient disconnection. +static BOOL disposableRemovalConfirmed; ///< Flag indicates user confirms disposable removal. -static BOOL isDrainStarted = FALSE; ///< Flag indicates a drain operation has been started. -static BOOL isDrainCompleted = FALSE; ///< Flag indicates drain has completed. -static BOOL rinseConcentrateLines = FALSE; ///< FLag indicates to rinse concentrate lines. +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. static DRAIN_STATE_T currentDrainReservoirState; ///< Current drain reservoir state. static U32 postTreatmentPublishTimerCounter; ///< Timer counter used to schedule post-treatment data broadcast. @@ -83,9 +84,9 @@ static void execDrainReservoirs( void ); static BOOL isReservoirDrainStarted( void ); -static DRAIN_STATE_T handleDrainFirstReservoirStartState( void ); -static DRAIN_STATE_T handleDrainFirstReservoirState( void ); static DRAIN_STATE_T handleDrainSwitchReservoirState( void ); +static DRAIN_STATE_T handleDrainReservoirStartState( void ); +static DRAIN_STATE_T handleDrainReservoirDrainState( void ); static DRAIN_STATE_T handleDrainSecondReservoirState( void ); /*********************************************************************//** @@ -97,13 +98,14 @@ *************************************************************************/ void initPostTreatmentMode( void ) { - patientDisconnectionConfirmed = FALSE; - disposableRemovalConfirmed = FALSE; - isDrainStarted = FALSE; - isDrainCompleted = FALSE; - rinseConcentrateLines = FALSE; - currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; - currentDrainReservoirState = DRAIN_FIRST_RESERVOIR_START_STATE; + patientDisconnectionConfirmed = FALSE; + disposableRemovalConfirmed = FALSE; + isDrainStarted = FALSE; + isDrainCompleted = FALSE; + rinseConcentrateLines = FALSE; + isThisFirstDrain = TRUE; + currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; + currentDrainReservoirState = DRAIN_SWITCH_RESERVOIR_STATE; postTreatmentPublishTimerCounter = 0; // Reset treatment log data @@ -516,12 +518,12 @@ { switch ( currentDrainReservoirState ) { - case DRAIN_FIRST_RESERVOIR_START_STATE: - currentDrainReservoirState = handleDrainFirstReservoirStartState(); + case DRAIN_RESERVOIR_START_STATE: + currentDrainReservoirState = handleDrainReservoirStartState(); break; - case DRAIN_FIRST_RESERVOIR_STATE: - currentDrainReservoirState = handleDrainFirstReservoirState(); + case DRAIN_RESERVOIR_DRAIN_STATE: + currentDrainReservoirState = handleDrainReservoirDrainState(); break; case DRAIN_SWITCH_RESERVOIR_STATE: @@ -536,7 +538,7 @@ break; default: - currentDrainReservoirState = DRAIN_FIRST_RESERVOIR_START_STATE; + currentDrainReservoirState = DRAIN_RESERVOIR_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_POST_TREATMENT_RESERVOIR_MGMT_INVALID_STATE, currentDrainReservoirState ); break; } @@ -572,93 +574,123 @@ /*********************************************************************//** * @brief - * The handleDrainReservoirOneState function sends command to DG to - * drain first reservoir. + * The handleDrainSwitchReservoirState function waits for DG to complete + * reservoir switch and sends drain command. * @details Inputs: none - * @details Outputs: drained reservoir one + * @details Outputs: proceed to next state after DG switched reservoir * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainFirstReservoirStartState( void ) +static DRAIN_STATE_T handleDrainSwitchReservoirState( void ) { - DRAIN_STATE_T state = DRAIN_FIRST_RESERVOIR_START_STATE; + DRAIN_STATE_T state = DRAIN_SWITCH_RESERVOIR_STATE; if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + DG_RESERVOIR_ID_T id = ( TRUE == isThisFirstDrain ? DG_RESERVOIR_2 : DG_RESERVOIR_1 ); + cmdSetDGActiveReservoir( id ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) { - rinseConcentrateLines = TRUE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines, TRUE ); + rinseConcentrateLines = ( TRUE == isThisFirstDrain ? TRUE : FALSE ); + + state = DRAIN_RESERVOIR_START_STATE; } } - else if ( DG_MODE_DRAI == getDGOpMode() ) + + /*if ( ( TRUE == hasDGCompletedReservoirSwitch() ) && ( DG_MODE_GENE == getDGOpMode() ) ) { - state = DRAIN_FIRST_RESERVOIR_STATE; + 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 handleDrainFirstReservoirState function waits for DG to finish draining - * first reservoir and sends command to switch reservoir. + * The handleDrainReservoirOneState function sends command to DG to + * drain first reservoir. * @details Inputs: none - * @details Outputs: drained first reservoir + * @details Outputs: drained reservoir one * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainFirstReservoirState( void ) +static DRAIN_STATE_T handleDrainReservoirStartState( void ) { - DRAIN_STATE_T state = DRAIN_FIRST_RESERVOIR_STATE; + DRAIN_STATE_T state = DRAIN_RESERVOIR_START_STATE; - /*if ( TRUE == isReservoirDrainStarted() ) + if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - isDrainStarted = TRUE; - } + DG_CMD_RESPONSE_T dgCmdResp; - // 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() ) ) + if ( FALSE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) + { + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines, TRUE ); + } + } + else if ( DG_MODE_DRAI == getDGOpMode() ) { - isDrainCompleted = TRUE; + state = DRAIN_RESERVOIR_DRAIN_STATE; } - if ( TRUE == isDrainCompleted )*/ + + /*if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + + if ( TRUE == hasDGCompletedReservoirSwitch() ) { - isDrainStarted = FALSE; - isDrainCompleted = FALSE; - state = DRAIN_SWITCH_RESERVOIR_STATE; - cmdSetDGActiveReservoir( DG_RESERVOIR_1 /*getDGInactiveReservoir()*/ ); + state = DRAIN_FIRST_RESERVOIR_STATE; } - } + }*/ return state; } /*********************************************************************//** * @brief - * The handleDrainSwitchReservoirState function waits for DG to complete - * reservoir switch and sends drain command. + * The handleDrainFirstReservoirState function waits for DG to finish draining + * first reservoir and sends command to switch reservoir. * @details Inputs: none - * @details Outputs: proceed to next state after DG switched reservoir + * @details Outputs: drained first reservoir * @return next state *************************************************************************/ -static DRAIN_STATE_T handleDrainSwitchReservoirState( void ) +static DRAIN_STATE_T handleDrainReservoirDrainState( void ) { - DRAIN_STATE_T state = DRAIN_SWITCH_RESERVOIR_STATE; + DG_CMD_RESPONSE_T dgCmdResp; - if ( ( TRUE == hasDGCompletedReservoirSwitch() ) && ( DG_MODE_GENE == getDGOpMode() ) ) + DRAIN_STATE_T state = DRAIN_RESERVOIR_DRAIN_STATE; + + /*if ( TRUE == isReservoirDrainStarted() ) { - rinseConcentrateLines = FALSE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines, TRUE ); + isDrainStarted = TRUE; } - else if ( DG_MODE_DRAI == getDGOpMode() ) + + // 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() ) ) { - state = DRAIN_SECOND_RESERVOIR_STATE; + 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 ); + isThisFirstDrain = FALSE; + } + return state; }