Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r8272c6f212023b3f591454c609088be36a6f5980 -re92a64cc9e95e2c79a5ff88d183ec33d8baa9745 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 8272c6f212023b3f591454c609088be36a6f5980) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision e92a64cc9e95e2c79a5ff88d183ec33d8baa9745) @@ -15,6 +15,8 @@ * ***************************************************************************/ +#include // For fabs + #include "ConcentratePumps.h" #include "ConductivitySensors.h" #include "FPGA.h" @@ -43,7 +45,6 @@ // ********** private definitions ********** #define TARGET_RO_PRESSURE_PSI 130 ///< Target pressure for RO pump. -#define TARGET_RO_FLOW_RATE_L 0.8 //TODO do we need to use this as default? ///< Target flow rate for RO pump. #define DIALYSATE_FILL_TIME_OUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when reservoir is not filled with correct dialysate. #define EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ( 5 * MS_PER_SECOND ) ///< Persistent period for empty bottle detect. @@ -57,6 +58,8 @@ #define WATER_QUALITY_CHECK_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Inlet water quality check time out period in ms. #define DIALYSATE_TEMPERATURE_TOLERANCE_C 2.0 ///< Dialysate temperature tolerance in degree C. +#define DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C 2.0 ///< Dialysate temperature sensors maximum allowed drift in C. +#define DIALYSATE_TEMPERATURE_SENSORS_DRIFT_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. #define ACID_CONCENTRATION_BOTTLE_VOLUME_ML 3000.0 ///< Volume of acid concentration in ml. #define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3000.0 ///< Volume of bicarb concentration in ml. @@ -106,6 +109,7 @@ static DG_FILL_MODE_STATE_T handlePausedState( void ); static BOOL isWaterQualityGood( void ); +static void checkDialysateTemperatureSensorsDrift( void ); static BOOL checkDialysateTemperature( void ); static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ); static void setFillInfoToRTCRAM( void ); @@ -114,7 +118,10 @@ * @brief * The initFillMode function initializes the fill mode module. * @details Inputs: none - * @details Outputs: Fill mode module initialized + * @details Outputs: fillState, dialysateFillStartTime, reservoirBaseWeight, + * totalROFlowRateMLPM, concentrateTestStartTime, acidConductivityTotal, + * dialysateConductivityTotal, conductivitySampleCount, + * concentratePumpPrimeCount * @return none *************************************************************************/ void initFillMode( void ) @@ -131,6 +138,7 @@ initPersistentAlarm( ALARM_ID_ACID_CONDUCTIVITY_OUT_OF_RANGE, 0, EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ); initPersistentAlarm( ALARM_ID_BICARB_CONDUCTIVITY_OUT_OF_RANGE, 0, EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ); + initPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_DRFIT_TIMEOUT, 0, DIALYSATE_TEMPERATURE_SENSORS_DRIFT_TIMEOUT_MS ); } /*********************************************************************//** @@ -181,6 +189,7 @@ checkInletWaterTemperature(); checkInletPressure(); checkRORejectionRatio(); + checkDialysateTemperatureSensorsDrift(); // TODO: Check for open straw door status and alarm if closed // Check if run out of time to fill the reservoir @@ -279,8 +288,12 @@ *************************************************************************/ void resetFillStatusParameters( void ) { - // Get the heaters info form the NV data management - DG_HEATERS_RECORD_T heaterInfo = getHeatersInfoReocrd(); + DG_HEATERS_RECORD_T heaterInfo; + // There is no number of NV data to check for the heaters info so it is passed as 0 + U08 numOfNVData2Check = 0; + // Get the heaters info from the NV data management. Do not alarm on the status of the data since it has already been checked in NV POST + getNVRecord2Driver( GET_INF_HEATERS_RECORD, (U08*)&heaterInfo, sizeof( DG_HEATERS_RECORD_T ), numOfNVData2Check, ALARM_ID_NO_ALARM ); + // If the data in the NV data management was not initialized properly, set it to 0 otherwise, set the average flow rate fillStatus.fillFlowRateAverage = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); fillStatus.fillFlowRateRunningSum = 0.0; @@ -322,14 +335,24 @@ if ( TRUE == isWaterQualityGood() ) #endif { - concentrateTestStartTime = getMSTimerCount(); -#ifndef DISABLE_MIXING + // If this is the first fill of a treatment, prime and acid and bicarb lines, otherwise transition + // to dialysate production directly + if ( TRUE == isThisTheFirstFill() ) + { + concentrateTestStartTime = getMSTimerCount(); + #ifndef DISABLE_MIXING setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONCENTRATE_PUMP_MAX_SPEED ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); -#endif - result = DG_FILL_MODE_STATE_BICARB_PUMP_CHECK; + #endif + result = DG_FILL_MODE_STATE_BICARB_PUMP_CHECK; + } + else + { + result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; + } + } if ( TRUE == didTimeout( waterQualityCheckStartTime, WATER_QUALITY_CHECK_TIME_OUT_MS ) ) @@ -432,7 +455,8 @@ if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { - concentratePumpPrimeCount = 0; + concentratePumpPrimeCount = 0; + fillStatus.isThisFirstFill = FALSE; requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; @@ -603,7 +627,6 @@ fillStatus.fillTemperatureRunningSum = 0.0; fillStatus.fillSampleCounter = 1; fillStatus.fillLastTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); - fillStatus.isThisFirstFill = FALSE; // Write the latest fill data into the RTC RAM for heaters control // TODO test this and make sure it is writing it correctly @@ -659,6 +682,29 @@ /*********************************************************************//** * @brief + * The checkDialysateTemperatureSensorsDrift function checks whether the + * dialysate temperature sensors have drifted. If they are drifted, it raises + * an alarm. + * @details Inputs: none + * @details Outputs: None + * @return none + *************************************************************************/ +static void checkDialysateTemperatureSensorsDrift( void ) +{ +#ifndef THD_USING_TRO_CONNECTOR // Do not use until TRo is back in line + F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); + BOOL isDriftOut = ( fabs( TDi - TRo ) >= DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C ? TRUE : FALSE ); + + if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_DRFIT_TIMEOUT, isDriftOut ) ) + { + activateAlarmNoData( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_DRFIT_TIMEOUT ); + } +#endif +} + +/*********************************************************************//** + * @brief * The checkDialysateTemperature function checks dialysate temperature after * it gets heated up by primary heater. * @details Inputs: TPo temperature value @@ -690,9 +736,13 @@ DG_BICARB_CONCENTRATES_RECORD_T bicarb = getBicarbConcentrateCalRecord(); // Set concentrate pumps speed based off RO pump flow rate - F32 const acidCP1PumpFlowRate = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio * measuredROFlowRate_mL_min; - F32 const bicarbCP2PumpFlowRate = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio * measuredROFlowRate_mL_min; + F32 acidCP1PumpFlowRate = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio * measuredROFlowRate_mL_min; + F32 bicarbCP2PumpFlowRate = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio * measuredROFlowRate_mL_min; + // Cap to the maximum allowed concentrate pumps rate + acidCP1PumpFlowRate = MIN( acidCP1PumpFlowRate, CONCENTRATE_PUMP_MAX_SPEED ); + bicarbCP2PumpFlowRate = MIN( bicarbCP2PumpFlowRate, CONCENTRATE_PUMP_MAX_SPEED ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, acidCP1PumpFlowRate ); setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, bicarbCP2PumpFlowRate ); #endif