Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r5422509f9d8db102b62952ba9f5923e832d6b2fa -r724b64673b719eaac10b0c9dd839ad9675274911 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 5422509f9d8db102b62952ba9f5923e832d6b2fa) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 724b64673b719eaac10b0c9dd839ad9675274911) @@ -43,13 +43,6 @@ #define FRESH_DIAL_PUMP_INITIAL_RPM 2500 ///< Nominal RPM target for fresh dialysate pump to maintain required pressure. #define SPENT_DIAL_PUMP_INITIAL_RPM 2000 ///< Nominal RPM target for spent dialysate pump to maintain required pressure. #define HYD_CHAMBER_FLUID_TEMP_C_MIN 35.0F ///< Minimum hydraulics fluid temperature in deg celcius -#define HYD_CHAMBER_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when hydraulics chamber pressure check initiated -#define SPENT_DIAL_PRES_CHECK_TIME_OUT ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when spent dialysate pressure check initiated -//TODO : Needs further finetuning. currently max negative pressure reaches around 11.5 psi +/- 5% values defined for now -//#define HYD_CHAMBER_TARGET_NEG_PRESS_MIN_PSI (-11.7877F) ///< Hydraulics chamber minimum negative pressure(D9/PHo) in psi. -//#define HYD_CHAMBER_TARGET_NEG_PRESS_MAX_PSI (-12.2789F) ///< Hydraulics chamber maximum negative pressure(D9/PHo) in psi. -#define HYD_CHAMBER_TARGET_NEG_PRESS_MIN_PSI (-10.000F) ///< Hydraulics chamber minimum negative pressure(D9/PHo) in psi. -#define HYD_CHAMBER_TARGET_NEG_PRESS_MAX_PSI (-12.075F) ///< Hydraulics chamber maximum negative pressure(D9/PHo) in psi. #define GEN_DIALYSATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen dialysate mode data published. /// Payload record structure for Gen dialysate execution state set request @@ -62,8 +55,6 @@ static DD_GEND_MODE_STATE_T genDialysateState = DD_GEND_STATE_START; ///< Currently active gen dialysate state. static OVERRIDE_F32_T targetHydChamberFluidTemp; ///< Target hydraulics chamber fluid temperature. -static U32 hydChamberPressureCheckStartTimeMS; ///< Current time when hydraulics chamber pressure check satrted in milliseconds. -static U32 spentDialPressureCheckStartTimeMS; ///< Current time when spent dialysate pressure check started in milliseconds. static OVERRIDE_U32_T isDialDeliveryInProgress; ///< To indicate dialysate started delivering to dialyzer for treatment (overrideable) static OVERRIDE_U32_T isDialysateGoodtoDeliver; ///< Flag indicating whether ready to deliver dialysate or not. static U32 genDialysateDataPublicationTimerCounter; ///< Used to schedule generate dialysate data publication to CAN bus. @@ -75,13 +66,10 @@ static void setModeGenDStateTransition( DD_GEND_MODE_STATE_T state ); static BOOL hydChamberWaterInletControl( void ); -static DD_GEND_MODE_STATE_T handleGenDHydraulicsChamberWaterInletCheckState( void ); -static DD_GEND_MODE_STATE_T handleGenDHydChamberPressureCheckState( void ); -static DD_GEND_MODE_STATE_T handleGenDFreshDialysatePressureCheckState( void ); -static DD_GEND_MODE_STATE_T handleGenDSpentDialysatePressureCheckState( void ); -static DD_GEND_MODE_STATE_T handleGenDProduceDialysateState( void ); +static DD_GEND_MODE_STATE_T handleGenDDialysateBypassState( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryState( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryPauseState( void ); +static DD_GEND_MODE_STATE_T handleGenDDialysateIsolatedUFState( void ); static F32 getGenDialysateTargetTemperature( void ); static void publishGenDialysateModeData( void ); @@ -107,8 +95,6 @@ isDialDeliveryInProgress.ovData = FALSE; isDialDeliveryInProgress.ovInitData = FALSE; isDialDeliveryInProgress.override = OVERRIDE_RESET; - hydChamberPressureCheckStartTimeMS = 0; - spentDialPressureCheckStartTimeMS = 0; genDialysateDataPublishInterval.data = GEN_DIALYSATE_DATA_PUBLISH_INTERVAL; genDialysateDataPublishInterval.ovData = GEN_DIALYSATE_DATA_PUBLISH_INTERVAL; genDialysateDataPublishInterval.ovInitData = 0; @@ -180,84 +166,25 @@ // Do nothing break; - case DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE: - // Close all balancing chamber and hydraulics valves - valveControlForBCClosedState(); - setHydValvesStatetoClosedState(); - setUFValvesStatetoClosedState(); + case DD_GEND_DIALYSATE_BYPASS_STATE: + //Previous state setValveState( M4_VALV, VALVE_STATE_OPEN ); - // Get the target temperature from TD targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); - // Turn on the primary heater setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); startHeater( D5_HEAT ); lastDialTargetTemperatureSet = getGenDialysateTargetTemperature(); - break; - case DD_GEND_HYD_CHAMBER_PRESSURE_CHECK_STATE: - //Previous state - setValveState( M4_VALV, VALVE_STATE_OPEN ); - startHeater( D5_HEAT ); - - // Open up VHo valve setValveState( D14_VALV, VALVE_STATE_OPEN ); - // Start timer for hyd chamber negative pressure check state - hydChamberPressureCheckStartTimeMS = getMSTimerCount(); - // Start D12/DGP pump - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - break; - - case DD_GEND_FRESH_DIALYSATE_PRESSURE_CHECK_STATE: - //Previous state - setValveState( M4_VALV, VALVE_STATE_OPEN ); - startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - - // Lets be DGP continue running since pressure relief valve was set/ tuned part of priming process - hydChamberPressureCheckStartTimeMS = getMSTimerCount(); - break; - - case DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE: - //Previous state - setValveState( M4_VALV, VALVE_STATE_OPEN ); - startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); - setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - - // Start the timer for spent dialysate pressure check - spentDialPressureCheckStartTimeMS = getMSTimerCount(); - - // Open only fresh side balancing chamber valves - valveControlForBCFreshSideOnlyOpenState(); - - // Make sure valves are in correct position - setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve - setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI - setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO - setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - - // Start D48/SDP pump - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); - break; - - case DD_GEND_PRODUCE_DIALYSATE_STATE: - //Previous state - setValveState( M4_VALV, VALVE_STATE_OPEN ); - startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); - //Close previously opened BC valves - valveControlForBCClosedState(); - + transitionToBalChamberFill(); break; case DD_GEND_DIALYSATE_DELIVERY_STATE: @@ -293,6 +220,10 @@ //close the DD - water inlet and drain valves? break; + case DD_GEND_ISOLATED_UF_STATE: + //TODO : define actuators states + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE1, state ) break; @@ -319,11 +250,8 @@ } } - // Manage water inlet temperature - if ( genDialysateState > DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE ) - { - hydChamberWaterInletControl(); - } + // Manage water level control + hydChamberWaterInletControl(); // Update any dynamic treatment parameter changes updateTreatmentSettings(); @@ -332,30 +260,14 @@ switch ( genDialysateState ) { case DD_GEND_STATE_START: - setModeGenDStateTransition( DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE ); - genDialysateState = DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE; + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); + genDialysateState = DD_GEND_DIALYSATE_BYPASS_STATE; break; - case DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE: - genDialysateState = handleGenDHydraulicsChamberWaterInletCheckState(); + case DD_GEND_DIALYSATE_BYPASS_STATE: + genDialysateState = handleGenDDialysateBypassState(); break; - case DD_GEND_HYD_CHAMBER_PRESSURE_CHECK_STATE: - genDialysateState = handleGenDHydChamberPressureCheckState(); - break; - - case DD_GEND_FRESH_DIALYSATE_PRESSURE_CHECK_STATE: - genDialysateState = handleGenDFreshDialysatePressureCheckState(); - break; - - case DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE: - genDialysateState = handleGenDSpentDialysatePressureCheckState(); - break; - - case DD_GEND_PRODUCE_DIALYSATE_STATE: - genDialysateState = handleGenDProduceDialysateState(); - break; - case DD_GEND_DIALYSATE_DELIVERY_STATE: genDialysateState = handleGenDDialysateDeliveryState(); break; @@ -364,6 +276,10 @@ genDialysateState = handleGenDDialysateDeliveryPauseState(); break; + case DD_GEND_ISOLATED_UF_STATE: + genDialysateState = handleGenDDialysateIsolatedUFState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_GEND_MODE_INVALID_EXEC_STATE, genDialysateState ) genDialysateState = DD_GEND_STATE_START; @@ -423,132 +339,33 @@ /*********************************************************************//** * @brief - * The handleGenDHydraulicsChamberWaterInletCheckState function checks the - * water level and allow the water into hydraulics for dialysate generation. - * @details \b Inputs: floater levels. + * The handleGenDDialysateIsolatedUFState function performs the + * Isolated ultrafiltration operations. + * @details \b Inputs: none. * @details \b Outputs: none * @return the current state of gen dialysate mode *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDHydraulicsChamberWaterInletCheckState( void ) +static DD_GEND_MODE_STATE_T handleGenDDialysateIsolatedUFState( void ) { - DD_GEND_MODE_STATE_T state = DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE; + DD_GEND_MODE_STATE_T state = DD_GEND_ISOLATED_UF_STATE; - // Allow water inlet to hydraulics chamber - if ( TRUE == hydChamberWaterInletControl() ) - { - // if water level is met, move to pressure check state - setModeGenDStateTransition( DD_GEND_HYD_CHAMBER_PRESSURE_CHECK_STATE ); - state = DD_GEND_HYD_CHAMBER_PRESSURE_CHECK_STATE; - } + //TODO: define isoalted ultrafilteration. return state; } /*********************************************************************//** * @brief - * The handleGenDHydChamberPressureCheckState function checks the - * hydraulics chamber pressure at chamber 4 of hydraulics. - * @details \b Inputs: pressure sensor readings, hydChamberPressureCheckStartTimeMS - * @details \b Outputs: none - * @return the current state of gen dialysate mode - *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDHydChamberPressureCheckState( void ) -{ - DD_GEND_MODE_STATE_T state = DD_GEND_HYD_CHAMBER_PRESSURE_CHECK_STATE; - F32 hydPressure = getFilteredPressure( D9_PRES ); - - // Hydraulics chamber negative pressure is in range ( -24 to -25 inHg ) - if ( ( hydPressure <= HYD_CHAMBER_TARGET_NEG_PRESS_MIN_PSI ) && ( hydPressure >= HYD_CHAMBER_TARGET_NEG_PRESS_MAX_PSI ) ) - { - // Proceed to next state - setModeGenDStateTransition( DD_GEND_FRESH_DIALYSATE_PRESSURE_CHECK_STATE ); - state = DD_GEND_FRESH_DIALYSATE_PRESSURE_CHECK_STATE; - } - else if ( TRUE == didTimeout( hydChamberPressureCheckStartTimeMS, HYD_CHAMBER_PRES_CHECK_TIME_OUT ) ) - { - // time out alarm and pause the dialysate generation? - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_HYD_CHAMBER_PRESS_OUT_OF_RANGE, hydPressure ); - state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleGenDFreshDialysatePressureCheckState function checks the - * positive pressure level ( chamber 5) of hydraulics chamber or fresh - * dialysate side. - * @details \b Inputs: pressure sensor readings,hydChamberPressureCheckStartTimeMS - * @details \b Outputs: none - * @return the current state of gen dialysate mode - *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDFreshDialysatePressureCheckState( void ) -{ - DD_GEND_MODE_STATE_T state = DD_GEND_FRESH_DIALYSATE_PRESSURE_CHECK_STATE; - F32 hydPressure = getFilteredPressure( D18_PRES ); - - // Hydraulics chamber postive pressure is in range - if ( ( hydPressure >= FRESH_DIAL_PRESSURE_MIN_PSIG ) && ( hydPressure <= FRESH_DIAL_PRESSURE_MAX_PSIG ) ) - { - // Proceed to next state - setModeGenDStateTransition( DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE ); - state = DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE; - } - else if ( TRUE == didTimeout( hydChamberPressureCheckStartTimeMS, HYD_CHAMBER_PRES_CHECK_TIME_OUT ) ) - { - // time out alarm and pause the dialysate generation? - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_FRESH_DIAL_PRESS_OUT_OF_RANGE, hydPressure ); - state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleGenDSpentDialysatePressureCheckState function checks the - * spent dialyaste pressure is in range to begin balancing chamber dialysate - * delivery. - * @details \b Inputs: pressure sensor readings,spentDialPressureCheckStartTimeMS. - * @details \b Outputs: none - * @return the current state of gen dialysate mode - *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDSpentDialysatePressureCheckState( void ) -{ - DD_GEND_MODE_STATE_T state = DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE; - F32 spentdialPressure = getFilteredPressure( D51_PRES ); - - // Spent dialysate pressure is in range - if ( ( spentdialPressure >= SPENT_DIAL_PRESSURE_MIN_PSIG ) && ( spentdialPressure <= SPENT_DIAL_PRESSURE_MAX_PSIG ) ) - { - // Proceed to next state - transitionToBalChamberFill(); - setModeGenDStateTransition( DD_GEND_PRODUCE_DIALYSATE_STATE ); - state = DD_GEND_PRODUCE_DIALYSATE_STATE; - } - else if ( TRUE == didTimeout( spentDialPressureCheckStartTimeMS, SPENT_DIAL_PRES_CHECK_TIME_OUT ) ) - { - // time out alarm and pause the dialysate generation? - SET_ALARM_WITH_1_F32_DATA( ALARM_ID_DD_GEND_SPENT_DIAL_PRESS_OUT_OF_RANGE, spentdialPressure ); - state = DD_GEND_DIALYSATE_DELIVERY_PAUSE; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handleGenDProduceDialysateState function produces dialysate + * The handleGenDDialysateBypassState function produces dialysate * by executing balancing chamber and decides to pass the dialysate - * for treatment. + * to dialyzer for treatment. * @details \b Inputs: none * @details \b Outputs: balancing chamber state. * @return the current state of gen dialysate mode *************************************************************************/ -static DD_GEND_MODE_STATE_T handleGenDProduceDialysateState( void ) +static DD_GEND_MODE_STATE_T handleGenDDialysateBypassState( void ) { - DD_GEND_MODE_STATE_T state = DD_GEND_PRODUCE_DIALYSATE_STATE; + DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_BYPASS_STATE; //Execute balancing chamber execBalancingChamberControl(); @@ -584,9 +401,9 @@ //transition to produce dialystate state if ( ( FALSE == getDialGoodToDeliverStatus() ) || ( TRUE == getTDDialyzerBypass() ) ) { - setModeGenDStateTransition( DD_GEND_PRODUCE_DIALYSATE_STATE ); + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); isDialDeliveryInProgress.data = FALSE; - state = DD_GEND_PRODUCE_DIALYSATE_STATE; + state = DD_GEND_DIALYSATE_BYPASS_STATE; } return state;