Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r8fc97ad09c8cbdf76dc19929c4751df3feacb40d -r20535cdea80fac7a48eb84d47c9ec4a1968051c5 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 8fc97ad09c8cbdf76dc19929c4751df3feacb40d) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 20535cdea80fac7a48eb84d47c9ec4a1968051c5) @@ -8,7 +8,7 @@ * @file ModeFill.c * * @author (last) Dara Navaei -* @date (last) 04-Aug-2022 +* @date (last) 12-Aug-2022 * * @author (original) Leonardo Baloa * @date (original) 19-Nov-2019 @@ -19,6 +19,7 @@ #include "ConcentratePumps.h" #include "ConductivitySensors.h" +#include "FlowSensors.h" #include "FPGA.h" #include "CPLD.h" #include "Heaters.h" @@ -59,7 +60,7 @@ #define FILL_MODE_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the fill mode data is published on the CAN bus. #define DIALYSATE_FILL_TIME_OUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when reservoir is not filled with correct dialysate. -#define CONCENTRATE_PUMP_PRIME_INTERVAL ( 3 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Persistent time interval for concentrate pumps prime. +#define CONCENTRATE_PUMP_PRIME_INTERVAL ( 10 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Persistent time interval for concentrate pumps prime. #define FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE 0.1F ///< Flow integrated volume has 10% tolerance compare to load cell reading. @@ -75,7 +76,7 @@ #define PRIME_CONCENTRATE_LINES_TIME_OUT_MS ( 95 * MS_PER_SECOND ) ///< Time required to prime the concentrate lines. #define FLUSH_BUBBLES_PUMP_TIME_OUT_MS ( 2 * MS_PER_SECOND ) ///< RO pump on during flush bubble interval in ms. #define DIALYSATE_TEMPERATURE_TOLERANCE_C 2.0F ///< Dialysate temperature tolerance in degree C. -#define DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C 2.0F ///< Dialysate temperature sensors maximum allowed drift in C. +#define DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C 1.0F ///< Dialysate temperature sensors maximum allowed deviation in C. #define DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. #define DATA_PUBLISH_COUNTER_START_COUNT 63 ///< Data publish counter start count. @@ -167,21 +168,21 @@ fillState = DG_FILL_MODE_STATE_START; dialysateFillStartTime = 0; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; - reservoirBaseWeight = 0.0; - integratedVolumeML = 0.0; + reservoirBaseWeight = 0.0F; + integratedVolumeML = 0.0F; concentrateTestStartTime = 0; - acidConductivityTotal = 0.0; - bicarbConductivityTotal = 0.0; + acidConductivityTotal = 0.0F; + bicarbConductivityTotal = 0.0F; conductivitySampleCount = 0; concentratePumpPrimeCount = 0; pumpSpeedIndex = 0; - averageBicarbConductivity = 0.0; - averageAcidConductivity = 0.0; - pctDiffInConductivity = 0.0; + averageBicarbConductivity = 0.0F; + averageAcidConductivity = 0.0F; + pctDiffInConductivity = 0.0F; bicarbConductivitySampleCount = 0; acidConductivitySampleCount = 0; - totalBicarbConductivity = 0.0; - totalAcidConductivity = 0.0; + totalBicarbConductivity = 0.0F; + totalAcidConductivity = 0.0F; havePauseActuatorsBeenSet = FALSE; initPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, 0, DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ); @@ -196,12 +197,8 @@ *************************************************************************/ U32 transitionToFillMode( void ) { - DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); - initFillMode(); - reservoirBaseWeight = getReservoirWeight( inactiveReservoir ); - // Set initial actuator states setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); @@ -332,16 +329,10 @@ *************************************************************************/ void resetFillStatusParameters( void ) { - DG_HEATERS_RECORD_T heaterInfo; - - // 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 ), 0, 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.fillFlowRateAverageLPM = ( heaterInfo.averageFillFlow < NEARLY_ZERO ? 0.0 : heaterInfo.averageFillFlow ); - fillStatus.fillFlowRateRunningSum = 0.0; + fillStatus.fillFlowRateAverageLPM = getTargetROPumpFlowRateLPM(); + fillStatus.fillFlowRateRunningSum = 0.0F; fillStatus.fillSampleCounter = 0; - fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillTemperatureRunningSum = 0.0F; // At the beginning the last and average temperatures are considered as the trimmer heater target temperature which // is the dialysate temperature fillStatus.fillTemperatureAverage = getHeaterTargetTemperature( DG_TRIMMER_HEATER ); @@ -404,11 +395,11 @@ { if ( ACID == bottle ) { - usedAcidVolumeML.data = 0.0; + usedAcidVolumeML.data = 0.0F; } else if ( BICARB == bottle ) { - usedBicarbVolumeML.data = 0.0; + usedBicarbVolumeML.data = 0.0F; } else { @@ -471,7 +462,7 @@ bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); + handleDialysateMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, acidMix, bicarbMix ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); result = DG_FILL_MODE_STATE_PRODUCE_DIALYSATE; @@ -533,8 +524,8 @@ else { // Initialization - totalBicarbConductivity = 0.0; - averageBicarbConductivity = 0.0; + totalBicarbConductivity = 0.0F; + averageBicarbConductivity = 0.0F; bicarbConductivitySampleCount = 0; // Set pumps flow rate to prepare for bicarb conductivity testing @@ -589,8 +580,8 @@ { // Initialization requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); - totalBicarbConductivity = 0.0; - totalAcidConductivity = 0.0; + totalBicarbConductivity = 0.0F; + totalAcidConductivity = 0.0F; bicarbConductivitySampleCount = 0; acidConductivitySampleCount = 0; @@ -640,7 +631,7 @@ averageBicarbConductivity = totalBicarbConductivity / bicarbConductivitySampleCount; averageAcidConductivity = totalAcidConductivity / acidConductivitySampleCount; - pctDiffInConductivity = fabs( 2.0 * ( averageAcidConductivity - averageBicarbConductivity ) / + pctDiffInConductivity = fabs( 2.0F * ( averageAcidConductivity - averageBicarbConductivity ) / ( averageAcidConductivity + averageBicarbConductivity ) ); if ( ( TRUE == isValueWithinPercentRange( averageAcidConductivity, ACID_TEST_CD2_TCD, FIVE_PERCENT_FACTOR ) ) && @@ -670,7 +661,7 @@ bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); + handleDialysateMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, acidMix, bicarbMix ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // Do the necessary setup here before transition to Produce Dialysate State @@ -710,12 +701,13 @@ bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; // Prime mixing before deliver result to reservoir - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); + handleDialysateMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, acidMix, bicarbMix ); if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); + reservoirBaseWeight = getReservoirWeight( getInactiveReservoir() ); dialysateFillStartTime = getMSTimerCount(); fillStatus.isThisFirstFill = FALSE; result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; @@ -750,19 +742,18 @@ bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; // Set concentrate pumps speed based on the RO pump flow rate - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); + handleDialysateMixing( getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) * ML_PER_LITER, acidMix, bicarbMix ); - integratedVolumeML += getMeasuredROFlowRateWithConcPumpsLPM() * ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN ) ); + integratedVolumeML += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER * FLOW_INTEGRATOR; usedAcidVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; usedBicarbVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) * FLOW_INTEGRATOR; - acidConductivityTotal += acidConductivity; bicarbConductivityTotal += bicarbConductivity; conductivitySampleCount++; // DG is delivering dialysate keep collecting the sample counter and the measured flow fillStatus.fillSampleCounter += 1; - fillStatus.fillFlowRateRunningSum += getMeasuredROFlowRateLPM(); + fillStatus.fillFlowRateRunningSum += getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); fillStatus.fillTemperatureRunningSum += getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); // TODO: Check for open straw door status and alarm if closed @@ -821,16 +812,12 @@ // Get the last fill temperature before leaving to Generation Idle fillStatus.fillFlowRateAverageLPM = fillStatus.fillFlowRateRunningSum / (F32)fillStatus.fillSampleCounter; fillStatus.fillTemperatureAverage = fillStatus.fillTemperatureRunningSum / (F32)fillStatus.fillSampleCounter; - fillStatus.fillFlowRateRunningSum = 0.0; - fillStatus.fillTemperatureRunningSum = 0.0; + fillStatus.fillFlowRateRunningSum = 0.0F; + fillStatus.fillTemperatureRunningSum = 0.0F; fillStatus.fillSampleCounter = 0; fillStatus.fillLastTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); calculateHeaterEstimationGain( DG_PRIMARY_HEATER ); - - // Write the latest fill data into the RTC RAM for heaters control - // setFillInfoToRTCRAM(); // TODO we do not need to write to NV memory for now - requestNewOperationMode( DG_MODE_GENE ); } @@ -908,16 +895,17 @@ *************************************************************************/ static void checkDialysateTemperatureSensors( 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 ); + BOOL isDriftOut = ( fabs( TDi - TRo ) >= DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ? TRUE : FALSE ); - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut ) ) +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_TEMPERATURE_SENSORS_ALARM ) != SW_CONFIG_ENABLE_VALUE ) +#endif { - activateAlarmNoData( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE ); + checkPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut, fabs( TDi - TRo ), + DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ); } -#endif } /*********************************************************************//**