Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r2fea76e972a450a97c74b2a9f627095032a3b586 -rb1dc3df084a8517ca1575bdbf741fecd96d56a12 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 2fea76e972a450a97c74b2a9f627095032a3b586) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision b1dc3df084a8517ca1575bdbf741fecd96d56a12) @@ -35,33 +35,37 @@ #define COND_CPI_SENSOR_PROBE_TYPE 100 ///< 1 K cell constant conductivity probe. #define COND_CPO_SENSOR_PROBE_TYPE 10 ///< 0.1 K cell constant conductivity probe. + #define COND_SENSOR_DECIMAL_CONVERSION 100 ///< Conductivity value from FPGA has two decimal place. #define COND_SENSOR_TEMPERATURE_COEF 0.02 ///< Linear temperature coefficient of variation at 25 Celcius for fresh water. #define COND_SENSOR_REFERENCE_TEMPERATURE 25 ///< Reference temperature for conductivity sensor. #define COND_SENSOR_REPORT_PERIOD ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Broadcast conductivity values message every second. -#define COND_SENSOR_CPI_CPO_MAX_VALUE 2000 ///< Maximum inlet water conductivity. -#define COND_SENSOR_CPI_CPO_MIN_VALUE 100 ///< Minimum inlet water conductivity. -#define COND_SENSOR_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity sensor out of range error. +#define COND_SENSOR_CPI_MAX_VALUE 2000 ///< Maximum inlet water conductivity. +#define COND_SENSOR_CPI_MIN_VALUE 100 ///< Minimum inlet water conductivity. +#define MIN_ACID_CONCENTRATE_CONDUCTIVITY 11000 ///< Minimum conductivity for acid concentrate. +#define MAX_ACID_CONCENTRATE_CONDUCTIVITY 11850 ///< Maximum conductivity for acid concentrate. + +#define MIN_BICARB_CONCENTRATE_CONDUCTIVITY 2000 ///< Minimum conductivity for bicarbonate concentrate. +#define MAX_BICARB_CONCENTRATE_CONDUCTIVITY 3000 ///< Maximum conductivity for bicarbonate concentrate. + +///< Minimum conductivity value for dialysate solution. +#define MIN_DIALYSATE_CONDUCTIVITY ( MIN_ACID_CONCENTRATE_CONDUCTIVITY + MIN_BICARB_CONCENTRATE_CONDUCTIVITY ) +///< Maximum conductivity value for dialysate solution. +#define MAX_DIALYSATE_CONDUCTIVITY ( MAX_ACID_CONCENTRATE_CONDUCTIVITY + MAX_BICARB_CONCENTRATE_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. #define MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ( 60 * MS_PER_SECOND ) ///< Conductivity sensor error window. #define RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE 1.0 ///< Out of range value for RO rejection ratio when CPi conductivity is zero. #define MAX_RO_REJECTION_RATIO_ALLOW 0.1 ///< Maximum RO rejection ratio. #define MAX_CPO_CONDUCTIVITY_ALLOW 15.0 ///< Maximum CPo sensor conductivity value. + +#define COND_SENSOR_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for conductivity sensor out of range error. #define RO_REJECTION_RATIO_PERSISTENCE_PERIOD ( 10 * MS_PER_SECOND ) ///< Persistence period for RO rejection ratio. -#define CONCENTRATE_POST_ACID_MIN_CONDUCTIVITY 11.0 ///< Minimum conductivity after adding acid. -#define CONCENTRATE_POST_ACID_MAX_CONDUCTIVITY 12.0 ///< Maximum conductivity after adding acid. - -#define CONCENTRATE_POST_BICARB_MIN_CONDUCTIVITY 13.0 ///< Minimum conductivity after adding bicarbonate. -#define CONCENTRATE_POST_BICARB_MAX_CONDUCTIVITY 14.0 ///< Maximum conductivity after adding bicarbonate. - -#define POST_ACID_CONDUCTIVITY_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for post-acid concentrate conductivity out of range. -#define POST_BICARB_CONDUCTIVITY_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for post-bicarb concentrate conductivity out of range. - #define EMSTAT_PICO_MEASUREMENT_OFFSET 0x8000000 ///< Measurement offset for emstat pico measurement data. #define EMSTAT_PICO_GOOD_STATUS 0x10 ///< Measurement good status. #define EMSTAT_PICO_FIFO_EMPTY_MASK 0x8000 ///< Emstat Pico buffer empty indication bit. @@ -144,8 +148,6 @@ initPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, 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 ); - initPersistentAlarm( ALARM_ID_POST_ACID_CONDUCTIVITY_OUT_OF_RANGE, POST_ACID_CONDUCTIVITY_PERSISTENCE_PERIOD, POST_ACID_CONDUCTIVITY_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_POST_BICARB_CONDUCTIVITY_OUT_OF_RANGE, POST_ACID_CONDUCTIVITY_PERSISTENCE_PERIOD, POST_ACID_CONDUCTIVITY_PERSISTENCE_PERIOD ); } /*********************************************************************//** @@ -191,11 +193,11 @@ void checkInletWaterConductivity( void ) { F32 const conductivity = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); - BOOL const isCondTooHigh = ( conductivity > COND_SENSOR_CPI_CPO_MAX_VALUE ); - BOOL const isCondTooLow = ( conductivity < COND_SENSOR_CPI_CPO_MIN_VALUE ); + BOOL const isCondTooHigh = ( conductivity > COND_SENSOR_CPI_MAX_VALUE ); + BOOL const isCondTooLow = ( conductivity < COND_SENSOR_CPI_MIN_VALUE ); - checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, isCondTooHigh, conductivity, COND_SENSOR_CPI_CPO_MAX_VALUE ); - checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, isCondTooLow, conductivity, COND_SENSOR_CPI_CPO_MIN_VALUE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_HIGH_CONDUCTIVITY, isCondTooHigh, conductivity, COND_SENSOR_CPI_MAX_VALUE ); + checkPersistentAlarm( ALARM_ID_INLET_WATER_LOW_CONDUCTIVITY, isCondTooLow, conductivity, COND_SENSOR_CPI_MIN_VALUE ); } /*********************************************************************//** @@ -209,7 +211,7 @@ *************************************************************************/ void checkRORejectionRatio( void ) { -#ifndef DISABLE_DIALYSATE_CHECK +#ifndef DISABLE_RO_RATIO_CHECK F32 const cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); BOOL const isRORejectionRatioOutOfRange = ( roRejectionRatio > MAX_RO_REJECTION_RATIO_ALLOW ) || ( cpo >= MAX_CPO_CONDUCTIVITY_ALLOW ); @@ -219,28 +221,54 @@ /*********************************************************************//** * @brief - * The checkConcentrateConductivity function checks concentrate conductivity - * after adding acid and bicarbonate and triggers an alarm when conductivity - * is out of allowed range. - * @details Inputs: CD1 and CD2 sensor conductivity - * @details Outputs: Trigger alarms when conductivity is out of allowed range - * @return none + * The isAcidConductivityInRange function checks if acid conductivity value + * is in range. + * @details Inputs: CD1 sensor conductivity + * @details Outputs: none + * @return TRUE if acid conductivity is in range, otherwise FALSE *************************************************************************/ -void checkConcentrateConductivity( void ) +BOOL isAcidConductivityInRange( void ) { - F32 const postAcidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); - F32 const postBicarbonateConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - BOOL const isPostAcidConductivityOutOfRange = ( postAcidConductivity <= CONCENTRATE_POST_ACID_MIN_CONDUCTIVITY ) || ( postAcidConductivity >= CONCENTRATE_POST_ACID_MAX_CONDUCTIVITY ); - BOOL const isPostBicarbConductivityOutOfRange = ( postBicarbonateConductivity <= CONCENTRATE_POST_BICARB_MIN_CONDUCTIVITY ) || ( postBicarbonateConductivity >= CONCENTRATE_POST_BICARB_MAX_CONDUCTIVITY ); + F32 const acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); + BOOL const isConductivityInRange = ( MIN_ACID_CONCENTRATE_CONDUCTIVITY <= acidConductivity ) && ( acidConductivity <= MAX_ACID_CONCENTRATE_CONDUCTIVITY ); -#ifndef DISABLE_DIALYSATE_CHECK - checkPersistentAlarm( ALARM_ID_POST_ACID_CONDUCTIVITY_OUT_OF_RANGE, isPostAcidConductivityOutOfRange, postAcidConductivity, CONCENTRATE_POST_ACID_MIN_CONDUCTIVITY ); - checkPersistentAlarm( ALARM_ID_POST_BICARB_CONDUCTIVITY_OUT_OF_RANGE, isPostBicarbConductivityOutOfRange, postBicarbonateConductivity, CONCENTRATE_POST_BICARB_MIN_CONDUCTIVITY ); -#endif + return isConductivityInRange; } /*********************************************************************//** * @brief + * The isBicarbConductivityInRange function checks if bicarbonate conductivity + * value is in range. + * @details Inputs: CD2 sensor conductivity + * @details Outputs: none + * @return TRUE if bicarb conductivity is in range, otherwise FALSE + *************************************************************************/ +BOOL isBicarbConductivityInRange( void ) +{ + F32 const bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); + BOOL const isConductivityInRange = ( MIN_BICARB_CONCENTRATE_CONDUCTIVITY <= bicarbConductivity ) && ( bicarbConductivity <= MAX_BICARB_CONCENTRATE_CONDUCTIVITY ); + + return isConductivityInRange; +} + +/*********************************************************************//** + * @brief + * The isDialysateConductivityInRange function checks if dialysate conductivity + * value is in range. + * @details Inputs: CD2 sensor conductivity + * @details Outputs: none + * @return TRUE if dialysate conductivity is in range, otherwise FALSE + *************************************************************************/ +BOOL isDialysateConductivityInRange( void ) +{ + F32 const bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); + BOOL const isConductivityInRange = isAcidConductivityInRange() && ( MIN_DIALYSATE_CONDUCTIVITY <= bicarbConductivity ) && ( bicarbConductivity <= MAX_DIALYSATE_CONDUCTIVITY ); + + return isConductivityInRange; +} + +/*********************************************************************//** + * @brief * The getConductivityValue function gets the compensated conductivity * value for a given conductivity sensor id. * @details Inputs: compensatedConductivityValues[]