/************************************************************************** * * Copyright (c) 2025-2026 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file ConductivityTeensy.h * * @author (last) Arpita Srivastava * @date (last) 3-Nov-2025 * * @author (original) Arpita Srivastava * @date (original) 3-Nov-2025 * ***************************************************************************/ #ifndef _CONDUCTIVITY_TEENSY_H_ #define _CONDUCTIVITY_TEENSY_H_ #include "DDCommon.h" // ********** public definitions ********** #define DOUBLE_COUNT 8 ///< Number of double values in Teensy EEPROM data #define FLOAT_COUNT 16 ///< Number of float values in Teensy EEPROM data #define MAX_COND_MST_PARAM_IDX 7 ///< Total number of parameters in measurement settings CONDUCTIVITY_MEASUREMENT_SETTINGS_T /// Enumeration of conductivity sensors. typedef enum ConductivitySensors { D17_COND = 0, ///< Bicarb only conductivity sensor - 1 FIRST_DD_COND_SENSOR = D17_COND, ///< First conductivity sensor D27_COND, ///< Acid and Bicarb mix conductivity sensor - 1 D29_COND, ///< Acid and Bicarb mix conductivity sensor - 2 D43_COND, ///< Spent dialysate conductivity sensor D74_COND, ///< Bicarb only conductivity sensor - 2 LAST_DD_COND_SENSOR = D74_COND, ///< Last conductivity sensor P9_COND, ///< Inlet water conductivity sensor FIRST_FP_COND_SENSOR = P9_COND, ///< First FP conductivity sensor P18_COND, ///< RO outlet water conductivity sensor LAST_FP_COND_SENSOR = P18_COND, ///< Last FP conductivity sensor NUM_OF_CONDUCTIVITY_SENSORS ///< Number of conductivity sensors } CONDUCTIVITY_SENSORS_T; /// Enumeration of Teensy Sensor Index values typedef enum TeensySensorIndex { TEENSY_SENSOR_0 = 0, ///< Maps to P9_COND TEENSY_SENSOR_1, ///< Maps to P18_COND TEENSY_SENSOR_2, ///< Maps to D17_COND TEENSY_SENSOR_3, ///< Maps to D27_COND TEENSY_SENSOR_4, ///< Maps to D29_COND TEENSY_SENSOR_5, ///< Maps to D43_COND MAX_TEENSY_SENSOR ///< Total number of mapped sensors } TEENSY_SENSOR_INDEX_T; /// Enumeration of Teensy Commands. Also used as TX and TX states. typedef enum TeensyCmdIndex { TEENSY_CMD_INIT_SENSOR = 0, ///< Maps to command "a" TEENSY_CMD_GET_INIT_STATUS, ///< Maps to command "l" TEENSY_CMD_UPDATE_EEPROM_DATA, ///< Maps to command "save" TEENSY_CMD_GET_EEPROM_DATA, ///< Maps to command "e" TEENSY_CMD_UPDATE_MEASUREMENT_SETTINGS, ///< Maps to command "cfg" TEENSY_CMD_GET_MEASUREMENT_SETTINGS, ///< Maps to command "k" TEENSY_CMD_START_MEASUREMENT, ///< Maps to command "m" TEENSY_CMD_STOP_MEASUREMENT, ///< Maps to command "n" TEENSY_CMD_GET_ALL_MEASUREMENTS, ///< Maps to command "g" TEENSY_CMD_GET_SINGLE_MEASUREMENT, ///< Maps to command "h" MAX_NUM_OF_TEENSY_CMDS ///< Total number of commands } TEENSY_CMD_INDEX_T; /// Enumeration of Initialization status of all the sensors connected to Teensy typedef enum Conductivity_Init_Status { COND_INIT_STATUS_UNITIALIZED = 0, ///< The initialization process has not started. COND_INIT_STATUS_IN_PROGRESS, ///< The initialization process has started. COND_INIT_STATUS_INITIALIZED, ///< Initialization process completed and all the sensors were initialized successfully. COND_INIT_STATUS_FAILED ///< Initialization process completed but one or more sensor was not initialized properly. } COND_INIT_STATUS_T; /// Enumeration of Parse status of received byte data typedef enum Conductivity_Parse_Status { COND_PARSE_NONE = 0, COND_PARSE_ERROR_NULL_BUFFER, COND_PARSE_ERROR_INVALID_LENGTH, COND_PARSE_ERROR_INVALID_SENSOR_NUM, COND_PARSE_SUCCESS, } COND_PARSE_STATUS; /// Enumeration of Conductivity Communication states. typedef enum Conductivity_Comm_States { COND_COMM_STATE_IDLE = 0, COND_COMM_STATE_TX, COND_COMM_STATE_RX, COND_COMM_STATE_FAILED, NUM_OF_COND_COMM_STATES } COND_COMM_STATE_T; /// Enumeration of update EEPROM status typedef enum Conductivity_Update_Eeprom_Status { COND_UPDATE_EEPROM_STATUS_UNITIALIZED = 0, ///< The initialization process has not started. COND_UPDATE_EEPROMSTATUS_IN_PROGRESS, ///< The initialization process has started. COND_UPDATE_EEPROM_STATUS_INITIALIZED, ///< Initialization process completed and all the sensors were initialized successfully. COND_UPDATE_EEPROM_STATUS_FAILED ///< Initialization process completed but one or more sensor was not initialized properly. } COND_UPDATE_EEPROM_STATUS_T; /// Enumeration of update measurement settings status typedef enum Update_mst_Status { COND_MST_STATUS_ERR_UNRECOGNIZED_PARAM = 0, ///< Invalid parameter was passed with the command COND_MST_STATUS_ERR_UPDATED_TO_DEFAULT_TIA, ///< Invalid value of "rtia" was passed with the command. So it was updated to its default value. COND_MST_STATUS_ERR_UPDATED_TO_DEFAULT_PGA, ///< Invalid value of "pga" was passed with the command. So it was updated to its default value. COND_MST_STATUS_ERR_UPDATED_TO_DEFAULT_DFT_NUM, ///< Invalid value of "dftnum" was passed with the command. So it was updated to its default value. COND_MST_STATUS_ERR_UPDATED_TO_DEFAULT_AVG_NUM, ///< Invalid value of "avgnum" was passed with the command. So it was updated to its default value. COND_MST_STATUS_SUCCESS } COND_UPDATE_MST_STATUS_T; /// Coefficients to be applied with raw impedance and rtd values to calculate conductivity and temperature. typedef struct { F64 A0; F64 A1; F64 B0; F64 B1; F64 B2; F64 B3; } COND_COEFF_T; /// Structure to receive Sensor Measurement data from Teensy #pragma pack(push, 1) typedef struct { U32 sensorNum; ///< Conductivity Sensor number i.e unit 1 to 6. F32 impFreq; ///< Impedance Frequency U32 impDataPoints; ///< Impedance Data Points. Hard coded to 1 F32 impRzMag; ///< Value of medianMag F32 impRzPhase; ///< Value of medianPhase F32 rtdFreq; ///< RTD Frequency. Hard coded to 0.0 U32 rtdDataPoints; ///< Impedance Data Points. Hard coded to 1 F32 rtdRzMag; ///< Value of rtd_resistance F32 rtdRzPhase; ///< RTD Rz Phase. Hard coded to 0.0 } COND_SENSOR_DATA_T; #pragma pack(pop) /// Structure to receive EEPROM data from Teensy. These are coefficient values to calculate conductivity and temperature. #pragma pack(push, 1) typedef struct { F64 doubleValue[DOUBLE_COUNT]; ///< Double Values stored in the EEPROM F32 floatValue[FLOAT_COUNT]; ///< Float Values stored in the EEPROM } COND_EEPROM_DATA_T; #pragma pack(pop) /// Structure to receive conductivity measurement settings from Teensy #pragma pack(push, 1) typedef struct { F32 SinFreq; ///< SinFreq : Frequency of excitation signal F32 DacVoltPP; ///< DacVoltPP : DAC output voltage in mV peak to peak. Maximum value is 800mVpp. Peak to peak voltage F32 BiasVolt; ///< BiasVolt : The excitation signal is DC+AC. This parameter decides the DC value in mV unit. 0.0mV means no DC bias. U32 HstiaRtiaSel; ///< HstiaRtiaSel : Valid param values ( 0, 1, 2, 3, 4, 5, 6, 7 ) U32 AdcPgaGain; ///< AdcPgaGain : Valid param values ( 1, 1.5, 2, 4, 9 ) i.e interpreted as ( 0, 1, 2, 3, 4 ) respectively in Teensy. U32 DftNum; ///< DftNum : DFT number Valid param values ( 4096, 2048, 1024, 512, 256 ) i.e interpreted as ( 10, 9, 8, 7, 6 ) respectively in Teensy. U32 ADCAvgNum; ///< ADCAvgNum : Valid param values ( 2, 4, 8, 16 )i.e interpreted as ( 0, 1, 2, 3 ) respectively in Teensy. } COND_MEASUREMENT_SETTINGS_T; #pragma pack(pop) /// Structure to store calculated Conductivity and Temperature for each sensor. typedef struct { F64 Conductivity; F64 Temperature; } COND_CALCULATED_MEASUREMENTS_T; /// Structure to enqueue and dequeue commands in the command queue typedef struct { TEENSY_CMD_INDEX_T cmdIdx; U08* teensyCMD; U32 rxSize; } COND_CMD_DATA_T; // ********** public function prototypes ********** void initConductivityTeensy( void ); void execConductivityTeensy( void ); void signalConductivityReceiptCompleted( void ); void signalConductivityTransmitCompleted( void ); void addToConductivityCmdQ(TEENSY_CMD_INDEX_T teensyCmd); F32 getTeensyConductivityValue( CONDUCTIVITY_SENSORS_T sensorId ); F32 getTeensyConductivityTemperatureValue( CONDUCTIVITY_SENSORS_T sensorId ); #endif /* _CONDUCTIVITY_TEENSY_H_ */