Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r6f62e99f0beb50422927a666ce79ef517dc19e7e -r674e18b10904e97f4b2624b826abc21f3220dd32 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 6f62e99f0beb50422927a666ce79ef517dc19e7e) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 674e18b10904e97f4b2624b826abc21f3220dd32) @@ -80,6 +80,8 @@ #define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3780.0 ///< Bottle volume of bicarb concentration in mL. #define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0 ///< Concentration bottle low volume in mL. +#define DATA_PUBLISH_COUNTER_START_COUNT 63 ///< Data publish counter start count. + /// 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 ) ); @@ -170,7 +172,7 @@ { fillState = DG_FILL_MODE_STATE_START; dialysateFillStartTime = 0; - dataPublishCounter = 0; + dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; reservoirBaseWeight = 0.0; totalROFlowRateMLPM = 0.0; concentrateTestStartTime = 0; @@ -707,14 +709,37 @@ fillStatus.fillFlowRateRunningSum += getMeasuredROFlowRateLPM(); fillStatus.fillTemperatureRunningSum += getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); +#ifndef DISABLE_MIXING + // Detect empty bottles using integrated volumes // TODO: empty bottles detection using conductivity sensors + if ( ( ( ACID_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedAcidVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 437 + { + usedAcidVolumeML.data = 0.0; + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + fillStatus.isThisFirstFill = TRUE; // empty bottles need replaced, set isThisFirstFill to FALSE so that prime, flush, acid & bicarb test are needed + fillStatus.fillEmptyAcidBottleDetected = TRUE; // set this variable to FALSE when user presses OK on the alarm to confirm bottle has been replaced and resume + } + + if ( ( ( BICARB_CONCENTRATION_BOTTLE_VOLUME_ML - getF32OverrideValue( &usedBicarbVolumeML ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) ) // || // SRSDG 438 + { + usedBicarbVolumeML.data = 0.0; + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + fillStatus.isThisFirstFill = TRUE; + fillStatus.fillEmptyBicarbBottleDetected = TRUE; + } +#endif + setBadAvgConductivityDetectedFlag( FALSE ); // If we've reached our target fill to volume (by weight), we're done filling - go back to generation idle mode // SRSDG 398 if ( TRUE == hasTargetFillVolumeBeenReached( inactiveReservoir ) ) { F32 filledVolumeML = getReservoirWeight( inactiveReservoir ) - reservoirBaseWeight; F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); - F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; + F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; #ifndef DISABLE_FLOW_CHECK_IN_FILL