Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -ref4bc1eaa0f019b678b4d49011a5d23ebe558ad8 -r487057777532342a4034df8296310270c8827f14 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision ef4bc1eaa0f019b678b4d49011a5d23ebe558ad8) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 487057777532342a4034df8296310270c8827f14) @@ -31,7 +31,7 @@ // ********** public definitions ********** -#define CONCENTRATE_PUMP_MAX_SPEED 40.0 ///< Maximum speed for concentrate pump in mL/min +#define CONCENTRATE_PUMP_MAX_SPEED 48.0 ///< Maximum speed for concentrate pump in mL/min /// Enumeration of concentrate pumps. typedef enum ConcentratePumps Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -re0eeafdfe3efec528a5ba8bb0f2f7c0f682b32da -r487057777532342a4034df8296310270c8827f14 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision e0eeafdfe3efec528a5ba8bb0f2f7c0f682b32da) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 487057777532342a4034df8296310270c8827f14) @@ -44,7 +44,9 @@ #define COND_SENSOR_REPORT_PERIOD ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Broadcast conductivity values message every second. #define COND_SENSOR_CPI_MAX_VALUE 2200 ///< Maximum inlet water conductivity. -#define COND_SENSOR_CPI_MIN_VALUE 2000 ///< Minimum inlet water conductivity. +#define COND_SENSOR_CPI_WARNING_HIGH 2200 ///< Warning high value for inlet water conductivity. +#define COND_SENSOR_CPI_WARNING_LOW 2000 ///< Warning low value for inlet water conductivity. +#define COND_SENSOR_CPI_MIN_VALUE 100 ///< Minimum inlet water conductivity. #define MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< New reading every 800 ms, expect to get valid new reading in 1s. #define MAX_CONDUCTIVITY_SENSOR_FAILURES 5 ///< maximum number of conductivity sensor errors within window period before alarm. @@ -139,6 +141,7 @@ setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); + initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); initPersistentAlarm( ALARM_ID_RO_REJECTION_RATIO_OUT_OF_RANGE, RO_REJECTION_RATIO_PERSISTENCE_PERIOD, RO_REJECTION_RATIO_PERSISTENCE_PERIOD ); @@ -225,17 +228,24 @@ F32 const conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); - BOOL const isConductTooLow = ( conductivity < COND_SENSOR_CPI_MIN_VALUE ); - BOOL const isConductInWarningRange = ( conductivity >= COND_SENSOR_CPI_MIN_VALUE ) && - ( conductivity <= COND_SENSOR_CPI_MAX_VALUE ) ? TRUE : FALSE; + BOOL const isConductTooLow = ( conductivity <= COND_SENSOR_CPI_MIN_VALUE ); + BOOL const isConductTooHigh = ( conductivity >= COND_SENSOR_CPI_MAX_VALUE ); + + BOOL const isConductInWarningRange = ( conductivity >= COND_SENSOR_CPI_WARNING_LOW ) && + ( conductivity < COND_SENSOR_CPI_WARNING_HIGH ) ? TRUE : FALSE; + if ( TRUE == isConductTooLow ) { checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, isConductTooLow, conductivity, COND_SENSOR_CPI_MIN_VALUE ); } + else if ( TRUE == isConductTooHigh ) + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, isConductTooHigh, conductivity, COND_SENSOR_CPI_MAX_VALUE ); + } else if ( TRUE == isConductInWarningRange ) { - checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE, COND_SENSOR_CPI_MIN_VALUE, conductivity, COND_SENSOR_CPI_MAX_VALUE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE, COND_SENSOR_CPI_WARNING_LOW, conductivity, COND_SENSOR_CPI_WARNING_HIGH ); } #endif Index: firmware/App/Controllers/ConductivitySensors.h =================================================================== diff -u -rca7bc09ad4fda0ad3578480b2ccf72d545937284 -r487057777532342a4034df8296310270c8827f14 --- firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision ca7bc09ad4fda0ad3578480b2ccf72d545937284) +++ firmware/App/Controllers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 487057777532342a4034df8296310270c8827f14) @@ -31,6 +31,7 @@ */ // ********** public definitions ********** + #define ACID_NORMAL_CONDUCTIVITY 11645.05 ///< Acid normal operation theoretical conductivity. #define BICARB_NORMAL_CONDUCTIVITY 13734.88 ///< Bicarb normal operation theoretical conductivity. Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -re0eeafdfe3efec528a5ba8bb0f2f7c0f682b32da -r487057777532342a4034df8296310270c8827f14 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision e0eeafdfe3efec528a5ba8bb0f2f7c0f682b32da) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 487057777532342a4034df8296310270c8827f14) @@ -55,12 +55,15 @@ #define SHIFT_BITS_BY_2_FOR_AVERAGING 2U ///< Shift the ADCs of the temperature sensors by 2 to average them. #define INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for temperature sensors out of range error period. -#define MAX_WATER_HIGH_INPUT_TEMPERATURE 39U ///< Maximum water input high temperature. -#define MIN_WATER_HIGH_INPUT_TEMPERATURE 37U ///< Minimum water input high temperature. +#define MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE 22U ///< Low range minimum water input temperature. +#define MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE 24U ///< Low range maximum water input temperature. -#define MAX_WATER_LOW_INPUT_TEMPERATURE 24U ///< Maximum water input low temperature. -#define MIN_WATER_LOW_INPUT_TEMPERATURE 22U ///< Minimum water input low temperature. +#define MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE 37U ///< High range minimum water input temperature. +#define MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE 39U ///< High range maximum water input temperature. +#define MIN_WATER_TEMPERATURE_ALARM 22U ///< Low water temperature alarm. +#define MAX_WATER_TEMPERATURE_ALARM 39U ///< High water temperature alarm. + #define HEATERS_INTERNAL_TEMPERTURE_CALCULATION_INTERVAL 20U ///< Time interval that is used to calculate the heaters internal temperature. #define HEATERS_INTERNAL_TC_ADC_TO_TEMP_CONVERSION_COEFF 0.25 ///< Heaters internal temperature sensors ADC to temperature conversion coefficient. #define HEATERS_COLD_JUNCTION_ADC_TO_TEMP_CONVERSION_COEFF 0.0625 ///< Heaters cold junction temperature sensors ADC to temperature conversion coefficient. @@ -271,9 +274,12 @@ initPersistentAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, - INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, + INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD, + INLET_WATER_TEMPERATURE_PERSISTENCE_PERIOD ); + // Persistent alarm for the temperature sensors range check initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS, TEMP_SENSORS_OUT_OF_RANGE_PERSISTENT_PEROID_MS ); @@ -357,27 +363,32 @@ #ifndef DISABLE_WATER_QUALITY_CHECK F32 const temperature = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER ); - BOOL isWaterTempInHighRange = ( temperature >= MIN_WATER_HIGH_INPUT_TEMPERATURE ) && - ( temperature <= MAX_WATER_HIGH_INPUT_TEMPERATURE ) ? TRUE : FALSE; + BOOL isWaterTempInHighRange = ( temperature >= MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE ) && + ( temperature <= MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ) ? TRUE : FALSE; - BOOL isWaterTempInLowRange = ( temperature >= MIN_WATER_LOW_INPUT_TEMPERATURE ) && - ( temperature <= MAX_WATER_LOW_INPUT_TEMPERATURE ) ? TRUE : FALSE; + BOOL isWaterTempInLowRange = ( temperature >= MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE ) && + ( temperature <= MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ) ? TRUE : FALSE; - BOOL isWaterTempOutOfRange = ( temperature < MIN_WATER_LOW_INPUT_TEMPERATURE ) && - ( temperature > MAX_WATER_HIGH_INPUT_TEMPERATURE ) ? TRUE : FALSE; + BOOL isWaterTempTooHigh = ( temperature > MAX_WATER_TEMPERATURE_ALARM ); + BOOL isWaterTempTooLow = ( temperature < MIN_WATER_TEMPERATURE_ALARM ); + if ( TRUE == isWaterTempInHighRange ) // warning alarm { - checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, isWaterTempInHighRange, temperature, MAX_WATER_HIGH_INPUT_TEMPERATURE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE, MIN_WATER_TEMPERATURE_WARNING_HIGH_RANGE, temperature, MAX_WATER_TEMPERATURE_WARNING_HIGH_RANGE ); } else if ( TRUE == isWaterTempInLowRange ) // warning alarm { - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, isWaterTempInLowRange, temperature, MIN_WATER_LOW_INPUT_TEMPERATURE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE, MIN_WATER_TEMPERATURE_WARNING_LOW_RANGE, temperature, MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ); } - else if ( TRUE == isWaterTempOutOfRange ) // alarm + else if ( TRUE == isWaterTempTooHigh ) // alarm { - checkPersistentAlarm( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE, isWaterTempOutOfRange, temperature, MAX_WATER_HIGH_INPUT_TEMPERATURE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE, isWaterTempTooHigh, temperature, MAX_WATER_TEMPERATURE_ALARM ); } + else if ( TRUE == isWaterTempTooLow ) // alarm + { + checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_TEMPERATURE, isWaterTempTooLow, temperature, MIN_WATER_TEMPERATURE_ALARM ); + } #endif } Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r81b059a5b624c2611eaabd918093cf9330c17969 -r487057777532342a4034df8296310270c8827f14 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 81b059a5b624c2611eaabd918093cf9330c17969) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 487057777532342a4034df8296310270c8827f14) @@ -49,6 +49,7 @@ #define RO_PUMP_800_ML_PER_MIN 0.8 ///< RO pump speed of 800.0 mL/minute. #define ACID_PUMP_20_ML_PER_MIN 20.0 ///< Acid pump speed of 20.0 mL/minute. #define BICARB_PUMP_40_ML_PER_MIN 40.0 ///< Bicarb pump speed of 40.0 mL/minute. +#define CONCENTRATE_PUMP_40_ML_PER_MIN 40.0 ///< Concentrate pump speed of 40.0 mL/minute. #define DIALYSATE_FILL_TIME_OUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when reservoir is not filled with correct dialysate. #define EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ( 1 * MS_PER_SECOND ) ///< Persistent period for empty bottle detect. @@ -68,7 +69,7 @@ #define CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN 5.0 ///< Concentrate pump additional speed during priming in mL/min. #define CONCENTRATE_TEST_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Concentrate test time out period in ms. #define WATER_QUALITY_TEST_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Inlet water quality test time out period in ms. -#define PRIME_CONCENTRATE_LINES_TIME_OUT_MS ( 2 * MS_PER_SECOND ) ///< Time required to prime the concentrate lines. +#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.0 ///< Dialysate temperature tolerance in degree C. #define DIALYSATE_TEMPERATURE_SENSORS_MAX_DRIFT_C 2.0 ///< Dialysate temperature sensors maximum allowed drift in C. @@ -124,11 +125,11 @@ 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 F32 roPumpSpeed[ RO_PUMP_LOOKUP_TABLE_SIZE ] = { RO_PUMP_400_ML_PER_MIN, ///< Lookup table to determine the desired RO speed in mL/min. - RO_PUMP_800_ML_PER_MIN, - RO_PUMP_400_ML_PER_MIN, - RO_PUMP_800_ML_PER_MIN }; -static U32 pumpSpeedIndex; ///< Index used to access the desired pump speed in roPumpSpeed table. +static F32 roPumpFlushBubblesSpeed[ RO_PUMP_LOOKUP_TABLE_SIZE ] = { RO_PUMP_400_ML_PER_MIN, ///< Lookup table to determine the desired RO speed in mL/min when flushing bubbles. + RO_PUMP_800_ML_PER_MIN, + RO_PUMP_400_ML_PER_MIN, + RO_PUMP_800_ML_PER_MIN }; +static U32 pumpSpeedIndex; ///< Index used to access the desired pump speed in roPumpFlushBubblesSpeed table. // ********** private function prototypes ********** @@ -245,6 +246,7 @@ switch ( fillState ) { case DG_FILL_MODE_STATE_START: + waterQualityTestStartTime = getMSTimerCount(); fillState = DG_FILL_MODE_STATE_TEST_INLET_WATER; break; @@ -406,9 +408,10 @@ } } #ifndef DISABLE_DIALYSATE_CHECK - else + if ( TRUE == didTimeout( waterQualityTestStartTime, WATER_QUALITY_TEST_TIME_OUT_MS ) ) { activateAlarmNoData( ALARM_ID_DG_BAD_INLET_WATER_QUALITY ); + requestNewOperationMode( DG_MODE_GENE ); } #endif @@ -419,8 +422,8 @@ * @brief * The handlePrimeConcentrateLines function primes the acid and bicarb * lines. - * @details Inputs: - * @details Outputs: + * @details Inputs: None + * @details Outputs: None * @return the next state *************************************************************************/ static DG_FILL_MODE_STATE_T handlePrimeConcentrateLines( void ) @@ -432,9 +435,9 @@ requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); - // Set the RO pump flow rate in according to the roPumpSpeed table to flush bubbles + // Set the RO pump flow rate in according to the roPumpFlushBubblesSpeed table to flush bubbles pumpSpeedIndex = 0; - setROPumpTargetFlowRateLPM( roPumpSpeed[ pumpSpeedIndex ], TARGET_RO_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( roPumpFlushBubblesSpeed[ pumpSpeedIndex ], TARGET_RO_PRESSURE_PSI ); flushBubblesStartTime = getMSTimerCount(); // State transition result = DG_FILL_MODE_STATE_FLUSH_BUBBLES; @@ -450,7 +453,7 @@ * then 800 mL/minute for 2 seconds 1 * then 400 mL/minute for 2 seconds 2 * then 800 mL/minute for 2 seconds 3 - * @details Inputs: + * @details Inputs: None * @details Outputs: request RO pump flow rate in mL/minute * @return the next state *************************************************************************/ @@ -462,7 +465,7 @@ { if ( ++pumpSpeedIndex < RO_PUMP_LOOKUP_TABLE_SIZE ) { - setROPumpTargetFlowRateLPM( roPumpSpeed[ pumpSpeedIndex ], TARGET_RO_PRESSURE_PSI ); + setROPumpTargetFlowRateLPM( roPumpFlushBubblesSpeed[ pumpSpeedIndex ], TARGET_RO_PRESSURE_PSI ); flushBubblesStartTime = getMSTimerCount(); } else @@ -504,7 +507,7 @@ { averageBicardConductivity = totalBicardConductivity / bicardConductivitySampleCount; - if( TRUE == isValueWithinPercentRange( averageBicardConductivity, BICARD_TEST_CD2_TCD, FIVE_PERCENT_FACTOR ) ) + if ( TRUE == isValueWithinPercentRange( averageBicardConductivity, BICARD_TEST_CD2_TCD, FIVE_PERCENT_FACTOR ) ) { // Initialization requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); @@ -566,6 +569,7 @@ ( TRUE == isValueWithinPercentRange(averageConductivity, ACID_TEST_CD2_TCD, FIVE_PERCENT_FACTOR) ) ) { // Do the necessary setup here before transition to Produce Dialysate State + fillStatus.isThisFirstFill = FALSE; requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); result = DG_FILL_MODE_STATE_PRODUCE_DIALYSATE; } @@ -593,7 +597,7 @@ F32 measuredROFlowRateMLPM = getMeasuredROFlowRateLPM() * ML_PER_LITER; #ifndef DISABLE_DIALYSATE_CHECK - if ( ( TRUE == isWaterQualityGood() ) && ( TRUE == checkDialysateTemperature() ) ) + if ( ( TRUE == isWaterQualityGood() ) && ( TRUE == checkDialysateTemperature() ) ) // SRSDG 216 #else if ( TRUE ) #endif @@ -607,15 +611,14 @@ if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) #endif { + fillStatus.isThisFirstFill = FALSE; setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; } } else { concentratePumpPrimeCount = 0; - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB ); } return result; @@ -774,7 +777,8 @@ BOOL isWaterTemperatureGood = ( ( FALSE == isAlarmActive( ALARM_ID_INLET_WATER_HIGH_TEMPERATURE ) && FALSE == isAlarmActive( ALARM_ID_INLET_WATER_LOW_TEMPERATURE ) && - FALSE == isAlarmActive( ALARM_ID_INLET_WATER_TEMPERATURE_OUT_OF_RANGE) ) ? FALSE : TRUE ); + FALSE == isAlarmActive( ALARM_ID_INLET_WATER_TEMPERATURE_IN_LOW_RANGE) && + FALSE == isAlarmActive( ALARM_ID_INLET_WATER_TEMPERATURE_IN_HIGH_RANGE) ) ? FALSE : TRUE ); BOOL isWaterConductivityGood = ( ( FALSE == isAlarmActive( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_WARNING_RANGE ) && FALSE == isAlarmActive( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY ) && @@ -827,8 +831,9 @@ * The isValueWithinPercentRange function validates if the test value * is within the percentage range specified by the baseValue and * percentFactor. - * @details Inputs: testValue + * @details Inputs: None * @details Outputs: None + * @param: testValue, baseValue, percentFactor * @return TRUE if testValue is within range. Otherwise, return FALSE *************************************************************************/ static BOOL isValueWithinPercentRange( F32 testValue, F32 baseValue, F32 percentFactor )