Index: sources/canbus/messagebuilder.cpp =================================================================== diff -u -rb2ebb6f71cf9b0c2ba68a47776e5b220b165b21c -r1732e83d2a0308b9c706f37d6d7724a364bbff2a --- sources/canbus/messagebuilder.cpp (.../messagebuilder.cpp) (revision b2ebb6f71cf9b0c2ba68a47776e5b220b165b21c) +++ sources/canbus/messagebuilder.cpp (.../messagebuilder.cpp) (revision 1732e83d2a0308b9c706f37d6d7724a364bbff2a) @@ -22,7 +22,7 @@ MessageBuilder::MessageBuilder(QObject *parent) : QObject(parent) { } -QList MessageBuilder::buildMessage(GuiActionType vAction, const QByteArray &vData) +FrameList MessageBuilder::buildFrames(GuiActionType vAction, const QByteArray &vData) { QList mFrames; QByteArray mPayload ; @@ -34,7 +34,8 @@ quint16 len = mPayload.length(); if (len > eLenCanFrame) { quint8 frameCount = len / eLenCanFrame; - for (quint8 i = 0; i <= frameCount; i++) { + if (len % eLenCanFrame) ++frameCount; + for (quint8 i = 0; i < frameCount; i++) { mFrames += mPayload.mid(i * eLenCanFrame, eLenCanFrame); } } else { @@ -52,21 +53,24 @@ void MessageBuilder::addActionId(QByteArray &vPayload, GuiActionType vAction) { - if (vAction != GuiActions::Unknown) { - vPayload += (vAction >> 8) & 0xFF;//high byte - vPayload += vAction & 0xFF;// low byte + if (vAction != GuiActionType::Unknown) { + quint16 mAction = static_cast(vAction); + vPayload += (mAction >> 8) & 0xFF;//high byte + vPayload += mAction & 0xFF;// low byte } } void MessageBuilder::addData(QByteArray &vPayload, GuiActionType vAction, const QByteArray &vData) { - quint8 len = payloadLen[vAction]; + quint16 i = static_cast(vAction); + quint8 len = payloadLen[i]; // if len has been set to max(255) // it means it has no limit and can be as long as 255 bytes if (len == eLenMaxData) { - len = vData.length(); if (vData.length() > eLenMaxData) { len = eLenMaxData ; + } else { + len = vData.length(); } } vPayload += len; @@ -87,47 +91,55 @@ { // TODO : calcCRC has not been used yet Q_UNUSED(vData) +#ifdef QT_DEBUG + return ePayload_Sync; +#else return '\0'; +#endif } -bool MessageBuilder::checkCRC(const QByteArray &vData, quint8 vCRC) +// CRC is always next byte after Data +bool MessageBuilder::checkCRC(const QByteArray &vData) { - //TODO : enable when the calcCRC implemented +#ifdef QT_DEBUG + //qDebug() << "qChecksum(\"0\",1) : " << qChecksum("\0",1); + // TODO : If a Message ID has not data does it still have CRC ? + if ( ! vData.length()) return false; + quint8 crc = vData.back(); + bool ok = calcCRC(vData) == crc; + return ok; +#else Q_UNUSED(vData) - Q_UNUSED(vCRC ) - return true;//calcCRC(vData) == vCRC; + return true; +#endif + + } -bool MessageBuilder::stripMessage(const QByteArray &vPayload, Message &vMessage) +bool MessageBuilder::buildMessage(const QByteArray &vPayload, Message &vMessage) { QByteArray mPayload = vPayload; - //Can_Id mCanId = static_cast(vFrame.frameId()); - //if (messages[mCanId].isEmpty()) { - // messages[mCanId].append(Message()); - //} else { - // if (messages[mCanId].last().isComplete()) { - // messages[mCanId].append(Message()); - // } - //} - // - //Message message = messages[mCanId].last(); - - // when we are here the message is new or partial. - bool ok = false; - if (hasSyncByte(mPayload)) { - vMessage.actionId = getActionId(mPayload); - vMessage.length = getLength (mPayload); - vMessage.data = getData (mPayload, vMessage.length, &ok); - if (!ok) { - qDebug() << "ERROR : CRC error"; + if (vMessage.data.isEmpty()) { // message is empty so expected a header + if (hasSyncByte(mPayload)) { // Got header + vMessage.actionId = getActionId(mPayload); + vMessage.length = getLength (mPayload); + vMessage.data = getData (mPayload, vMessage.length); + vMessage.initialized = true; + } else { // Expected Header but got pure data + qDebug() << "ERROR :" << "Expected Header, got frame without Sync byte"; return false; } } else { - qDebug() << "ERROR : incomplete message or corrupted without sync byte (without header)"; - return false; + vMessage.data += vPayload.mid(0, vMessage.length - vMessage.data.length()); } - //messages[mCanId].append(message); + if (vMessage.isComplete()) { + if ( ! checkCRC(vMessage.data) ) { // CRC is always next byte after Data + qDebug() << "ERROR :" << "CRC error"; + return false; + } + } + return true; } @@ -153,23 +165,22 @@ return static_cast(mActionId); } -quint8 MessageBuilder::getLength(QByteArray &vPayload) +int MessageBuilder::getLength(QByteArray &vPayload) { - quint8 mlen = vPayload[0]; + // on the line bellow it has to be cast to unsigned otherwise FF will be converted to -1 and + 1 becomes 0. + int mlen = static_cast(vPayload[0]) + 1; // Add CRC to the length of data vPayload = vPayload.mid(eLenLength); return mlen; } -QByteArray MessageBuilder::getData(QByteArray &vPayload, quint8 vLen, bool *ok) +QByteArray MessageBuilder::getData(QByteArray &vPayload, int vLen) { QByteArray mData; if (vLen <= eLenMaxHeaderData) { - mData = vPayload.mid(0,vLen); - if (ok) { - *ok = checkCRC(mData,vPayload[vLen+1]); // CRC is always next byte after Data - } + mData = vPayload.mid(0, vLen); } else { mData = vPayload; } return mData; } +