Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r93d68c04d7a89d4f7829fb2d8b440028f1fd2fa2 -rab7dfc361e5ee347141842b317f1fc2f16e4e3f3 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 93d68c04d7a89d4f7829fb2d8b440028f1fd2fa2) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision ab7dfc361e5ee347141842b317f1fc2f16e4e3f3) @@ -68,15 +68,17 @@ typedef struct { - F32 fillFlowRunningSum; ///< Fill flow running sum. - U32 fillFlowSampleCounter; ///< Fill flow sample counter. - F32 fillFlowAverage; ///< Fill flow average value. -} FILL_FLOW_RATE_STATUS_T; + F32 fillFlowRateRunningSum; ///< Fill flow running sum. + U32 fillSampleCounter; ///< Fill flow sample counter. + F32 fillTemperatureRunningSum; ///< Fill temperature running sum. + F32 fillTemperatureAverage; ///< Fill temperature average value. + F32 fillFlowRateAverage; ///< Fill flow average value. +} FILL_CONDITION_STATUS_T; static DG_FILL_MODE_STATE_T fillState; ///< Currently active fill state. static U32 dialysateFillStartTime; ///< Current time when starting to fill dialysate. static F32 reservoirBaseWeight; ///< Fill reservoir base weight. -static FILL_FLOW_RATE_STATUS_T fillFlowRate; ///< Fill flow rate status. +static FILL_CONDITION_STATUS_T fillStatus; ///< Fill condition status. static U32 waterQualityCheckStartTime; ///< Starting time for inlet water quality check. static U32 concentrateTestStartTime; ///< Starting time for concentrate test. @@ -102,7 +104,7 @@ static BOOL isWaterQualityGood( void ); static BOOL checkDialysateTemperature( void ); static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ); -static void calculateFillAverage( void ); +static void getAvgFillFlowRateFromRTCRAM( void ); /*********************************************************************//** * @brief @@ -113,18 +115,20 @@ *************************************************************************/ void initFillMode( void ) { - fillState = DG_FILL_MODE_STATE_START; - dialysateFillStartTime = 0; - reservoirBaseWeight = 0.0; - totalROFlowRate_mL_min = 0.0; - concentrateTestStartTime = 0; - acidConductivityTotal = 0.0; - dialysateConductivityTotal = 0.0; - conductivitySampleCount = 0; - concentratePumpPrimeCount = 0; - fillFlowRate.fillFlowAverage = 0.79; // TODO get this value from NV RAM at the beginning of the fill - fillFlowRate.fillFlowRunningSum = 0.0; - fillFlowRate.fillFlowSampleCounter = 0; + fillState = DG_FILL_MODE_STATE_START; + dialysateFillStartTime = 0; + reservoirBaseWeight = 0.0; + totalROFlowRate_mL_min = 0.0; + concentrateTestStartTime = 0; + acidConductivityTotal = 0.0; + dialysateConductivityTotal = 0.0; + conductivitySampleCount = 0; + concentratePumpPrimeCount = 0; + fillStatus.fillFlowRateAverage = 0.79; // TODO change this to 0 once RTC RAM is implemented + fillStatus.fillFlowRateRunningSum = 0.0; + fillStatus.fillSampleCounter = 0; + fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillTemperatureAverage = 0.0; 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 ); @@ -155,7 +159,9 @@ // NOTE: The target flow rate should be set prior to setting the start primary heater // because the initial guess in the heaters driver needs the target flow to calculate // the new PWMs for the main and small primary heaters +#ifndef DISABLE_FLOW_CONTROL_TREATMENT setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI ); +#endif startHeater( DG_PRIMARY_HEATER ); } @@ -173,6 +179,7 @@ checkInletWaterTemperature(); checkInletPressure(); checkRORejectionRatio(); + getAvgFillFlowRateFromRTCRAM(); // TODO: Check for open straw door status and alarm if closed // Check if run out of time to fill the reservoir @@ -225,19 +232,45 @@ /*********************************************************************//** * @brief - * The getAverageFillFlowRate function returns the moving average fill - * flow rate. + * The getAvgFillFlowRate function returns the average fill flow rate in + * each fill. * @details Inputs: none + * @details Outputs: fillFlowRateAverage + * @return average of the fill flow rate + *************************************************************************/ +F32 getAvgFillFlowRate( void ) +{ + return fillStatus.fillFlowRateAverage; +} + +/*********************************************************************//** + * @brief + * The setAvgFillFlowRateToRTCRAM function sets the average fill flow rate + * at the end of the treatment. + * @details Inputs: none * @details Outputs: averageFillFlowRate - * @return the moving average of the fill flow rate + * @return none *************************************************************************/ -F32 getAverageFillFlowRate( void ) +void setAvgFillFlowRateToRTCRAM( void ) { - return fillFlowRate.fillFlowAverage; + } /*********************************************************************//** * @brief + * The getAverageFillTemperature function returns the average fill temperature + * in each fill. + * @details Inputs: none + * @details Outputs: fillTemperatureAverage + * @return average fill temperature + *************************************************************************/ +F32 getAverageFillTemperature( void ) +{ + return fillStatus.fillTemperatureAverage; +} + +/*********************************************************************//** + * @brief * The handleCheckInletWaterState function checks for inlet water quality * before jumping to dialysate production state. * @details Inputs: Temperature and conductivity alarms @@ -336,11 +369,12 @@ *************************************************************************/ static DG_FILL_MODE_STATE_T handleAcidPumpCheckState( void ) { - DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_ACID_PUMP_CHECK; + DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_ACID_PUMP_CHECK; DG_ACID_CONCENTRATES_RECORD_T acid = getAcidConcentrateCalRecord(); - F32 measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; - F32 acidPumpFlowRate_mL_min = measuredROFlowRate_mL_min * acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio + - CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN; + F32 measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; + F32 acidPumpFlowRate_mL_min = measuredROFlowRate_mL_min * acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio + + CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN; + #ifndef DISABLE_DIALYSATE_CHECK F32 const acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); #else @@ -452,8 +486,9 @@ conductivitySampleCount++; // DG is delivering dialysate keep collecting the sample counter and the measured flow - fillFlowRate.fillFlowSampleCounter += 1; - fillFlowRate.fillFlowRunningSum += getMeasuredROFlowRate(); + fillStatus.fillSampleCounter += 1; + fillStatus.fillFlowRateRunningSum += getMeasuredROFlowRate(); + fillStatus.fillTemperatureRunningSum += getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); #ifndef DISABLE_DIALYSATE_CHECK if ( ( isWaterQualityGood() != TRUE ) || ( checkDialysateTemperature() != TRUE ) ) @@ -515,13 +550,14 @@ } #endif - // Done with this fill. Calculate the average fill flow rate - fillFlowRate.fillFlowAverage = fillFlowRate.fillFlowRunningSum / (F32)fillFlowRate.fillFlowSampleCounter; + // Done with this fill. Calculate the average fill flow rate and average temperature + fillStatus.fillFlowRateAverage = fillStatus.fillFlowRateRunningSum / (F32)fillStatus.fillSampleCounter; + fillStatus.fillTemperatureAverage = fillStatus.fillTemperatureRunningSum / (F32)fillStatus.fillSampleCounter; // Reset the variables for the next fill - fillFlowRate.fillFlowRunningSum = 0.0; - fillFlowRate.fillFlowSampleCounter = 0; + fillStatus.fillFlowRateRunningSum = 0.0; + fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillSampleCounter = 1; - setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); requestNewOperationMode( DG_MODE_GENE ); } @@ -566,6 +602,7 @@ return ( ( isInletPressureGood && isWaterTemperatureGood && isWaterConductivityGood ) ? TRUE : FALSE ); } + /*********************************************************************//** * @brief * The checkDialysateTemperature function checks dialysate temperature after @@ -582,6 +619,7 @@ return ( ( fabs( dialysateTemp - targetTemp ) <= DIALYSATE_TEMPERATURE_TOLERANCE_C ) ? TRUE : FALSE ); } + /*********************************************************************//** * @brief * The handleDialysateMixing function handles the dialysate mixing by setting @@ -607,7 +645,7 @@ #endif } -static void calculateFillAverage( void ) +static void getAvgFillFlowRateFromRTCRAM( void ) { }