Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r715b8517f4f25d4fa5444d1aae8d8d729ceba77c -receb190a5d66fdbee779478ac8bb50a846ed9241 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 715b8517f4f25d4fa5444d1aae8d8d729ceba77c) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision eceb190a5d66fdbee779478ac8bb50a846ed9241) @@ -7,8 +7,8 @@ * * @file ModeFill.c * -* @author (last) Dara Navaei -* @date (last) 11-Nov-2022 +* @author (last) Michael Garthwaite +* @date (last) 21-Nov-2022 * * @author (original) Leonardo Baloa * @date (original) 19-Nov-2019 @@ -79,8 +79,6 @@ #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_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. /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. @@ -116,7 +114,6 @@ static U32 flushBubblesStartTime; ///< Starting time for flush bubbles. static U32 concentratePumpPrimeCount; ///< Interval count for concentrate pump prime. -static F32 integratedVolumeML; ///< Total RO flow rate over period of time. static BOOL didFMPCheckStart; ///< Flag indicates whether FMP flow vs. LC volume check has begun. static F32 acidConductivityTotal; ///< Total of acid conductivity during fill. static F32 bicarbConductivityTotal; ///< Total of bicarb conductivity during fill. @@ -138,6 +135,7 @@ static OVERRIDE_F32_T usedBicarbVolumeML = { 0.0, 0.0, 0.0, 0.0 }; ///< The integrated bicarb concentration volume has been used in mL. static OVERRIDE_U32_T fillModeDataPublishInterval = { FILL_MODE_DATA_PUB_INTERVAL, FILL_MODE_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish fill mode data to CAN bus. +static OVERRIDE_F32_T integratedVolumeML = { 0.0, 0.0, 0.0, 0.0 }; ///< Total RO flow rate over period of time. // ********** private function prototypes ********** @@ -151,7 +149,6 @@ static DG_FILL_MODE_STATE_T handlePausedState( void ); static BOOL areInletWaterConditionsAlarmsActive( void ); -static void checkDialysateTemperatureSensors( void ); static void handleDialysateMixing( F32 measuredROFlowRate_mL_min, F32 acidMixingRatio, F32 bicarbMixingRatio ); static void setFillInfoToRTCRAM( void ); static BOOL isValueWithinPercentRange( F32 testValue, F32 baseValue, F32 percentFactor ); @@ -173,7 +170,7 @@ dialysateFillStartTime = 0; dataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; reservoirBaseWeight = 0.0F; - integratedVolumeML = 0.0F; + integratedVolumeML.data = 0.0F; didFMPCheckStart = FALSE; concentrateTestStartTime = 0; acidConductivityTotal = 0.0F; @@ -189,8 +186,6 @@ 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 ); } /*********************************************************************//** @@ -328,6 +323,20 @@ /*********************************************************************//** * @brief + * The getIntegratedVolumeML function returns the integrated volume in mL + * @details Inputs: integratedVolumeML + * @details Outputs: integrated volume + * @return integrated volume + *************************************************************************/ +F32 getIntegratedVolumeML( void ) +{ + + F32 integratedVolume = getF32OverrideValue(&integratedVolumeML); + return integratedVolume; +} + +/*********************************************************************//** + * @brief * The resetFillStatusParameters function resets the fill status parameters. * @details Inputs: none * @details Outputs: fillStatus @@ -491,8 +500,8 @@ if ( TRUE == didTimeout( concentratePrimingStartTime, PRIME_CONCENTRATE_LINES_TIME_OUT_MS ) ) { - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, NO_PARK_CONC_PUMPS ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, NO_PARK_CONC_PUMPS ); // Set the RO pump flow rate in according to the roPumpFlushBubblesSpeed table to flush bubbles pumpSpeedIndex = 0; @@ -585,7 +594,7 @@ if ( TRUE == isConductivityInRange ) { // Initialization - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, NO_PARK_CONC_PUMPS ); totalBicarbConductivity = 0.0F; totalAcidConductivity = 0.0F; bicarbConductivitySampleCount = 0; @@ -739,11 +748,12 @@ DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; DG_RESERVOIR_ID_T inactiveRsrvr = getInactiveReservoir(); F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); - F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); // TODO the systems team will let us know when we can use TD2 in DVT. Until then it is disabled - F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); //getTemperatureValue( (U32)TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); + F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); + F32 inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_CONDUCTIVITY_SENSOR_2 ); #ifndef _RELEASE_ - if ( HW_CONFIG_BETA == getHardwareConfigStatus() ) + if ( ( HW_CONFIG_BETA == getHardwareConfigStatus() ) || + ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_USING_TPO_FOR_PRIMARY_HEATER_CONTROL ) ) ) { inletTemperature = getTemperatureValue( (U32)TEMPSENSORS_OUTLET_PRIMARY_HEATER ); } @@ -767,7 +777,7 @@ reservoirBaseWeight = getReservoirWeight( getInactiveReservoir() ); } - integratedVolumeML += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER * FLOW_INTEGRATOR; + integratedVolumeML.data += getMeasuredROFlowRateWithConcPumpsLPM() * ML_PER_LITER * FLOW_INTEGRATOR; } usedAcidVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; @@ -792,7 +802,7 @@ if ( TRUE == hasTargetFillVolumeBeenReached( inactiveRsrvr ) ) { F32 filledVolumeML = getReservoirWeight( inactiveRsrvr ) - reservoirBaseWeight; - F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); + F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / getIntegratedVolumeML() ) ); F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; F32 acidNormalConductivity = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConductivityUSPerCM; @@ -804,7 +814,7 @@ { if ( integratedVolumeToLoadCellReadingPercent > FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE ) // SRSDG 240 { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_FLOW_METER_CHECK_FAILURE, filledVolumeML, integratedVolumeML ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_FLOW_METER_CHECK_FAILURE, filledVolumeML, getIntegratedVolumeML() ); } } @@ -865,8 +875,8 @@ { setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); setROPumpTargetFlowRateLPM( TARGET_RO_FLOW_RATE_IN_PAUSE_L, TARGET_RO_PRESSURE_PSI ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, NO_PARK_CONC_PUMPS ); + requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, NO_PARK_CONC_PUMPS ); havePauseActuatorsBeenSet = TRUE; } @@ -911,30 +921,6 @@ /*********************************************************************//** * @brief - * The checkDialysateTemperatureSensors 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 checkDialysateTemperatureSensors( void ) -{ - F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); - F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); - BOOL isDriftOut = ( fabs( TDi - TRo ) >= DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ? TRUE : FALSE ); - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_TEMPERATURE_SENSORS_ALARM ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - checkPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut, fabs( TDi - TRo ), - DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ); - } -} - -/*********************************************************************//** - * @brief * The isValueWithinPercentRange function validates if the test value * is within the percentage range specified by the baseValue and * percentFactor. @@ -1007,8 +993,8 @@ * @brief * The publishFillModeData function publishes fill mode data * at the set interval. - * @details Inputs: fillModeDataPublicationTimerCounter - * @details Outputs: fillModeDataPublicationTimerCounter + * @details Inputs: fillModeDataPublicationTimerCounter, fillModeDataPublishInterval + * @details Outputs: fillModeData * @return none *************************************************************************/ static void publishFillModeData( void ) @@ -1025,7 +1011,7 @@ fillModeData.pctDiffInConductivity = pctDiffInConductivity; fillModeData.usedAcidVolumeML = getChemicalUsedVolumeML( ACID ); fillModeData.usedBicarbVolumeML = getChemicalUsedVolumeML( BICARB ); - fillModeData.integratedVolumeML = integratedVolumeML; + fillModeData.integratedVolumeML = getIntegratedVolumeML(); broadcastData( MSG_ID_DG_FILL_MODE_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&fillModeData, sizeof( DG_FILL_MODE_DATA_T ) ); @@ -1057,7 +1043,7 @@ usedAcidVolumeML.ovInitData = usedAcidVolumeML.data; usedAcidVolumeML.ovData = value; usedAcidVolumeML.override = OVERRIDE_KEY; - result = TRUE; + result = TRUE; } return result; @@ -1079,9 +1065,9 @@ { usedAcidVolumeML.data = usedAcidVolumeML.ovInitData; usedAcidVolumeML.override = OVERRIDE_RESET; - usedAcidVolumeML.ovInitData = 0.0; - usedAcidVolumeML.ovData = 0.0; - result = TRUE; + usedAcidVolumeML.ovInitData = 0.0F; + usedAcidVolumeML.ovData = 0.0F; + result = TRUE; } return result; @@ -1105,7 +1091,7 @@ usedBicarbVolumeML.ovInitData = usedBicarbVolumeML.data; usedBicarbVolumeML.ovData = value; usedBicarbVolumeML.override = OVERRIDE_KEY; - result = TRUE; + result = TRUE; } return result; @@ -1127,9 +1113,9 @@ { usedBicarbVolumeML.data = usedBicarbVolumeML.ovInitData; usedBicarbVolumeML.override = OVERRIDE_RESET; - usedBicarbVolumeML.ovInitData = 0.0; - usedBicarbVolumeML.ovData = 0.0; - result = TRUE; + usedBicarbVolumeML.ovInitData = 0.0F; + usedBicarbVolumeML.ovData = 0.0F; + result = TRUE; } return result; @@ -1150,10 +1136,10 @@ if ( TRUE == isTestingActivated() ) { - U32 intvl = value / TASK_GENERAL_INTERVAL; + U32 intvl = value / TASK_GENERAL_INTERVAL; fillModeDataPublishInterval.ovData = intvl; fillModeDataPublishInterval.override = OVERRIDE_KEY; - result = TRUE; + result = TRUE; } return result; @@ -1175,10 +1161,55 @@ { fillModeDataPublishInterval.override = OVERRIDE_RESET; fillModeDataPublishInterval.ovData = fillModeDataPublishInterval.ovInitData; + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetIntegratedVolumeOverride function overrides the + * integrated volume. + * @details Inputs: value + * @details Outputs: integratedVolumeML + * @param: value integrated volume in mL + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetIntegratedVolumeOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + integratedVolumeML.ovData = value; + integratedVolumeML.override = OVERRIDE_KEY; result = TRUE; } return result; } +/*********************************************************************//** + * @brief + * The testResetIntegratedVolumeOverride function resets the + * override of integrated volume. + * @details Inputs: none + * @details Outputs: integratedVolumeML + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetIntegratedVolumeOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + integratedVolumeML.override = OVERRIDE_RESET; + integratedVolumeML.ovData = integratedVolumeML.ovInitData; + result = TRUE; + } + + return result; +} + /**@}*/