Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r89cf53e72625123054b11897c2e0a8359d82b7ce -r0a74bcce6674271e35d5154003dd6c25011f80f9 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 89cf53e72625123054b11897c2e0a8359d82b7ce) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 0a74bcce6674271e35d5154003dd6c25011f80f9) @@ -60,7 +60,7 @@ #define LINEAR_INTERCEPT_FACTOR 3.47F ///< Intercept factor used in adjusted dialysate temperature linear calculation for high Qds #define LOW_DIAL_FLOW_RATE 150.0F ///< Dialysate flow rate lesser than 150 considered to be low Qds. #define SPENT_CHAMBER_FILL_MAX_COUNT 7 ///< Total number of spent chamber fill allowed. - +#define BICARB_CHAMBER_FILL_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Bicarb chamber fill timeout. //Testing #define DELAY_BC_SWITCHING_AT_START_UP ( 10 * MS_PER_SECOND ) ///< Provide a balancing chamber switching start up delay to stabilize pump speed etc., /// Payload record structure for Gen dialysate execution state set request @@ -79,6 +79,7 @@ static U32 genDialysateDataPublicationTimerCounter; ///< Used to schedule generate dialysate data publication to CAN bus. static OVERRIDE_U32_T genDialysateDataPublishInterval; ///< Generate dialysate mode data publish interval. static BOOL isTreatmentParamUpdated; ///< To indicate change in treatment parameters +static U32 bicarbFillStartTimeMS; ///< Bicarb fill start time to check the timeout for filling process. //Testing static U32 bypassStateDelayStartTimeMS; ///< Delay balancing chamber switching for a second to preapre pump steady state. static BOOL delayBypassStateFlag; ///< To indicate change in treatment parameters @@ -90,6 +91,7 @@ static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryState( void ); static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryPauseState( void ); static DD_GEND_MODE_STATE_T handleGenDSpentChamberFillState(void); +static DD_GEND_MODE_STATE_T handleGenDBicarbChamberFillState( void ); static DD_GEND_MODE_STATE_T handleGenDIsolatedUFState( void ); static F32 getGenDialysateTargetTemperature( void ); static void calculateTargetDialysateTemp( void ); @@ -125,6 +127,7 @@ genDialysateDataPublishInterval.override = OVERRIDE_RESET; genDialysateDataPublicationTimerCounter = 0; isTreatmentParamUpdated = FALSE; + bicarbFillStartTimeMS = 0; //Testing bypassStateDelayStartTimeMS = 0; delayBypassStateFlag = TRUE; @@ -200,43 +203,46 @@ case DD_GEND_DIALYSATE_BYPASS_STATE: //Close all balancing chamber valves valveControlForBCClosedState(); - //Previous state setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); + setValveState( D14_VALV, VALVE_STATE_OPEN ); + 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 // Turn on the primary heater calculateTargetDialysateTemp(); setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); + setD28TempFeedbackControl( TRUE ); startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); //Testing : Enable close loop once testing is complete //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - 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 ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); transitionToBalChamberFill(); //Testing bypassStateDelayStartTimeMS = getMSTimerCount(); + delayBypassStateFlag = TRUE; break; case DD_GEND_DIALYSATE_DELIVERY_STATE: //Previous state setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); + setValveState( D14_VALV, VALVE_STATE_OPEN ); + setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve // Turn on the primary heater calculateTargetDialysateTemp(); setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); + setD28TempFeedbackControl( TRUE ); startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); + //setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve //setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, FALSE ); setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); @@ -249,24 +255,61 @@ case DD_GEND_SPENT_CHAMBER_FILL_STATE: //Close all balancing chamber valves valveControlForBCClosedState(); - transitionToSpentChamberFill(); - //Set valves and actuators + setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI + setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO + setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); + setValveState( D14_VALV, VALVE_STATE_OPEN ); + setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve + setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve + setValveState( D47_VALV, VALVE_STATE_OPEN ); // Spent chamber purge valve - calculateTargetDialysateTemp(); + requestConcentratePumpOff( D76_PUMP, FALSE ); + requestConcentratePumpOff( D11_PUMP, FALSE ); + requestConcentratePumpOff( D10_PUMP, FALSE ); + // Turn on the primary heater + calculateTargetDialysateTemp(); setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); + setD28TempFeedbackControl( TRUE ); startHeater( D5_HEAT ); - setValveState( D14_VALV, VALVE_STATE_OPEN ); setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); - setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve + setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_FILL_RPM, TRUE ); + + //Transition to spent chamber fill + transitionToSpentChamberFill(); + break; + + case DD_GEND_BICARB_CHAMBER_FILL_STATE: + //Close all balancing chamber valves + valveControlForBCClosedState(); + requestConcentratePumpOff( D11_PUMP, FALSE ); + requestConcentratePumpOff( D10_PUMP, FALSE ); + requestConcentratePumpOff( D76_PUMP, FALSE ); + + //Set valves and actuators + setValveState( D47_VALV, VALVE_STATE_CLOSED ); // Spent chamber purge valve setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO + setValveState( D14_VALV, VALVE_STATE_CLOSED ); + + setValveState( D53_VALV, VALVE_STATE_OPEN ); // Drain valve setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - setValveState( D47_VALV, VALVE_STATE_OPEN ); // Spent chamber purge valve - setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_FILL_RPM, TRUE ); + setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); + setValveState( D64_VALV, VALVE_STATE_OPEN ); // Bicarb chamber purge valve + bicarbFillStartTimeMS = getMSTimerCount(); + + // Turn on the primary heater + calculateTargetDialysateTemp(); + setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); + //Disable the D28 based temp control as fluid dispense being stopped by balancing chamber. + setD28TempFeedbackControl( FALSE ); + startHeater( D5_HEAT ); + + setDialysatePumpTargetRPM( D12_PUMP, FRESH_DIAL_PUMP_INITIAL_RPM, TRUE ); + setDialysatePumpTargetRPM( D48_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM, TRUE ); break; case DD_GEND_DIALYSATE_DELIVERY_PAUSE: @@ -284,8 +327,6 @@ setValveState( D35_VALV, VALVE_STATE_CLOSED ); // VDI setValveState( D40_VALV, VALVE_STATE_CLOSED ); // VDO setValveState( D34_VALV, VALVE_STATE_OPEN ); // Bypass valve - - //TODO : close the DD - water inlet and drain valves? break; case DD_GEND_ISOLATED_UF_STATE: @@ -350,6 +391,10 @@ genDialysateState = handleGenDSpentChamberFillState(); break; + case DD_GEND_BICARB_CHAMBER_FILL_STATE: + genDialysateState = handleGenDBicarbChamberFillState(); + break; + case DD_GEND_DIALYSATE_DELIVERY_PAUSE: genDialysateState = handleGenDDialysateDeliveryPauseState(); break; @@ -465,8 +510,9 @@ *************************************************************************/ static DD_GEND_MODE_STATE_T handleGenDDialysateBypassState( void ) { - DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_BYPASS_STATE; - LEVEL_STATE_T spentChamberLevel = getLevelStatus( D46_LEVL ); + DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_BYPASS_STATE; + LEVEL_STATE_T spentChamberLevel = getLevelStatus( D46_LEVL ); + LEVEL_STATE_T bicarbChamberLevel = getLevelStatus( D63_LEVL ); //Testing if ( TRUE == delayBypassStateFlag ) @@ -490,6 +536,14 @@ state = DD_GEND_SPENT_CHAMBER_FILL_STATE; } #endif +#ifdef __BICARB_CHAMBER_FILL__ + if ( LEVEL_STATE_LOW == bicarbChamberLevel ) + { + setModeGenDStateTransition( DD_GEND_BICARB_CHAMBER_FILL_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_BICARB_CHAMBER_FILL_STATE; + } +#endif //if the produced dialysate is good and TD asks for dialysate delivery //move to next state if ( ( TRUE == getDialGoodToDeliverStatus() ) && ( FALSE == getTDDialyzerBypass() ) ) @@ -512,8 +566,9 @@ *************************************************************************/ static DD_GEND_MODE_STATE_T handleGenDDialysateDeliveryState( void ) { - DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_DELIVERY_STATE; - LEVEL_STATE_T spentChamberLevel = getLevelStatus( D46_LEVL ); + DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_DELIVERY_STATE; + LEVEL_STATE_T spentChamberLevel = getLevelStatus( D46_LEVL ); + LEVEL_STATE_T bicarbChamberLevel = getLevelStatus( D63_LEVL ); // if TD asks for bypass or dialysate is not good to deliver //transition to bypass dialystate state @@ -531,6 +586,14 @@ state = DD_GEND_SPENT_CHAMBER_FILL_STATE; } #endif +#ifdef __BICARB_CHAMBER_FILL__ + else if ( LEVEL_STATE_LOW == bicarbChamberLevel ) + { + setModeGenDStateTransition( DD_GEND_BICARB_CHAMBER_FILL_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_BICARB_CHAMBER_FILL_STATE; + } +#endif else { //Execute balancing chamber @@ -542,11 +605,12 @@ return state; } + /*********************************************************************//** * @brief * The handleGenDSpentChamberFillState function performing spent * chamber filling/degassing by executing balancing chamber. - * @details \b Inputs: none + * @details \b Inputs: D46 level. * @details \b Outputs: balancing chamber state. * @return the current state of gen dialysate mode *************************************************************************/ @@ -578,7 +642,43 @@ } return state; +} +/*********************************************************************//** + * @brief + * The handleGenDBicarbChamberFillState function performing Bicarb + * chamber filling/degassing by opening up the purge valve which is connected + * to negative pressure chamber D of Hydraulics chamber. + * @details \b Inputs: D63 level. + * @details \b Outputs: isBicarbFillTimeout,valves actuation. + * @return the current state of gen dialysate mode + *************************************************************************/ +static DD_GEND_MODE_STATE_T handleGenDBicarbChamberFillState( void ) +{ + DD_GEND_MODE_STATE_T state = DD_GEND_BICARB_CHAMBER_FILL_STATE; + + LEVEL_STATE_T bicarbChamberLevel = getLevelStatus( D63_LEVL ); + BOOL isBicarbFillTimeout = FALSE; + + if ( TRUE == didTimeout( bicarbFillStartTimeMS, BICARB_CHAMBER_FILL_TIMEOUT ) ) + { + isBicarbFillTimeout = TRUE; + // Raise alarm for bicarb fill timeout + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_BICARB_FILL_TIMEOUT_FAULT, BICARB_CHAMBER_FILL_TIMEOUT, 0 ) + } + + // High level is met or fill timeout + if ( ( LEVEL_STATE_HIGH == bicarbChamberLevel ) || ( TRUE == isBicarbFillTimeout ) ) + { + setValveState( D64_VALV, VALVE_STATE_CLOSED ); // Close Bicarb chamber purge valve + bicarbFillStartTimeMS = 0; + + setModeGenDStateTransition( DD_GEND_DIALYSATE_BYPASS_STATE ); + isDialDeliveryInProgress.data = FALSE; + state = DD_GEND_DIALYSATE_BYPASS_STATE; + } + + return state; } /*********************************************************************//**