Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -r89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8 -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -18,6 +18,7 @@ #include // For memcpy #include "ConductivitySensors.h" +#include "ConductivityTeensy.h" #include "FpgaDD.h" #include "MessageSupport.h" #include "Messaging.h" @@ -80,13 +81,6 @@ static CONDUCTIVITY_SENSOR_CONTROL_T conductivitySensorControl[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensor Control for reset, init, read and write operations. -static CONDUCTIVITY_INIT_STATUS_T conductivityInitStatus; -static CONDUCTIVITY_EEPROM_DATA_T conductivityEEPROMdata; -static CONDUCTIVITY_MEASUREMENT_SETTINGS_T conductivityMeasurementSettings; -static CONDUCTIVITY_SENSOR_DATA_T rawConductivityValues[ MAX_TEENSY_SENSOR ]; -static CONDUCTIVITY_CALCULATED_MEASUREMENTS_T calculatedMeasurement[ MAX_TEENSY_SENSOR ]; -static CONDUCTIVITY_COEFFICIENTS_T conductivityCoeff[MAX_TEENSY_SENSOR]; - static const TEENSY_SENSOR_INDEX_T teensySensorMapping[NUM_OF_CONDUCTIVITY_SENSORS] = { [D17_COND] = TEENSY_SENSOR_0, [D27_COND] = TEENSY_SENSOR_1, @@ -96,45 +90,14 @@ [P18_COND] = TEENSY_SENSOR_5 }; - // ********** private function prototypes ********** static void checkConductivitySensors( void ); static CONDUCTIVITY_READ_STATE_T handleConductivitySensorsReadInitiate( CONDUCTIVITY_SENSORS_T sensorID ); static CONDUCTIVITY_WRITE_STATE_T handleConductivitySensorsWriteComplete( CONDUCTIVITY_SENSORS_T sensorID ); static CONDUCTIVITY_WRITE_STATE_T handleConductivitySensorsWriteInitiate( CONDUCTIVITY_SENSORS_T sensorID ); static CONDUCTIVITY_READ_STATE_T handleConductivitySensorsReadComplete( CONDUCTIVITY_SENSORS_T sensorID ); - -static CONDUCTIVITY_PARSE_STATUS parseMeasurementSettings(const U32 *buffer, U32 len ); -static CONDUCTIVITY_PARSE_STATUS parseEEPROMdata( const U32 *buffer, U32 len ); -static CONDUCTIVITY_PARSE_STATUS parseConductivityMeasurements( const U32 *buffer, U32 len ); - -static void sendCmd_getInitStatus( void ); -static void sendCmd_updateEEPROMdata( CONDUCTIVITY_EEPROM_DATA_T eepromData); -static void sendCmd_getEEPROMdata( void ); -static void sendCmd_updateMeasurementSettings( CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurememtSettings ); -static void sendCmd_getMeasurementSettings( void ); -static void sendCmd_getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ); -static void sendCmd_getAllMeasurements( void ); - -static void receiveResponse_getInitStatus( void ); -static void receiveResponse_updateEEPROMdata( void ); -static void receiveResponse_getEEPROMdata( void ); -static void receiveResponse_updateMeasurementSettings( void ); -static void receiveResponse_getMeasurementSettings( void ); -static void receiveResponse_getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ); -static void receiveResponse_getAllMeasurements( void ); - -static CONDUCTIVITY_INIT_STATUS_T getInitStatus( void ); -static const CONDUCTIVITY_EEPROM_DATA_T* getEEPROMdata( void ); -static const CONDUCTIVITY_MEASUREMENT_SETTINGS_T* getMeasurementSettings( void ); -static const CONDUCTIVITY_SENSOR_DATA_T* getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ); -static const CONDUCTIVITY_SENSOR_DATA_T* getAllMeasurements( void ); - -static void calculateConductivity( CONDUCTIVITY_SENSORS_T sensorID ); -static void calculateTemperature( CONDUCTIVITY_SENSORS_T sensorID ); static TEENSY_SENSOR_INDEX_T getTeensySensorNum( CONDUCTIVITY_SENSORS_T sensorID ); - /*********************************************************************//** * @brief * The initConductivitySensors function initializes the ConductivitySensors unit. @@ -193,8 +156,11 @@ initFPGAPersistentAlarm( FPGA_PERS_ERROR_D74_COND_SENSOR, ALARM_ID_DD_D74_COND_SENSOR_FPGA_FAULT, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ); //initFPGAPersistentAlarm( FPGA_PERS_ERROR_P9_COND_SENSOR, ALARM_ID_FP_P9_SENSOR_FPGA_FAULT, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ); //initFPGAPersistentAlarm( FPGA_PERS_ERROR_P18_COND_SENSOR, ALARM_ID_FP_P18_SENSOR_FPGA_FAULT, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS, COND_SENSORS_FPGA_ERROR_TIMEOUT_MS ); + + initConductivityDMAchannels(); } + /*********************************************************************//** * @brief * The readConductivitySensors function gets the current conductivity reading @@ -410,36 +376,6 @@ /*********************************************************************//** * @brief - * The getImpedanceValue function gets the current calculated conductivity / - impedance value. - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if given sensor is invalid. - * @details \b Inputs: lastConductivityErrorCounter - * @details \b Outputs: none - * @param sensor ID of conductivity sensor to get error count for. - * @return The current conductivity sensor error count of a given conductivity sensor. - *************************************************************************/ -F64 getImpedanceValue( U32 sensorNum ) -{ - return calculatedMeasurement[sensorNum].Conductivity; -} - -/*********************************************************************//** - * @brief - * The getRTDValue function gets the current conductivity sensor - * error count for a given conductivity sensor. - * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if given sensor is invalid. - * @details \b Inputs: lastConductivityErrorCounter - * @details \b Outputs: none - * @param sensor ID of conductivity sensor to get error count for. - * @return The current conductivity sensor error count of a given conductivity sensor. - *************************************************************************/ -F64 getRTDValue( U32 sensorNum ) -{ - return calculatedMeasurement[sensorNum].Temperature; -} - -/*********************************************************************//** - * @brief * The requestConductivitySensorReset function commands the given * the conductivity sensor to go for reset. * @details \b Inputs: none @@ -1066,277 +1002,6 @@ return state; } -/*********************************************************************//** - * @brief - * The parseMeasurementSettings Reads measurement settings from buffer and - * stores in conductivityMeasurementSettings. - * @details \b Inputs : none - * @details \b Outputs: conductivityMeasurementSettings - Measurement Settings - * @param buffer - Data to be parsed and stored. - * len - Length of the input data. - * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. - *************************************************************************/ -static CONDUCTIVITY_PARSE_STATUS parseMeasurementSettings( const U32 *buffer, U32 len ) -{ - CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; - U32 expectedDataLength = sizeof( CONDUCTIVITY_MEASUREMENT_SETTINGS_T ); - - // Validate buffer - if ( buffer == NULL ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; - } - // Validate buffer length - else if ( len != expectedDataLength ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; - } - else - { - // Parse and Store the data - memcpy( &conductivityMeasurementSettings, buffer, expectedDataLength ); - } - - return parseStatus; -} - -/*********************************************************************//** - * @brief - * The parseEEPROMdata Reads EEPROM data from buffer and - * stores in conductivityEEPROMdata. - * @details \b Inputs : none - * @details \b Outputs: conductivityEEPROMdata - EEPROM data - * @param buffer - Data to be parsed and stored. - * len - Length of the input data. - * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. - *************************************************************************/ -static CONDUCTIVITY_PARSE_STATUS parseEEPROMdata( const U32 *buffer, U32 len ) -{ - CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; - U32 expectedDataLength = sizeof( CONDUCTIVITY_EEPROM_DATA_T ); - - // Validate buffer - if ( buffer == NULL ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; - } - // Validate buffer length - else if ( len != expectedDataLength ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; - } - else - { - // Parse and Store the data - memcpy( &conductivityEEPROMdata, buffer, expectedDataLength ); - } - - return parseStatus; -} - -/*********************************************************************//** - * @brief - * The parseConductivityMeasurements Reads Conductivity Measurements / Sensor readings - * from buffer and stores in rawConductivityValues. - * @details \b Inputs : none - * @details \b Outputs: rawConductivityValues - Raw Conductivity Measurements / Sensor readings - * @param buffer - Data to be parsed and stored. - * len - Length of the input data. - * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. - *************************************************************************/ -static CONDUCTIVITY_PARSE_STATUS parseConductivityMeasurements( const U32 *buffer, U32 len ) -{ - CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; - U32 expectedDataLength = sizeof( CONDUCTIVITY_SENSOR_DATA_T ); - U32 sensorCount = 0; - U16 sensorIdx = 0; - - // // Validate buffer - if ( NULL == buffer ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; - } - - // Validate buffer length - else if ( ( len % expectedDataLength ) != 0 ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; - } - else - { - // Calculate the number of sensors for which we have received the data - sensorCount = len / expectedDataLength; - - // Parse the data and store in conductivityMeasurements[] - for ( sensorIdx = 0; sensorIdx < sensorCount; sensorIdx++ ) - { - // Read the sensor data temporarily - CONDUCTIVITY_SENSOR_DATA_T tempSensor; - memcpy(&tempSensor, ( buffer + ( sensorIdx * expectedDataLength ) ), expectedDataLength ); - - // And check if the received sensor number id valid - if ( (tempSensor.sensorNum < 1 ) || - ( tempSensor.sensorNum > MAX_TEENSY_SENSOR ) ) - { - parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_SENSOR_NUM; - break; - } - else - { - // The received data value contains sensor values from 1 to 6. - // So store value in array index for position (sensorNum - 1) i.e. 0 to 5. - rawConductivityValues[tempSensor.sensorNum - 1] = tempSensor; - } - } - } - - return parseStatus; -} - -static void sendCmd_getInitStatus( void ) -{ - -} - -static void sendCmd_updateEEPROMdata(CONDUCTIVITY_EEPROM_DATA_T eepromData) -{ - -} - -static void sendCmd_getEEPROMdata( void ) -{ - -} - -static void sendCmd_updateMeasurementSettings( CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurememtSettings ) -{ - -} - -static void sendCmd_getMeasurementSettings( void ) -{ - -} - -static void sendCmd_getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ) -{ - TEENSY_SENSOR_INDEX_T sensorNum = getTeensySensorNum(sensorID); -} - -static void sendCmd_getAllMeasurements( void ) -{ - -} - - -static void receiveResponse_getInitStatus( void ) -{ - -} - -static void receiveResponse_updateEEPROMdata( void ) -{ - -} - -static void receiveResponse_getEEPROMdata( void ) -{ - -} - -static void receiveResponse_updateMeasurementSettings( void ) -{ - -} - -static void receiveResponse_getMeasurementSettings( void ) -{ - -} - -static void receiveResponse_getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ) -{ - TEENSY_SENSOR_INDEX_T sensorNum = getTeensySensorNum(sensorID); -} - -static void receiveResponse_getAllMeasurements( void ) -{ - -} - -static CONDUCTIVITY_INIT_STATUS_T getInitStatus( void ) -{ - sendInitStatusCommand(); - receiveInitStatusResponse(); - return conductivityInitStatus; -} - -static const CONDUCTIVITY_EEPROM_DATA_T* getEEPROMdata(void) -{ - return &conductivityEEPROMdata; -} - - -static const CONDUCTIVITY_MEASUREMENT_SETTINGS_T* getMeasurementSettings(void) -{ - return &conductivityMeasurementSettings; -} - -static const CONDUCTIVITY_SENSOR_DATA_T* getSingleMeasurement( CONDUCTIVITY_SENSORS_T sensorID ) -{ - const CONDUCTIVITY_SENSOR_DATA_T* result = NULL; - - TEENSY_SENSOR_INDEX_T sensorNum = getTeensySensorNum( sensorID ); - - if (sensorNum < MAX_TEENSY_SENSOR) - { - result = &rawConductivityValues[ sensorNum ]; - } - - return result; -} - - - -static const CONDUCTIVITY_SENSOR_DATA_T* getAllMeasurements( void ) -{ - return rawConductivityValues; -} - -static void calculateConductivity( CONDUCTIVITY_SENSORS_T sensorID ) -{ - TEENSY_SENSOR_INDEX_T sensorNum = getTeensySensorNum( sensorID ); - F64 calculatedConductivity = 0.0; - F64 B3 = conductivityCoeff[ sensorNum ].B3; - F64 B2 = conductivityCoeff[ sensorNum ].B2; - F64 B1 = conductivityCoeff[ sensorNum ].B1; - F64 B0 = conductivityCoeff[ sensorNum ].B0; - F64 R = rawConductivityValues[ sensorNum ].impRzMag; - F64 Z = rawConductivityValues[ sensorNum ].rtdRzMag; - - calculatedConductivity = ( ( B3 * ( 1000.0 / R ) ) + - ( B2 * ( Z / R ) ) + - ( B1 * ( ( 100 * log( Z ) ) / R ) ) + - B0 - ); - - calculatedMeasurement[sensorNum].Conductivity = calculatedConductivity; - -} - -static void calculateTemperature( CONDUCTIVITY_SENSORS_T sensorID ) -{ - TEENSY_SENSOR_INDEX_T sensorNum = getTeensySensorNum( sensorID ); - F64 calculatedTemperature = 0.0; - F64 A1 = conductivityCoeff[ sensorNum ].A1; - F64 A0 = conductivityCoeff[ sensorNum ].A0; - F64 Z = rawConductivityValues[ sensorNum ].rtdRzMag; - - calculatedTemperature = ( ( A1 * Z ) + A0 ); - - calculatedMeasurement[sensorNum].Temperature = calculatedTemperature; -} - static TEENSY_SENSOR_INDEX_T getTeensySensorNum( CONDUCTIVITY_SENSORS_T sensorID ) { if ( sensorID >= NUM_OF_CONDUCTIVITY_SENSORS ) Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -r89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8 -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -36,8 +36,6 @@ */ // ********** public definitions ********** -#define DOUBLE_COUNT 8 ///< Number of double values in Teensy EEPROM data -#define FLOAT_COUNT ((128 - (DOUBLE_COUNT * 8)) / 4) ///< Number of float values in Teensy EEPROM data /// Enumeration of conductivity sensors. typedef enum ConductivitySensors @@ -56,92 +54,6 @@ NUM_OF_CONDUCTIVITY_SENSORS ///< Number of conductivity sensors } CONDUCTIVITY_SENSORS_T; - -typedef enum TeensySensorIndex -{ - TEENSY_SENSOR_0 = 0, ///< Maps to D17_COND - TEENSY_SENSOR_1, ///< Maps to D27_COND - TEENSY_SENSOR_2, ///< Maps to D43_COND - TEENSY_SENSOR_3, ///< Maps to D74_COND - TEENSY_SENSOR_4, ///< Maps to P9_COND - TEENSY_SENSOR_5, ///< Maps to P18_COND - MAX_TEENSY_SENSOR ///< Total number of mapped sensors -} TEENSY_SENSOR_INDEX_T; - -/// Initialization status of all the sensors connected to Teensy -typedef enum Conductivity_Init_Status -{ - CONDUCTIVITY_INIT_STATUS_UNITIALIZED = 0, ///< The initialization process has not started. - CONDUCTIVITY_INIT_STATUS_IN_PROGRESS, ///< The initialization process has started. - CONDUCTIVITY_INIT_STATUS_INITIALIZED, ///< Initialization process completed and all the sensors were initialized successfully. - CONDUCTIVITY_INIT_STATUS_FAILED ///< Initialization process completed but one or more sensor was not initialized properly. -}CONDUCTIVITY_INIT_STATUS_T; - - -typedef enum Conductivity_Parse_Status -{ - CONDUCTIVITY_PARSE_SUCCESS = 0, - CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER, - CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH, - CONDUCTIVITY_PARSE_ERROR_INVALID_SENSOR_NUM -} CONDUCTIVITY_PARSE_STATUS; - -/// 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 -} CONDUCTIVITY_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 -} CONDUCTIVITY_EEPROM_DATA_T; -#pragma pack(pop) - -/// Structure to receive conductivity measurement settings from Teensy -#pragma pack(push, 1) -typedef struct -{ - F32 SinFreq; - F32 DacVoltPP; - F32 BiasVolt; - U32 HstiaRtiaSel; - U32 AdcPgaGain; - U32 DftNum; - U32 ADCAvgNum; -} CONDUCTIVITY_MEASUREMENT_SETTINGS_T; -#pragma pack(pop) - -typedef struct -{ - F64 Conductivity; - F64 Temperature; -}CONDUCTIVITY_CALCULATED_MEASUREMENTS_T; - -typedef struct -{ - F64 A0; - F64 A1; - F64 B0; - F64 B1; - F64 B2; - F64 B3; -}CONDUCTIVITY_COEFFICIENTS_T; - - // ********** public function prototypes ********** void initConductivitySensors( void ); @@ -152,9 +64,6 @@ U32 getConductivitySensorReadCount( CONDUCTIVITY_SENSORS_T sensor ); U32 getConductivitySensorErrorCount( CONDUCTIVITY_SENSORS_T sensor ); -F64 getImpedanceValue( U32 sensorNum ); -F64 getRTDValue( U32 sensorNum ); - void handleConductivitySensorsReset( void ); void handleConductivitySensorsInitProcedure( void ); void execConductivitySensorWrite( void ); Index: firmware/App/Drivers/ConductivityTeensy.c =================================================================== diff -u --- firmware/App/Drivers/ConductivityTeensy.c (revision 0) +++ firmware/App/Drivers/ConductivityTeensy.c (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -0,0 +1,740 @@ +/************************************************************************** +* +* 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.c +* +* @author (last) Arpita Srivastava +* @date (last) 3-Nov-2025 +* +* @author (original) Arpita Srivastava +* @date (original) 3-Nov-2025 +* +***************************************************************************/ + +#include // Used for calculating the polynomial calibration equation. +#include // For memcpy + +#include "sci.h" +#include "sys_dma.h" + +#include "ConductivityTeensy.h" + + +#define SCI_RECEIVE_DMA_REQUEST 28 ///< Serial port receive DMA request line. +#define SCI_TRANSMIT_DMA_REQUEST 29 ///< Serial port transmit DMA request line. +#define COND_WRITE_CMD_BUFFER_LEN 256 ///< Conductivity write command buffer byte length. +#define COND_READ_CMD_BUFFER_LEN 8 ///< Conductivity read command buffer byte length. +#define COND_WRITE_RSP_BUFFER_LEN 8 ///< Conductivity write command response buffer byte length. +#define COND_READ_RSP_BUFFER_LEN 256 ///< Conductivity read command response buffer byte length. + +// ********** private data ********** +static CONDUCTIVITY_COMM_STATE_T conductivityCommState = COND_COMM_STATE_START; + +// Conductivity comm buffers +static U08 condWriteCmdBuffer[ COND_WRITE_CMD_BUFFER_LEN ]; ///< Conductivity write command buffer. Holds the next Conductivity write command to be transmitted. +static U08 condReadCmdBuffer[ COND_READ_CMD_BUFFER_LEN ]; ///< Conductivity read command buffer. Holds the next Conductivity read command to be transmitted. +static U08 condWriteResponseBuffer[ COND_WRITE_RSP_BUFFER_LEN ]; ///< Conductivity write command response buffer. Memory reserved to capture the response to the last Conductivity write command. +static U08 condReadResponseBuffer[ COND_READ_RSP_BUFFER_LEN ]; ///< Conductivity read command response buffer. Memory reserved to capture the response to the last Conductivity read command. + +// Conductivity DMA control records +static g_dmaCTRL condDMAWriteControlRecord; ///< DMA record for controlling a DMA write command transmission from buffer. +static g_dmaCTRL condDMAWriteRespControlRecord; ///< DMA record for controlling a DMA write command reception to buffer. +static g_dmaCTRL condDMAReadControlRecord; ///< DMA record for controlling a DMA read command transmission from buffer. +static g_dmaCTRL condDMAReadRespControlRecord; ///< DMA record for controlling a DMA read command reception to buffer. + +static CONDUCTIVITY_INIT_STATUS_T conductivityInitStatus; +static CONDUCTIVITY_EEPROM_DATA_T conductivityEEPROMdata; +static CONDUCTIVITY_MEASUREMENT_SETTINGS_T conductivityMeasurementSettings; +static CONDUCTIVITY_SENSOR_DATA_T rawConductivityValues[ MAX_TEENSY_SENSOR ]; +static CONDUCTIVITY_CALCULATED_MEASUREMENTS_T calculatedMeasurement[ MAX_TEENSY_SENSOR ]; +static CONDUCTIVITY_COEFFICIENTS_T conductivityCoeff[MAX_TEENSY_SENSOR]; + +static const char* teensyCmd[] = { "a", ///< COND_COMM_STATE_SEND_CMD_INIT_SENSOR + "l", ///< COND_COMM_STATE_SEND_CMD_GET_INIT_STATUS + "save", ///< COND_COMM_STATE_SEND_CMD_UPDATE_EEPROM_DATA, + "e", ///< COND_COMM_STATE_SEND_CMD_GET_EEPROM_DATA, + "cfg", ///< COND_COMM_STATE_SEND_CMD_UPDATE_MEASUREMENT_SETTINGS, + "k", ///< COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT_SETTINGS, + "m", ///< COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT, + "n", ///< Stop getting measurements + "g", ///< Get measurements of all the sensors + "j", ///< Select a sensor. ex : "j 1" selects sensor number 1 + "h" ///< Get that of selected sensor. (First Execute command "j".) + }; + + +// ********** private function prototypes ********** +static void handleConductivitySendCmd( void ); +static void handlecConductivityReceiveResponse( void ); + +static void consumeUnexpectedConductivityData( void ); + +static void setupConductivityDMAForWriteCmd( U32 bytes2Transmit ); +static void setupConductivityDMAForWriteResp( U32 bytes2Receive ); +static void setupConductivityDMAForReadResp( U32 bytes2Receive ); +static void setupConductivityDMAForReadCmd( U32 bytes2Transmit ); + +static void startConductivityDMAReceiptOfWriteResp( void ); +static void startConductivityDMAReceiptOfReadResp( void ); +static void startConductivityDMAWriteCmd( void ); +static void startConductivityDMAReadCmd( void ); + +static CONDUCTIVITY_PARSE_STATUS parseMeasurementSettings(const U32 *buffer, U32 len ); +static CONDUCTIVITY_PARSE_STATUS parseEEPROMdata( const U32 *buffer, U32 len ); +static CONDUCTIVITY_PARSE_STATUS parseConductivityMeasurements( const U32 *buffer, U32 len ); + +static CONDUCTIVITY_COMM_STATE_T sendCmd_initSensor( void ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_initSensor( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_getInitStatus( void ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getInitStatus( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_updateEEPROMdata( CONDUCTIVITY_EEPROM_DATA_T eepromData); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_updateEEPROMdata( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_getEEPROMdata( void ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getEEPROMdata( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_updateMeasurementSettings( CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurememtSettings ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_updateMeasurementSettings( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_getMeasurementSettings( void ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getMeasurementSettings( void ); +static CONDUCTIVITY_COMM_STATE_T sendCmd_getMeasurements( void ); +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getMeasurements( void ); + +static void sendCmd_getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ); +static void rcvRspns_getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ); +static void sendCmd_getAllMeasurements( void ); +static void rcvRspns_getAllMeasurements( void ); + +static CONDUCTIVITY_INIT_STATUS_T getInitStatus( void ); +static const CONDUCTIVITY_EEPROM_DATA_T* getEEPROMdata( void ); +static const CONDUCTIVITY_MEASUREMENT_SETTINGS_T* getMeasurementSettings( void ); +static const CONDUCTIVITY_SENSOR_DATA_T* getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ); +static const CONDUCTIVITY_SENSOR_DATA_T* getAllMeasurements( void ); + +static void calculateConductivity( TEENSY_SENSOR_INDEX_T sensorNum ); +static void calculateTemperature( TEENSY_SENSOR_INDEX_T sensorNum ); + +void execConductivityCommunication( void ) +{ + switch ( conductivityCommState ) + { + case COND_COMM_STATE_START: + break; + + case COND_COMM_STATE_SEND_CMD: + break; + + case COND_COMM_STATE_RCV_RSPNS: + break; + + case COND_COMM_STATE_SEND_CMD_GET_INIT_STATUS: + conductivityCommState = sendCmd_getInitStatus(); + break; + + case COND_COMM_STATE_RCV_RSPNS_GET_INIT_STATUS: + conductivityCommState = rcvRspns_getInitStatus(); + break; + + case COND_COMM_STATE_SEND_CMD_UPDATE_EEPROM_DATA: + { + CONDUCTIVITY_EEPROM_DATA_T eepromData = {0}; + conductivityCommState = sendCmd_updateEEPROMdata( eepromData ); + break; + } + + case COND_COMM_STATE_RCV_RSPNS_UPDATE_EEPROM_DATA: + conductivityCommState = rcvRspns_updateEEPROMdata(); + break; + + case COND_COMM_STATE_SEND_CMD_GET_EEPROM_DATA: + conductivityCommState = sendCmd_getEEPROMdata(); + break; + + case COND_COMM_STATE_RCV_RSPNS_GET_EEPROM_DATA: + conductivityCommState = rcvRspns_getEEPROMdata(); + break; + + case COND_COMM_STATE_SEND_CMD_UPDATE_MEASUREMENT_SETTINGS: + { + CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurememtSettings = {0}; + conductivityCommState = sendCmd_updateMeasurementSettings( measurememtSettings ); + break; + } + + case COND_COMM_STATE_RCV_RSPNS_UPDATE_MEASUREMENT_SETTINGS: + conductivityCommState = rcvRspns_updateMeasurementSettings(); + break; + + case COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT_SETTINGS: + conductivityCommState = sendCmd_getMeasurementSettings(); + break; + + case COND_COMM_STATE_RCV_RSPNS_GET_MEASUREMENT_SETTINGS: + conductivityCommState = rcvRspns_getMeasurementSettings(); + break; + + case COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT: + conductivityCommState = sendCmd_getMeasurements(); + break; + + case COND_COMM_STATE_RCV_RSPNS_GET_MEASUREMENT: + conductivityCommState = rcvRspns_getMeasurements(); + break; + + case COND_COMM_STATE_FAILED: + break; + + default: + break; + } + +} + +static void handleConductivitySendCmd( void ) +{ + +} +static void handleConductivityReceiveResponse( void ) +{ + +} + + +void initConductivityDMAchannels( void ) +{ + // Assign DMA channels to h/w DMA requests + dmaReqAssign( DMA_CH3, SCI_RECEIVE_DMA_REQUEST ); + dmaReqAssign( DMA_CH4, SCI_TRANSMIT_DMA_REQUEST ); + // Set DMA channel priorities + dmaSetPriority( DMA_CH3, HIGHPRIORITY ); + dmaSetPriority( DMA_CH4, LOWPRIORITY ); + // Enable DMA block transfer complete interrupts + dmaEnableInterrupt( DMA_CH3, BTC ); + dmaEnableInterrupt( DMA_CH4, BTC ); + + // Initialize FPGA DMA Write Control Record + condDMAWriteControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAWriteControlRecord.SADD = (U32)condWriteCmdBuffer; // Transfer source address + condDMAWriteControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register + condDMAWriteControlRecord.CHCTRL = 0; // No chaining + condDMAWriteControlRecord.ELCNT = 1; // Frame is 1 element + condDMAWriteControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAWriteControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte for read + condDMAWriteControlRecord.WRSIZE = ACCESS_8_BIT; // Element size is 1 byte for write + condDMAWriteControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAWriteControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment + condDMAWriteControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed + condDMAWriteControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAWriteControlRecord.ELSOFFSET = 0; // Not used + condDMAWriteControlRecord.ELDOFFSET = 0; // Not used + condDMAWriteControlRecord.FRSOFFSET = 0; // Not used + condDMAWriteControlRecord.FRDOFFSET = 0; // Not used + + // Initialize FPGA DMA Write Response Control Record + condDMAWriteRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAWriteRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register + condDMAWriteRespControlRecord.DADD = (U32)condWriteResponseBuffer; // Transfer destination address + condDMAWriteRespControlRecord.CHCTRL = 0; // No chaining + condDMAWriteRespControlRecord.ELCNT = 1; // Frame is 1 element + condDMAWriteRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAWriteRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte + condDMAWriteRespControlRecord.WRSIZE = ACCESS_8_BIT; // + condDMAWriteRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAWriteRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed + condDMAWriteRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment + condDMAWriteRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAWriteRespControlRecord.ELDOFFSET = 0; // Not used + condDMAWriteRespControlRecord.ELSOFFSET = 0; // Not used + condDMAWriteRespControlRecord.FRDOFFSET = 0; // Not used + condDMAWriteRespControlRecord.FRSOFFSET = 0; // Not used + + // Initialize FPGA DMA Read Control Record + condDMAReadControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAReadControlRecord.SADD = (U32)condReadCmdBuffer; // Transfer source address + condDMAReadControlRecord.DADD = (U32)(&(sciREG->TD)); // Dest. is SCI xmit register + condDMAReadControlRecord.CHCTRL = 0; // No chaining + condDMAReadControlRecord.ELCNT = 1; // Frame is 1 element + condDMAReadControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAReadControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte + condDMAReadControlRecord.WRSIZE = ACCESS_8_BIT; // + condDMAReadControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAReadControlRecord.ADDMODERD = ADDR_INC1; // Source addressing mode is post-increment + condDMAReadControlRecord.ADDMODEWR = ADDR_FIXED; // Dest. addressing mode is fixed + condDMAReadControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAReadControlRecord.ELSOFFSET = 0; // Not used + condDMAReadControlRecord.ELDOFFSET = 0; // Not used + condDMAReadControlRecord.FRSOFFSET = 0; // Not used + condDMAReadControlRecord.FRDOFFSET = 0; // Not used + + // Initialize FPGA DMA Read Response Control Record + condDMAReadRespControlRecord.PORTASGN = 4; // Port B (only choice per datasheet) + condDMAReadRespControlRecord.SADD = (U32)(&(sciREG->RD)); // Source is SCI recv register + condDMAReadRespControlRecord.DADD = (U32)condReadResponseBuffer; // Transfer destination address + condDMAReadRespControlRecord.CHCTRL = 0; // No chaining + condDMAReadRespControlRecord.ELCNT = 1; // Frame is 1 element + condDMAReadRespControlRecord.FRCNT = 0; // Block is TBD frames - will be populated later when known + condDMAReadRespControlRecord.RDSIZE = ACCESS_8_BIT; // Element size is 1 byte + condDMAReadRespControlRecord.WRSIZE = ACCESS_8_BIT; // + condDMAReadRespControlRecord.TTYPE = FRAME_TRANSFER; // Transfer type is block transfer + condDMAReadRespControlRecord.ADDMODERD = ADDR_FIXED; // Source addressing mode is fixed + condDMAReadRespControlRecord.ADDMODEWR = ADDR_INC1; // Dest. addressing mode is post-increment + condDMAReadRespControlRecord.AUTOINIT = AUTOINIT_OFF; // Auto-init off + condDMAReadRespControlRecord.ELDOFFSET = 0; // Not used + condDMAReadRespControlRecord.ELSOFFSET = 0; // Not used + condDMAReadRespControlRecord.FRDOFFSET = 0; // Not used + condDMAReadRespControlRecord.FRSOFFSET = 0; // Not used + + // There should not be any data pending yet + consumeUnexpectedConductivityData(); +} + +/*********************************************************************//** + * @brief + * The getImpedanceValue function gets the current calculated conductivity / + impedance value. + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if given sensor is invalid. + * @details \b Inputs: lastConductivityErrorCounter + * @details \b Outputs: none + * @param sensor ID of conductivity sensor to get error count for. + * @return The current conductivity sensor error count of a given conductivity sensor. + *************************************************************************/ +F64 getImpedanceValue( U32 sensorNum ) +{ + return calculatedMeasurement[sensorNum].Conductivity; +} + +/*********************************************************************//** + * @brief + * The getRTDValue function gets the current conductivity sensor + * error count for a given conductivity sensor. + * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if given sensor is invalid. + * @details \b Inputs: lastConductivityErrorCounter + * @details \b Outputs: none + * @param sensor ID of conductivity sensor to get error count for. + * @return The current conductivity sensor error count of a given conductivity sensor. + *************************************************************************/ +F64 getRTDValue( U32 sensorNum ) +{ + return calculatedMeasurement[sensorNum].Temperature; +} + +static void consumeUnexpectedConductivityData( void ) +{ + // Clear any errors + sciRxError( scilinREG ); + + // If a byte is pending read, read it + if ( sciIsRxReady( scilinREG ) != 0 ) + { + sciReceiveByte( scilinREG ); + } +} + +static void setupConductivityDMAForWriteCmd( U32 bytes2Transmit ) +{ + // Verify # of bytes does not exceed buffer length + if ( bytes2Transmit <= COND_WRITE_CMD_BUFFER_LEN ) + { + condDMAWriteControlRecord.FRCNT = bytes2Transmit; + } +} + +static void setupConductivityDMAForWriteResp( U32 bytes2Receive ) +{ + // Verify # of bytes does not exceed buffer length + if ( bytes2Receive <= COND_WRITE_RSP_BUFFER_LEN ) + { + condDMAWriteRespControlRecord.FRCNT = bytes2Receive; + } + +} + +static void setupConductivityDMAForReadResp( U32 bytes2Receive ) +{ + // Verify # of bytes does not exceed buffer length + if ( bytes2Receive <= COND_READ_RSP_BUFFER_LEN ) + { + condDMAReadRespControlRecord.FRCNT = bytes2Receive; + } +} + +static void setupConductivityDMAForReadCmd( U32 bytes2Transmit ) +{ + // Verify # of bytes does not exceed buffer length + if ( bytes2Transmit <= COND_READ_CMD_BUFFER_LEN ) + { + condDMAReadControlRecord.FRCNT = bytes2Transmit; + } +} + +static void startConductivityDMAReceiptOfWriteResp( void ) +{ + dmaSetCtrlPacket( DMA_CH3, condDMAWriteRespControlRecord ); + dmaSetChEnable( DMA_CH3, DMA_HW ); + setSCI2DMAReceiveInterrupt(); +} + +static void startConductivityDMAReceiptOfReadResp( void ) +{ + dmaSetCtrlPacket( DMA_CH3, condDMAReadRespControlRecord ); + dmaSetChEnable( DMA_CH3, DMA_HW ); + setSCI2DMAReceiveInterrupt(); +} + +static void startConductivityDMAWriteCmd( void ) +{ + dmaSetCtrlPacket( DMA_CH4, condDMAWriteControlRecord ); + dmaSetChEnable( DMA_CH4, DMA_HW ); + setSCI2DMATransmitInterrupt(); +} + +static void startConductivityDMAReadCmd( void ) +{ + dmaSetCtrlPacket( DMA_CH4, condDMAReadControlRecord ); + dmaSetChEnable( DMA_CH4, DMA_HW ); + setSCI2DMATransmitInterrupt(); +} + + +/*********************************************************************//** + * @brief + * The parseMeasurementSettings Reads measurement settings from buffer and + * stores in conductivityMeasurementSettings. + * @details \b Inputs : none + * @details \b Outputs: conductivityMeasurementSettings - Measurement Settings + * @param buffer - Data to be parsed and stored. + * len - Length of the input data. + * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. + *************************************************************************/ +static CONDUCTIVITY_PARSE_STATUS parseMeasurementSettings( const U32 *buffer, U32 len ) +{ + CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; + U32 expectedDataLength = sizeof( CONDUCTIVITY_MEASUREMENT_SETTINGS_T ); + + // Validate buffer + if ( buffer == NULL ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; + } + // Validate buffer length + else if ( len != expectedDataLength ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; + } + else + { + // Parse and Store the data + memcpy( &conductivityMeasurementSettings, buffer, expectedDataLength ); + } + + return parseStatus; +} + +/*********************************************************************//** + * @brief + * The parseEEPROMdata Reads EEPROM data from buffer and + * stores in conductivityEEPROMdata. + * @details \b Inputs : none + * @details \b Outputs: conductivityEEPROMdata - EEPROM data + * @param buffer - Data to be parsed and stored. + * len - Length of the input data. + * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. + *************************************************************************/ +static CONDUCTIVITY_PARSE_STATUS parseEEPROMdata( const U32 *buffer, U32 len ) +{ + CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; + U32 expectedDataLength = sizeof( CONDUCTIVITY_EEPROM_DATA_T ); + + // Validate buffer + if ( buffer == NULL ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; + } + // Validate buffer length + else if ( len != expectedDataLength ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; + } + else + { + // Parse and Store the data + memcpy( &conductivityEEPROMdata, buffer, expectedDataLength ); + } + + return parseStatus; +} + +/*********************************************************************//** + * @brief + * The parseConductivityMeasurements Reads Conductivity Measurements / Sensor readings + * from buffer and stores in rawConductivityValues. + * @details \b Inputs : none + * @details \b Outputs: rawConductivityValues - Raw Conductivity Measurements / Sensor readings + * @param buffer - Data to be parsed and stored. + * len - Length of the input data. + * @return CONDUCTIVITY_PARSE_STATUS to tell if parsing was successful or not. + *************************************************************************/ +static CONDUCTIVITY_PARSE_STATUS parseConductivityMeasurements( const U32 *buffer, U32 len ) +{ + CONDUCTIVITY_PARSE_STATUS parseStatus = CONDUCTIVITY_PARSE_SUCCESS; + U32 expectedDataLength = sizeof( CONDUCTIVITY_SENSOR_DATA_T ); + U32 sensorCount = 0; + U16 sensorIdx = 0; + + // // Validate buffer + if ( NULL == buffer ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_NULL_BUFFER; + } + + // Validate buffer length + else if ( ( len % expectedDataLength ) != 0 ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_LENGTH; + } + else + { + // Calculate the number of sensors for which we have received the data + sensorCount = len / expectedDataLength; + + // Parse the data and store in conductivityMeasurements[] + for ( sensorIdx = 0; sensorIdx < sensorCount; sensorIdx++ ) + { + // Read the sensor data temporarily + CONDUCTIVITY_SENSOR_DATA_T tempSensor; + memcpy(&tempSensor, ( buffer + ( sensorIdx * expectedDataLength ) ), expectedDataLength ); + + // And check if the received sensor number id valid + if ( (tempSensor.sensorNum < 1 ) || + ( tempSensor.sensorNum > MAX_TEENSY_SENSOR ) ) + { + parseStatus = CONDUCTIVITY_PARSE_ERROR_INVALID_SENSOR_NUM; + break; + } + else + { + // The received data value contains sensor values from 1 to 6. + // So store value in array index for position (sensorNum - 1) i.e. 0 to 5. + rawConductivityValues[tempSensor.sensorNum - 1] = tempSensor; + } + } + } + + return parseStatus; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_initSensor( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_INIT_SENSOR; + + // condWriteCmdBuffer + + return state; + +} +static CONDUCTIVITY_COMM_STATE_T rcvRspns_initSensor( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_INIT_SENSOR; + + // condWriteResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_getInitStatus( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_GET_INIT_STATUS; + + // condReadCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getInitStatus( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_GET_INIT_STATUS; + + // condReadResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_updateEEPROMdata(CONDUCTIVITY_EEPROM_DATA_T eepromData) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_UPDATE_EEPROM_DATA; + + // condWriteCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_updateEEPROMdata( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_UPDATE_EEPROM_DATA; + + // condWriteResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_getEEPROMdata( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_GET_EEPROM_DATA; + + // condReadCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getEEPROMdata( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_GET_EEPROM_DATA; + + // condReadResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_updateMeasurementSettings( CONDUCTIVITY_MEASUREMENT_SETTINGS_T measurememtSettings ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_UPDATE_MEASUREMENT_SETTINGS; + + // condWriteCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_updateMeasurementSettings( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_UPDATE_MEASUREMENT_SETTINGS; + + // condWriteResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_getMeasurementSettings( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT_SETTINGS; + + // condReadCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getMeasurementSettings( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_GET_MEASUREMENT_SETTINGS; + + // condReadResponseBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T sendCmd_getMeasurements( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_SEND_CMD_GET_MEASUREMENT; + + // condReadCmdBuffer + + return state; +} + +static CONDUCTIVITY_COMM_STATE_T rcvRspns_getMeasurements( void ) +{ + CONDUCTIVITY_COMM_STATE_T state = COND_COMM_STATE_RCV_RSPNS_GET_MEASUREMENT; + + // condReadResponseBuffer + + return state; +} + +static void sendCmd_getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ) +{ +} + +static void rcvRspns_getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ) +{ +} + +static void sendCmd_getAllMeasurements( void ) +{ + +} + +static void rcvRspns_getAllMeasurements( void ) +{ + +} + +static CONDUCTIVITY_INIT_STATUS_T getInitStatus( void ) +{ + sendInitStatusCommand(); + receiveInitStatusResponse(); + return conductivityInitStatus; +} + +static const CONDUCTIVITY_EEPROM_DATA_T* getEEPROMdata(void) +{ + return &conductivityEEPROMdata; +} + + +static const CONDUCTIVITY_MEASUREMENT_SETTINGS_T* getMeasurementSettings(void) +{ + return &conductivityMeasurementSettings; +} + +static const CONDUCTIVITY_SENSOR_DATA_T* getSingleMeasurement( TEENSY_SENSOR_INDEX_T sensorNum ) +{ + const CONDUCTIVITY_SENSOR_DATA_T* result = NULL; + + if (sensorNum < MAX_TEENSY_SENSOR) + { + result = &rawConductivityValues[ sensorNum ]; + } + + return result; +} + +static const CONDUCTIVITY_SENSOR_DATA_T* getAllMeasurements( void ) +{ + return rawConductivityValues; +} + +static void calculateConductivity( TEENSY_SENSOR_INDEX_T sensorNum ) +{ + F64 calculatedConductivity = 0.0; + F64 B3 = conductivityCoeff[ sensorNum ].B3; + F64 B2 = conductivityCoeff[ sensorNum ].B2; + F64 B1 = conductivityCoeff[ sensorNum ].B1; + F64 B0 = conductivityCoeff[ sensorNum ].B0; + F64 R = rawConductivityValues[ sensorNum ].impRzMag; + F64 Z = rawConductivityValues[ sensorNum ].rtdRzMag; + + calculatedConductivity = ( ( B3 * ( 1000.0 / R ) ) + + ( B2 * ( Z / R ) ) + + ( B1 * ( ( 100 * log( Z ) ) / R ) ) + + B0 + ); + + calculatedMeasurement[sensorNum].Conductivity = calculatedConductivity; + +} + +static void calculateTemperature( TEENSY_SENSOR_INDEX_T sensorNum ) +{ + F64 calculatedTemperature = 0.0; + F64 A1 = conductivityCoeff[ sensorNum ].A1; + F64 A0 = conductivityCoeff[ sensorNum ].A0; + F64 Z = rawConductivityValues[ sensorNum ].rtdRzMag; + + calculatedTemperature = ( ( A1 * Z ) + A0 ); + + calculatedMeasurement[sensorNum].Temperature = calculatedTemperature; +} + + + Index: firmware/App/Monitors/Conductivity.c =================================================================== diff -u -ra8b1004967be1c3bd4d46e96ff5886a0ec1446cc -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision a8b1004967be1c3bd4d46e96ff5886a0ec1446cc) +++ firmware/App/Monitors/Conductivity.c (.../Conductivity.c) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -146,6 +146,8 @@ execConductivitySensorRead(); #endif + execConductivityCommunication(); + filterConductivitySensors(); // publish conductivity sensors publishConductivitySensorsData(); Index: firmware/DD.dil =================================================================== diff -u -r89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8 -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/DD.dil (.../DD.dil) (revision 89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8) +++ firmware/DD.dil (.../DD.dil) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -1,4 +1,4 @@ -# RM46L852PGE 10/29/25 15:21:11 +# RM46L852PGE 11/03/25 09:17:14 # ARCH=RM46L852PGE # @@ -1709,7 +1709,7 @@ DRIVER.SCI.VAR.SCI_FEINTENA.VALUE=0 DRIVER.SCI.VAR.SCILIN_PORT_BIT0_DOUT.VALUE=0 DRIVER.SCI.VAR.SCI_OEINTLVL.VALUE=0 -DRIVER.SCI.VAR.SCI_TXINTENA.VALUE=1 +DRIVER.SCI.VAR.SCI_TXINTENA.VALUE=0 DRIVER.SCI.VAR.SCILIN_PARITYENA.VALUE=0 DRIVER.SCI.VAR.SCILIN_PORT_BIT1_DOUT.VALUE=0 DRIVER.SCI.VAR.SCI_PORT_BIT0_DOUT.VALUE=0 @@ -1719,7 +1719,7 @@ DRIVER.SCI.VAR.SCILIN_PORT_BIT0_PULDIS.VALUE=0 DRIVER.SCI.VAR.SCI_BREAKINTLVL.VALUE=0 DRIVER.SCI.VAR.SCI_STOPBITS.VALUE=1 -DRIVER.SCI.VAR.SCI_RXINTENA.VALUE=1 +DRIVER.SCI.VAR.SCI_RXINTENA.VALUE=0 DRIVER.SCI.VAR.SCI_FEINTLVL.VALUE=0 DRIVER.SCI.VAR.SCILIN_EVENPARITY.VALUE=0 DRIVER.SCI.VAR.SCI_TXINTLVL.VALUE=0 Index: firmware/include/sci.h =================================================================== diff -u -r89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8 -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/include/sci.h (.../sci.h) (revision 89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8) +++ firmware/include/sci.h (.../sci.h) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -133,7 +133,7 @@ #define SCI_SETINT_CONFIGVALUE ((uint32)((uint32)0U << 26U) \ |(uint32)((uint32)0U << 25U) \ |(uint32)((uint32)0U << 24U) \ - |(uint32)((uint32)1U << 9U) \ + |(uint32)((uint32)0U << 9U) \ |(uint32)((uint32)0U << 1U) \ |(uint32)((uint32)0U << 0U)) Index: firmware/source/sci.c =================================================================== diff -u -r89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8 -rd48829521f698f5fe55157bc688ca196a9376faa --- firmware/source/sci.c (.../sci.c) (revision 89c78ab89ac3909d5fe74f491f6f3b3cadd0ccf8) +++ firmware/source/sci.c (.../sci.c) (revision d48829521f698f5fe55157bc688ca196a9376faa) @@ -138,12 +138,12 @@ sciREG->SETINT = (uint32)((uint32)0U << 26U) /* Framing error */ | (uint32)((uint32)0U << 25U) /* Overrun error */ | (uint32)((uint32)0U << 24U) /* Parity error */ - | (uint32)((uint32)1U << 9U) /* Receive */ + | (uint32)((uint32)0U << 9U) /* Receive */ | (uint32)((uint32)0U << 1U) /* Wakeup */ | (uint32)((uint32)0U << 0U); /* Break detect */ /** - initialize global transfer variables */ - g_sciTransfer_t[0U].mode = (uint32)1U << 8U; + g_sciTransfer_t[0U].mode = (uint32)0U << 8U; g_sciTransfer_t[0U].tx_length = 0U; g_sciTransfer_t[0U].rx_length = 0U;