diff --git a/developHw.pro.user b/developHw.pro.user index 1620762..4af91ac 100644 --- a/developHw.pro.user +++ b/developHw.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/include/model/hardware/core/lowLevelApi/TrxBoard.h b/include/model/hardware/core/lowLevelApi/TrxBoard.h index ca7e339..260e686 100644 --- a/include/model/hardware/core/lowLevelApi/TrxBoard.h +++ b/include/model/hardware/core/lowLevelApi/TrxBoard.h @@ -55,6 +55,7 @@ private: QList _afeModuleOffset; QList _fpgaOffset; QByteArray _eepromCrc; + QList> _systemLut; const quint32 _offsetSlave0; const quint32 _offsetSlave1; const quint32 _offsetSlave2; @@ -169,6 +170,14 @@ private: void scenParamsFilling(eScenParams cmd); //QList signedVector2unsignedList(QVector& sgnVec); + QList systemStructure2List(systemE2proms &systemRoms); + void systemLutCompletion(void); + void systemCompare(QList &system) const; + void crcCheck (const QByteArray array, quint8 crcRom) const; + void trxCrcCheck(const QByteArray array, quint32 offset) const; + void prbCtrlCrcCheck(const QByteArray array, quint32 offset) const; + void mpsCrcCheck(const QByteArray array, quint32 offset) const; + #ifndef DEVELOP_UI void afeAdcsSync(const quint8& slaveMounted); void gtReadReset(void); @@ -254,6 +263,9 @@ public: quint32 deviceId(void) const; quint32 vendorId(void) const; + void checkSystemCompatibility(void); + quint8 crcGenerator(QByteArray inputByteArray) const; + QByteArray trxRomHeader(void) const; QByteArray trxRomId(void) const; QByteArray trxRomPid(void) const; diff --git a/include/model/hardware/core/lowLevelApi/TrxBoardUtils/TrxBoardStructures.h b/include/model/hardware/core/lowLevelApi/TrxBoardUtils/TrxBoardStructures.h index 27119d1..13fb2ff 100644 --- a/include/model/hardware/core/lowLevelApi/TrxBoardUtils/TrxBoardStructures.h +++ b/include/model/hardware/core/lowLevelApi/TrxBoardUtils/TrxBoardStructures.h @@ -41,7 +41,6 @@ struct EepromStatus quint32 boardSerialNumber; quint32 firstMbedCodeVersion; quint32 secondMbedCodeVersion; - quint16 crc16; quint8 errorCode; }; diff --git a/include/model/hardware/core/lowLevelApi/TrxBoardUtils/e2promFormat.h b/include/model/hardware/core/lowLevelApi/TrxBoardUtils/e2promFormat.h index 0d1965e..f11bc5c 100644 --- a/include/model/hardware/core/lowLevelApi/TrxBoardUtils/e2promFormat.h +++ b/include/model/hardware/core/lowLevelApi/TrxBoardUtils/e2promFormat.h @@ -2,27 +2,37 @@ #define E2PROMFORMAT_H #include +#include "TrxBoardStructures.h" + +#define CRC_POLYNOMIAL 0x07 // x^8 + x^2 + x + 1 +#define CRC8_BYTE_NUMBER 1U #define EEPROM_HEADER_BEGIN 0U #define EEPROM_HEADER_NUMBER 3U #define EEPROM_ID_BEGIN 19U #define EEPROM_ID_NUMBER 2U +#define EEPROM_ID_CRC 21U -#define EEPROM_PID_BEGIN 21U +#define EEPROM_PID_BEGIN 22U #define EEPROM_PID_NUMBER 2U +#define EEPROM_PID_CRC 24U -#define EEPROM_PCB_VERSION_BEGIN 23U +#define EEPROM_PCB_VERSION_BEGIN 25U #define EEPROM_PCB_VERSION_NUMBER 2U +#define EEPROM_PCB_VERSION_CRC 27U -#define EEPROM_BOARD_SERIAL_NO_BEGIN 25U +#define EEPROM_BOARD_SERIAL_NO_BEGIN 28U #define EEPROM_BOARD_SERIAL_NO_NUMBER 4U +#define EEPROM_BOARD_SERIAL_NO_CRC 32U -#define EEPROM_FIRST_MBED_CODE_VERSION_BEGIN 29U +#define EEPROM_FIRST_MBED_CODE_VERSION_BEGIN 33U #define EEPROM_FIRST_MBED_CODE_VERSION_NUMBER 4U +#define EEPROM_FIRST_MBED_CODE_VERSION_CRC 37U -#define EEPROM_SECOND_MBED_CODE_VERSION_BEGIN 33U +#define EEPROM_SECOND_MBED_CODE_VERSION_BEGIN 38U #define EEPROM_SECOND_MBED_CODE_VERSION_NUMBER 4U +#define EEPROM_SECOND_MBED_CODE_VERSION_CRC 42U #define EEPROM_INFO_BEGIN 30U #define EEPROM_INFO_NUMBER 100U @@ -30,7 +40,6 @@ #define EEPROM_IMPULSE_RESPONSE_BEGIN 428U #define EEPROM_IMPULSE_RESPONSE_NUMBER 1024U - #define EEPROM_CRC_BEGIN 0U #define EEPROM_CRC_NUMBER 19U @@ -40,9 +49,16 @@ const QByteArray headerArray = QByteArray::fromHex("AA55F0"); const quint32 trxId = 0x1030; -const quint32 prbCntlId = 0x1020; +const quint32 prbCtrlId = 0x1020; const quint32 mpsId = 0x1010; const quint32 pid = 0x0001; +struct systemE2proms +{ + EepromStatus trx; + EepromStatus prbCtrl; + EepromStatus mps; +}; + #endif // E2PROMFORMAT_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 4196d53..bb57cf3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2998,21 +2998,26 @@ QString bigEndianByteArray2Str(QByteArray btArr, int base) QByteArray str2BigEndianByteArray4SerialNo(QString str) { - QStringRef strByte1(&str, 0, 2); - QStringRef strByte2(&str, 2, 2); - QStringRef strByte34(&str, 4, 3); + if(str.length() == 7) + { + QStringRef strByte1(&str, 0, 2); + QStringRef strByte2(&str, 2, 2); + QStringRef strByte34(&str, 4, 3); - QByteArray qbInt; + QByteArray qbInt; - qbInt.append(static_cast(strByte1.toInt())); - qbInt.append(static_cast(strByte2.toInt())); + qbInt.append(static_cast(strByte1.toInt())); + qbInt.append(static_cast(strByte2.toInt())); - for(qint8 i = 1; i >= 0; i--) - { - qbInt.append(static_cast(((strByte34.toShort()) >> (i*8)) & 0xFF)); - } + for(qint8 i = 1; i >= 0; i--) + { + qbInt.append(static_cast(((strByte34.toShort()) >> (i*8)) & 0xFF)); + } - return qbInt; + return qbInt; + } + else + throw SonoException("Invalid board serial number."); } QString bigEndianByteArray2Str4SerialNo(QByteArray btArr) @@ -3085,15 +3090,27 @@ QString MainWindow::byteArray2InfoString (QByteArray& arr) return infoStr; } -QByteArray MainWindow::crcWrite(const QList& crcArray) +QByteArray MainWindow::crcCalc(const QByteArray array) { - QByteArray crcByteArray; - foreach(auto byte, crcArray) - { - crcByteArray.push_back(static_cast(byte)); - } + quint8 crcValue = _trx.crcGenerator(array); + QByteArray crc; + crc.append(static_cast(crcValue)); + return crc; +} - return crcByteArray; +void MainWindow::trxCrcWrite(const QByteArray array, quint32 offset) +{ + trxEepromWrite(crcCalc(array), offset, _bCtrl); +} + +void MainWindow::prbCtrlCrcWrite(const QByteArray array, quint32 offset) +{ + prbCtrlEepromWrite(crcCalc(array), offset, _bCtrl); +} + +void MainWindow::mpsCrcWrite(const QByteArray array, quint32 offset) +{ + mpsEepromWrite(crcCalc(array), offset, _bCtrl); } QByteArray MainWindow::e2promClear(quint32 length) @@ -3128,6 +3145,8 @@ void MainWindow::on_btn_trxRomId_clicked() QByteArray sendingArray = str2BigEndianByteArray(idStr, 16, 2); trxEepromWrite(sendingArray, EEPROM_ID_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_ID_CRC); } else { @@ -3161,6 +3180,8 @@ void MainWindow::on_btn_trxRomPid_clicked() QByteArray sendingArray = str2BigEndianByteArray(pidStr, 16, 2); trxEepromWrite(sendingArray, EEPROM_PID_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_PID_CRC); } else { @@ -3194,6 +3215,8 @@ void MainWindow::on_btn_trxRomPcbVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(pcbVesionStr, 10, 2); trxEepromWrite(sendingArray, EEPROM_PCB_VERSION_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_PCB_VERSION_CRC); } else { @@ -3227,6 +3250,8 @@ void MainWindow::on_btn_trxRomSerialNumber_clicked() QByteArray sendingArray = str2BigEndianByteArray4SerialNo(serialNoStr); trxEepromWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_CRC); } else { @@ -3260,11 +3285,13 @@ void MainWindow::on_btn_trxRomMasterCodeVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(masterCodeVersionStr, 10, 4); trxEepromWrite(sendingArray, EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_FIRST_MBED_CODE_VERSION_CRC); } else { QString firstMbedStr = bigEndianByteArray2Str(_trx.trxRomFirstMbedCode(), 10); - ui->tb_trxRomMasterCodeVersion->setText(firstMbedStr); + ui->tb_trxRomMasterCodeVersion->setText("MFV." + firstMbedStr); } } catch(SonoException& e) @@ -3293,11 +3320,13 @@ void MainWindow::on_btn_trxRomSlaveCodeVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(slaveCodeVersionWrStr, 10, 4); trxEepromWrite(sendingArray, EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, _bCtrl); + + trxCrcWrite(sendingArray, EEPROM_SECOND_MBED_CODE_VERSION_CRC); } else { QString secondMbedStr = bigEndianByteArray2Str(_trx.trxRomSecondMbedCode(), 10); - ui->tb_trxRomSlaveCodeVersion->setText(secondMbedStr); + ui->tb_trxRomSlaveCodeVersion->setText("SFV." + secondMbedStr); } } catch(SonoException& e) @@ -3311,7 +3340,11 @@ void MainWindow::on_chk_writeHeaderTrxRom_clicked(bool checked) { if(checked) { + QByteArray clearHeader = e2promClear(EEPROM_HEADER_NUMBER); + trxEepromWrite(clearHeader, EEPROM_HEADER_BEGIN, _bCtrl); + trxEepromWrite(headerArray, EEPROM_HEADER_BEGIN, _bCtrl); + qDebug() << _trx.trxRomHeader(); } } @@ -3377,6 +3410,8 @@ void MainWindow::on_btn_mpsRomId_clicked() QByteArray sendingArray = str2BigEndianByteArray(idStr, 16, 2); mpsEepromWrite(sendingArray, EEPROM_ID_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_ID_CRC); } else { @@ -3410,6 +3445,8 @@ void MainWindow::on_btn_mpsRomPid_clicked() QByteArray sendingArray = str2BigEndianByteArray(pidStr, 16, 2); mpsEepromWrite(sendingArray, EEPROM_PID_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_PID_CRC); } else { @@ -3443,6 +3480,8 @@ void MainWindow::on_btn_mpsRomPcbVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(pcbVesionStr, 10, 2); mpsEepromWrite(sendingArray, EEPROM_PCB_VERSION_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_PCB_VERSION_CRC); } else { @@ -3476,6 +3515,8 @@ void MainWindow::on_btn_mpsRomSerialNumber_clicked() QByteArray sendingArray = str2BigEndianByteArray4SerialNo(serialNoStr); mpsEepromWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_CRC); } else { @@ -3509,11 +3550,13 @@ void MainWindow::on_btn_mpsRomUcCodeVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(ucCodeVersionStr, 10, 4); mpsEepromWrite(sendingArray, EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_FIRST_MBED_CODE_VERSION_CRC); } else { QString firstMbedStr = bigEndianByteArray2Str(_trx.mpsRomFirstMbedCode(), 10); - ui->tb_mpsRomUcCodeVersion->setText(firstMbedStr); + ui->tb_mpsRomUcCodeVersion->setText("UCV." + firstMbedStr); } } catch(SonoException& e) @@ -3542,11 +3585,13 @@ void MainWindow::on_btn_mpsRomSupCodeVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(supCodeVersionWrStr, 10, 4); mpsEepromWrite(sendingArray, EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, _bCtrl); + + mpsCrcWrite(sendingArray, EEPROM_SECOND_MBED_CODE_VERSION_CRC); } else { QString secondMbedStr = bigEndianByteArray2Str(_trx.mpsRomSecondMbedCode(), 10); - ui->tb_mpsRomSupCodeVersion->setText(secondMbedStr); + ui->tb_mpsRomSupCodeVersion->setText("SVV." + secondMbedStr); } } catch(SonoException& e) @@ -3560,7 +3605,11 @@ void MainWindow::on_chk_writeHeaderMpsRom_clicked(bool checked) { if(checked) { + QByteArray clearHeader = e2promClear(EEPROM_HEADER_NUMBER); + mpsEepromWrite(clearHeader, EEPROM_HEADER_BEGIN, _bCtrl); + mpsEepromWrite(headerArray, EEPROM_HEADER_BEGIN, _bCtrl); + qDebug() << _trx.mpsRomHeader(); } } @@ -3626,6 +3675,8 @@ void MainWindow::on_btn_prbCtrlRomId_clicked() QByteArray sendingArray = str2BigEndianByteArray(idStr, 16, 2); prbCtrlEepromWrite(sendingArray, EEPROM_ID_BEGIN, _bCtrl); + + prbCtrlCrcWrite(sendingArray, EEPROM_ID_CRC); } else { @@ -3658,6 +3709,8 @@ void MainWindow::on_btn_prbCntlRomPid_clicked() QByteArray sendingArray = str2BigEndianByteArray(pidStr, 16, 2); prbCtrlEepromWrite(sendingArray, EEPROM_PID_BEGIN, _bCtrl); + + prbCtrlCrcWrite(sendingArray, EEPROM_PID_CRC); } else { @@ -3691,6 +3744,8 @@ void MainWindow::on_btn_prbCntlRomPcbVersion_clicked() QByteArray sendingArray = str2BigEndianByteArray(pcbVesionStr, 10, 2); prbCtrlEepromWrite(sendingArray, EEPROM_PCB_VERSION_BEGIN, _bCtrl); + + prbCtrlCrcWrite(sendingArray, EEPROM_PCB_VERSION_CRC); } else { @@ -3724,6 +3779,8 @@ void MainWindow::on_btn_prbCntlRomSerialNumber_clicked() QByteArray sendingArray = str2BigEndianByteArray4SerialNo(serialNoStr); prbCtrlEepromWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_BEGIN, _bCtrl); + + prbCtrlCrcWrite(sendingArray, EEPROM_BOARD_SERIAL_NO_CRC); } else { @@ -3742,7 +3799,11 @@ void MainWindow::on_chk_writeHeaderPrbCtrlRom_clicked(bool checked) { if(checked) { + QByteArray clearHeader = e2promClear(EEPROM_HEADER_NUMBER); + prbCtrlEepromWrite(clearHeader, EEPROM_HEADER_BEGIN, _bCtrl); + prbCtrlEepromWrite(headerArray, EEPROM_HEADER_BEGIN, _bCtrl); + qDebug() << _trx.prbCtrlRomHeader(); } } @@ -3787,6 +3848,26 @@ void MainWindow::on_chk_clearPrbCtrlRom_clicked(bool checked) // } //} +/*************************************************************************************************/ +/*************************************************************************************************/ +void MainWindow::on_chk_sysCompatibilityCheck_clicked(bool checked) +{ + try + { + if(checked) + { + _trx.checkSystemCompatibility(); + } + } + catch(SonoException& e) + { + qDebug() << e.what(); + MESSAGE_BOX("Failed! \n\r" + "The system parameters are not compatible."); + } +} + +/*************************************************************************************************/ /*************************************************************************************************/ /*************************************************************************************************/ void MainWindow::on_btn_prbRomIdRead_clicked() diff --git a/mainwindow.h b/mainwindow.h index 03d9d54..bd234bb 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -198,7 +198,13 @@ private: QString byteArray2InfoString (QByteArray& arr); - QByteArray crcWrite (const QList &crcArray); + QByteArray crcCalc (const QByteArray array); + + void trxCrcWrite (const QByteArray array, quint32 offset); + + void prbCtrlCrcWrite (const QByteArray array, quint32 offset); + + void mpsCrcWrite (const QByteArray array, quint32 offset); QByteArray e2promClear(quint32 length); @@ -547,6 +553,8 @@ private slots: void on_btn_mpsRomSupCodeVersion_clicked(); + void on_chk_sysCompatibilityCheck_clicked(bool checked); + signals: void showMessage(QString message); void threeDReady(); diff --git a/mainwindow.ui b/mainwindow.ui index 1a65498..31b8ff5 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -2052,46 +2052,10 @@ TRX - - - - 700 - 50 - 91 - 23 - - - - - 9 - - - - Clear All - - - - - - 700 - 30 - 101 - 23 - - - - - 9 - - - - Write Header - - - 200 + 300 20 151 61 @@ -2176,7 +2140,7 @@ - 360 + 460 20 131 61 @@ -2261,7 +2225,7 @@ - 500 + 600 20 95 61 @@ -2346,7 +2310,7 @@ - 600 + 700 20 95 61 @@ -2431,7 +2395,7 @@ - 0 + 100 20 95 61 @@ -2516,7 +2480,7 @@ - 100 + 200 20 95 61 @@ -2598,6 +2562,45 @@ + + + + 0 + 20 + 97 + 61 + + + + + QLayout::SetFixedSize + + + + + + 8 + + + + Write Header + + + + + + + + 8 + + + + Clear All + + + + + @@ -2876,46 +2879,10 @@ Probe Control - - - - 700 - 30 - 101 - 23 - - - - - 9 - - - - Write Header - - - - - - 700 - 50 - 90 - 23 - - - - - 9 - - - - Clear All - - - 0 + 100 20 95 61 @@ -3000,7 +2967,7 @@ - 200 + 300 20 151 61 @@ -3085,7 +3052,7 @@ - 360 + 460 20 131 61 @@ -3170,7 +3137,7 @@ - 100 + 200 20 95 61 @@ -3252,59 +3219,80 @@ - - - - - 10 - 170 - 801 - 81 - - - - MPS - - + - 700 - 50 - 91 - 23 + 0 + 20 + 97 + 61 - - - 9 - - - - Clear All - + + + QLayout::SetFixedSize + + + + + + 8 + + + + Write Header + + + + + + + + 8 + + + + Clear All + + + + - + - 700 - 30 - 101 - 23 + 600 + 40 + 151 + 20 - 9 + 10 - Write Header + Compatibility Check + + + + + 10 + 170 + 801 + 81 + + + + MPS + - 0 + 100 20 95 61 @@ -3389,7 +3377,7 @@ - 100 + 200 20 95 61 @@ -3474,7 +3462,7 @@ - 200 + 300 20 151 61 @@ -3559,7 +3547,7 @@ - 360 + 460 20 131 61 @@ -3644,7 +3632,7 @@ - 500 + 600 20 95 61 @@ -3729,7 +3717,7 @@ - 600 + 700 20 95 61 @@ -3811,6 +3799,42 @@ + + + + 0 + 20 + 97 + 61 + + + + + + + + 8 + + + + Write Header + + + + + + + + 8 + + + + Clear All + + + + + diff --git a/src/model/hardware/core/lowLevelApi/TrxBoard.cpp b/src/model/hardware/core/lowLevelApi/TrxBoard.cpp index 2fe4392..9dd1f86 100644 --- a/src/model/hardware/core/lowLevelApi/TrxBoard.cpp +++ b/src/model/hardware/core/lowLevelApi/TrxBoard.cpp @@ -319,6 +319,72 @@ void TrxBoard::setFpgaOffset() _fpgaOffset << 0x100000 << 0x200000 << 0x300000; } +QList TrxBoard::systemStructure2List(systemE2proms &systemRoms) +{ + QList dataset; + + dataset.append(systemRoms.trx.id); + dataset.append(systemRoms.prbCtrl.id); + dataset.append(systemRoms.mps.id); + + dataset.append(systemRoms.trx.pid); + dataset.append(systemRoms.prbCtrl.pid); + dataset.append(systemRoms.mps.pid); + + dataset.append(systemRoms.trx.pcbVersion); + dataset.append(systemRoms.prbCtrl.pcbVersion); + dataset.append(systemRoms.mps.pcbVersion); + + dataset.append(systemRoms.trx.firstMbedCodeVersion); + dataset.append(systemRoms.mps.firstMbedCodeVersion); + + dataset.append(systemRoms.trx.secondMbedCodeVersion); + dataset.append(systemRoms.mps.secondMbedCodeVersion); + + return dataset; +} + +void TrxBoard::systemLutCompletion() +{ + _systemLut.clear(); + + systemE2proms systemRoms; + + systemRoms.trx.id = trxId; + systemRoms.prbCtrl.id = prbCtrlId; + systemRoms.mps.id = mpsId; + systemRoms.trx.pid = pid; + systemRoms.prbCtrl.pid = pid; + systemRoms.mps.pid = pid; + + systemRoms.trx.pcbVersion = 1; + systemRoms.prbCtrl.pcbVersion = 1; + systemRoms.mps.pcbVersion = 1; + systemRoms.trx.firstMbedCodeVersion = 1; + systemRoms.mps.firstMbedCodeVersion = 1; + systemRoms.trx.secondMbedCodeVersion = 1; + systemRoms.mps.secondMbedCodeVersion = 1; + _systemLut.append(systemStructure2List(systemRoms)); + + systemRoms.trx.pcbVersion = 2; + systemRoms.prbCtrl.pcbVersion = 2; + systemRoms.mps.pcbVersion = 2; + systemRoms.trx.firstMbedCodeVersion = 1; + systemRoms.mps.firstMbedCodeVersion = 1; + systemRoms.trx.secondMbedCodeVersion = 1; + systemRoms.mps.secondMbedCodeVersion = 1; + _systemLut.append(systemStructure2List(systemRoms)); + + systemRoms.trx.pcbVersion = 2; + systemRoms.prbCtrl.pcbVersion = 2; + systemRoms.mps.pcbVersion = 2; + systemRoms.trx.firstMbedCodeVersion = 1; + systemRoms.mps.firstMbedCodeVersion = 1; + systemRoms.trx.secondMbedCodeVersion = 2; + systemRoms.mps.secondMbedCodeVersion = 1; + _systemLut.append(systemStructure2List(systemRoms)); +} + //QList TrxBoard::signedVector2unsignedList (QVector& sgnVec) //{ //_unsignedQntzrList.clear(); @@ -368,6 +434,7 @@ TrxBoard::TrxBoard() : _offsetSlave0(0), _offsetSlave1(0x400000), _offsetSlave2( setRomCrc(); setFpgaOffset(); setAfeModuleOffset(); + systemLutCompletion(); } TrxBoard::ScenHwRegister::ScenHwRegister() @@ -1646,39 +1713,137 @@ quint32 TrxBoard::vendorId() const return vid; } +void TrxBoard::systemCompare(QList &system) const +{ + foreach(auto &lut, _systemLut) + { + if(lut == system) + { + return; + } + } + throw SonoException("The system parameters are not compatible."); +} + +void TrxBoard::checkSystemCompatibility() +{ + EepromStatus trxE2prom, prbCtrlE2prom, mpsE2prom; + this->trxState(trxE2prom); + this->prbCtrlState(prbCtrlE2prom); + this->mpsState(mpsE2prom); + + systemE2proms currentSystemRoms; + currentSystemRoms.trx = trxE2prom; + currentSystemRoms.prbCtrl = prbCtrlE2prom; + currentSystemRoms.mps = mpsE2prom; + + QList currentSystem = systemStructure2List(currentSystemRoms); + + systemCompare(currentSystem); +} + +quint8 TrxBoard::crcGenerator(QByteArray inputByteArray) const +{ + quint8 arrayLength = static_cast(inputByteArray.length()); + quint8 *input = new quint8[arrayLength]; + memcpy(input, inputByteArray, arrayLength); + + quint8 crcInitialValue(0x00); + int i; + + while(arrayLength--) + { + crcInitialValue = crcInitialValue ^ *input++; // Apply Byte + + for(i=0; i<8; i++) // Eight rounds of 1-bit + { + if (crcInitialValue & 0x80) + crcInitialValue = static_cast((crcInitialValue << 1) ^ CRC_POLYNOMIAL); + else + crcInitialValue = static_cast(crcInitialValue << 1); // Left Shifting + } + } + + return(crcInitialValue); +} + +void TrxBoard::crcCheck(const QByteArray array, quint8 crcRom) const +{ + quint8 crcGen = crcGenerator(array); + if(crcGen != crcRom) + { + throw SonoException("CRC check error is happend."); + } +} + +void TrxBoard::trxCrcCheck(const QByteArray array, quint32 offset) const +{ + quint8 crcRom = static_cast((this->_bCtrlMngt->trxEepromRead(offset, CRC8_BYTE_NUMBER)).at(0)); + crcCheck(array, crcRom); +} + +void TrxBoard::prbCtrlCrcCheck(const QByteArray array, quint32 offset) const +{ + quint8 crcRom = static_cast((this->_bCtrlMngt->prbCtrlEepromRead(offset, CRC8_BYTE_NUMBER)).at(0)); + crcCheck(array, crcRom); +} + +void TrxBoard::mpsCrcCheck(const QByteArray array, quint32 offset) const +{ + quint8 crcRom = static_cast((this->_bCtrlMngt->mpsEepromRead(offset, CRC8_BYTE_NUMBER)).at(0)); + crcCheck(array, crcRom); +} + QByteArray TrxBoard::trxRomHeader() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + QByteArray header = (this->_bCtrlMngt->trxEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + if(headerArray != header) + { + throw SonoException("The header checksum of the TRX e2prom is corrupted."); + } + return header; } QByteArray TrxBoard::trxRomId() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + QByteArray id = (this->_bCtrlMngt->trxEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + trxCrcCheck(id, EEPROM_ID_CRC); + return id; } QByteArray TrxBoard::trxRomPid() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + QByteArray pid = (this->_bCtrlMngt->trxEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + trxCrcCheck(pid, EEPROM_PID_CRC); + return pid; } QByteArray TrxBoard::trxRomPcbVersion() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + QByteArray pcb = (this->_bCtrlMngt->trxEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + trxCrcCheck(pcb, EEPROM_PCB_VERSION_CRC); + return pcb; } QByteArray TrxBoard::trxRomSerialNo() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + QByteArray serial = (this->_bCtrlMngt->trxEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + trxCrcCheck(serial, EEPROM_BOARD_SERIAL_NO_CRC); + return serial; } QByteArray TrxBoard::trxRomFirstMbedCode() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, EEPROM_FIRST_MBED_CODE_VERSION_NUMBER)); + QByteArray mbed1 = (this->_bCtrlMngt->trxEepromRead(EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, EEPROM_FIRST_MBED_CODE_VERSION_NUMBER)); + trxCrcCheck(mbed1, EEPROM_FIRST_MBED_CODE_VERSION_CRC); + return mbed1; } QByteArray TrxBoard::trxRomSecondMbedCode() const { - return(this->_bCtrlMngt->trxEepromRead(EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, EEPROM_SECOND_MBED_CODE_VERSION_NUMBER)); + QByteArray mbed2 = (this->_bCtrlMngt->trxEepromRead(EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, EEPROM_SECOND_MBED_CODE_VERSION_NUMBER)); + trxCrcCheck(mbed2, EEPROM_SECOND_MBED_CODE_VERSION_CRC); + return mbed2; } void TrxBoard::trxState(EepromStatus& romStatus) const @@ -1690,7 +1855,6 @@ void TrxBoard::trxState(EepromStatus& romStatus) const QByteArray serialNo; QByteArray firstMbedCode; QByteArray secondMbedCode; - QByteArray crc16; romStatus.ConnectionMode = connected; romStatus.errorCode = EEPROM_NO_ERROR; @@ -1715,51 +1879,58 @@ void TrxBoard::trxState(EepromStatus& romStatus) const secondMbedCode = trxRomSecondMbedCode(); romStatus.secondMbedCodeVersion = byteArray2UintBigEndian(secondMbedCode); - -// crcChk = this->_bCtrlMngt->trxEepromRead(EEPROM_CRC_BEGIN, EEPROM_CRC_NUMBER); -// if(crcChk == _eepromCrc) -// { -// romStatus.errorCode = EEPROM_NO_ERROR; -// } -// else -// { -// romStatus.errorCode = EEPROM_CRC_ERROR; - // } } QByteArray TrxBoard::mpsRomHeader() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + QByteArray header = (this->_bCtrlMngt->mpsEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + if(headerArray != header) + { + throw SonoException("The header checksum of the MPS e2prom is corrupted."); + } + return header; } QByteArray TrxBoard::mpsRomId() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + QByteArray id = (this->_bCtrlMngt->mpsEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + mpsCrcCheck(id, EEPROM_ID_CRC); + return id; } QByteArray TrxBoard::mpsRomPid() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + QByteArray pid = (this->_bCtrlMngt->mpsEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + mpsCrcCheck(pid, EEPROM_PID_CRC); + return pid; } QByteArray TrxBoard::mpsRomPcbVersion() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + QByteArray pcb = (this->_bCtrlMngt->mpsEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + mpsCrcCheck(pcb, EEPROM_PCB_VERSION_CRC); + return pcb; } QByteArray TrxBoard::mpsRomSerialNo() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + QByteArray serial = (this->_bCtrlMngt->mpsEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + mpsCrcCheck(serial, EEPROM_BOARD_SERIAL_NO_CRC); + return serial; } QByteArray TrxBoard::mpsRomFirstMbedCode() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, EEPROM_FIRST_MBED_CODE_VERSION_NUMBER)); + QByteArray mbed1 = (this->_bCtrlMngt->mpsEepromRead(EEPROM_FIRST_MBED_CODE_VERSION_BEGIN, EEPROM_FIRST_MBED_CODE_VERSION_NUMBER)); + mpsCrcCheck(mbed1, EEPROM_FIRST_MBED_CODE_VERSION_CRC); + return mbed1; } QByteArray TrxBoard::mpsRomSecondMbedCode() const { - return(this->_bCtrlMngt->mpsEepromRead(EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, EEPROM_SECOND_MBED_CODE_VERSION_NUMBER)); + QByteArray mbed2 = (this->_bCtrlMngt->mpsEepromRead(EEPROM_SECOND_MBED_CODE_VERSION_BEGIN, EEPROM_SECOND_MBED_CODE_VERSION_NUMBER)); + mpsCrcCheck(mbed2, EEPROM_SECOND_MBED_CODE_VERSION_CRC); + return mbed2; } void TrxBoard::mpsState(EepromStatus& romStatus) const @@ -1771,7 +1942,6 @@ void TrxBoard::mpsState(EepromStatus& romStatus) const QByteArray serialNo; QByteArray firstMbedCode; QByteArray secondMbedCode; - QByteArray crc16; romStatus.ConnectionMode = connected; romStatus.errorCode = EEPROM_NO_ERROR; @@ -1796,41 +1966,44 @@ void TrxBoard::mpsState(EepromStatus& romStatus) const secondMbedCode = mpsRomSecondMbedCode(); romStatus.secondMbedCodeVersion = byteArray2UintBigEndian(secondMbedCode); - -// crcChk = this->_bCtrlMngt->mpsEepromRead(EEPROM_CRC_BEGIN, EEPROM_CRC_NUMBER); -// if(crcChk == _eepromCrc) -// { -// romStatus.errorCode = EEPROM_NO_ERROR; -// } -// else -// { -// romStatus.errorCode = EEPROM_CRC_ERROR; -// } } QByteArray TrxBoard::prbCtrlRomHeader() const { - return(this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + QByteArray header = (this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_HEADER_BEGIN, EEPROM_HEADER_NUMBER)); + if(headerArray != header) + { + throw SonoException("The header checksum of the relay e2prom is corrupted."); + } + return header; } QByteArray TrxBoard::prbCtrlRomId() const { - return(this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + QByteArray id = (this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_ID_BEGIN, EEPROM_ID_NUMBER)); + prbCtrlCrcCheck(id, EEPROM_ID_CRC); + return id; } QByteArray TrxBoard::prbCtrlRomPid() const { - return(this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + QByteArray pid = (this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_PID_BEGIN, EEPROM_PID_NUMBER)); + prbCtrlCrcCheck(pid, EEPROM_PID_CRC); + return pid; } QByteArray TrxBoard::prbCtrlRomPcbVersion() const { - return(this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + QByteArray pcb = (this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_PCB_VERSION_BEGIN, EEPROM_PCB_VERSION_NUMBER)); + prbCtrlCrcCheck(pcb, EEPROM_PCB_VERSION_CRC); + return pcb; } QByteArray TrxBoard::prbCtrlRomSerialNo() const { - return(this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + QByteArray serial = (this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_BOARD_SERIAL_NO_BEGIN, EEPROM_BOARD_SERIAL_NO_NUMBER)); + prbCtrlCrcCheck(serial, EEPROM_BOARD_SERIAL_NO_CRC); + return serial; } void TrxBoard::prbCtrlState(EepromStatus& romStatus) const @@ -1842,7 +2015,6 @@ void TrxBoard::prbCtrlState(EepromStatus& romStatus) const QByteArray serialNo; QByteArray firstMbedCode; QByteArray secondMbedCode; - QByteArray crc16; romStatus.ConnectionMode = connected; romStatus.errorCode = EEPROM_NO_ERROR; @@ -1861,16 +2033,6 @@ void TrxBoard::prbCtrlState(EepromStatus& romStatus) const serialNo = prbCtrlRomSerialNo(); romStatus.boardSerialNumber = byteArray2UintBigEndian(serialNo); - -// crcChk = this->_bCtrlMngt->prbCtrlEepromRead(EEPROM_CRC_BEGIN, EEPROM_CRC_NUMBER); -// if(crcChk == _eepromCrc) -// { -// romStatus.errorCode = EEPROM_NO_ERROR; -// } -// else -// { -// romStatus.errorCode = EEPROM_CRC_ERROR; -// } } void TrxBoard::selectedPrbState(EepromStatus& romStatus, eSelectProbe prbSel) const