Index: firmware/App/Modes/ModePreGenDialysate.c =================================================================== diff -u -rbd522c8ffdf75130571e5b6a79d1b1d6acd78b1c -rc67f50a3c737b65216f513477dbf91d8af044e58 --- firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision bd522c8ffdf75130571e5b6a79d1b1d6acd78b1c) +++ firmware/App/Modes/ModePreGenDialysate.c (.../ModePreGenDialysate.c) (revision c67f50a3c737b65216f513477dbf91d8af044e58) @@ -19,13 +19,16 @@ #include "ConcentratePumps.h" #include "DialysatePumps.h" #include "DryBiCart.h" +#include "FPOperationModes.h" #include "Heaters.h" +#include "Level.h" #include "ModePreGenDialysate.h" #include "ModeGenDialysate.h" #include "ModeFault.h" #include "Messaging.h" #include "OperationModes.h" #include "Pressure.h" +#include "RinsePump.h" #include "TaskGeneral.h" #include "Timers.h" #include "Utilities.h" @@ -39,9 +42,18 @@ // ********** private definitions ********** /// Interval (ms/task time) at which the pre-treatment state data is published on the CAN bus. -#define PRE_GEN_DIALYSATE_DATA_PUB_INTERVAL ( 250 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre-gen dialysate mode data published. -#define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 30 * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated -#define NEG_PRES_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for Hydraulics chamber negative degassing pressure check. +#define PRE_GEN_DIALYSATE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre-gen dialysate mode data published. +#define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 30 * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated +#define NEG_PRES_PERSISTENCE_TIME_MS ( 1 * MS_PER_SECOND ) ///< Persistence time for Hydraulics chamber negative degassing pressure check. +#define PRE_GEN_DEFAULT_TIME_OUT ( 60 * MS_PER_SECOND ) +#define PRE_GEN_FILL_HYDRO_CHAMBER_TIMEOUT ( 120 * MS_PER_SECOND ) +#define PRE_GEN_PRIME_CONCENTRATE_TIMEOUT ( 120 * MS_PER_SECOND ) +#define PRE_GEN_PRIME_CONCENTRATE_PUMP_SPEED 100.0F +#define PRE_GEN_PRIME_CONCENTRATE_VOLUME 0xFFFF +#define PRE_GEN_PRIME_BAL_CHAMBER_CONCENTRATE_PUMP_SPEED 60.0F +#define PRE_GEN_PRIME_D12_RPM 1500.0F +#define PRE_GEN_PRIME_D48_RPM 2000.0F +#define PRE_GEN_PRIME_DIALYZER_CONCENTRATE_PUMP_SPEED 30.0F // ********** private data ********** @@ -53,13 +65,21 @@ static BOOL pendingStopDDPreGenDialRequest; ///< Flag indicating TD has requested DD stop the pre generation dialysate. static U32 preGenDialysatePublishTimerCounter; ///< Pre-Gen Dialysate data broadcast timer counter used to schedule when to transmit data. static OVERRIDE_U32_T preGenDialysateModePublishInterval; ///< Interval (in task intervals) at which to publish pre-gen dialysate mode data to CAN bus. +static U32 preGenAcidPrimeTimer; +static U32 preGenBicarbPrimeTimer; +static U32 preGenfillChamberCTimer; +static BOOL currentHydroChamberStatus; // ********** private function prototypes ********** static void publishPreGenDialysateState( void ); static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ); -static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ); static DD_PRE_GEN_DIALYSATE_STATE_T handleDryBicartInitialFillState( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handleFillChamberF( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handlePrimeBicarbLine( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handlePrimeAcidLine( void ); +static DD_PRE_GEN_DIALYSATE_STATE_T handleWaitForFPState( void ); +static void setModePreGenDialysateTransition( DD_PRE_GEN_DIALYSATE_STATE_T state ); //Wet Self test static void setModePreGenWetSelfStateTransition( DD_WET_SELF_TEST_STATE_T state ); @@ -77,7 +97,7 @@ *************************************************************************/ void initPreGenDialysateMode( void ) { - preGenDialysateState = DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK; + preGenDialysateState = DD_PRE_GEN_WAIT_FOR_FP_GEN; wetSelfTestState = DD_WET_SELF_TEST_START; hydChamberPressureCheckStartTimeMS = 0; pressureCheckPersistanceStartTimeMS = 0; @@ -87,6 +107,11 @@ preGenDialysateModePublishInterval.ovData = PRE_GEN_DIALYSATE_DATA_PUB_INTERVAL; preGenDialysateModePublishInterval.ovInitData = 0; preGenDialysateModePublishInterval.override = OVERRIDE_RESET; + currentHydroChamberStatus = FALSE; + + preGenAcidPrimeTimer = 0; + preGenBicarbPrimeTimer = 0; + preGenfillChamberCTimer = 0; } /*********************************************************************//** @@ -121,40 +146,64 @@ *************************************************************************/ U32 execPreGenDialysateMode( void ) { - //Manage Inlet water control - hydChamberWaterInletControl(); + DD_PRE_GEN_DIALYSATE_STATE_T prevState = preGenDialysateState; - //TODO: To be placed in correct states once states defined. - if ( TRUE == pendingStartDDGenDialRequest ) + + + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_SKIP_PRE_GEN_PRIMING ) ) { - pendingStartDDGenDialRequest = FALSE; - requestNewOperationMode( DD_MODE_GEND ); + preGenDialysateState = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; } + + //Manage Inlet water control after hydro chamber fill + if( DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK < preGenDialysateState ) + { + currentHydroChamberStatus = hydChamberWaterInletControl(); + } + //TODO: Transition to post gen dialysate if concentrate priming has been started - else if ( TRUE == pendingStopDDPreGenDialRequest ) + if ( TRUE == pendingStopDDPreGenDialRequest ) { pendingStopDDPreGenDialRequest = FALSE; requestNewOperationMode( DD_MODE_STAN ); } + else { // execute current pre-gen dialysate state switch ( preGenDialysateState ) { + case DD_PRE_GEN_WAIT_FOR_FP_GEN: + preGenDialysateState = handleWaitForFPState(); + break; + case DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK: preGenDialysateState = handlePreGenDialysateFillCompleteCheckState(); break; - case DD_PRE_GEN_WET_SELF_TEST: - preGenDialysateState = handlePreGenWetSelfTestState(); - break; - case DD_PRE_GEN_DRY_BICART_INITIAL_FILL: preGenDialysateState = handleDryBicartInitialFillState(); break; + case DD_PRE_GEN_FILL_CHAMBER_F: + preGenDialysateState = handleFillChamberF(); + break; + + case DD_PRE_GEN_PRIME_BICARB_LINE: + preGenDialysateState = handlePrimeBicarbLine(); + break; + + case DD_PRE_GEN_PRIME_ACID_LINE: + preGenDialysateState = handlePrimeAcidLine(); + break; + case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: - // TODO : handle wait for Gen dialysate + + if ( TRUE == pendingStartDDGenDialRequest ) + { + pendingStartDDGenDialRequest = FALSE; + requestNewOperationMode( DD_MODE_GEND ); + } break; default: @@ -163,6 +212,12 @@ } } + if ( prevState != preGenDialysateState ) + { + setModePreGenDialysateTransition( preGenDialysateState ); + SEND_EVENT_WITH_2_U32_DATA( DD_EVENT_PRE_GEN_CHANGE, prevState, preGenDialysateState ) + } + publishPreGenDialysateState(); return preGenDialysateState; @@ -225,45 +280,63 @@ /*********************************************************************//** * @brief - * The handlePreGenDialysateFillCompleteCheckState function checks the - * hydrochamber fill and transition to next state. + * The handleWaitForFPState function checks the state of FP + * transition to next state. * @details \b Inputs: state * @details \b Outputs: none * @return current state of PreGenDialysate mode *************************************************************************/ -static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ) +static DD_PRE_GEN_DIALYSATE_STATE_T handleWaitForFPState( void ) { - //TODO: define hydroblock fill complete process - DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_WET_SELF_TEST; + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_WAIT_FOR_FP_GEN; + FP_OP_MODE_T fpMode = getCurrentFPOperationMode(); + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_RUN_SOLO ) ) + { + state = DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK; + } + + else if ( ( FP_MODE_DEGP == fpMode ) || ( FP_MODE_GENP == fpMode ) ) + { + state = DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK; + } + + //TODO: Should DD keep a timer and Alarm if FP never transitions? + return state; } /*********************************************************************//** * @brief - * The handlePreGenWetSelfTestState function executes the series of self - * tests with the conecentrates and dialysate. + * The handlePreGenDialysateFillCompleteCheckState function checks the + * hydrochamber fill and transition to next state. * @details \b Inputs: state * @details \b Outputs: none * @return current state of PreGenDialysate mode *************************************************************************/ -static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenWetSelfTestState( void ) +static DD_PRE_GEN_DIALYSATE_STATE_T handlePreGenDialysateFillCompleteCheckState( void ) { - //TODO: Change to wet self test state later - DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DRY_BICART_INITIAL_FILL; + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK; - if ( FALSE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) + if ( LVL_STATE_HIGH == getFloaterStatus( D6_LEVL ) ) { - setBicartFillRequested(); + state = DD_PRE_GEN_FILL_CHAMBER_F; + + //TODO: Rework disable dry bicarb config. Currently skipping + // all concentrate related priming + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) + { + state = DD_PRE_GEN_PRIME_BICARB_LINE; + } } - //execWetSelfTest(); + //TODO: Timeout alarm. 120s return state; } /*********************************************************************//** * @brief - * The handleDryBicartInitialFillState function executes intial dry bicart fill request + * The handleDryBicartInitialFillState function executes initial dry bicart fill request * @details \b Inputs: none * @details \b Outputs: none * @return current state of PreGenDialysate mode @@ -273,26 +346,187 @@ //TODO: Change to wet self test state later DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_DRY_BICART_INITIAL_FILL; - if ( FALSE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) { + state = DD_PRE_GEN_FILL_CHAMBER_F; + } + + else + { // stay in this state till bicart fill complete. - if ( getCurrentDryBiCartFillExecState() == DRY_BICART_FILL_COMPLETE_STATE ) + if ( getCurrentDryBiCartPreGenFillExecState() == DRY_BICART_FILL_COMPLETE_STATE ) { - state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + state = DD_PRE_GEN_FILL_CHAMBER_F; } // TODO: Alarm if it is not completed within 1.5 minutes } - else + + return state; +} + +/*********************************************************************//** + * @brief + * The handleFillChamberF function checks the + * chamber F fill and transition to next state. + * @details \b Inputs: state + * @details \b Outputs: none + * @return current state of PreGenDialysate mode + *************************************************************************/ +static DD_PRE_GEN_DIALYSATE_STATE_T handleFillChamberF( void ) +{ + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_FILL_CHAMBER_F; + + if ( PRE_GEN_BICARB_SUPPLY_VENT_END_STATE == getCurrentDryBiCartPreGenFillExecState() ) { - // not bicart fill, move to next state - state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + state = DD_PRE_GEN_PRIME_BICARB_LINE; } + //TODO: Timeout alarm. 120s return state; } /*********************************************************************//** * @brief + * The handlePrimeBicarbLine function handles priming the bicarb line + * and transition to next state. + * @details \b Inputs: state + * @details \b Outputs: none + * @return current state of PreGenDialysate mode + *************************************************************************/ +static DD_PRE_GEN_DIALYSATE_STATE_T handlePrimeBicarbLine( void ) +{ + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_PRIME_BICARB_LINE; + + if ( TRUE == didTimeout( preGenBicarbPrimeTimer, PRE_GEN_PRIME_CONCENTRATE_TIMEOUT ) ) + { + state = DD_PRE_GEN_PRIME_ACID_LINE; + } + + return state; +} + +static DD_PRE_GEN_DIALYSATE_STATE_T handlePrimeAcidLine( void ) +{ + DD_PRE_GEN_DIALYSATE_STATE_T state = DD_PRE_GEN_PRIME_ACID_LINE; + + if ( TRUE == didTimeout( preGenAcidPrimeTimer, PRE_GEN_PRIME_CONCENTRATE_TIMEOUT ) ) + { + state = DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The setModeGenPDefTransition function sets the actuators and variables + * for the state transition in generate permeate mode. + * @details Inputs: none + * @details Outputs: Actuate valves, pumps as desired. + * @param state gen permeate state enum + * @return none + *************************************************************************/ +static void setModePreGenDialysateTransition( DD_PRE_GEN_DIALYSATE_STATE_T state ) +{ + // Execute on running state + switch( state ) + { + case DD_PRE_GEN_WAIT_FOR_FP_GEN: + break; + + case DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK: + preGenfillChamberCTimer = getMSTimerCount(); + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + setValveState( D3_VALV, VALVE_STATE_OPEN ); + break; + + case DD_PRE_GEN_DRY_BICART_INITIAL_FILL: + + if ( FALSE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) + { + setBicartFillRequested(); + } + break; + + case DD_PRE_GEN_FILL_CHAMBER_F: + if ( FALSE == getTestConfigStatus( TEST_CONFIG_DD_DISABLE_DRY_BICARB ) ) + { + setBicartPreGenFillRequested(); + } + setDialysatePumpTargetRPM( D12_PUMP, PRE_GEN_PRIME_D12_RPM, TRUE ); + + break; + + case DD_PRE_GEN_PRIME_BICARB_LINE: + preGenBicarbPrimeTimer = getMSTimerCount(); + // dialyzer bypass + setValveState( D34_VALV, VALVE_STATE_OPEN ); + setValveState( D91_VALV, VALVE_STATE_CLOSED ); + setValveState( D35_VALV, VALVE_STATE_CLOSED ); + setValveState( D40_VALV, VALVE_STATE_CLOSED ); + // open BC fresh side + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); + // close BC spent side + setValveState( D23_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); + //vent air to chamber h + setValveState( D47_VALV, VALVE_STATE_OPEN ); + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + setValveState( D80_VALV, VALVE_STATE_CLOSED ); + //set bicarb concentrate pump and rinse pump + setRinsePumpState( RINSE_PUMP_STATE_ON ); + setConcentratePumpTargetSpeed( D10_PUMP, PRE_GEN_PRIME_CONCENTRATE_PUMP_SPEED, PRE_GEN_PRIME_CONCENTRATE_VOLUME ); + requestConcentratePumpOn( D10_PUMP ); + break; + + case DD_PRE_GEN_PRIME_ACID_LINE: + requestConcentratePumpOff( D10_PUMP, FALSE ); + //TODO: Merge concentrate line priming to one state. + preGenAcidPrimeTimer = getMSTimerCount(); + // dialyzer bypass + setValveState( D34_VALV, VALVE_STATE_OPEN ); + setValveState( D91_VALV, VALVE_STATE_CLOSED ); + setValveState( D35_VALV, VALVE_STATE_CLOSED ); + setValveState( D40_VALV, VALVE_STATE_CLOSED ); + // open BC fresh side + setValveState( D19_VALV, VALVE_STATE_OPEN ); + setValveState( D20_VALV, VALVE_STATE_OPEN ); + setValveState( D21_VALV, VALVE_STATE_OPEN ); + setValveState( D22_VALV, VALVE_STATE_OPEN ); + // close BC spent side + setValveState( D23_VALV, VALVE_STATE_CLOSED ); + setValveState( D24_VALV, VALVE_STATE_CLOSED ); + setValveState( D25_VALV, VALVE_STATE_CLOSED ); + setValveState( D26_VALV, VALVE_STATE_CLOSED ); + //vent air to chamber h + setValveState( D47_VALV, VALVE_STATE_OPEN ); + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + setValveState( D80_VALV, VALVE_STATE_CLOSED ); + //set acid concentrate pump and rinse pump + setRinsePumpState( RINSE_PUMP_STATE_ON ); + setConcentratePumpTargetSpeed( D11_PUMP, PRE_GEN_PRIME_CONCENTRATE_PUMP_SPEED, PRE_GEN_PRIME_CONCENTRATE_VOLUME ); + requestConcentratePumpOn( D11_PUMP ); + break; + + case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: + //TODO: update to recirculation instead of off states. + requestConcentratePumpOff( D10_PUMP, FALSE ); + requestConcentratePumpOff( D11_PUMP, FALSE ); + setRinsePumpState( RINSE_PUMP_STATE_OFF ); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, FP_FAULT_ID_FP_INVALID_GENP_STATE, state ) + break; + } +} +/*********************************************************************//** + * @brief * The setModePreGenWetSelfStateTransition function sets the actuators and variables * for the state transition in pre-gen WetSlef test mode. * @details Inputs: Valve states, Pump speed @@ -529,8 +763,10 @@ { // TODO add validate condition after checking with Vinay case DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK: - case DD_PRE_GEN_WET_SELF_TEST: case DD_PRE_GEN_DRY_BICART_INITIAL_FILL: + case DD_PRE_GEN_FILL_CHAMBER_F: + case DD_PRE_GEN_PRIME_BICARB_LINE: + case DD_PRE_GEN_PRIME_ACID_LINE: case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: result = TRUE; break; @@ -562,10 +798,12 @@ { // TODO add logic after checking with Vinay // Any of these state require no special handling - case DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK: - case DD_PRE_GEN_WET_SELF_TEST: - case DD_PRE_GEN_DRY_BICART_INITIAL_FILL: - case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: + case DD_PRE_GEN_DIALYSATE_HYD_CHAMBER_FILL_CHECK: + case DD_PRE_GEN_DRY_BICART_INITIAL_FILL: + case DD_PRE_GEN_FILL_CHAMBER_F: + case DD_PRE_GEN_PRIME_BICARB_LINE: + case DD_PRE_GEN_PRIME_ACID_LINE: + case DD_PRE_GEN_DIALYSATE_WAIT_FOR_GEND: default: break; }