Index: main.cpp =================================================================== diff -u -r6303657064538167d438e8cee767924044aa3b37 -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- main.cpp (.../main.cpp) (revision 6303657064538167d438e8cee767924044aa3b37) +++ main.cpp (.../main.cpp) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -66,6 +66,8 @@ QByteArray gFakeData = "" ; const char *gFakeData_default = "00" ; bool gSendEmptyKeepAwake = true ; +bool gFakeSeqAtBegin = false ; +bool gDisableHunhandledReport = false ; bool gConsoleoutFrameInterface = false ; bool gConsoleoutCanInterface = false ; @@ -97,26 +99,31 @@ parser.addHelpOption(); parser.addVersionOption(); + // --- QCommandLineOption optionConsoleoutCanInterface( QStringList() << "c" << "canOut", QCoreApplication::translate("main", "Show the Can Frame Output")); parser.addOption(optionConsoleoutCanInterface); + // --- QCommandLineOption optionConsoleoutFrameInterface( QStringList() << "m" << "msgOut", QCoreApplication::translate("main", "Show the Message Output")); parser.addOption(optionConsoleoutFrameInterface); + // --- QCommandLineOption optionSendEmptyKeepAwake(QStringList() << "0" << "disable-keep-awake", QCoreApplication::translate("main", "Disable send low priority, empty message on the CANBus just to keep UI board CAN driver awake")); parser.addOption(optionSendEmptyKeepAwake); + // --- QCommandLineOption optionFakeInterval( QStringList() << "i" << "fake-interval", QCoreApplication::translate("main", "Test fake message interval(ms)"), QCoreApplication::translate("main", "interval")); parser.addOption(optionFakeInterval); + // --- QCommandLineOption optionFakeData( QStringList() << "f" << "fake-message", QCoreApplication::translate("main", "Test fake message data\n" @@ -125,11 +132,25 @@ QCoreApplication::translate("main", "data")); parser.addOption(optionFakeData); - parser.process(*qApp); + // --- + QCommandLineOption optionFakeSeqAtBegin( + QStringList() << "b" << "fake-message-seq-atbegin", + QCoreApplication::translate("main", "Test fake message sequence at the beginning of the frame")); + parser.addOption(optionFakeSeqAtBegin); + // --- + QCommandLineOption optionDisableHunhandledReport(QStringList() << "u" << "disable-unhandled-report", + QCoreApplication::translate("main", "Disable unhandled messages report as an error in the log")); + parser.addOption(optionDisableHunhandledReport); + + // --- + parser.process(*qApp); + gConsoleoutCanInterface = parser.isSet(optionConsoleoutCanInterface ); gConsoleoutFrameInterface = parser.isSet(optionConsoleoutFrameInterface ); + gDisableHunhandledReport = parser.isSet(optionDisableHunhandledReport ); + if (parser.isSet(optionSendEmptyKeepAwake)) gSendEmptyKeepAwake = false; bool ok = false; @@ -142,6 +163,9 @@ } else { gFakeData = gFakeData_default; } + if (parser.isSet(optionFakeSeqAtBegin)) { + gFakeSeqAtBegin = true; + } gFakeData = QByteArray::fromHex(gFakeData); } } Index: sources/applicationcontroller.cpp =================================================================== diff -u -r4a6abe765f03feae8100ec660aa04aa218d4dfa3 -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- sources/applicationcontroller.cpp (.../applicationcontroller.cpp) (revision 4a6abe765f03feae8100ec660aa04aa218d4dfa3) +++ sources/applicationcontroller.cpp (.../applicationcontroller.cpp) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -240,7 +240,11 @@ QVariantList mData; int mFakeDataLen = gFakeData.length(); if (mFakeDataLen) { - createFakeSequencedLongMessage(mData, mFakeDataLen); + if (gFakeSeqAtBegin) { + createFakeSeqAtBeginLongMessage(mData, mFakeDataLen); + } else { + createFakeSequencedLongMessage (mData, mFakeDataLen); + } } else { mData += static_cast(GuiActionData::NoData); } @@ -257,34 +261,37 @@ void ApplicationController::createFakeSequencedLongMessage(QVariantList &vData, const int vFakeDataLen) { QByteArray data; - Types::U16 u16; if (vFakeDataLen == 1 && gFakeData == QByteArray::fromHex(gFakeData_default)) { - static quint64 txCount = 0; + static quint16 txCount = 0; + Types::U16 seq; + quint8 dataBytesLeft = 0; + const quint8 crcBytesLen = 2; for (int i = 0; i < 13; i++) { switch (i) { - case 0: - u16.value = txCount; - data += u16.bytes[0]; - data += u16.bytes[1]; + case 0: // First frame : HEAD + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; break; - case 12: - for (int i = 0; i < 4; i++) { + case 12: // Last frame with CRC + dataBytesLeft = 8 - sizeof(seq) - crcBytesLen; + for (int i = 0; i < dataBytesLeft; i++) { data += (char)(0); } - u16.value = txCount; - data += u16.bytes[0]; - data += u16.bytes[1]; + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; break; - default: - const quint8 dataBytesLeft = 8 - 2; // 2 Bytes for the txCount + default: // Middle Frames + dataBytesLeft = 8 - sizeof(seq); for (int i = 0; i < dataBytesLeft; i++) { data += (char)(0); } - u16.value = txCount; - data += u16.bytes[0]; - data += u16.bytes[1]; + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; break; } Types::safeIncrement(txCount); @@ -294,3 +301,59 @@ vData += gFakeData; } } + +/*! + * \brief ApplicationController::createFakeSequencedAtBeginLongMessage + * \details This method is creating the fake message with frame sequence + * which we use for Denali Message test + * \param vFakeDataLen + */ +void ApplicationController::createFakeSeqAtBeginLongMessage(QVariantList &vData, const int vFakeDataLen) +{ + QByteArray data; + if (vFakeDataLen == 1 && gFakeData == QByteArray::fromHex(gFakeData_default)) { + static quint32 txCount = 0; + Types::U32 seq; + quint8 dataBytesLeft = 0; + const quint8 crcBytesLen = 2; + for (int i = 0; i < 13; i++) { + switch (i) { + case 0: // First frame : HEAD + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; + //data += seq.bytes[3]; // Chopped off + //data += seq.bytes[4]; // Chopped off + break; + + case 12: // Last frame with CRC + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; + data += seq.bytes[3]; + data += seq.bytes[4]; + dataBytesLeft = 8 - sizeof(seq) - crcBytesLen; + for (int i = 0; i < dataBytesLeft; i++) { + data += (char)(0); + } + break; + + default: // Middle Frames + dataBytesLeft = 8 - sizeof(seq); + seq.value = txCount; + data += seq.bytes[0]; + data += seq.bytes[1]; + data += seq.bytes[3]; + data += seq.bytes[4]; + for (int i = 0; i < dataBytesLeft; i++) { + data += (char)(0); + } + break; + } + Types::safeIncrement(txCount); + } + vData += QByteArray::fromHex(data.toHex()); + } else { + vData += gFakeData; + } +} Index: sources/applicationcontroller.h =================================================================== diff -u -r4a6abe765f03feae8100ec660aa04aa218d4dfa3 -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- sources/applicationcontroller.h (.../applicationcontroller.h) (revision 4a6abe765f03feae8100ec660aa04aa218d4dfa3) +++ sources/applicationcontroller.h (.../applicationcontroller.h) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -56,7 +56,8 @@ void keepAlive(); - void createFakeSequencedLongMessage(QVariantList &vData, const int vFakeDataLen); + void createFakeSequencedLongMessage (QVariantList &vData, const int vFakeDataLen); + void createFakeSeqAtBeginLongMessage(QVariantList &vData, const int vFakeDataLen); private slots: // Should be private for thread safety and is connected internally. void onActionReceive (GuiActionType vAction, const QVariantList &vData); // UI <= HD/DG Index: sources/canbus/messagebuilder.cpp =================================================================== diff -u -r1ec7b44e6d1d66460d2da943ff65f3c0c0755d8f -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- sources/canbus/messagebuilder.cpp (.../messagebuilder.cpp) (revision 1ec7b44e6d1d66460d2da943ff65f3c0c0755d8f) +++ sources/canbus/messagebuilder.cpp (.../messagebuilder.cpp) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -225,9 +225,13 @@ quint8 mExpected = 0; quint8 mBeenRead = 0; if ( ! checkCRC(crcData, mExpected, mBeenRead ) ) { // CRC is always next byte after Data - LOG_ERROR(tr("CRC error, expected %1 but got %2") - .arg(Format::toHexString(mExpected, true, eLenCRCDigits)) - .arg(Format::toHexString(mBeenRead, true, eLenCRCDigits))); + static quint64 erCRC = 0; + LOG_ERROR(tr("%1 - CRC error, expected %2 but got %3 : %4") + .arg(++erCRC) + .arg(Format::toHexString(mExpected, true, eLenCRCDigits)) + .arg(Format::toHexString(mBeenRead, true, eLenCRCDigits)) + .arg(Format::toHexString(vMessage.data)) + ); return false; } return true; Index: sources/canbus/messageinterpreter.cpp =================================================================== diff -u -r4a6abe765f03feae8100ec660aa04aa218d4dfa3 -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- sources/canbus/messageinterpreter.cpp (.../messageinterpreter.cpp) (revision 4a6abe765f03feae8100ec660aa04aa218d4dfa3) +++ sources/canbus/messageinterpreter.cpp (.../messageinterpreter.cpp) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -132,6 +132,7 @@ */ void MessageInterpreter::printUnhandled(const Message &vMessage) { + if ( gDisableHunhandledReport ) return; QString mActionIdHexString = Format::toHexString(vMessage.actionId, false, eLenMessageIDDigits); QString logMessage = tr("Unhandled Message ID (HD)") + '\n' + QString("%1 # %2 %3") Index: sources/main.h =================================================================== diff -u -r4a6abe765f03feae8100ec660aa04aa218d4dfa3 -rd3edfbd78f021082f37c7ee79a5a31a57b2808d4 --- sources/main.h (.../main.h) (revision 4a6abe765f03feae8100ec660aa04aa218d4dfa3) +++ sources/main.h (.../main.h) (revision d3edfbd78f021082f37c7ee79a5a31a57b2808d4) @@ -40,13 +40,16 @@ static vCLASS _instance; \ return _instance; \ } \ - - +//--------------------------------------------------------------------------------// +//--------------------------------------------------------------------------------// extern int gFakeInterval; extern QByteArray gFakeData; extern const char*gFakeData_default; extern bool gSendEmptyKeepAwake; - +extern bool gFakeSeqAtBegin; +extern bool gDisableHunhandledReport; +//--------------------------------------------------------------------------------// +//--------------------------------------------------------------------------------// #define PROPERTY(vTYPE , vVARIABLE , vDEFVALUE) \ Q_PROPERTY(vTYPE vVARIABLE \ READ vVARIABLE \