Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rfee71ca73745dad573b28acd13b66624cceeabc0 -r6e07046677cba738be6f78b155f4f23120a43081 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision fee71ca73745dad573b28acd13b66624cceeabc0) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 6e07046677cba738be6f78b155f4f23120a43081) @@ -59,8 +59,10 @@ { PRIME_RESERVOIR_MGMT_START_STATE = 0, ///< If DG not already in re-circ mode, try to get it there. PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE, ///< In DG re-circ, wait for lines to flush - then start draining inactive reservoir. + PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP, ///< After sending drain command, wait for DG to response back. PRIME_RESERVOIR_MGMT_DRAIN_STATE, ///< Wait for drain to complete. PRIME_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. + PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP, ///< After sending fill command, wait for DG to response back. PRIME_RESERVOIR_MGMT_FILL_STATE, ///< Wait for fill to complete. PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE, ///< Wait for reservoir 2 become inactive. @@ -89,7 +91,7 @@ // ********** private function prototypes ********** static void broadcastPrimingStatus( void ); -static void execPreTreatmentReservoirMgmt( void ); +static void execPrimeReservoirMgmt( void ); static void purgeAirValvesBloodPumpControl( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineSetupState( void ); @@ -196,7 +198,7 @@ broadcastPrimingStatus(); // Exec reservoir management for priming - execPreTreatmentReservoirMgmt(); + execPrimeReservoirMgmt(); } /*********************************************************************//** @@ -243,41 +245,55 @@ /*********************************************************************//** * @brief - * The execPreTreatmentReservoirMgmt function executes the state machine for the - * reservoir management during pre-treatment mode. + * The execPrimeReservoirMgmt function executes the state machine for the + * reservoir management during pre-treatment prime sub-mode. * @details Inputs: currentReservoirMgmtState * @details Outputs: DG reservoirs' fills managed. * @return none *************************************************************************/ -static void execPreTreatmentReservoirMgmt( void ) +static void execPrimeReservoirMgmt( void ) { + DG_CMD_RESPONSE_T dgCmdResp; + + getDGCommandResponse( &dgCmdResp ); DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); + // treatment reservoir mgmt. state machine switch ( currentReservoirMgmtState ) { case PRIME_RESERVOIR_MGMT_START_STATE: + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + break; + + case PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: if ( DG_MODE_CIRC == dgOpMode ) { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP; + cmdStartDGDrain( PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + } } else { - cmdStartDG(); + // TODO Handle when DG mode is out of sync } break; - case PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE: - if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) + case PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP: + if ( DG_CMD_START_DRAIN == dgCmdResp.commandID ) { - cmdStartDGDrain( PRIME_DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + if ( FALSE == dgCmdResp.rejected ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_DRAIN_STATE; + } + else if ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE; + } } - - if ( DG_MODE_DRAI == dgOpMode ) - { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_DRAIN_STATE; - } break; case PRIME_RESERVOIR_MGMT_DRAIN_STATE: @@ -290,11 +306,22 @@ case PRIME_RESERVOIR_MGMT_START_FILL_STATE: if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP; cmdStartDGFill( PRIME_FILL_RESERVOIR_TO_VOLUME_ML ); } - if ( DG_MODE_FILL == dgOpMode ) + break; + + case PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP: + if ( DG_CMD_START_FILL == dgCmdResp.commandID ) { - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FILL_STATE; + if ( FALSE == dgCmdResp.rejected ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_FILL_STATE; + } + else if ( DG_CMD_REQUEST_REJECT_REASON_INVALID_MODE == dgCmdResp.rejected ) + { + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_FILL_STATE; + } } break;