Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r55c11d87989243f1d755d06910529214db4f7312 -r83b12013a84403fe4d7d6f70b516d623bfb2fcfd --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 55c11d87989243f1d755d06910529214db4f7312) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 83b12013a84403fe4d7d6f70b516d623bfb2fcfd) @@ -99,6 +99,7 @@ CONDUCTIVITY_SENSORS_T condSnsr; ///< Emstat conductivity sensor on the board. TEMPERATURE_SENSORS_T condSnsrTempSnsr; ///< Emstat conductivity sensor temperature sensor. ALARM_ID_T condSnsrHex2StrAlarm; ///< Emstat conductivity sensor hex to string alarm. + U32 invalidCharCounter; } EMSTAT_COND_SENSORS_T; /// Emstat board structure @@ -108,6 +109,8 @@ U08 packageIndex; ///< Emstat package index number. U08 package[ EMSTAT_PACKAGE_BUFFER_SIZE ]; ///< Emstat read buffer package. EMSTAT_COND_SENSORS_T sensors[ EMSTAT_NUM_OF_SENSORS_PER_BOARD ]; ///< Emstat conductivity and corresponding temperature sensors. + U08 packetIndex; + U08 packetData[100]; } EMSTAT_READ_T; /// Conductivity sensors structure @@ -118,6 +121,7 @@ OVERRIDE_F32_T compensatedCondValue; ///< Conductivity sensor compensated value F32 rawCondValue; ///< Conductivity sensor raw value. U32 sensorStatus; ///< Conductivity sensor status. + U32 rawEmstatCondValue; ///< Conductivity sensor from Emstat. } COND_SENSOR_STATUS_T; #pragma pack(pop) @@ -181,16 +185,22 @@ emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CPI_SENSOR; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsrTempSnsr = TEMPSENSORS_INLET_PRIMARY_HEATER; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsrHex2StrAlarm = ALARM_ID_DG_CPI_COND_SENSOR_INVALID_CHAR; + emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].invalidCharCounter = 0; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CPO_SENSOR; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrTempSnsr = TEMPSENSORS_OUTLET_PRIMARY_HEATER; emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrHex2StrAlarm = ALARM_ID_DG_CPO_COND_SENSOR_INVALID_CHAR; + emstatBoardRead[ EMSTAT_CPI_CPO_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].invalidCharCounter = 0; + + // CD1/CD2 Emstat board conductivity sensors and their corresponding temperature sensors emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsr = CONDUCTIVITYSENSORS_CD1_SENSOR; emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsrTempSnsr = TEMPSENSORS_CONDUCTIVITY_SENSOR_1; emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].condSnsrHex2StrAlarm = ALARM_ID_DG_CD1_COND_SENSOR_INVALID_CHAR; + emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPI_OR_CD1_INDEX ].invalidCharCounter = 0; 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; emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].condSnsrHex2StrAlarm = ALARM_ID_DG_CD2_COND_SENSOR_INVALID_CHAR; + emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ].sensors[ EMSTAT_CPO_OR_CD2_INDEX ].invalidCharCounter = 0; // For V3 conductivity sensors setFPGACPiProbeType( COND_CPI_SENSOR_PROBE_TYPE ); @@ -516,18 +526,29 @@ static void processEmstatBoard( EMSTAT_BOARD_T board ) { U08 emstatByte = 0; -// U08 fpgaErrorCount = 0; U16 rxFifoCount = 0; + static U32 maxRxFifoCount = 0; + static U32 numRxFifoEmpty = 0; + static U32 numRxFifoCheck = 0; switch ( board ) { // TODO should check Rx FIFO to see if a character exists? case EMSTAT_CPI_CPO_BOARD: // Check for continuous incoming bytes - rxFifoCount = getFPGAEmstatCPiCPoRxFifoCount(); + rxFifoCount = getFPGAEmstatCPiCPoRxFifoCount() & 0x7FFF; + numRxFifoCheck++; + if (numRxFifoCheck == 10000) + { + maxRxFifoCount = 0; + numRxFifoEmpty = 0; + } + if (rxFifoCount > maxRxFifoCount) maxRxFifoCount = rxFifoCount; + if (rxFifoCount == 0) numRxFifoEmpty++; + checkFPGAPersistentAlarms( FPGA_PERS_ERROR_CPI_CPO_COND_SENSORS, rxFifoCount ); - // Only process the sensor read if there is a new byteendif + // Only process the sensor read if there is a new byte if ( 0 != rxFifoCount ) { emstatByte = getFPGAEmstatCPiCPoByteOut(); @@ -537,11 +558,11 @@ case EMSTAT_CD1_CD2_BOARD: // Check for continuous incoming bytes - rxFifoCount = getFPGAEmstatCD1CD2RxFifoCount(); + rxFifoCount = getFPGAEmstatCD1CD2RxFifoCount() & 0x7FFF;; checkFPGAPersistentAlarms( FPGA_PERS_ERROR_CD1_CD2_COND_SENSORS, rxFifoCount ); // Only process the sensor read if there is a new byte - if ( 0 != rxFifoCount) + if ( 0 != rxFifoCount) { emstatByte = getFPGAEmstatCD1CD2OutByte(); processEmstatSensorRead( &emstatBoardRead[ EMSTAT_CD1_CD2_BOARD ], emstatByte ); @@ -569,15 +590,21 @@ switch ( emstatByte ) { case 'P': - readPackage->packageStarted = TRUE; - readPackage->packageIndex = 0; + if ( FALSE == readPackage->packageStarted) + { + readPackage->packageStarted = TRUE; + readPackage->packageIndex = 0; + readPackage->packetIndex = 0; + readPackage->packetData[readPackage->packetIndex++] = emstatByte; + } break; case ';': if ( TRUE == readPackage->packageStarted ) { processEmstatMeasurementDataPackets( EMSTAT_CPI_OR_CD1_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); readPackage->packageIndex = 0; + readPackage->packetData[readPackage->packetIndex++] = emstatByte; } break; @@ -586,14 +613,18 @@ { processEmstatMeasurementDataPackets( EMSTAT_CPO_OR_CD2_INDEX, readPackage, (EMSTAT_VARIABLE_T*)readPackage->package ); readPackage->packageStarted = FALSE; + readPackage->packetData[readPackage->packetIndex++] = emstatByte; } break; default: if ( TRUE == readPackage->packageStarted ) { - if (readPackage->package[ readPackage->packageIndex ] < EMSTAT_PACKAGE_BUFFER_SIZE ) - readPackage->package[ readPackage->packageIndex++ ] = emstatByte; + readPackage->packetData[readPackage->packetIndex++] = emstatByte; + if (readPackage->packageIndex < EMSTAT_PACKAGE_BUFFER_SIZE ) + { + readPackage->package[ readPackage->packageIndex++ ] = emstatByte; + } } break; } @@ -615,15 +646,19 @@ CONDUCTIVITY_SENSORS_T sensorId = readPackage->sensors[ boardSensorIndex ].condSnsr; BOOL convStatus = hexStrToDec( (U08*)&receivedPackets->status, &condSensorStatus[ sensorId ].sensorStatus, sizeof( receivedPackets->status ) ); - BOOL isSensorStatusBad = ( EMSTAT_PICO_STATUS_TIMING_NOT_MET == condSensorStatus[ sensorId ].sensorStatus ? TRUE : FALSE ); + BOOL isSensorStatusBad = ( EMSTAT_PICO_STATUS_OK == condSensorStatus[ sensorId ].sensorStatus ? FALSE : TRUE ); ALARM_ID_T badHexAlarm = readPackage->sensors[ boardSensorIndex ].condSnsrHex2StrAlarm; BOOL isConvNotValid = FALSE; if ( FALSE == isSensorStatusBad ) { U32 prefix = prefixStrToSIFactor( receivedPackets->prefix ); - convStatus = hexStrToDec( receivedPackets->value, &condSensorStatus[ sensorId ].sensorStatus, sizeof( receivedPackets->value ) ); - F32 resistance = ( ( F32 )( condSensorStatus[ sensorId ].sensorStatus - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); + convStatus = hexStrToDec( receivedPackets->value, &condSensorStatus[ sensorId ].rawEmstatCondValue, sizeof( receivedPackets->value ) ); + if (FALSE == convStatus) + { + readPackage->sensors[ boardSensorIndex ].invalidCharCounter++; + } + F32 resistance = ( ( F32 )( condSensorStatus[ sensorId ].rawEmstatCondValue - EMSTAT_PICO_MEASUREMENT_OFFSET ) / prefix ); F32 temperature = getTemperatureValue( readPackage->sensors[ boardSensorIndex ].condSnsrTempSnsr ); F32 conductivity = ( 1.0F / resistance ) * SIEMENS_TO_MICROSIEMENS_CONVERSION; F32 compensatedCond = calcCompensatedConductivity( conductivity, temperature ); @@ -639,11 +674,11 @@ checkPersistentAlarm( ALARM_ID_DG_CONDUCTIVITY_SENSOR_BAD_STATUS, isSensorStatusBad, condSensorStatus[ sensorId ].sensorStatus, EMSTAT_PICO_STATUS_TIMING_NOT_MET ); - if ( EMSTAT_PICO_STATUS_TIMING_NOT_MET == condSensorStatus[ sensorId ].sensorStatus ) + if ( EMSTAT_PICO_STATUS_OK != condSensorStatus[ sensorId ].sensorStatus ) { if ( ++condSensorStatus[ sensorId ].internalErrorCount > MAX_CONDUCTIVITY_SENSOR_FAILURES ) { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, sensorId, condSensorStatus[ sensorId ].sensorStatus ); } } else Index: firmware/App/Controllers/Voltages.c =================================================================== diff -u -r6499ea25921fcf67826fa0c35bb03caf411ba542 -r83b12013a84403fe4d7d6f70b516d623bfb2fcfd --- firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 6499ea25921fcf67826fa0c35bb03caf411ba542) +++ firmware/App/Controllers/Voltages.c (.../Voltages.c) (revision 83b12013a84403fe4d7d6f70b516d623bfb2fcfd) @@ -315,30 +315,30 @@ *************************************************************************/ static void checkVoltageRanges( void ) { - U32 i; + MONITORED_VOLTAGES_T channel; // Check range - for ( i = 0; i <= MONITORED_LINE_LAST_RANGE_CHECKED_LINE; i++ ) + for ( channel = 0; channel <= MONITORED_LINE_LAST_RANGE_CHECKED_LINE; channel++ ) { - F32 volts = getMonitoredLineLevel( (MONITORED_VOLTAGES_T)i ); + F32 volts = getMonitoredLineLevel( channel ); - if ( volts > MAX_VOLTAGES[ i ] ) + if ( volts > MAX_VOLTAGES[ channel ] ) { - if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + if ( ++voltageAlarmPersistenceCtr[ channel ] > VOLTAGES_ALARM_PERSISTENCE ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32) channel, volts ) } } - else if ( volts < MIN_VOLTAGES[ i ] ) + else if ( volts < MIN_VOLTAGES[ channel ] ) { - if ( ++voltageAlarmPersistenceCtr[ i ] > VOLTAGES_ALARM_PERSISTENCE ) + if ( ++voltageAlarmPersistenceCtr[ channel ] > VOLTAGES_ALARM_PERSISTENCE ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32)i, volts ) + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_VOLTAGE_OUT_OF_RANGE, (F32) channel, volts ) } } else { - voltageAlarmPersistenceCtr[ i ] = 0; + voltageAlarmPersistenceCtr[ channel ] = 0; } } } Index: firmware/App/Services/FPGA.c =================================================================== diff -u -r55c11d87989243f1d755d06910529214db4f7312 -r83b12013a84403fe4d7d6f70b516d623bfb2fcfd --- firmware/App/Services/FPGA.c (.../FPGA.c) (revision 55c11d87989243f1d755d06910529214db4f7312) +++ firmware/App/Services/FPGA.c (.../FPGA.c) (revision 83b12013a84403fe4d7d6f70b516d623bfb2fcfd) @@ -835,44 +835,58 @@ checkFPGACommFailure(); } } + else + { + // Not an ACK + checkFPGACommFailure(); + } } else { // Timeout - communication error checkFPGACommFailure(); } - // if bulk read command is ACK'd, collect the readings - if ( TRUE == fpgaReadCommandResponseReceived ) + /* If the write command response (ACK) was not received, the read response + * was not issued. If this is the case the read response will also + * timeout. For FPGA V&V testing this will cause two timeouts to occur. + * The V&V expectation is that when the timeout test is executed a + * single timeout will occur. + */ + if ( TRUE == fpgaWriteCommandResponseReceived ) { - // did FPGA Ack the read command? - if ( fpgaReadResponseBuffer[ 0 ] == FPGA_READ_CMD_ACK ) + // if bulk read command is ACK'd, collect the readings + if ( TRUE == fpgaReadCommandResponseReceived ) { - U32 rspSize = FPGA_READ_RSP_HDR_LEN + fpgaReadByteSize; - U32 crcPos = rspSize; - U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[ crcPos ], fpgaReadResponseBuffer[ crcPos + 1 ] ); - - // does the FPGA response CRC check out? - if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) + // did FPGA ACK the read command? + if ( fpgaReadResponseBuffer[ 0 ] == FPGA_READ_CMD_ACK ) { - // capture the read values - memcpy( &fpgaSensorReadings, &fpgaReadResponseBuffer[ FPGA_READ_RSP_HDR_LEN ], fpgaReadByteSize ); - result = FPGA_STATE_WRITE_ALL_ACTUATORS; + U32 rspSize = FPGA_READ_RSP_HDR_LEN + fpgaReadByteSize; + U32 crcPos = rspSize; + U16 crc = MAKE_WORD_OF_BYTES( fpgaReadResponseBuffer[ crcPos ], fpgaReadResponseBuffer[ crcPos + 1 ] ); + + // does the FPGA response CRC check out? + if ( crc == crc16( fpgaReadResponseBuffer, rspSize ) ) + { + // capture the read values + memcpy( &fpgaSensorReadings, &fpgaReadResponseBuffer[ FPGA_READ_RSP_HDR_LEN ], fpgaReadByteSize ); + result = FPGA_STATE_WRITE_ALL_ACTUATORS; + } + else // bad CRC + { + checkFPGACommFailure(); + } } - else // bad CRC + else // read command was NAK'd { checkFPGACommFailure(); - } + } } - else // read command was NAK'd + else // no response to read command { checkFPGACommFailure(); } } - else // no response to read command - { - checkFPGACommFailure(); - } // There should not be any data received at this time consumeUnexpectedData();