Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -65,9 +65,10 @@ /*************************DVT Definitions********************************************/ #define CONCENTRATE_PUMP_CONTROL_EIGHTH_STEP 0x07 ///< Concentrate pump control 1/8th step. -#define CONCENTRATE_PUMP_CONTROL_REVERSE_DIR 0x00 //0x08 ///< Concentrate pump control reverse direction. -#define CONCENTRATE_PUMP_CONTROL_FORWARD_DIR 0x08 //0x00 ///< Concentrate pump control forward direction. +#define CONCENTRATE_PUMP_CONTROL_REVERSE_DIR 0x00 ///< Concentrate pump control reverse direction. +#define CONCENTRATE_PUMP_CONTROL_FORWARD_DIR 0x08 ///< Concentrate pump control forward direction. #define CONCENTRATE_PUMP_CONTROL_ENABLE 0x00 ///< Concentrate pump control enable pump. +#define CONCENTRATE_PUMP_CONTROL_DISABLE 0x01 ///< Concentrate pump control disable pump. #define CONCENTRATE_PUMP_CONTROL_NOT_RESET 0x20 ///< Concentrate pump control not reset. #define CONCENTRATE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Concentrate pump control sleep off. @@ -432,32 +433,6 @@ /*********************************************************************//** * @brief - * The getAcidConcentrateCalRecord function returns the acid concentrate - * calibration record. - * @details Inputs: none - * @details Outputs: acidConcentrateCalRecord - * @return acid concentrate calibration record - *************************************************************************/ -DG_ACID_CONCENTRATES_RECORD_T getAcidConcentrateCalRecord( void ) -{ - return acidConcentrateCalRecord; -} - -/*********************************************************************//** - * @brief - * The getBicarbConcentrateCalRecord function returns the bicarb - * concentrate calibration record. - * @details Inputs: none - * @details Outputs: bicarbConcentrateCalRecord - * @return bicarb concentrate calibration record - *************************************************************************/ -DG_BICARB_CONCENTRATES_RECORD_T getBicarbConcentrateCalRecord( void ) -{ - return bicarbConcentrateCalRecord; -} - -/*********************************************************************//** - * @brief * The stopConcentratePump function sets the concentrate pump step speed * to zero and turns off concentrate pumps. * @details Inputs: none @@ -655,13 +630,13 @@ checkPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, isPulseWidthOut, pulseWidthInMicroSeconds, CONCENTRATE_PUMP_MIN_ALLOWED_HALL_SENSOR_COUNT ); - if ( FALSE == isPulseWidthOut ) + if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; + concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; } - else if ( CONCENTRATE_PUMP_ZERO_FLOW_RATE == pulseWidthCount ) + else if ( FALSE == isPulseWidthOut ) { - concentratePumps[ pumpId ].measuredPumpSpeed.data = 0.0; + concentratePumps[ pumpId ].measuredPumpSpeed.data = ( US_PER_SECOND / pulseWidthInMicroSeconds ) * CONCENTRATE_PUMP_VOLUME_PER_PULSE * SEC_PER_MIN; } } Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -69,9 +69,6 @@ F32 getConcentratePumpTargetFlowMLPM( CONCENTRATE_PUMPS_T pumpId ); F32 getMeasuredPumpSpeed( CONCENTRATE_PUMPS_T pumpId ); -DG_ACID_CONCENTRATES_RECORD_T getAcidConcentrateCalRecord( void ); -DG_BICARB_CONCENTRATES_RECORD_T getBicarbConcentrateCalRecord( void ); - BOOL testSetConcentratePumpDataPublishIntervalOverride( U32 value ); BOOL testResetConcentratePumpDataPublishIntervalOverride( void ); BOOL testSetConcentratePumpTargetSpeedOverride( U32 pumpId, F32 value ); Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -264,7 +264,7 @@ SELF_TEST_STATUS_T execConductivitySensorsSelfTest( void ) { BOOL calStatus = getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), - NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); + NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); SELF_TEST_STATUS_T result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); return result; Index: firmware/App/Controllers/ConductivitySensors.h =================================================================== diff -u -ra89d6b091874136d75a9bfbdbbc1ff00f42467b3 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision a89d6b091874136d75a9bfbdbbc1ff00f42467b3) +++ firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -46,9 +46,6 @@ // ********** public definitions ********** -#define ACID_NORMAL_CONDUCTIVITY 11645.05 ///< Acid normal operation theoretical conductivity. -#define BICARB_NORMAL_CONDUCTIVITY 13734.88 ///< Bicarb normal operation theoretical conductivity. - /// Enumeration of conductivity sensors. typedef enum ConductivitySensors { Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -229,7 +229,7 @@ if( heater < NUM_OF_DG_HEATERS ) { - if ( TRUE == heatersStatus[ heater ].hasTargetTempChanged ) + if ( HEATER_EXEC_STATE_OFF == heatersStatus[ heater ].state ) { status = TRUE; heatersStatus[ heater ].startHeaterSignal = TRUE; Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -625,17 +625,17 @@ switch( sensorIndex ) { - case TEMPSENSORS_LOAD_CELL_A1_B1: // 267 - case TEMPSENSORS_LOAD_CELL_A2_B2: // 279 - case TEMPSENSORS_CONDUCTIVITY_SENSOR_1: // 283 - case TEMPSENSORS_CONDUCTIVITY_SENSOR_2: // 287 - case TEMPSENSORS_OUTLET_PRIMARY_HEATER: // 291 - case TEMPSENSORS_INLET_PRIMARY_HEATER: // 295 - case TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR: // 299 - case TEMPSENSORS_OUTLET_REDUNDANT: // 303 - case TEMPSENSORS_INTERNAL_TRO_RTD: // 307 - case TEMPSENSORS_INLET_DIALYSATE: // 311 - case TEMPSENSORS_INTERNAL_TDI_RTD: // 315 + case TEMPSENSORS_LOAD_CELL_A1_B1: + case TEMPSENSORS_LOAD_CELL_A2_B2: + case TEMPSENSORS_CONDUCTIVITY_SENSOR_1: + case TEMPSENSORS_CONDUCTIVITY_SENSOR_2: + case TEMPSENSORS_OUTLET_PRIMARY_HEATER: + case TEMPSENSORS_INLET_PRIMARY_HEATER: + case TEMPSENSORS_INTERNAL_COND_TEMP_SENSOR: + case TEMPSENSORS_OUTLET_REDUNDANT: + case TEMPSENSORS_INTERNAL_TRO_RTD: + case TEMPSENSORS_INLET_DIALYSATE: + case TEMPSENSORS_INTERNAL_TDI_RTD: case TEMPSENSORS_HEAT_DISINFECT: case TEMPSENSORS_INTERNAL_THD_RTD: { Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -55,9 +55,6 @@ #define RINSE_CONCENTRATE_LINES_WAIT ( 25 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Time period to wait for concentrate lines to rinse. #define RINSE_SPEED ( ( CONCENTRATE_PUMP_MAX_SPEED - 3.0F ) * -1.0F ) ///< Reserver the concentrate speed to rinse out concentrate lines. - -#define ACID_CONCENTRATION_BOTTLE_VOLUME_ML 3430.0F ///< Bottle volume of acid concentration in mL. -#define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3780.0F ///< Bottle volume of bicarb concentration in mL. #define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0F ///< Concentration bottle low volume in mL. // ********** private data ********** @@ -238,8 +235,19 @@ // if we have reached our target drain to volume (by weight) or cannot drain anymore, we are done draining - go back to generation idle mode if ( TRUE == hasTargetDrainVolumeBeenReached( inactiveReservoir, DRAIN_WEIGHT_UNCHANGE_TIMEOUT ) ) { + DG_ACID_CONCENTRATES_RECORD_T acid; + F32 acidBottleVolML; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; + F32 bicarbBottleVolML; + + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); signalDrainPumpHardStop(); + acidBottleVolML = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidFullBottleVolumeML; + bicarbBottleVolML = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbStartVolumeML; + + if ( DG_RESERVOIR_1 == inactiveReservoir ) { setValveState( VRD1, VALVE_STATE_CLOSED ); @@ -254,14 +262,14 @@ #endif { // Detect empty bottles using integrated volumes - if ( ( ACID_CONCENTRATION_BOTTLE_VOLUME_ML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 437 + if ( ( acidBottleVolML - getChemicalUsedVolumeML( ACID ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 437 { resetChemicalUsedVolumeML( ACID ); setThisFisrtFillFlag( TRUE ); // indicates bottles need prime activateAlarmNoData( ALARM_ID_DG_ACID_BOTTLE_LOW_VOLUME ); } - if ( ( BICARB_CONCENTRATION_BOTTLE_VOLUME_ML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 438 + if ( ( bicarbBottleVolML - getChemicalUsedVolumeML( BICARB ) ) <= CONCENTRATION_BOTTLE_LOW_VOLUME_ML ) // || // SRSDG 438 { resetChemicalUsedVolumeML( BICARB ); setThisFisrtFillFlag( TRUE ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -129,7 +129,6 @@ static U32 pumpSpeedIndex; ///< Index used to access the desired pump speed in roPumpFlushBubblesSpeed table. static BOOL havePauseActuatorsBeenSet; ///< Flag to indicate the actuators have been set to pause for the first time. - static OVERRIDE_F32_T usedAcidVolumeML = { 0.0, 0.0, 0.0, 0.0 }; ///< The integrated acid concentration volume has been used in mL. 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, @@ -148,7 +147,7 @@ static BOOL areInletWaterConditionsAlarmsActive( void ); static void checkDialysateTemperatureSensors( void ); -static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ); +static void handleDialysateMixing( F32 measuredROFlowRate_mL_min, F32 acidMixingRatio, F32 bicarbMixingRatio ); static void setFillInfoToRTCRAM( void ); static BOOL isValueWithinPercentRange( F32 testValue, F32 baseValue, F32 percentFactor ); static void publishFillModeData( void ); @@ -200,6 +199,7 @@ DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); initFillMode(); + reservoirBaseWeight = getReservoirWeight( inactiveReservoir ); // Set initial actuator states @@ -215,7 +215,6 @@ setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); setHeaterTargetTemperature( DG_PRIMARY_HEATER, getPrimaryHeaterTargetTemperature() ); startHeater( DG_PRIMARY_HEATER ); - setCPLDCleanLEDColor( CPLD_CLEAN_LED_OFF ); return fillState; @@ -460,8 +459,19 @@ } else { + DG_ACID_CONCENTRATES_RECORD_T acid; + F32 acidMix; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; + F32 bicarbMix; + + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); + + acidMix = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; + setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER ); + handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); result = DG_FILL_MODE_STATE_PRODUCE_DIALYSATE; @@ -648,9 +658,19 @@ if ( TRUE == haveTestsPassed ) { - setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); + DG_ACID_CONCENTRATES_RECORD_T acid; + F32 acidMix; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; + F32 bicarbMix; - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER ); + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); + + acidMix = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; + + setROPumpTargetFlowRateLPM( getTargetFillFlowRateLPM(), TARGET_RO_PRESSURE_PSI ); + handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); // Do the necessary setup here before transition to Produce Dialysate State @@ -678,9 +698,19 @@ static DG_FILL_MODE_STATE_T handleProduceDialysateState( void ) { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_PRODUCE_DIALYSATE; + DG_ACID_CONCENTRATES_RECORD_T acid; + F32 acidMix; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; + F32 bicarbMix; + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); + + acidMix = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + bicarbMix = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio; + // Prime mixing before deliver result to reservoir - handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER ); + handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { @@ -704,13 +734,23 @@ *************************************************************************/ static DG_FILL_MODE_STATE_T handleDeliverDialysateState( void ) { + DG_ACID_CONCENTRATES_RECORD_T acid; + F32 acidMix; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; + F32 bicarbMix; DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; DG_RESERVOIR_ID_T inactiveReservoir = getInactiveReservoir(); F32 acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); F32 bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); + + acidMix = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio; + 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 ); + handleDialysateMixing( getMeasuredROFlowRateLPM() * ML_PER_LITER, acidMix, bicarbMix ); integratedVolumeML += getMeasuredROFlowRateWithConcPumpsLPM() * ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN ) ); usedAcidVolumeML.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; @@ -739,6 +779,8 @@ F32 integratedVolumeToLoadCellReadingPercent = fabs( 1.0F - ( filledVolumeML / integratedVolumeML ) ); F32 avgAcidConductivity = acidConductivityTotal / conductivitySampleCount; F32 avgBicarbConductivity = bicarbConductivityTotal / conductivitySampleCount; + F32 acidNormalConductivity = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConductivityUSPerCM; + F32 bicarbNormalConductivity = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConductivityUSPerCM; #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_FLOW_VS_LOAD_CELL_CHECK_IN_FILL ) != SW_CONFIG_ENABLE_VALUE ) @@ -755,20 +797,20 @@ #endif { // SRSDG 400 - if ( FALSE == isValueWithinPercentRange( avgBicarbConductivity, BICARB_NORMAL_CONDUCTIVITY, FIVE_PERCENT_FACTOR ) ) + if ( FALSE == isValueWithinPercentRange( avgBicarbConductivity, bicarbNormalConductivity, FIVE_PERCENT_FACTOR ) ) { setBadAvgConductivityDetectedFlag( TRUE ); // signal idle bad avg conductivity detected setThisFisrtFillFlag( TRUE ); - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_FILL_CONDUCTIVITY_OUT_OF_RANGE, avgBicarbConductivity, BICARB_NORMAL_CONDUCTIVITY ); // trigger replace bottles alarm #1 + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_FILL_CONDUCTIVITY_OUT_OF_RANGE, avgBicarbConductivity, bicarbNormalConductivity ); // trigger replace bottles alarm #1 clearAlarm( ALARM_ID_CREATING_DIALYSATE_PLEASE_WAIT ); // clear this alarm before triggering in case previous fill was bad and still active from before activateAlarmNoData ( ALARM_ID_CREATING_DIALYSATE_PLEASE_WAIT ); } - if ( FALSE == isValueWithinPercentRange( avgAcidConductivity, ACID_NORMAL_CONDUCTIVITY, FIVE_PERCENT_FACTOR ) ) + if ( FALSE == isValueWithinPercentRange( avgAcidConductivity, acidNormalConductivity, FIVE_PERCENT_FACTOR ) ) { setBadAvgConductivityDetectedFlag( TRUE ); // signal idle bad avg conductivity detected setThisFisrtFillFlag( TRUE ); - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_FILL_CONDUCTIVITY_OUT_OF_RANGE, avgAcidConductivity, ACID_NORMAL_CONDUCTIVITY ); // trigger replace bottles alarm #1 then + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_FILL_CONDUCTIVITY_OUT_OF_RANGE, avgAcidConductivity, acidNormalConductivity ); // trigger replace bottles alarm #1 then clearAlarm( ALARM_ID_CREATING_DIALYSATE_PLEASE_WAIT ); // clear this alarm before triggering in case previous fill was bad and still active from before activateAlarmNoData ( ALARM_ID_CREATING_DIALYSATE_PLEASE_WAIT ); } @@ -910,17 +952,14 @@ * @details Inputs: none * @details Outputs: Set concentrate pump speed relative to RO pump flow rate * @param measuredROFlowRate_mL_min measured RO flow rate in mL/min + * * @return none *************************************************************************/ -static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ) +static void handleDialysateMixing( F32 measuredROFlowRate_mL_min, F32 acidMixingRatio, F32 bicarbMixingRatio ) { - // TODO what should we do with start volume from the structure? - DG_ACID_CONCENTRATES_RECORD_T acid = getAcidConcentrateCalRecord(); - DG_BICARB_CONCENTRATES_RECORD_T bicarb = getBicarbConcentrateCalRecord(); - // Set concentrate pumps speed based off RO pump flow rate - F32 acidCP1PumpFlowRate = acid.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidConcMixRatio * measuredROFlowRate_mL_min; - F32 bicarbCP2PumpFlowRate = bicarb.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbConcMixRatio * measuredROFlowRate_mL_min; + F32 acidCP1PumpFlowRate = acidMixingRatio * measuredROFlowRate_mL_min; + F32 bicarbCP2PumpFlowRate = bicarbMixingRatio * measuredROFlowRate_mL_min; // Cap to the maximum allowed concentrate pumps rate acidCP1PumpFlowRate = MIN( acidCP1PumpFlowRate, CONCENTRATE_PUMP_MAX_SPEED ); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -292,36 +292,6 @@ /*********************************************************************//** * @brief - * The checkPersistentAlarm function triggers/clears an alarm if an alarm condition - * has persisted/cleared over given time limit. - * @details Inputs: none - * @details Outputs: checks whether an alarm is triggered or an alarm condition is cleared - * @param alarmID ID of alarm to check - * @param isErrorOccured Flag indicates alarm condition is active or not - * @param data alarm data - * @param limit alarm condition limit - * @return TRUE if given alarm is active, FALSE if not - *************************************************************************/ -BOOL checkPersistentAlarm( ALARM_ID_T alarm, BOOL const isErrorOccured, F32 const data, F32 const limit ) -{ - BOOL status = FALSE; - - if ( TRUE == isPersistentAlarmTriggered( alarm, isErrorOccured ) ) - { - SET_ALARM_WITH_2_F32_DATA( alarm, data, limit ); - } - - if ( TRUE == isPersistentAlarmConditionCleared( alarm, isErrorOccured ) ) - { - clearAlarmCondition( alarm ); - status = TRUE; - } - - return status; -} - -/*********************************************************************//** - * @brief * The handleResendActiveAlarmsRequest function processes the request to re-send * all active alarms. * @details Inputs: alarmIsActive[] Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r0f6b35ef8da4d30793a181750d0a6d5898118120 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 0f6b35ef8da4d30793a181750d0a6d5898118120) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -100,7 +100,6 @@ void clearAlarmCondition( ALARM_ID_T alarm ); BOOL isAlarmActive( ALARM_ID_T alarm ); -BOOL checkPersistentAlarm( ALARM_ID_T alarm, BOOL const isErrorOccured, F32 const data, F32 const limit ); void handleResendActiveAlarmsRequest( void ); BOOL testSetAlarmStateOverride( U32 alarmID, BOOL value ); Index: firmware/App/Services/FPGA.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -2174,6 +2174,14 @@ return fpgaSensorReadings.fpgaBaroPROMCoeff6; } +/*********************************************************************//** + * @brief + * The getFPGABaroCoeffsCRC function gets the FPGA barometric pressure + * sensor temperature coefficients' CRC. + * @details Inputs: fpgaSensorReadings + * @details Outputs: none + * @return barometric pressure sensor temperature coefficients' CRC + *************************************************************************/ U16 getFPGABaroCoeffsCRC( void ) { return fpgaSensorReadings.fpgaBaroPROMCRC; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -51,7 +51,7 @@ #define MAX_REDUNDANT_LOAD_CELL_DIFF 50.0F ///< Maximum difference in redundant load cells when determining if fill completed. #define MAX_DRAIN_RPM_MLP 2400.0F ///< Maximum drain RPM in mL/min. #define DATA_PUBLISH_COUNTER_START_COUNT 5 ///< Data publish counter start count. -#define ENVIRONMENT_TEMPERATURE_C 23.5F ///< Device's environment temperature in C. // TODO add this to the cal records +#define NUM_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. // ********** private data ********** @@ -98,6 +98,8 @@ static BOOL tareLoadCellRequest; ///< Flag indicates if load cell tare has been requested by HD. static DG_RESERVOIR_VOLUME_RECORD_T reservoirsCalRecord; ///< DG reservoirs non-volatile record. static DG_HEATING_CAL_RECORD_T heatingConstsCalRecord; ///< DG heating calibration record. +static DG_ACID_CONCENTRATES_RECORD_T acidConcentrateCalRecord; ///< Acid concentrate calibration record. +static DG_BICARB_CONCENTRATES_RECORD_T bicarbConcentrateCalRecord; ///< Bicarb concentrate calibration record. static F32 targetFillFlowRateLPM; ///< Target fill flow rate in L/min. static BOOL isThisTheFirstCycle; ///< Boolean flag to indicate whether this is the first cycle. static RESERVOIRS_PREVIOUS_STATUS reservoirPreviousStatus[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoirs previous status. @@ -147,7 +149,8 @@ // publish active reservoir, fill/drain volume targets at 1 Hz. if ( ++dataPublishCounter >= RESERVOIR_DATA_PUB_INTERVAL ) { - RESERVOIR_DATA_T data; + RESERVOIR_DATA_T data; + data.activeReservoir = getU32OverrideValue( &activeReservoir ); data.fillToVolumeMl = getU32OverrideValue( &fillVolumeTargetMl ); data.drainToVolumeMl = getU32OverrideValue( &drainVolumeTargetMl ); @@ -180,10 +183,15 @@ calStatus |= getNVRecord2Driver( GET_CAL_RSRVRS_VOL_RECORD, (U08*)&reservoirsCalRecord, sizeof( reservoirsCalRecord ), NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_RESERVOIRS_INVALID_CAL_RECORD ); - calStatus |= getNVRecord2Driver( GET_CAL_HEATING_RECORD, (U08*)&heatingConstsCalRecord, sizeof( heatingConstsCalRecord ), NUM_OF_CAL_DATA_RSRVRS, ALARM_ID_DG_HEATING_INVALID_CAL_RECORD ); + // Get the calibration values of acid and bicarb + calStatus |= getNVRecord2Driver( GET_CAL_ACID_CONCENTREATES, (U08*)&acidConcentrateCalRecord, sizeof( acidConcentrateCalRecord ), + NUM_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DG_ACID_CONCENTRATE_INVALID_CAL_RECORD ); + calStatus |= getNVRecord2Driver( GET_CAL_BICARB_CONCENTRATES, (U08*)&bicarbConcentrateCalRecord, sizeof( bicarbConcentrateCalRecord ), + NUM_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DG_BICARB_CONCENTRATE_INVALID_CAL_RECORD ); + if ( TRUE == calStatus ) { result = SELF_TEST_STATUS_PASSED; @@ -564,45 +572,6 @@ /*********************************************************************//** * @brief - * The getReservoirActualTemperature function calculates the reservoir's - * actual temperature. - * @details Inputs: none - * @details Outputs: heatersTempCalc - * @return reservoir actual temperature - *************************************************************************/ -F32 getReservoirActualTemperature( void ) -{ - F32 UFTimeConstant = 0.0; - F32 targetFillVolML = getTargetFillVolumeML(); - F32 tempLastFill = getLastFillTemperature(); - F32 tempAvgFill = getAvgFillTemperature(); - F32 UFTauCPerMS = heatingConstsCalRecord.ultrafilterTempTauCPerMin / ( SEC_PER_MIN * MS_PER_SECOND ); - F32 RsrvrTauCPerMS = heatingConstsCalRecord.reservoirTempTauCPerMin / ( SEC_PER_MIN * MS_PER_SECOND ); - - // Only do the calculations if the fill volume is not 0.0 so the final value will not be a nan. - if ( targetFillVolML > NEARLY_ZERO ) - { - heatersTempCalc.timeUFDecayMS = (F32)heatersTempCalc.timeReservoirCycleMS - heatersTempCalc.timeReservoirFillMS; - UFTimeConstant = heatersTempCalc.timeUFDecayMS * UFTauCPerMS; - heatersTempCalc.tempUFFill = tempLastFill + UFTimeConstant; - - F32 ultrafilterPart = ( heatingConstsCalRecord.ultrafilterVolmL / targetFillVolML ) * heatersTempCalc.tempUFFill; - F32 fillPart = ( ( targetFillVolML - heatingConstsCalRecord.ultrafilterVolmL ) / targetFillVolML ) * tempAvgFill; - F32 tempReservoir0Actual = ultrafilterPart + fillPart; - - F32 tempReservoirEndfillActual = tempReservoir0Actual + ( ( heatersTempCalc.timeReservoirFillMS * HALF ) * RsrvrTauCPerMS ); - heatersTempCalc.tempReservoirUseActual = tempReservoirEndfillActual + ( heatersTempCalc.timeReservoirFill2SwitchMS * RsrvrTauCPerMS ); - } - else - { - heatersTempCalc.tempReservoirUseActual = 0.0; - } - - return heatersTempCalc.tempReservoirUseActual; -} - -/*********************************************************************//** - * @brief * The getPrimaryHeaterTargetTemperature function calculates the primary * heater target temperature and returns target temperature value. * @details Inputs: heatingConstsCalRecord @@ -649,8 +618,11 @@ if ( targetROFlowLPM > 0 ) { - priTargetTemp = ( tempTarget * ( tgtTotalFlowLPM / targetROFlowLPM ) ) - ( ENVIRONMENT_TEMPERATURE_C * ( tgtAicdFlowLPM / targetROFlowLPM ) ) - - ( ENVIRONMENT_TEMPERATURE_C * ( tgtBicarbFlowLPM / targetROFlowLPM ) ); + F32 acidTemperature = acidConcentrateCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidBottleTemperature; + F32 bicarbTemperature = bicarbConcentrateCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbBottleTemperature; + + priTargetTemp = ( tempTarget * ( tgtTotalFlowLPM / targetROFlowLPM ) ) - ( acidTemperature * ( tgtAicdFlowLPM / targetROFlowLPM ) ) - + ( bicarbTemperature * ( tgtBicarbFlowLPM / targetROFlowLPM ) ); } return priTargetTemp; @@ -680,10 +652,13 @@ if ( tgtTotalFlowLPM > 0 ) { - heatersTempCalc.tempFillMixAvgTrimmer = ( fillROAvgActual * ( tgtTotalFlowLPM / targetROFlowLPM ) ) + - ( ENVIRONMENT_TEMPERATURE_C * ( tgtAicdFlowLPM / targetROFlowLPM ) ) + - ( ENVIRONMENT_TEMPERATURE_C * ( tgtBicarbFlowLPM / targetROFlowLPM ) ); + F32 acidTemperature = acidConcentrateCalRecord.acidConcentrate[ CAL_DATA_ACID_CONCENTRATE_1 ].acidBottleTemperature; + F32 bicarbTemperature = bicarbConcentrateCalRecord.bicarbConcentrate[ CAL_DATA_BICARB_CONCENTRATE_1 ].bicarbBottleTemperature; + heatersTempCalc.tempFillMixAvgTrimmer = ( fillROAvgActual * ( tgtTotalFlowLPM / targetROFlowLPM ) ) + + ( acidTemperature * ( tgtAicdFlowLPM / targetROFlowLPM ) ) + + ( bicarbTemperature * ( tgtBicarbFlowLPM / targetROFlowLPM ) ); + heatersTempCalc.tempRsrvr0ActualTrimmer = ( ( heatingConstsCalRecord.ultrafilterVolmL / targetFillVolML ) * tempUFFill ) + ( ( ( targetFillVolML - heatingConstsCalRecord.ultrafilterVolmL ) / targetFillVolML ) * heatersTempCalc.tempFillMixAvgTrimmer ); @@ -711,6 +686,34 @@ /*********************************************************************//** * @brief + * The getAcidConcentrateCalRecord function fills the provided buffer with + * the acid concentrate record. + * @details Inputs: acidConcentrateCalRecord + * @details Outputs: none + * @param acidRecord which is the pointer to the provided buffer + * @return none + *************************************************************************/ +void getAcidConcentrateCalRecord( DG_ACID_CONCENTRATES_RECORD_T* acidRecord ) +{ + memcpy( acidRecord, &acidConcentrateCalRecord, sizeof( DG_ACID_CONCENTRATES_RECORD_T ) ); +} + +/*********************************************************************//** + * @brief + * The getBicarbConcentrateCalRecord function fills the provided buffer with + * the bicarb concentrate record. + * @details Inputs: bicarbConcentrateCalRecord + * @details Outputs: none + * @param bicarbRecord which is the pointer to the provided buffer + * @return none + *************************************************************************/ +void getBicarbConcentrateCalRecord( DG_BICARB_CONCENTRATES_RECORD_T* bicarbRecord ) +{ + memcpy( bicarbRecord, &bicarbConcentrateCalRecord, sizeof( DG_BICARB_CONCENTRATES_RECORD_T ) ); +} + +/*********************************************************************//** + * @brief * The hasTargetFillVolumeReached function checks if the target fill volume * for specific reservoir has been reached. * @details Inputs: fillVolumeTargetMl Index: firmware/App/Services/Reservoirs.h =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Services/Reservoirs.h (.../Reservoirs.h) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -110,13 +110,14 @@ void setDialysateHeatingParameters( DG_CMD_DIALYSATE_HEATING_PARAMS_T params ); U32 getTargetFillVolumeML( void ); F32 getTargetFillFlowRateLPM( void ); -F32 getReservoirActualTemperature( void ); // TODO remove F32 getPrimaryHeaterTargetTemperature( void ); F32 getReservoirCurrentTemperature( void ); F32 getTargetDialysateFlowLPM( void ); F32 getTrimmerHeaterTargetTemperature( void ); DG_RESERVOIR_VOLUME_RECORD_T getReservoirsCalRecord( void ); +void getAcidConcentrateCalRecord( DG_ACID_CONCENTRATES_RECORD_T* acidRecord ); +void getBicarbConcentrateCalRecord( DG_BICARB_CONCENTRATES_RECORD_T* bicarbRecord ); BOOL hasTargetFillVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId ); BOOL hasTargetDrainVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId, U32 timeout ); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -ra4669c80291e85fa5ce17d77ebcfd0c882831202 -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision a4669c80291e85fa5ce17d77ebcfd0c882831202) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -558,14 +558,15 @@ void handleDGSendConcentrateMixingRatios( MESSAGE_T *message ) { MESSAGE_T msg; - - DG_ACID_CONCENTRATES_RECORD_T acid = getAcidConcentrateCalRecord(); - DG_BICARB_CONCENTRATES_RECORD_T bicarb = getBicarbConcentrateCalRecord(); + DG_ACID_CONCENTRATES_RECORD_T acid; + DG_BICARB_CONCENTRATES_RECORD_T bicarb; // By the time these are requested, the prepare time is no longer needed since the concentrate lines are // primed before the actual treatment starts - U32 fillPrepTimeMS = 0; + U32 fillPrepTimeMS = 0; + U08 *payloadPtr = msg.payload; - U08 *payloadPtr = msg.payload; + getAcidConcentrateCalRecord( &acid ); + getBicarbConcentrateCalRecord( &bicarb ); // Create a message record blankMessage( &msg ); Index: firmware/source/sys_main.c =================================================================== diff -u -r1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d -r9826fc85bd1497ec617ae0e825f78b91972de2b3 --- firmware/source/sys_main.c (.../sys_main.c) (revision 1c2f96bf994157b11c0c32ddaf96fc91a9a1da1d) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 9826fc85bd1497ec617ae0e825f78b91972de2b3) @@ -92,6 +92,7 @@ #include "TemperatureSensors.h" #include "Thermistors.h" #include "Timers.h" +#include "Utilities.h" #include "UVReactors.h" #include "Valves.h" #include "Voltages.h" @@ -203,6 +204,7 @@ initFluidLeak(); initOperationModes(); initIntegrity(); + initSemaphores(); } /*************************************************************************