Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -r224b86c0847207c168d38fa1713a1e9116642267 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) @@ -79,8 +79,24 @@ U16 status; ///< Status for measurement data package U08 reserved2[4]; ///< Comma separator and index of current range } EMSTAT_VARIABLE_T; + +/// Emstat board structure +typedef struct +{ + BOOL packageStarted; ///< Emstat package started flag. + U08 packageIndex; ///< Emstat package index number. + U08 package[ 50 ]; ///< Emstat read buffer package. +} EMSTAT_READ_T; #pragma pack(pop) +/// Emstat boards for CPi/CPo and CD1/CD2 +typedef enum EmstatBoards +{ + CPI_CPO_EMSTAT_BOARD = 0, ///< Emstat CPi/CPo board. + CD1_CD2_EMSTAT_BOARD, ///< Emstat CD1/CD2 board. + NUM_OF_EMSTAT_BOARDS ///< Number of Emstat boards. +} EMSTAT_BOARD_T; + // ********** private data ********** /// Conductivity sensors' associated temperature sensors @@ -98,16 +114,21 @@ static F32 rawConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest raw conductivity values. static F32 roRejectionRatio; ///< Latest RO rejection ratio. static U32 sensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Latest sensor hardware status. - static OVERRIDE_U32_T conductivityDataPublishInterval = { COND_SENSOR_REPORT_PERIOD, COND_SENSOR_REPORT_PERIOD, 0, 0 }; ///< Conductivity sensors publish time interval override. static U32 conductivityDataPublicationTimerCounter; ///< Conductivity sensors data publish timer counter. +static EMSTAT_READ_T emstatBoardRead[ NUM_OF_EMSTAT_BOARDS ]; ///< EMSTAT board read. static BOOL packageStarted; ///< Flag to indicate the start of a package measurement data. static U08 packageIndex; ///< Current package measurement data bytes index. static U08 package[ 50 ]; ///< Storage of package bytes until ready to process. static DG_COND_SENSORS_CAL_RECORD_T condSensorsCalRecord; ///< Conductivity sensors' calibration record. +// TODo can we combine the two +static BOOL newPackageStarted; +static U08 newPackageIndex; +static U08 newPackage[ 50 ]; + // ********** private function prototypes ********** static F32 calcCompensatedConductivity( F32 conductivity, F32 temperature ); @@ -116,7 +137,8 @@ static U32 prefixStrToSIFactor( U08 prefix ); static void processMeasurementDataPackage( U32 sensorId ); -static void processCD1CD2SensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ); +static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ); +static void processEmstatSensorRead( CONDUCTIVITY_SENSORS_T sensor, U16 fpgaReadCount, U08 fpgaErrorCount ); static F32 getCalibrationAppliedConductivityValue( U32 sensorId, F32 compensatedValue ); /*********************************************************************//** @@ -128,36 +150,38 @@ *************************************************************************/ void initConductivitySensors( void ) { - U32 i; - + U08 i; roRejectionRatio = 0.0; packageIndex = 0U; packageStarted = FALSE; conductivityDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) { - readCount[ i ] = 0; - internalErrorCount[ i ] = 0; - rawConductivityValues[ i ] = 0.0; - + readCount[ i ] = 0; + internalErrorCount[ i ] = 0; + rawConductivityValues[ i ] = 0.0; compensatedConductivityValues[ i ].data = 0.0; compensatedConductivityValues[ i ].ovData = 0.0; compensatedConductivityValues[ i ].ovInitData = 0.0; compensatedConductivityValues[ i ].override = OVERRIDE_RESET; - benignPolynomialCalRecord( &condSensorsCalRecord.condSensors[ i ] ); } - setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); - setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); + for ( i = 0; i < NUM_OF_EMSTAT_BOARDS; i++ ) + { + memset( &emstatBoardRead[ i ], 0x0, sizeof( EMSTAT_BOARD_T ) ); + } - initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); - initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, 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_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); // TODO can we leave this here? + setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); // TODO can we leave this here? + + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR, MAX_CONDUCTIVITY_SENSOR_FAILURES, MAX_CONDUCTIVITY_SENSOR_FAILURE_WINDOW_MS ); + initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_HIGH_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_INLET_WATER_CONDUCTIVITY_IN_LOW_RANGE, 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_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD, COND_SENSOR_BAD_STATUS_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_OUTLET_PRIMARY_CONDUCTIVITY_OUT_OF_RANGE, COND_SENSOR_PERSISTENCE_PERIOD, COND_SENSOR_PERSISTENCE_PERIOD ); } /*********************************************************************//** @@ -177,12 +201,12 @@ getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); } - - processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); #ifndef ENABLE_DVT_BOARD + processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPO_SENSOR, getFPGACPo(), getFPGACPoReadCount(), getFPGACPoErrorCount(), getFPGACPoFault() ); #endif - processCD1CD2SensorRead( getFPGAEmstatRxFifoCount(), getFPGAEmstatRxErrCount() ); + processCD1CD2EmstatSensorRead( getFPGAEmstatRxFifoCount(), getFPGAEmstatRxErrCount() ); + processEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); // TODO can this be replacing the top function? if ( ++conductivityDataPublicationTimerCounter >= getU32OverrideValue( &conductivityDataPublishInterval ) ) { @@ -223,19 +247,10 @@ SELF_TEST_STATUS_T execConductivitySensorsSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; - - BOOL calStatus = getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), + BOOL calStatus = getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); + result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } - return result; } @@ -393,14 +408,14 @@ { if ( ( readCount[ sensorId ] != fpgaReadCount ) ) { - F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); - F32 conductivity = ( (F32)( fgpaRead ) / COND_SENSOR_DECIMAL_CONVERSION ); + F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); + F32 conductivity = ( (F32)( fgpaRead ) / COND_SENSOR_DECIMAL_CONVERSION ); F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); - readCount[ sensorId ] = fpgaReadCount; - internalErrorCount[ sensorId ] = 0; + readCount[ sensorId ] = fpgaReadCount; + internalErrorCount[ sensorId ] = 0; compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CPi and CPo + rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CPi and CPo } else { @@ -474,12 +489,22 @@ *************************************************************************/ static void processMeasurementDataPackage( U32 sensorId ) { - EMSTAT_VARIABLE_T const * const measurementPtr = (EMSTAT_VARIABLE_T *)&package; - U32 status = hexStrToDec( (U08 *)&measurementPtr->status, sizeof( measurementPtr->status ) ); - sensorStatus[ sensorId ] = status; + //EMSTAT_VARIABLE_T const * const measurementPtr = (EMSTAT_VARIABLE_T *)&package; // TODO remove + EMSTAT_VARIABLE_T* measurementPtr; - if ( EMSTAT_PICO_GOOD_STATUS == status ) + if ( ( CONDUCTIVITYSENSORS_CD1_SENSOR == sensorId ) || ( CONDUCTIVITYSENSORS_CD2_SENSOR == sensorId ) ) { + measurementPtr = (EMSTAT_VARIABLE_T *)&package; + } + else + { + measurementPtr = (EMSTAT_VARIABLE_T *)&newPackage; + } + + sensorStatus[ sensorId ] = hexStrToDec( (U08 *)&measurementPtr->status, sizeof( measurementPtr->status ) ); + + if ( EMSTAT_PICO_GOOD_STATUS == sensorStatus[ sensorId ] ) + { U32 prefix = prefixStrToSIFactor( measurementPtr->prefix ); F32 resistance = ( ( F32 )( hexStrToDec( measurementPtr->value, sizeof( measurementPtr->value ) ) - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); @@ -491,20 +516,20 @@ rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CD1 and CD2 // Clear the alarm - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, FALSE, status, EMSTAT_PICO_GOOD_STATUS ); + checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, FALSE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); } else { #ifndef DISABLE_COND_STATUS_CHECK - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, TRUE, status, EMSTAT_PICO_GOOD_STATUS ); + checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, TRUE, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); #endif } - if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == status ) + if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == sensorStatus[ sensorId ] ) { if ( ++internalErrorCount[ sensorId ] > MAX_CONDUCTIVITY_SENSOR_FAILURES ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); // TODO DVT + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); } } else @@ -520,17 +545,17 @@ * it raises an alarm. If the read count has changed, the new reading will be processed. * @details Inputs: none * @details Outputs: none - * @param fpgaReadCount FPGA read count for rx fifo + * @param fpgaReadCount FPGA read count for Rx FIFO * @param fpgaErrorCount FPGA error count * @return none *************************************************************************/ -static void processCD1CD2SensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ) +static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ) { - if ( fpgaErrorCount == 0 ) + if ( 0 == fpgaErrorCount ) { - if ( ( fpgaReadCount > 0 ) && ( ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) == 0 ) ) + if ( ( fpgaReadCount > 0 ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) ) { - U08 const emstatByte = getFPGAEmstatOutByte(); + U08 emstatByte = getFPGAEmstatCD1CD2OutByte(); switch ( emstatByte ) { @@ -540,23 +565,23 @@ break; case ';': - if ( packageStarted ) + if ( TRUE == packageStarted ) { processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD1_SENSOR ); packageIndex = 0; } break; case '\n': - if ( packageStarted ) + if ( TRUE == packageStarted ) { processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD2_SENSOR ); packageStarted = FALSE; } break; default: - if ( packageStarted ) + if ( TRUE == packageStarted ) { package[ packageIndex++ ] = emstatByte; } @@ -572,12 +597,54 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_COND_SENSOR_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); // TODO DVT + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); } } } } +static void processEmstatSensorRead( CONDUCTIVITY_SENSORS_T sensor, U16 fpgaReadCount, U08 fpgaErrorCount ) +{ + if ( 0 == fpgaErrorCount ) + { + if ( ( fpgaReadCount > 0 ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) ) + { + U08 emstatByte = getFPGAEmstatCPiCPoByteOut(); + + switch ( emstatByte ) + { + case 'P': + newPackageStarted = TRUE; + newPackageIndex = 0; + break; + + case ';': + if ( TRUE == newPackageStarted ) + { + processMeasurementDataPackage( CONDUCTIVITYSENSORS_CPI_SENSOR ); + newPackageIndex = 0; + } + break; + + case '\n': + if ( TRUE == newPackageStarted ) + { + processMeasurementDataPackage( CONDUCTIVITYSENSORS_CPO_SENSOR ); + newPackageStarted = FALSE; + } + break; + + default: + if ( TRUE == newPackageStarted ) + { + newPackage[ newPackageIndex++ ] = emstatByte; + } + break; + } + } + } +} + /*********************************************************************//** * @brief * The getCalibrationAppliedConductivityValue function gets the temperature