/************************************************************************** * * Copyright (c) 2019-2020 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 ConductivitySensors.c * * @author (last) Quang Nguyen * @date (last) 13-Jul-2020 * * @author (original) Quang Nguyen * @date (original) 13-Jul-2020 * ***************************************************************************/ #include "ConductivitySensors.h" #include "SystemCommMessages.h" #include "FPGA.h" #include "TaskPriority.h" #include "TemperatureSensors.h" /** * @addtogroup ConductivitySensors * @{ */ // ********** private definitions ********** #define COND_SENSOR_PROBE_TYPE 1000 #define COND_SENSOR_TEMPERATURE_COEF 0.02 #define COND_SENSOR_REPORT_PERIOD (100 / TASK_PRIORITY_INTERVAL) ///< Broadcast conductivity values message every 100 ms. // ********** private data ********** static U32 readCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Read count for conductivity readings. static OVERRIDE_F32_T compensatedConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest conductivity values. static OVERRIDE_U32_T conductivityDataPublishInterval = { COND_SENSOR_REPORT_PERIOD, COND_SENSOR_REPORT_PERIOD, 0, 0 }; static U32 conductivityDataPublicationTimerCounter = 0; // ********** private function prototypes ********** static U32 getConductivityDataPublishInterval( void ); /************************************************************************* * @brief * The initConductivitySensors function initializes the ConductivitySensors module. * @details * Inputs : none * Outputs : ConductivitySensors module initialized * @return none *************************************************************************/ void initConductivitySensors( void ) { U32 i; for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) { readCount[ i ] = 0; compensatedConductivityValues[ i ].data = 0.0; compensatedConductivityValues[ i ].ovData = 0.0; compensatedConductivityValues[ i ].ovInitData = 0.0; compensatedConductivityValues[ i ].override = OVERRIDE_RESET; // setFPGAConductivityProbeType( COND_SENSOR_PROBE_TYPE ); } } /************************************************************************* * @brief * The execConductivitySensors function gets conductivity sensors' data from FPGA and advertises them over CAN. * @details * Inputs : none * Outputs : Advertising conductivity sensors' data. * @return none *************************************************************************/ void execConductivitySensors(void) { U08 const fpgaCPiReadCount = getFPGACPiReadCount(); if ( readCount[ CONDUCITIVYSENSORS_CPI_SENSOR ] != fpgaCPiReadCount ) { readCount[ CONDUCITIVYSENSORS_CPI_SENSOR ] = fpgaCPiReadCount; F32 const temperatureValue = getTemperatureValue( TEMPSENSORS_INLET_PRIMARY_HEATER_TEMP_SENSOR ); F32 const compensatedCoef = ( 1 + ( COND_SENSOR_TEMPERATURE_COEF * (temperatureValue - 25) ) ); F32 const rawConductivity = (F32)( getFPGACPi() ) / 100; compensatedConductivityValues[ CONDUCITIVYSENSORS_CPI_SENSOR ].data = rawConductivity * compensatedCoef; } if ( ++conductivityDataPublicationTimerCounter >= getConductivityDataPublishInterval() ) { conductivityDataPublicationTimerCounter = 0; } } /************************************************************************* * @brief * The getConductivityValue function gets the compensated conductivity * value for a given conductivity sensor id. * @details * Inputs : compensatedConductivityValues[] * Outputs : none * @param sensorId : Id of conductivity sensor to get conductivity value * @return the compensated conductivity value for the given sensor id. *************************************************************************/ F32 getConductivityValue( U32 sensorId ) { F32 result = 0; if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { if ( OVERRIDE_KEY == compensatedConductivityValues[ sensorId ].override ) { result = compensatedConductivityValues[ sensorId ].ovData; } else { result = compensatedConductivityValues[ sensorId ].data; } } else { activateAlarmNoData( ALARM_ID_SOFTWARE_FAULT ); } return result; } /************************************************************************* * @brief * The getConductivityDataPublishInterval function gets the conductivity * data publication interval. * @details * Inputs : getConductivityDataPublishInterval * Outputs : none * @return the current conductivity data publication interval (in ms/task interval). *************************************************************************/ static U32 getConductivityDataPublishInterval( void ) { U32 result = conductivityDataPublishInterval.data; if ( OVERRIDE_KEY == conductivityDataPublishInterval.override ) { result = conductivityDataPublishInterval.ovData; } return result; } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /************************************************************************* * @brief * The testSetConductivityOverride function overrides the compensated * conductivity value of given sensor id. * @details * Inputs : none * Outputs : compensatedConductivityValues[] * @param sensorId : Id of conductivity sensor to get conductivity value * @param value : override compensated conductivity value * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetConductivityOverride( U32 sensorId, F32 value ) { BOOL result = FALSE; if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { if ( isTestingActivated() ) { result = TRUE; compensatedConductivityValues[ sensorId ].ovData = value; compensatedConductivityValues[ sensorId ].override = OVERRIDE_KEY; } } return result; } /************************************************************************* * @brief * The testResetConductivityOverride function resets the override of the \n * conductivity sensor value. * @details * Inputs : none * Outputs : compensatedConductivityValues[] * @param sensorId : Id of the conductivity sensor to override. * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetConductivityOverride( U32 sensorId ) { BOOL result = FALSE; if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { if ( isTestingActivated() ) { result = TRUE; compensatedConductivityValues[ sensorId ].ovData = compensatedConductivityValues[ sensorId ].ovInitData; compensatedConductivityValues[ sensorId ].override = OVERRIDE_RESET; } } return result; } /************************************************************************* * @brief * The testSetConductivityDataPublishIntervalOverride function overrides * the conductivity data publish interval. * @details * Inputs : none * Outputs : conductivityDataPublishInterval * @param value : override conductivity data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetConductivityDataPublishIntervalOverride( U32 interval_ms ) { BOOL result = FALSE; if ( isTestingActivated() ) { result = TRUE; conductivityDataPublishInterval.ovData = interval_ms / TASK_PRIORITY_INTERVAL; conductivityDataPublishInterval.override = OVERRIDE_KEY; } return result; } /************************************************************************* * @brief * The testResetConductivityDataPublishIntervalOverride function resets * the override of the conductivity data publish interval. * @details * Inputs : none * Outputs : conductivityDataPublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetConductivityDataPublishIntervalOverride( void ) { BOOL result = FALSE; if ( isTestingActivated() ) { result = TRUE; conductivityDataPublishInterval.ovData = conductivityDataPublishInterval.ovInitData; conductivityDataPublishInterval.override = OVERRIDE_RESET; } return result; }