Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r5c8f6d4d16252ed287dd7ee5a89ff814bce17eff -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 5c8f6d4d16252ed287dd7ee5a89ff814bce17eff) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -86,6 +86,7 @@ U08 reserved2[4]; ///< Comma separator and index of current range } EMSTAT_VARIABLE_T; +/// Emstat conductivity sensor and its corresponding temperature sensor typedef struct { CONDUCTIVITY_SENSORS_T condSnsr; ///< Emstat conductivity sensor 1 on the board. @@ -124,51 +125,24 @@ NUM_OF_EMSTAT_BOARDS ///< Number of Emstat boards. } EMSTAT_BOARD_T; -/// Conductivity sensors' associated temperature sensors -static U32 associateTempSensor[ NUM_OF_CONDUCTIVITY_SENSORS ] = -{ - TEMPSENSORS_INLET_PRIMARY_HEATER, ///< Inlet temperature sensor - TEMPSENSORS_OUTLET_PRIMARY_HEATER, ///< Outlet temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_1, ///< Post-acid temperature sensor - TEMPSENSORS_CONDUCTIVITY_SENSOR_2, ///< Post-bicarbonate temperature sensor -}; // TODO remove - -static U08 readCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Read count for conductivity readings. -static U32 internalErrorCount[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Internal error count for conductivity readings. -static OVERRIDE_F32_T compensatedConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Latest compensated conductivity values. -static F32 rawConductivityValues[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< Latest raw conductivity values. -static U32 sensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; // TODO remove ///< 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 F32 roRejectionRatio; ///< Latest RO rejection ratio. static U32 condDataPublishCounter; ///< Conductivity sensors data publish timer counter. static EMSTAT_READ_T emstatBoardRead[ NUM_OF_EMSTAT_BOARDS ]; ///< EMSTAT board read. static COND_SENSOR_STATUS_T condSensorStatus[ NUM_OF_CONDUCTIVITY_SENSORS ]; ///< Conductivity sensors status. - -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 ); static void calcRORejectionRatio( void ); -static void processCPiCPoSensorRead( U32 sensorId, U32 fgpaRead, U08 fpgaReadCount, U08 fpgaErrorCount, U08 fpgaSensorFault ); +static void processCPiCPoSensorRead( U32 sensorId, U08 emstatBoardSensorIndex, U32 fgpaRead, U08 fpgaReadCount, U08 fpgaErrorCount, U08 fpgaSensorFault ); static U32 prefixStrToSIFactor( U08 prefix ); -static void processMeasurementDataPackage( U32 sensorId ); // TODO remove -static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ); // TODO remove -static void processNewEmstatSensorRead( CONDUCTIVITY_SENSORS_T sensor, U16 fpgaReadCount, U08 fpgaErrorCount ); // TODO remove - static void processEmstatBoard( EMSTAT_BOARD_T board ); static void processEmstatSensorRead( EMSTAT_READ_T* readPackage, U08 emstatByte, U16 fpgaReadCount, U08 fpgaErrorCount ); -static void processEmstatMeasurementDataPackage( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackage ); +static void processEmstatMeasurementDataPackets( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackets ); static F32 getCalibrationAppliedConductivityValue( U32 sensorId, F32 compensatedValue ); /*********************************************************************//** @@ -182,22 +156,10 @@ { U08 i; roRejectionRatio = 0.0; - packageIndex = 0U; - packageStarted = FALSE; condDataPublishCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( i = 0; i < NUM_OF_CONDUCTIVITY_SENSORS; i++ ) { - // TODO remove - 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; - // TODo remove - memset( &condSensorStatus[ i ], 0x0, sizeof( COND_SENSOR_STATUS_T ) ); benignPolynomialCalRecord( &condSensorsCalRecord.condSensors[ i ] ); } @@ -220,8 +182,9 @@ emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CD2_SENSOR; emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrTempSnsr = TEMPSENSORS_CONDUCTIVITY_SENSOR_2; - setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); // TODO can we leave this here? - setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); // TODO can we leave this here? + // For V3 conductivity sensors + setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); + setFPGACPoProbeType( COND_CPO_SENSOR_PROBE_TYPE ); 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 ); @@ -248,42 +211,39 @@ getNVRecord2Driver( GET_CAL_CONDUCTIVITY_SENSORS, (U08*)&condSensorsCalRecord, sizeof( condSensorsCalRecord ), NUM_OF_CAL_DATA_COND_SENSORS, ALARM_ID_DG_COND_SENSORS_INVALID_CAL_RECORD ); } -#ifndef ENABLE_DVT_BOARD - processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); - processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPO_SENSOR, getFPGACPo(), getFPGACPoReadCount(), getFPGACPoErrorCount(), getFPGACPoFault() ); -#endif - //processCD1CD2EmstatSensorRead( getFPGAEmstatCD1CD2RxFifoCount(), getFPGAEmstatCD1CD2RxErrCount() ); - //processCD1CD2EmstatSensorRead( getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); - //processNewEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCD1CD2RxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); // TODO can this be replacing the top function? - //processNewEmstatSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, getFPGAEmstatCPiCPoRxFifoCount(), getFPGAEmstatCPiCPoRxErrCount() ); - //processEmstatBoard( EMSTAT_CPI_CPO_BOARD ); +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_ENABLE_V3_SYSTEM ) ) + { + processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPI_SENSOR, EMSTAT_CPI_OR_CD1_INDEX, getFPGACPi(), getFPGACPiReadCount(), getFPGACPiErrorCount(), getFPGACPiFault() ); + processCPiCPoSensorRead( CONDUCTIVITYSENSORS_CPO_SENSOR, EMSTAT_CPO_OR_CD2_INDEX, getFPGACPo(), getFPGACPoReadCount(), getFPGACPoErrorCount(), getFPGACPoFault() ); + } + else +#endif + { + processEmstatBoard( EMSTAT_CPI_CPO_BOARD ); + } processEmstatBoard( EMSTAT_CD1_CD2_BOARD ); if ( ++condDataPublishCounter >= getU32OverrideValue( &conductivityDataPublishInterval ) ) { CONDUCTIVITY_DATA_T data; calcRORejectionRatio(); - - condDataPublishCounter = 0; data.roRejectionRatio = roRejectionRatio; - - data.cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); - data.cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); - data.cd1 = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); - data.cd2 = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); - - data.cpiRaw = rawConductivityValues[ CONDUCTIVITYSENSORS_CPI_SENSOR ]; - data.cpoRaw = rawConductivityValues[ CONDUCTIVITYSENSORS_CPO_SENSOR ]; - data.cd1Raw = rawConductivityValues[ CONDUCTIVITYSENSORS_CD1_SENSOR ]; - data.cd2Raw = rawConductivityValues[ CONDUCTIVITYSENSORS_CD2_SENSOR ]; - - data.cpiSensorStatus = sensorStatus[ CONDUCTIVITYSENSORS_CPI_SENSOR ]; - data.cpoSensorStatus = sensorStatus[ CONDUCTIVITYSENSORS_CPO_SENSOR ]; - data.cd1SensorStatus = sensorStatus[ CONDUCTIVITYSENSORS_CD1_SENSOR ]; - data.cd2SensorStatus = sensorStatus[ CONDUCTIVITYSENSORS_CD2_SENSOR ]; - + data.cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + data.cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); + data.cd1 = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); + data.cd2 = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); + data.cpiRaw = condSensorStatus[ CONDUCTIVITYSENSORS_CPI_SENSOR ].rawCondValue; + data.cpoRaw = condSensorStatus[ CONDUCTIVITYSENSORS_CPO_SENSOR ].rawCondValue; + data.cd1Raw = condSensorStatus[ CONDUCTIVITYSENSORS_CD1_SENSOR ].rawCondValue; + data.cd2Raw = condSensorStatus[ CONDUCTIVITYSENSORS_CD2_SENSOR ].rawCondValue; + data.cpiSensorStatus = condSensorStatus[ CONDUCTIVITYSENSORS_CPI_SENSOR ].sensorStatus; + data.cpoSensorStatus = condSensorStatus[ CONDUCTIVITYSENSORS_CPO_SENSOR ].sensorStatus; + data.cd1SensorStatus = condSensorStatus[ CONDUCTIVITYSENSORS_CD1_SENSOR ].sensorStatus; + data.cd2SensorStatus = condSensorStatus[ CONDUCTIVITYSENSORS_CD2_SENSOR ].sensorStatus; + condDataPublishCounter = 0; broadcastData( MSG_ID_DG_CONDUCTIVITY_DATA, COMM_BUFFER_OUT_CAN_DG_BROADCAST, (U08*)&data, sizeof( CONDUCTIVITY_DATA_T ) ); } } @@ -390,9 +350,10 @@ if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { + // NOTE: the compensated value is set into a local variable and then passed to the override function + // to prevent memory failure OVERRIDE_F32_T value = condSensorStatus[ sensorId ].compensatedCondValue; - //result = getF32OverrideValue( &compensatedConductivityValues[ sensorId ] ); // TODO remove - result = getF32OverrideValue( &value ); + result = getF32OverrideValue( &value ); } else { @@ -431,9 +392,8 @@ *************************************************************************/ static void calcRORejectionRatio( void ) { - F32 const cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); - F32 const cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); - + F32 cpi = getConductivityValue( CONDUCTIVITYSENSORS_CPI_SENSOR ); + F32 cpo = getConductivityValue( CONDUCTIVITYSENSORS_CPO_SENSOR ); roRejectionRatio = RO_REJECTION_RATIO_OUT_OF_RANGE_VALUE; if ( fabs(cpi) >= NEARLY_ZERO ) @@ -450,52 +410,52 @@ * @details Inputs: none * @details Outputs: none * @param sensorId Conductivity sensor id to process + * @param emstatBoardSensorIndex the sensor index number on an EMSTAT board * @param fgpaRead FPGA conductivity reading value * @param fpgaReadCount FPGA read count * @param fpgaErrorCount FPGA error count * @param fpgaSensorFault FPGA sensor fault * @return none *************************************************************************/ -static void processCPiCPoSensorRead( U32 sensorId, U32 fgpaRead, U08 fpgaReadCount, U08 fpgaErrorCount, U08 fpgaSensorFault ) +static void processCPiCPoSensorRead( U32 sensorId, U08 emstatBoardSensorIndex, U32 fgpaRead, U08 fpgaReadCount, U08 fpgaErrorCount, U08 fpgaSensorFault ) { if ( ( 0 == fpgaErrorCount ) && ( 0 == fpgaSensorFault ) ) { - if ( ( readCount[ sensorId ] != fpgaReadCount ) ) + if ( ( condSensorStatus[ sensorId ].readCount != fpgaReadCount ) ) { - F32 temperature = getTemperatureValue( associateTempSensor[ sensorId ] ); + // The corresponding temperature sensor of a conductivity sensor is maintained in the EMSTAT boards' structure since the + // EMSTAT sensors will be the permanent sensors from DVT onward. + F32 temperature = getTemperatureValue( emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ emstatBoardSensorIndex ].condSnsrTempSnsr ); F32 conductivity = ( (F32)( fgpaRead ) / COND_SENSOR_DECIMAL_CONVERSION ); F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); - readCount[ sensorId ] = fpgaReadCount; - internalErrorCount[ sensorId ] = 0; - compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CPi and CPo + condSensorStatus[ sensorId ].readCount = fpgaReadCount; + condSensorStatus[ sensorId ].internalErrorCount = 0; + condSensorStatus[ sensorId ].compensatedCondValue.data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); + condSensorStatus[ sensorId ].rawCondValue = conductivity; // store raw conductivity data from CPi and CPo } else { - ++internalErrorCount[ sensorId ]; - if ( internalErrorCount[ sensorId ] > MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ) + if ( ++condSensorStatus[ sensorId ].internalErrorCount > MAX_ALLOWED_UNCHANGED_CONDUCTIVITY_READS ) { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_COND_SENSOR_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { -#ifndef ENABLE_DVT_BOARD - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); // TODO for DVT testing -#endif + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); } } } } else { - if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) // TODO remove time windowed { #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_COND_SENSOR_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); // TODO for DVT testing + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); } } } @@ -533,172 +493,12 @@ /*********************************************************************//** * @brief - * The processMeasurementDataPackage function processes incoming measurement data - * package variables from Emstat Pico and convert it to conductivity. The conductivity - * value is then compensated based on associating temperature sensor's value. - * @details Inputs: none - * @details Outputs: none - * @param sensorId Conductivity sensor id to process + * The processEmstatBoard function processes the Emsat boards + * @details Inputs: emstatBoardRead + * @details Outputs: emstatBoardRead + * @param board the enum of the Emstat board * @return none *************************************************************************/ -static void processMeasurementDataPackage( U32 sensorId ) -{ - //EMSTAT_VARIABLE_T const * const measurementPtr = (EMSTAT_VARIABLE_T *)&package; // TODO remove - EMSTAT_VARIABLE_T* measurementPtr; - - 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 ] ); - F32 conductivity = ( 1.0 / resistance * SIEMENS_TO_MICROSIEMENS_CONVERSION ); - F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); - - internalErrorCount[ sensorId ] = 0; - compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - rawConductivityValues[ sensorId ] = conductivity; // store raw conductivity data from CD1 and CD2 - - // Clear the alarm - 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, sensorStatus[ sensorId ], EMSTAT_PICO_GOOD_STATUS ); -#endif - } - - 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 ); - } - } - else - { - internalErrorCount[ sensorId ] = 0; - } -} - -/*********************************************************************//** - * @brief - * The processCD1CD2SensorRead function checks if there is an error with Emstat - * conductivity sensors. If there is any error with the Emstat conductivity sensors, - * 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 fpgaErrorCount FPGA error count - * @return none - *************************************************************************/ -static void processCD1CD2EmstatSensorRead( U16 fpgaReadCount, U08 fpgaErrorCount ) -{ - if ( 0 == fpgaErrorCount ) - { - if ( ( fpgaReadCount > 0 ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) ) - { - U08 emstatByte = getFPGAEmstatCD1CD2OutByte(); - - switch ( emstatByte ) - { - case 'P': - packageStarted = TRUE; - packageIndex = 0; - break; - - case ';': - if ( TRUE == packageStarted ) - { - processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD1_SENSOR ); - packageIndex = 0; - } - break; - - case '\n': - if ( TRUE == packageStarted ) - { - processMeasurementDataPackage( CONDUCTIVITYSENSORS_CD2_SENSOR ); - packageStarted = FALSE; - } - break; - - default: - if ( TRUE == packageStarted ) - { - package[ packageIndex++ ] = emstatByte; - } - break; - } - } - } - else - { - if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) - { -#ifndef _RELEASE_ - 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 ); - } - } - } -} - -static void processNewEmstatSensorRead( 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; - } - } - } -} - static void processEmstatBoard( EMSTAT_BOARD_T board ) { U08 emstatByte = 0; @@ -728,6 +528,18 @@ } } +/*********************************************************************//** + * @brief + * The processEmstatSensorRead function processes the Emsat boards' data + * that is received from the boards + * @details Inputs: none + * @details Outputs: none + * @param read package the structure of each Emstat board + * @param emstatByte the received byte from the sensor + * @param fpgaReadCount the FPGA read count + * @param fpgaErrorCount the FGPA error count + * @return none + *************************************************************************/ static void processEmstatSensorRead( EMSTAT_READ_T* readPackage, U08 emstatByte, U16 fpgaReadCount, U08 fpgaErrorCount ) { switch ( emstatByte ) @@ -740,15 +552,15 @@ case ';': if ( TRUE == readPackage->packageStarted ) { - processEmstatMeasurementDataPackage( EMSTAT_CPI_OR_CD1_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); + processEmstatMeasurementDataPackets( EMSTAT_CPI_OR_CD1_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); readPackage->packageIndex = 0; } break; case '\n': if ( TRUE == readPackage->packageStarted ) { - processEmstatMeasurementDataPackage( EMSTAT_CPO_OR_CD2_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); + processEmstatMeasurementDataPackets( EMSTAT_CPO_OR_CD2_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); readPackage->packageStarted = FALSE; } break; @@ -761,50 +573,59 @@ break; } + // Only process the FPGA error and count values if the DG Software is not in the POST mode if ( getCurrentOperationMode() != DG_MODE_INIT ) { if ( ( fpgaReadCount != readPackage->fpgaPreviousCount ) && ( 0 == ( fpgaReadCount & EMSTAT_PICO_FIFO_EMPTY_MASK ) ) && ( fpgaErrorCount != readPackage->fpgaPreviousErrorCount ) ) { + // Everything is fine update the previous read with the current read readPackage->fpgaPreviousCount = fpgaReadCount; } - else if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) + else if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) // TODO remove time windowed { #ifndef _RELEASE_ 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 ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); } } } } -static void processEmstatMeasurementDataPackage( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackage ) +/*********************************************************************//** + * @brief + * The processEmstatMeasurementDataPackets function processes the Emsat boards' + * received data packets. + * @details Inputs: condSensorStatus, + * @details Outputs: condSensorStatus + * @param boardSenosrIndex the sensor index on each board (i.e CPi = 0 & CPo = 1 + * in EMSTAT_CPI_CPO_BOARD) + * @param read package the structure of each Emstat board + * @return none + *************************************************************************/ +static void processEmstatMeasurementDataPackets( U08 boardSensorIndex, EMSTAT_READ_T* readPackage, EMSTAT_VARIABLE_T* receivedPackets ) { CONDUCTIVITY_SENSORS_T sensorId = readPackage->sensors[ boardSensorIndex ].condSnsr; - condSensorStatus[ sensorId ].sensorStatus = hexStrToDec( (U08*)&receivedPackage->status, sizeof( receivedPackage->status ) ); + condSensorStatus[ sensorId ].sensorStatus = hexStrToDec( (U08*)&receivedPackets->status, sizeof( receivedPackets->status ) ); BOOL isSensorStatusBad = ( EMSTAT_PICO_GOOD_STATUS != condSensorStatus[ sensorId ].sensorStatus ? TRUE : FALSE ); if ( FALSE == isSensorStatusBad ) { - U32 prefix = prefixStrToSIFactor( receivedPackage->prefix ); - F32 resistance = ( ( F32 )( hexStrToDec( receivedPackage->value, sizeof( receivedPackage->value ) ) - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); + U32 prefix = prefixStrToSIFactor( receivedPackets->prefix ); + F32 resistance = ( ( F32 )( hexStrToDec( receivedPackets->value, sizeof( receivedPackets->value ) ) - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); F32 temperature = getTemperatureValue( readPackage->sensors[ boardSensorIndex ].condSnsrTempSnsr ); - F32 conductivity = ( 1.0 / resistance * SIEMENS_TO_MICROSIEMENS_CONVERSION ); + F32 conductivity = ( 1.0 / resistance ) * SIEMENS_TO_MICROSIEMENS_CONVERSION; F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); condSensorStatus[ sensorId ].internalErrorCount = 0; condSensorStatus[ sensorId ].compensatedCondValue.data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); condSensorStatus[ sensorId ].rawCondValue = conductivity; - - //internalErrorCount[ sensorId ] = 0; - //compensatedConductivityValues[ sensorId ].data = getCalibrationAppliedConductivityValue( sensorId, compensatedCond ); - //rawConductivityValues[ sensorId ] = conductivity; } // Check the conductivity sensors bad status alarm - checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, isSensorStatusBad, condSensorStatus[ sensorId ].sensorStatus, EMSTAT_PICO_GOOD_STATUS ); + //checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, isSensorStatusBad, condSensorStatus[ sensorId ].sensorStatus, EMSTAT_PICO_GOOD_STATUS ); // TODO DVT is reporting bad status check it if ( EMSTAT_PICO_TIMING_NOT_MET_STATUS == condSensorStatus[ sensorId ].sensorStatus ) { @@ -817,18 +638,6 @@ { condSensorStatus[ sensorId ].internalErrorCount = 0; } - - /*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 ); - } - } - else - { - internalErrorCount[ sensorId ] = 0; - }*/ } /*********************************************************************//** @@ -862,8 +671,8 @@ * @brief * The testSetConductivityOverride function overrides the compensated * conductivity value of given sensor id. - * @details Inputs: compensatedConductivityValues[] - * @details Outputs: compensatedConductivityValues[] + * @details Inputs: none + * @details Outputs: condSensorStatus * @param sensorId conductivity sensor id * @param value override compensated conductivity value * @return TRUE if override successful, FALSE if not @@ -874,11 +683,11 @@ if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { - if ( isTestingActivated() ) + if ( TRUE == isTestingActivated() ) { - result = TRUE; - compensatedConductivityValues[ sensorId ].ovData = value; - compensatedConductivityValues[ sensorId ].override = OVERRIDE_KEY; + result = TRUE; + condSensorStatus[ sensorId ].compensatedCondValue.ovData = value; + condSensorStatus[ sensorId ].compensatedCondValue.override = OVERRIDE_KEY; } } @@ -889,8 +698,8 @@ * @brief * The testResetConductivityOverride function resets the override of the * conductivity sensor value. - * @details Inputs: compensatedConductivityValues[] - * @details Outputs: compensatedConductivityValues[] + * @details Inputs: none + * @details Outputs: condSensorStatus * @param sensorId conductivity sensor id * @return TRUE if reset successful, FALSE if not *************************************************************************/ @@ -900,11 +709,11 @@ if ( sensorId < NUM_OF_CONDUCTIVITY_SENSORS ) { - if ( isTestingActivated() ) + if ( TRUE == isTestingActivated() ) { - result = TRUE; - compensatedConductivityValues[ sensorId ].ovData = compensatedConductivityValues[ sensorId ].ovInitData; - compensatedConductivityValues[ sensorId ].override = OVERRIDE_RESET; + result = TRUE; + condSensorStatus[ sensorId ].compensatedCondValue.ovData = condSensorStatus[ sensorId ].compensatedCondValue.ovInitData; + condSensorStatus[ sensorId ].compensatedCondValue.override = OVERRIDE_RESET; } } Index: firmware/App/Controllers/DialysateFlow.c =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Controllers/DialysateFlow.c (.../DialysateFlow.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/Controllers/DialysateFlow.c (.../DialysateFlow.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -90,15 +90,8 @@ { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; BOOL calStatus = getNVRecord2Driver( GET_CAL_FLOW_SENSORS, (U08*)&flowSensorsCalRecord, sizeof( DG_FLOW_SENSORS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_FLOW_SENSORS, ALARM_ID_DG_FLOW_SENSORS_INVALID_CAL_RECORD ); - if ( TRUE == calStatus ) - { - result = SELF_TEST_STATUS_PASSED; - } - else - { - result = SELF_TEST_STATUS_FAILED; - } + NUM_OF_CAL_DATA_FLOW_SENSORS, ALARM_ID_DG_DIALYSATE_FLOW_SENSOR_INVALID_CAL_RECORD ); + result = ( TRUE == calStatus ? SELF_TEST_STATUS_PASSED : SELF_TEST_STATUS_FAILED ); return result; } Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r38c28a43b71d21d72906b07e9d60107b84bffb37 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 38c28a43b71d21d72906b07e9d60107b84bffb37) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -324,18 +324,9 @@ *************************************************************************/ void execDrainPumpMonitor( void ) { - U16 fpgaADCSpeedCount = getFPGADrainPumpSpeed(); + U16 fpgaADCSpeedCount = getFPGADrainPumpSpeed(); + drainPumpMeasuredRPM.data = ( DRAIN_PUMP_OFF_RPM_ADC_COUNT == fpgaADCSpeedCount ? 0 : ( CONVERSION_COEFF / fpgaADCSpeedCount ) ); - if ( DRAIN_PUMP_OFF_RPM_ADC_COUNT == fpgaADCSpeedCount ) - { - drainPumpMeasuredRPM.data = 0; - } - else - { - // Convert speed ADC to RPM - drainPumpMeasuredRPM.data = CONVERSION_COEFF / getFPGADrainPumpSpeed(); - } - #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_DRAIN_PUMP_MONITOR ) != SW_CONFIG_ENABLE_VALUE ) #endif @@ -346,9 +337,7 @@ BOOL isRPMTooHigh = ( getDrainPumpMeasuredRPM() > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, FALSE, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); -#ifndef ENABLE_DVT_BOARD - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); // TODO DVT -#endif + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); // If the off fault alarm has become active, trigger the safety shutdown if ( TRUE == isAlarmActive( ALARM_ID_DRAIN_PUMP_OFF_FAULT ) ) @@ -360,21 +349,17 @@ else if ( DRAIN_PUMP_OPEN_LOOP_STATE == drainPumpState ) { // Using abs since the read RPM can be above or below the target - U32 rpmDiff = abs( getDrainPumpTargetRPM() - getDrainPumpMeasuredRPM() ); - - // Check if RPM is out of range + U32 rpmDiff = abs( getDrainPumpTargetRPM() - getDrainPumpMeasuredRPM() ); BOOL isRPMOutOfRange = ( rpmDiff > MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ? TRUE : FALSE ); -#ifndef ENABLE_DVT_BOARD checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); // TODO DVT -#endif + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); } else { // There are not out of range conditions, clear the alarms checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_RPM_OUT_OF_RANGE, FALSE, getDrainPumpMeasuredRPM(), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); - checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); // TODO DVT + checkPersistentAlarm( ALARM_ID_DRAIN_PUMP_OFF_FAULT, FALSE, getDrainPumpMeasuredRPM(), MIN_DRAIN_PUMP_RPM ); } } Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 669f36cf32c3b500aa2fd5b08c58ee5e6b2e7f08) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -354,7 +354,7 @@ if ( TRUE == isNewCalibrationRecordAvailable() ) { getNVRecord2Driver( GET_CAL_FLOW_SENSORS, (U08*)&flowSensorsCalRecord, sizeof( DG_FLOW_SENSORS_CAL_RECORD_T ), - NUM_OF_CAL_DATA_FLOW_SENSORS, ALARM_ID_DG_FLOW_SENSORS_INVALID_CAL_RECORD ); + NUM_OF_CAL_DATA_FLOW_SENSORS, ALARM_ID_DG_RO_FLOW_SENSOR_INVALID_CAL_RECORD ); } // Read flow at the control set Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -19,6 +19,7 @@ #include "FPGA.h" #include "MessageSupport.h" +#include "OperationModes.h" #include "PersistentAlarm.h" #include "SystemCommMessages.h" #include "TemperatureSensors.h" @@ -35,11 +36,11 @@ // ********** private definitions ********** #define PRIMARY_HEATER_EXT_TEMP_SENSORS_GAIN 8U ///< Primary heater external temperature sensors gain. -#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 20000//*/19600U // 20000 for dvt ///< Primary heater external temperature sensors reference resistance. +#define PRIMARY_HEATER_EXT_TEMP_SENSORS_REF_RESISTANCE 19600U // 20000 for dvt ///< Primary heater external temperature sensors reference resistance. #define PRIMARY_HEATER_EXT_TEMP_SENSORS_0_DEGREE_RESISTANCE 1000U ///< Primary heater external temperature sensors zero degree resistance. #define COND_SENSORS_TEMP_SENSOR_GAIN 8U ///< Temperature sensor for conductivity gain. -#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 20000///19600U ///< Temperature sensor for conductivity reference resistance. +#define COND_SENSORS_TEMP_SENSOR_REF_RESISTANCE 19600U // 20000 for dvt ///< Temperature sensor for conductivity reference resistance. #define COND_SENSORS_TEMP_SENSOR_0_DEGREE_RESISTANCE 1000U ///< Temperature sensor for conductivity zero degree resistance. #define TRIMMER_HEATER_EXT_TEMP_SENSORS_GAIN 32U ///< Trimmer heater external temperature sensors gain. @@ -940,11 +941,10 @@ F32 temperature = getTemperatureValue( sensorIndex ); // Check both temperature and to be in range - if ( ( temperature < TEMP_SENSORS_MIN_ALLOWED_DEGREE_C ) || ( temperature > tempSensors[ sensorIndex ].maxAllowedTemp ) ) + if ( ( ( temperature < TEMP_SENSORS_MIN_ALLOWED_DEGREE_C ) || ( temperature > tempSensors[ sensorIndex ].maxAllowedTemp ) ) && + ( getCurrentOperationMode() != DG_MODE_INIT ) ) { -#ifndef ENABLE_DVT_BOARD checkPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSOR_OUT_OF_RANGE, TRUE, sensorIndex, temperature ); -#endif } } } Index: firmware/App/DGCommon.h =================================================================== diff -u -r224b86c0847207c168d38fa1713a1e9116642267 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 224b86c0847207c168d38fa1713a1e9116642267) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -36,13 +36,10 @@ // #define TASK_TIMING_OUTPUT_ENABLED 1 // Build switch // re-purposes drain pump enable pin for task timing #define DISABLE_ACK_ALARM 1 // Build switch #define THD_USING_TRO_CONNECTOR 1 // Build switch - #define DISABLE_COND_STATUS_CHECK 1 // Build switch // #define EMC_TEST_BUILD 1 // Build switch - #define DISABLE_RTC_CONFIG 1 // Not needed TODO investigate and remove +// #define ENABLE_DVT_BOARD 1 // TODo can we make this a sw config? TODO remove - #define ENABLE_DVT_BOARD 1 // TODo can we make this a sw config? TODO remove - #include #include #endif Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r0d94694b64f936805dd6c2f71fde1840bc9c1311 -rbcf9339af8a725054a8c936ae572bb95e2bcd3f0 --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 0d94694b64f936805dd6c2f71fde1840bc9c1311) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision bcf9339af8a725054a8c936ae572bb95e2bcd3f0) @@ -1632,11 +1632,7 @@ *************************************************************************/ U08 getFPGACPiFault( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPiFault; -#else - return 0; -#endif } /*********************************************************************//** @@ -1648,11 +1644,7 @@ *************************************************************************/ U08 getFPGACPiReadCount( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPiReadCnt; -#else - return 0; -#endif } /*********************************************************************//** @@ -1664,11 +1656,7 @@ *************************************************************************/ U08 getFPGACPiErrorCount( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPiErrorCnt; -#else - return 0; -#endif } /*********************************************************************//** @@ -1692,11 +1680,7 @@ *************************************************************************/ U08 getFPGACPoFault( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPoFault; -#else - return 0; -#endif } /*********************************************************************//** @@ -1708,11 +1692,7 @@ *************************************************************************/ U08 getFPGACPoReadCount( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPoReadCnt; -#else - return 0; -#endif } /*********************************************************************//** @@ -1725,11 +1705,7 @@ *************************************************************************/ U08 getFPGACPoErrorCount( void ) { -#ifndef ENABLE_DVT_BOARD return fpgaSensorReadings.fpgaCPoErrorCnt; -#else - return 0; -#endif } /*********************************************************************//**