Index: sources/canbus/messagehandler.cpp =================================================================== diff -u -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) +++ sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -53,8 +53,9 @@ void MessageHandler::initConnections() { // From GUI - connect(_ApplicationController, SIGNAL(didActionTransmit(GuiActionType, GuiActionData)), - this , SLOT( onActionTransmit(GuiActionType, GuiActionData))); + connect(_ApplicationController, SIGNAL(didActionTransmit(GuiActionType, const QByteArray &)), + this , SLOT( onActionTransmit(GuiActionType, const QByteArray &))); + // From HD/DG connect(_CanInterface , SIGNAL( didRead(QCanBusFrame)), this , SLOT(onFrameReceive (QCanBusFrame))); @@ -68,12 +69,17 @@ transmitFrame(eChlid_UI, GuiActions::Check_In); } -void MessageHandler::transmitFrame(MessageHandler::Can_Id vCan_Id, GuiActionType vAction, GuiActionData vData) +void MessageHandler::transmitFrame(MessageHandler::Can_Id vCan_Id, GuiActionType vAction, const QByteArray &vData) { QCanBusFrame mFrame; mFrame.setFrameId(vCan_Id); - mFrame.setPayload(buildMessage(vAction,vData)); - emit didFrameTransmit(mFrame); + QList mFrames = buildMessage(vAction,vData); + for (auto frame : mFrames) { + mFrame.setPayload(frame); + //TODO : If it's necessary we can have a dispatcher + // to schedule and send messages in another thread. + emit didFrameTransmit(mFrame); + } } bool MessageHandler::ignoreChannel(const QCanBusFrame &vFrame) @@ -93,16 +99,27 @@ return false; } -QByteArray MessageHandler::buildMessage(GuiActionType vAction, GuiActionData vData) +QList MessageHandler::buildMessage(GuiActionType vAction, const QByteArray &vData) { + QList mFrames; QByteArray mPayload ; - addSyncByte (mPayload); - addActionId (mPayload, vAction ); // Message ID - addLegth (mPayload, vAction ); // Payload Length - addData (mPayload, vData ); // Adding required Data - addCRC (mPayload); // CRC - addPadding (mPayload); // Padded to 8 byte frame - return mPayload ; + addSyncByte (mPayload); // SyncByte + addActionId (mPayload, vAction); // Message ID + addData (mPayload, vAction, vData); // Regarding Payload Length, Adding required Data + addCRC (mPayload); // CRC + + quint16 len = mPayload.length(); + if (len > eLenCanFrame) { + quint8 frameCount = len / eLenCanFrame; + for (quint8 i = 0; i <= frameCount; i++) { + mFrames += mPayload.mid(i*eLenCanFrame,eLenCanFrame); + } + } else { + mFrames += mPayload; + } + + addPadding (mFrames.last()); // Padded to 8 byte frame + return mFrames; } void MessageHandler::addSyncByte(QByteArray &vPayload) @@ -118,18 +135,21 @@ } } -void MessageHandler::addLegth(QByteArray &vPayload, GuiActionType vAction) +void MessageHandler::addData(QByteArray &vPayload, GuiActionType vAction, const QByteArray &vData) { - vPayload.append(payloadLen[vAction]); + quint8 len = payloadLen[vAction]; + // 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 ; + } + } + vPayload += len; + vPayload += vData.mid(0, len); // Adding required Data } -void MessageHandler::addData(QByteArray &vPayload, GuiActionData vData) -{ - // if the payload is more than a remaining frame empty bytes - // then it requires to be chopped. - vPayload.append(vData); // Adding required Data -} - void MessageHandler::addPadding(QByteArray &vPayload) { vPayload = vPayload.leftJustified(eLenCanFrame, '\0'); @@ -252,8 +272,9 @@ * \details Processes the requested action * \param vAction - User requested Action */ -void MessageHandler::onActionTransmit(GuiActionType vAction, GuiActionData vData) +void MessageHandler::onActionTransmit(GuiActionType vAction, const QByteArray &vData) { + qDebug() << vData; transmitFrame(eChlid_UI, vAction, vData); }