Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r6a0c331c66cfd77b7c6052a10934e1ee3a0e4b97 -r140f7d1be7df0a6dd6597cc4e1469f4741054e7b --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 6a0c331c66cfd77b7c6052a10934e1ee3a0e4b97) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 140f7d1be7df0a6dd6597cc4e1469f4741054e7b) @@ -56,7 +56,8 @@ #define PRE_TREATMENT_FLUSH_COUNT 2 ///< Number of flush cycles for each reservoir. -#define PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML 1400 +#define PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML 1400 ///< Pre-treatment test configuration minimum reservoir volume in milliliters. +#define PRE_TREATMENT_TEST_CONFIG_MAX_RSRVR_VOL_ML 1575 ///< Pre-treatment test configuration maximum reservoir volume in milliliters. typedef struct { @@ -316,6 +317,7 @@ } else { + // If the expedite pre-treatment test configuration is set, the reservoir management is executed differently execPreTreatmentTestConfigReservoirMgmt(); } @@ -1078,7 +1080,7 @@ * @brief * The handlePatientConnectionWait4TreatmentStartState function handles the wait * for treatment start state of pre-treatment patient connection sub-mode. - * @details Inputs: treatmentStartRequested + * @details Inputs: treatmentStartRequested, currentReservoirMgmtState * @details Outputs: none * @return next patient connection state *************************************************************************/ @@ -1106,156 +1108,6 @@ /*********************************************************************//** * @brief - * The execPreTreatmentTestConfigReservoirMgmt function executes the state - * machine for reservoir management during pre-treatment mode when a test - * configuration (expedite pre-treatment test config for now) is enabled. - * @details Inputs: currentReservoirMgmtState - * @details Outputs: currentReservoirMgmtState - * @return none - *************************************************************************/ -static void execPreTreatmentTestConfigReservoirMgmt( void ) -{ - switch( currentReservoirMgmtState ) - { - case PRE_TREATMENT_RESERVOIR_MGMT_START_STATE: - { - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - F32 reservoir1Level = getReservoirWeight( DG_RESERVOIR_1 ); - F32 reservoir2Level = getReservoirWeight( DG_RESERVOIR_2 ); - - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - - if ( ( reservoir1Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir1Level < PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) ) - { - // Assume a reservoir switch is not needed and transition to the complete state because we are done - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; - - if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) - { - // Reservoir 1 has the right volume, set it to active reservoir and wait for it to be done - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - } - } - else if ( reservoir1Level >= PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) - { - // Reservoir 1 needs a partial drain so set it to be inactive so DG can drain it - if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) - { - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; - } - - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; - } - else if ( ( reservoir2Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir2Level < PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) ) - { - // Reservoir 2 is in the right level, just make sure it is the active reservoir - // Assume a reservoir switch is not needed and transition to the complete state because we are done - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; - - if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) - { - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - } - } - else if ( reservoir2Level >= PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML ) - { - if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) - { - rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; - } - - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; - } - - cmdSetDGActiveReservoir( &rsrvrCmd ); - } - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE: - { - DG_OP_MODE_T dgOpMode = getDGOpMode(); - U32 dgSubMode = getDGSubMode(); - - // If DG has not started yet, start DG - if ( DG_MODE_STAN == dgOpMode ) - { - cmdStartDG(); - } - - // Ensure any pending reservoir switches are completed before sending drain command - if ( TRUE == hasDGCompletedReservoirSwitch() ) - { - if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) - { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; - cmdStartDGDrain( PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML, FALSE, FALSE, TRUE ); - } - } - } - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE: - { - DG_CMD_RESPONSE_T dgCmdResp; - DG_OP_MODE_T dgOpMode = getDGOpMode(); - U32 dgSubMode = getDGSubMode(); - - // Check DG response to drain command - if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) - { - if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) - { - if ( DG_MODE_DRAI == dgOpMode ) - { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; - } - } - else - { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; - } - } - } - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE: - { - DG_OP_MODE_T dgOpMode = getDGOpMode(); - U32 dgSubMode = getDGSubMode(); - - if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) - { - DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); - - DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; - - rsrvrCmd.reservoirID = ( DG_RESERVOIR_1 == inactiveReservoir ? (U32)DG_RESERVOIR_1 : (U32)DG_RESERVOIR_2 ); - rsrvrCmd.useLastTrimmerHeaterDC = FALSE; - - cmdSetDGActiveReservoir( &rsrvrCmd ); - - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; - } - } - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE: - if ( TRUE == hasDGCompletedReservoirSwitch() ) - { - currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; - } - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE: - // Done with test configuration reservoir management. Do nothing. - break; - } -} - -/*********************************************************************//** - * @brief * The execPreTreatmentReservoirMgmt function executes the state machine for * reservoir management during pre-treatment mode. * @details Inputs: currentReservoirMgmtState @@ -1714,6 +1566,159 @@ /*********************************************************************//** * @brief + * The execPreTreatmentTestConfigReservoirMgmt function executes the state + * machine for reservoir management during pre-treatment mode when a test + * configuration (expedite pre-treatment test config for now) is enabled. + * @details Inputs: currentReservoirMgmtState + * @details Outputs: currentReservoirMgmtState + * @return none + *************************************************************************/ +static void execPreTreatmentTestConfigReservoirMgmt( void ) +{ + switch( currentReservoirMgmtState ) + { + case PRE_TREATMENT_RESERVOIR_MGMT_START_STATE: + { + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + F32 reservoir1Level = getReservoirWeight( DG_RESERVOIR_1 ); + F32 reservoir2Level = getReservoirWeight( DG_RESERVOIR_2 ); + + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + if ( ( reservoir1Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir1Level < PRE_TREATMENT_TEST_CONFIG_MAX_RSRVR_VOL_ML ) ) + { + // Assume a reservoir switch is not needed and transition to the complete state because we are done + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + + if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) + { + // Reservoir 1 has the right volume, set it to active reservoir and wait for it to be done + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + else if ( reservoir1Level >= PRE_TREATMENT_TEST_CONFIG_MAX_RSRVR_VOL_ML ) + { + // Reservoir 1 needs a partial drain so set it to be inactive so DG can drain it + if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) + { + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; + } + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + else if ( ( reservoir2Level >= PRE_TREATMENT_TEST_CONFIG_MIN_RSRVR_VOL_ML ) && ( reservoir2Level < PRE_TREATMENT_TEST_CONFIG_MAX_RSRVR_VOL_ML ) ) + { + // Reservoir 2 is in the right level, just make sure it is the active reservoir + // Assume a reservoir switch is not needed and transition to the complete state because we are done + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + + if ( DG_RESERVOIR_1 == getDGActiveReservoir() ) + { + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_2; + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + else if ( reservoir2Level >= PRE_TREATMENT_TEST_CONFIG_MAX_RSRVR_VOL_ML ) + { + if ( DG_RESERVOIR_2 == getDGActiveReservoir() ) + { + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + } + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + + if ( currentReservoirMgmtState != PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE ) + { + cmdSetDGActiveReservoir( &rsrvrCmd ); + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE: + { + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + // If DG has not started yet, start DG + if ( DG_MODE_STAN == dgOpMode ) + { + cmdStartDG(); + } + + // Ensure any pending reservoir switches are completed before sending drain command + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; + cmdStartDGDrain( PRE_TREATMENT_FULL_RESERVOIR_VOLUME_ML, FALSE, FALSE, TRUE ); + } + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE: + { + DG_CMD_RESPONSE_T dgCmdResp; + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + // Check DG response to drain command + if ( TRUE == getDGCommandResponse( DG_CMD_START_DRAIN, &dgCmdResp ) ) + { + if ( DG_CMD_REQUEST_REJECT_REASON_NONE == dgCmdResp.rejectCode ) + { + if ( DG_MODE_DRAI == dgOpMode ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE; + } + } + else + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_REQUEST_RESERVOIR_SWITCH_STATE: + { + DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); + + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) + { + DG_RESERVOIR_ID_T inactiveReservoir = getDGInactiveReservoir(); + + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + + rsrvrCmd.reservoirID = ( DG_RESERVOIR_1 == inactiveReservoir ? (U32)DG_RESERVOIR_1 : (U32)DG_RESERVOIR_2 ); + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + } + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE: + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; + } + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE: + // Done with test configuration reservoir management. Do nothing. + break; + } +} + +/*********************************************************************//** + * @brief * The testSetPreTreatmentModePublishIntervalOverride function sets the override of the * pre-treatment mode data publication interval. * @details Inputs: none