Index: firmware/App/Drivers/ConductivitySensors.c =================================================================== diff -u -r325e67dab10f6666702bf0f1256015b31e58de4f -r895a48e398bbd9621425f781f9ff7974fb3dd523 --- firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 325e67dab10f6666702bf0f1256015b31e58de4f) +++ firmware/App/Drivers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 895a48e398bbd9621425f781f9ff7974fb3dd523) @@ -80,6 +80,10 @@ static CONDUCTIVITY_SENSOR_CONTROL_T conductivitySensorControl[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensor Control for reset, init, read and write operations. +static CONDUCTIVITY_MEASUREMENT_SETTINGS_T conductivityMeasurementSettings; +static CONDUCTIVITY_EEPROM_DATA_T conductivityEEPROMdata; +static CONDUCTIVITY_SENSOR_DATA_T conductivityMeasurements[ MAX_CONDUCTIVITY_SENSOR ]; + // ********** private function prototypes ********** static void checkConductivitySensors( void ); @@ -88,6 +92,10 @@ 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, uint32_t len); + /*********************************************************************//** * @brief * The initConductivitySensors function initializes the ConductivitySensors unit. @@ -990,6 +998,106 @@ } +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; +} + +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; +} + +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_CONDUCTIVITY_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. + conductivityMeasurements[tempSensor.sensorNum - 1] = tempSensor; + } + } + } + + return parseStatus; +} + + + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Drivers/ConductivitySensors.h =================================================================== diff -u -r89f18a07a6d5837bf9b4559a69046e2b06f32c35 -r895a48e398bbd9621425f781f9ff7974fb3dd523 --- firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 89f18a07a6d5837bf9b4559a69046e2b06f32c35) +++ firmware/App/Drivers/ConductivitySensors.h (.../ConductivitySensors.h) (revision 895a48e398bbd9621425f781f9ff7974fb3dd523) @@ -36,6 +36,9 @@ */ // ********** 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 +#define MAX_CONDUCTIVITY_SENSOR 6 /// Enumeration of conductivity sensors. typedef enum ConductivitySensors @@ -54,6 +57,64 @@ NUM_OF_CONDUCTIVITY_SENSORS ///< Number of conductivity sensors } CONDUCTIVITY_SENSORS_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 +} 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) + +/// 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; + + // ********** public function prototypes ********** void initConductivitySensors( void );