Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r09bab7093c44ef358e505bfcef016ffb39f56bd9 -r545cfb4fa5e9c27c2f6f0581529a25e551dfb9bf --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 09bab7093c44ef358e505bfcef016ffb39f56bd9) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 545cfb4fa5e9c27c2f6f0581529a25e551dfb9bf) @@ -61,17 +61,22 @@ #define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3000.0 ///< Volume of bicarb concentration in ml. #define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0 ///< Concentration bottle low volume in ml. -#define FLOW_MOVING_AVG_TIME_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Fill flow moving average time interval. -#define NUMBER_OF_FLOW_SAMPLES_FOR_MOVING_AVG 10.0 ///< Number of flow samples to collect for moving average. - /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. static const F32 FLOW_INTEGRATOR = ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); // ********** private data ********** +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; + 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 U32 waterQualityCheckStartTime; ///< Starting time for inlet water quality check. static U32 concentrateTestStartTime; ///< Starting time for concentrate test. @@ -97,6 +102,7 @@ static BOOL isWaterQualityGood( void ); static BOOL checkDialysateTemperature( void ); static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ); +static void calculateFillAverage( void ); /*********************************************************************//** * @brief @@ -107,15 +113,18 @@ *************************************************************************/ 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; + 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; 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 ); @@ -216,6 +225,19 @@ /*********************************************************************//** * @brief + * The getAverageFillFlowRate function returns the moving average fill + * flow rate. + * @details Inputs: none + * @details Outputs: averageFillFlowRate + * @return the moving average of the fill flow rate + *************************************************************************/ +F32 getAverageFillFlowRate( void ) +{ + return fillFlowRate.fillFlowAverage; +} + +/*********************************************************************//** + * @brief * The handleCheckInletWaterState function checks for inlet water quality * before jumping to dialysate production state. * @details Inputs: Temperature and conductivity alarms @@ -316,8 +338,8 @@ { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_ACID_PUMP_CHECK; DG_ACID_CONCENTRATES_RECORD_T acid = getAcidConcentrateCalRecord(); - F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; - F32 acidPumpFlowRate_mL_min = measuredROFlowRate_mL_min * acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio + + 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; acidPumpFlowRate_mL_min = MIN( acidPumpFlowRate_mL_min, CONCENTRATE_PUMP_MAX_SPEED ); @@ -365,8 +387,8 @@ *************************************************************************/ static DG_FILL_MODE_STATE_T handleDialysateProductionState( void ) { - DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; - F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; + DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; + F32 measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; #ifndef DISABLE_DIALYSATE_CHECK if ( ( TRUE == isWaterQualityGood() ) && ( TRUE == checkDialysateTemperature() ) ) @@ -427,6 +449,10 @@ dialysateConductivityTotal += dialysateConductivity; conductivitySampleCount++; + // DG is delivering dialysate keep collecting the sample counter and the measured flow + fillFlowRate.fillFlowSampleCounter += 1; + fillFlowRate.fillFlowRunningSum += getMeasuredROFlowRate(); + #ifndef DISABLE_DIALYSATE_CHECK if ( ( isWaterQualityGood() != TRUE ) || ( checkDialysateTemperature() != TRUE ) ) { @@ -487,6 +513,12 @@ } #endif + // Done with this fill. Calculate the average fill flow rate + fillFlowRate.fillFlowAverage = fillFlowRate.fillFlowRunningSum / (F32)fillFlowRate.fillFlowSampleCounter; + // Reset the variables for the next fill + fillFlowRate.fillFlowRunningSum = 0.0; + fillFlowRate.fillFlowSampleCounter = 0; + requestNewOperationMode( DG_MODE_GENE ); } @@ -572,7 +604,12 @@ #endif } +static void calculateFillAverage( void ) +{ +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/