Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -rccfd15568f1e3d304320c2babb2fd4bcf0413304 -r74be223d47ea7bb0ac7d814e74d3627d830a5fac --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision ccfd15568f1e3d304320c2babb2fd4bcf0413304) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 74be223d47ea7bb0ac7d814e74d3627d830a5fac) @@ -63,7 +63,8 @@ static BOOL disposableRemovalConfirmed = FALSE; ///< Flag indicates user confirms disposable removal. static BOOL isDrainStarted = FALSE; ///< Flag indicates a drain operation has been started. -static BOOL isDrainCompleted = FALSE; +static BOOL isDrainCompleted = FALSE; ///< Flag indicates drain has completed. +static BOOL rinseConcentrateLines = FALSE; ///< FLag indicates to rinse concentrate lines. static HD_POST_TREATMENT_STATE_T currentPostTreatmentState; ///< Current state of post-treatment mode state machine. static DRAIN_STATE_T currentDrainReservoirState; ///< Current drain reservoir state. @@ -75,8 +76,9 @@ // ********** private function prototypes ********** -static HD_POST_TREATMENT_STATE_T handlePostTreatmentPatientDisconnectionState( void ); static HD_POST_TREATMENT_STATE_T handlePostTreatmentDrainReservoirsState( void ); +static HD_POST_TREATMENT_STATE_T handlePostTreatmentPatientDisconnectionState( void ); +static HD_POST_TREATMENT_STATE_T handlePostTreatmentDisposableRemovalState( void ); static HD_POST_TREATMENT_STATE_T handlePostTreatmentVerifyState( void ); static void execDrainReservoirs( void ); @@ -99,7 +101,8 @@ disposableRemovalConfirmed = FALSE; isDrainStarted = FALSE; isDrainCompleted = FALSE; - currentPostTreatmentState = HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + rinseConcentrateLines = FALSE; + currentPostTreatmentState = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; currentDrainReservoirState = DRAIN_FIRST_RESERVOIR_START_STATE; postTreatmentPublishTimerCounter = 0; @@ -156,12 +159,16 @@ switch ( currentPostTreatmentState ) { + case HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE: + currentPostTreatmentState = handlePostTreatmentDrainReservoirsState(); + break; + case HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE: currentPostTreatmentState = handlePostTreatmentPatientDisconnectionState(); break; - case HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE: - currentPostTreatmentState = handlePostTreatmentDrainReservoirsState(); + case HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE: + currentPostTreatmentState = handlePostTreatmentDisposableRemovalState(); break; case HD_POST_TREATMENT_VERIFY_STATE: @@ -175,7 +182,9 @@ if ( ++postTreatmentPublishTimerCounter >= getU32OverrideValue( &postTreatmentModePublishInterval ) ) { - broadcastPostTreatmentState( currentPostTreatmentState ); + U32 state = (U32)currentPostTreatmentState; + + broadcastData( MSG_ID_HD_POST_TREATMENT_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&state, sizeof( U32 ) ); postTreatmentPublishTimerCounter = 0; } @@ -312,6 +321,28 @@ /*********************************************************************//** * @brief + * The handlePostTreatmentDrainReservoirsState function executes drain reservoirs + * operation state machine and transition to next state once completed. + * @details Inputs: currentDrainReservoirState + * @details Outputs: executed drain reservoirs operation state machine. + * @return current state (sub-mode) + *************************************************************************/ +static HD_POST_TREATMENT_STATE_T handlePostTreatmentDrainReservoirsState( void ) +{ + HD_POST_TREATMENT_STATE_T state = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; + + execDrainReservoirs(); + + if ( DRAIN_COMPLETE_STATE == currentDrainReservoirState ) + { + state = HD_POST_TREATMENT_PATIENT_DISCONNECTION_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handlePostTreatmentPatientConnectionState function waits for user * confirms patient disconnection. * @details Inputs: none @@ -333,11 +364,11 @@ if ( TRUE == patientDisconnectionConfirmed ) { patientDisconnectionConfirmed = FALSE; - state = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; + state = HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; - for ( valve = VDI; valve < NUM_OF_VALVES; ++valve ) + for ( valve = VDI; valve < NUM_OF_VALVES; valve++ ) { - homeValve( valve ); + setValvePosition( valve, VALVE_POSITION_A_INSERT_EJECT ); } homeBloodPump(); @@ -360,28 +391,24 @@ /*********************************************************************//** * @brief - * The handlePostTreatmentDrainReservoirsState function executes drain reservoirs - * operation state machine and transition to next state once completed. - * @details Inputs: currentDrainReservoirState - * @details Outputs: executed drain reservoirs operation state machine. + * The handlePostTreatmentDisposableRemovalState function waits for user + * to confirm disposable removal. + * @details Inputs: disposableRemovalConfirmed + * @details Outputs: processed disposable removal confirmation * @return current state (sub-mode) *************************************************************************/ -static HD_POST_TREATMENT_STATE_T handlePostTreatmentDrainReservoirsState( void ) +static HD_POST_TREATMENT_STATE_T handlePostTreatmentDisposableRemovalState( void ) { - HD_POST_TREATMENT_STATE_T state = HD_POST_TREATMENT_DRAIN_RESERVOIRS_STATE; + HD_POST_TREATMENT_STATE_T state = HD_POST_TREATMENT_DISPOSABLE_REMOVAL_STATE; - execDrainReservoirs(); - - if ( DRAIN_COMPLETE_STATE == currentDrainReservoirState ) - { #ifdef SKIP_UI_INTERACTION - disposableRemovalConfirmed = TRUE; + disposableRemovalConfirmed = TRUE; #endif - if ( TRUE == disposableRemovalConfirmed ) - { - disposableRemovalConfirmed = FALSE; - state = HD_POST_TREATMENT_VERIFY_STATE; - } + + if ( TRUE == disposableRemovalConfirmed ) + { + disposableRemovalConfirmed = FALSE; + state = HD_POST_TREATMENT_VERIFY_STATE; } return state; @@ -486,7 +513,7 @@ } else { - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines ); } } @@ -507,8 +534,14 @@ if ( ( DG_MODE_GENE == getDGOpMode() ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == getDGSubMode() ) ) { - state = DRAIN_FIRST_RESERVOIR_STATE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + state = DRAIN_FIRST_RESERVOIR_STATE; + rinseConcentrateLines = TRUE; + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines ); + } } return state; @@ -566,7 +599,8 @@ if ( TRUE == hasDGCompletedReservoirSwitch() ) { state = DRAIN_SECOND_RESERVOIR_STATE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + rinseConcentrateLines = FALSE; + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, rinseConcentrateLines ); } return state; @@ -589,7 +623,7 @@ isDrainStarted = TRUE; } - // Drain has started and DG goes to re-circ mode flush lines state means drain completed + // 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_LINES == getDGSubMode() ) ) { isDrainCompleted = TRUE; @@ -601,6 +635,7 @@ { isDrainStarted = FALSE; isDrainCompleted = FALSE; + rinseConcentrateLines = FALSE; state = DRAIN_COMPLETE_STATE; } }