Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -rb6d20d9e5c704a9f7ebceea9bb12731dac61fc2a -r6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision b6d20d9e5c704a9f7ebceea9bb12731dac61fc2a) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 6679a2cd813b21a8cb4c58b3eeb721e0eef9a10b) @@ -26,6 +26,7 @@ #include "OperationModes.h" #include "Pressure.h" #include "TaskGeneral.h" +#include "TDInterface.h" #include "Temperature.h" #include "Timers.h" #include "Valves.h" @@ -57,6 +58,8 @@ //static BOOL isHydChamberTempinRange = FALSE; ///< Flag indicating hydraulics chamber water temperature is in range. 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 BOOL isDialysateGoodtoDeliver; ///< Flag indicating whether ready to deliver dialysate or not. static U32 genDialysateDataPublicationTimerCounter; ///< Used to schedule generate dialysate data publication to CAN bus. static OVERRIDE_U32_T genDialysateDataPublishInterval; ///< Generate dialysate mode data publish interval. @@ -68,6 +71,7 @@ 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 handleGendProduceDialysateyState( void ); static DD_GEND_MODE_STATE_T handleGendDialysateDeliveryState( void ); static DD_GEND_MODE_STATE_T handleGendDialysateDeliveryPauseState( void ); static void publishGenDialysateModeData( void ); @@ -87,6 +91,11 @@ // targetHydChamberFluidTemp.override = OVERRIDE_RESET; // isHydChamberTempinRange = FALSE; genDialysateState = DD_GEND_STATE_START; + isDialysateGoodtoDeliver = FALSE; + isDialDeliveryInProgress.data = FALSE; + isDialDeliveryInProgress.ovData = FALSE; + isDialDeliveryInProgress.ovInitData = FALSE; + isDialDeliveryInProgress.override = OVERRIDE_RESET; hydChamberPressureCheckStartTimeMS = 0; spentDialPressureCheckStartTimeMS = 0; genDialysateDataPublishInterval.data = GEN_DIALYSATE_DATA_PUBLISH_INTERVAL; @@ -115,8 +124,35 @@ return genDialysateState; } + /*********************************************************************//** * @brief + * The execGenDialysateMonitor function monitors the balancing chamber fill + * operations and alarm if temperature and conductivity is not in range. + * @details \b Inputs: + * @details \b Outputs: + * @details \b Alarm: none. + * @return none. + *************************************************************************/ +void execGenDialysateMonitor( void ) +{ + // Read temperature and conducitivity + //F32 hydChamberTemperature = getTemperatureValue( TEMPSENSORS_HYDRAULICS_PRIMARY_HEATER ); + //F32 biCarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); + //F32 acidBicarbMixConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD3_SENSOR ); + + // Monitor critical parameter while balancing chamber fill is in progress + if ( TRUE == getBalancingChamberFillinProgressStatus() ) + { + // Temperature range check + + // Coductivity range check + isDialysateGoodtoDeliver = TRUE; + } +} + +/*********************************************************************//** + * @brief * The setModeGenDStateTransition function sets the actuators and variables * for the state transition in generate dialysis mode. * @details Inputs: Valve states, Pump speed @@ -136,12 +172,8 @@ case DD_GEND_HYD_CHAMBER_WATER_INLET_CHECK_STATE: // Close all balancing chamber and hydraulics valves valveControlForBCClosedState(); - setValveState( VHI, VALVE_STATE_CLOSED ); //D03 - setValveState( VHB, VALVE_STATE_CLOSED ); //D08 - setValveState( VHO, VALVE_STATE_CLOSED ); //D14 - setValveState( VTD, VALVE_STATE_CLOSED ); //D52 - setValveState( VDR, VALVE_STATE_CLOSED ); //D53 - setValveState( VP2, VALVE_STATE_CLOSED ); //D47 + setHydValveStatetoClosedState(); + setUFValveStatetoClosedState(); // Get the target temperature from TD //targetHydChamberFluidTemp.data = HYD_CHAMBER_FLUID_TEMP_C_MIN; @@ -164,13 +196,32 @@ case DD_GEND_SPENT_DIALYSATE_PRESSURE_CHECK_STATE: // Start the timer for spent dialysate pressure check spentDialPressureCheckStartTimeMS = getMSTimerCount(); + + // Open all balancing chamber valves for free flow + valveControlForBCOpenState(); + + // Make sure valves are in correct position + setValveState( VDR, VALVE_STATE_OPEN ); //D53 + setValveState( VDI, VALVE_STATE_CLOSED ); + setValveState( VDO, VALVE_STATE_CLOSED ); + setValveState( VDB2, VALVE_STATE_OPEN ); + // Start D48/SDP pump setDialysatePumpTargetRPM( SPENT_DIALYSATE_PUMP, SPENT_DIAL_PUMP_INITIAL_RPM ); break; + case DD_GEND_PRODUCE_DIALYSATE_STATE: + // Enable bypass valve + setValveState( VDI, VALVE_STATE_CLOSED ); + setValveState( VDO, VALVE_STATE_CLOSED ); + setValveState( VDB2, VALVE_STATE_OPEN ); + break; + case DD_GEND_DIALYSATE_DELIVERY_STATE: - // Make sure valves are in correct position - setValveState( VDR, VALVE_STATE_OPEN ); //D53 + // Disable bypass valve + setValveState( VDB2, VALVE_STATE_CLOSED ); + setValveState( VDI, VALVE_STATE_OPEN ); + setValveState( VDO, VALVE_STATE_OPEN ); break; case DD_GEND_DIALYSATE_DELIVERY_PAUSE: @@ -236,6 +287,10 @@ genDialysateState = handleGendSpentDialysatePressureCheckState(); break; + case DD_GEND_PRODUCE_DIALYSATE_STATE: + genDialysateState = handleGendProduceDialysateyState(); + break; + case DD_GEND_DIALYSATE_DELIVERY_STATE: genDialysateState = handleGendDialysateDeliveryState(); break; @@ -269,11 +324,11 @@ // Read floater switch BOOL result = FALSE; LEVEL_STATE_T floaterLevel1 = getLevelStatus( FLOATER_1 ); - LEVEL_STATE_T floaterLevel2 = getLevelStatus( FLOATER_2 ); + //LEVEL_STATE_T floaterLevel2 = getLevelStatus( FLOATER_2 ); //F32 hydChamberTemperature = getTemperatureValue( TEMPSENSORS_HYDRAULICS_PRIMARY_HEATER ); // High level is met - if ( STATE_HIGH == floaterLevel2 ) + if ( STATE_HIGH == floaterLevel1 ) { //turn off inlet water valve setValveState( VHO, VALVE_STATE_CLOSED ); @@ -307,10 +362,10 @@ } // Invalid levels - if ( ( STATE_LOW == floaterLevel1 ) && ( STATE_HIGH == floaterLevel2 ) ) - { - //TODO : check for invalid levels and trigger alarm - } +// if ( ( STATE_LOW == floaterLevel1 ) && ( STATE_HIGH == floaterLevel2 ) ) +// { +// //TODO : check for invalid levels and trigger alarm +// } return result; } @@ -416,8 +471,8 @@ { // Proceed to next state transitionToBalChamberFill(); - setModeGenDStateTransition( DD_GEND_DIALYSATE_DELIVERY_STATE ); - state = DD_GEND_DIALYSATE_DELIVERY_STATE; + setModeGenDStateTransition( DD_GEND_PRODUCE_DIALYSATE_STATE ); + state = DD_GEND_PRODUCE_DIALYSATE_STATE; } else if ( TRUE == didTimeout( spentDialPressureCheckStartTimeMS, SPENT_DIAL_PRES_CHECK_TIME_OUT ) ) { @@ -430,23 +485,52 @@ /*********************************************************************//** * @brief + * The handleGendProduceDialysateyState function produces dialysate + * by executing balancing chamber and decides to pass the dialysate + * 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 handleGendProduceDialysateyState( void ) +{ + DD_GEND_MODE_STATE_T state = DD_GEND_PRODUCE_DIALYSATE_STATE; + + //Execute balancing chamber + execBalancingChamberControl(); + + //if the produced dialysate is good and TD asks for dialysate delivery + // move to next state + if ( ( TRUE == isDialysateGoodtoDeliver ) && ( FALSE == getTDDialyzerBypass() ) ) + { + setModeGenDStateTransition( DD_GEND_DIALYSATE_DELIVERY_STATE ); + state = DD_GEND_DIALYSATE_DELIVERY_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleGendDialysateDeliveryState function performing dialysate - * delivery by executing balacning chamber. + * delivery by executing balancing chamber. * @details \b Inputs: none * @details \b Outputs: balancing chamber state. * @return the current state of gen dialysate mode *************************************************************************/ static DD_GEND_MODE_STATE_T handleGendDialysateDeliveryState( void ) { DD_GEND_MODE_STATE_T state = DD_GEND_DIALYSATE_DELIVERY_STATE; - U32 balChamberstate; //Execute balancing chamber - balChamberstate = execBalancingChamberControl(); + execBalancingChamberControl(); - if ( BAL_CHAMBER_DIAL_DELIVERY_PAUSE == balChamberstate ) + // if TD asks for bypass or dialysate is not good to deliver + //transition to produce dialystate state + if ( ( FALSE == isDialysateGoodtoDeliver ) || ( TRUE == getTDDialyzerBypass() ) ) { - //handle if balancing chamber is paused for some reasons. + setModeGenDStateTransition( DD_GEND_PRODUCE_DIALYSATE_STATE ); + state = DD_GEND_PRODUCE_DIALYSATE_STATE; } return state; @@ -485,6 +569,42 @@ /*********************************************************************//** * @brief + * The requestDDStop function handles an TD request to stop (return to standby mode). + * @details \b Inputs: none + * @details \b Outputs: DD standby mode requested + * @return TRUE if request accepted. + *************************************************************************/ +BOOL requestDDStop( void ) +{ + BOOL result = TRUE; + + requestNewOperationMode( DD_MODE_STAN ); + + return result; +} + +/*********************************************************************//** + * @brief + * The getDialDeliveryProgressStatus function gets the dialysate delivery + * progress status. + * @details \b Inputs: isDialDeliveryInProgress + * @details \b Outputs: none + * @return the current status of dialysate delivery + *************************************************************************/ +U32 getDialDeliveryProgressStatus( void ) +{ + U32 result = isDialDeliveryInProgress.data; + + if ( OVERRIDE_KEY == isDialDeliveryInProgress.override ) + { + result = isDialDeliveryInProgress.ovData; + } + + return result; +} + +/*********************************************************************//** + * @brief * The getGenDilaysateDataPublishInterval function gets the generate dialysate * mode data publish interval. * @details \b Inputs: genDialysateDataPublishInterval @@ -520,13 +640,15 @@ GEN_DIALYSATE_MODE_DATA_T data; data.genDialysateExecState = (U32)getCurrentGenDialysateState(); + data.isDialDelInProgress = (BOOL)getDialDeliveryProgressStatus(); data.floaterLevel1 = (U32)getLevelStatus( FLOATER_1 ); data.floaterLevel2 = (U32)getLevelStatus( FLOATER_2 ); data.BiCarbLevel = (U32)getLevelStatus( BICARB_LEVEL ); data.SpentChamberLevel = (U32)getLevelStatus( SPENT_DIALYSATE_LEVEL ); data.hydNegativePressure = getFilteredPressure( PRESSURE_SENSOR_HYDRAULICS_OUTLET ); data.hydPositivePressure = getFilteredPressure( PRESSURE_SENSOR_FRESH_DIALYSATE ); data.spentDialysatePressure = getFilteredPressure( PRESSURE_SENSOR_SPENT_DIALYSATE ); + data.isDialysateGoodtoDeliver = isDialysateGoodtoDeliver; broadcastData( MSG_ID_DD_GEN_DIALYSATE_MODE_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&data, sizeof( GEN_DIALYSATE_MODE_DATA_T ) ); @@ -559,6 +681,23 @@ /*********************************************************************//** * @brief + * The testDialDeliveryInProgressOverride function sets the override value + * of the dialysate delivery In progress flag. + * @details Inputs: isDialDeliveryInProgress + * @details Outputs: isDialDeliveryInProgress + * @param message Override message from Dialin which includes the override + * value to override the dialysate delivery in progress flag. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testDialDeliveryInProgressOverride( MESSAGE_T *message ) +{ + BOOL result = u32Override( message, &isDialDeliveryInProgress, 0, TRUE ); + + return result; +} + +/*********************************************************************//** + * @brief * The testGenDHydChamberFluidTempOverride function sets the override value * of the hydraulics chamber fluid temperature. * @details Inputs: targetHydChamberFluidTemp