Index: sources/applicationcontroller.cpp =================================================================== diff -u -r2085b749d1d0aafe823e840f5aa0bc88a340798a -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/applicationcontroller.cpp (.../applicationcontroller.cpp) (revision 2085b749d1d0aafe823e840f5aa0bc88a340798a) +++ sources/applicationcontroller.cpp (.../applicationcontroller.cpp) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -51,23 +51,20 @@ void ApplicationController::initConnections() { // From GUI - connect(_GuiController , SIGNAL(didActionTransmit(GuiActionType, GuiActionData)), - this , SLOT( onActionTransmit(GuiActionType, GuiActionData))); + connect(_GuiController , SIGNAL(didActionTransmit(GuiActionType, const QByteArray &)), + this , SLOT( onActionTransmit(GuiActionType, const QByteArray &))); // From HD/DG - connect(_MessageHandler, SIGNAL(didActionReceive (GuiActionType, GuiActionData)), - this , SLOT( onActionReceive (GuiActionType, GuiActionData))); + connect(_MessageHandler, SIGNAL(didActionReceive (GuiActionType, GuiActionData)), + this , SLOT( onActionReceive (GuiActionType, GuiActionData))); } /*! * \brief Process the requested action * \details Processes the requested action * \param vAction - User requested Action */ -void ApplicationController::onActionTransmit(GuiActionType vAction, GuiActionData vData) +void ApplicationController::onActionTransmit(GuiActionType vAction, const QByteArray &vData) { - // qDebug() << "ApplicationController.actionPerformed : " << vAction << vData; - // Process the performed action by GUI - // Process ... emit didActionTransmit(vAction, vData); } @@ -80,8 +77,5 @@ */ void ApplicationController::onActionReceive (GuiActionType vAction, GuiActionData vData) { - // qDebug() << "ApplicationController.actionConfirmed : " << vAction; - // Process the command and notify GUI Controller - // Process ... emit didActionReceive (vAction, vData); } Index: sources/applicationcontroller.h =================================================================== diff -u -r2085b749d1d0aafe823e840f5aa0bc88a340798a -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/applicationcontroller.h (.../applicationcontroller.h) (revision 2085b749d1d0aafe823e840f5aa0bc88a340798a) +++ sources/applicationcontroller.h (.../applicationcontroller.h) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -48,12 +48,12 @@ void initConnections(); private slots: // Should be private for thread safety and is connected internally. - void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG - void onActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void onActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG signals: - void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG - void didActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void didActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG void quit(int retcode=0); Index: sources/canbus/caninterface.cpp =================================================================== diff -u -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/canbus/caninterface.cpp (.../caninterface.cpp) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) +++ sources/canbus/caninterface.cpp (.../caninterface.cpp) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -77,7 +77,7 @@ void CanInterface::initConnections() { if (_canDevice) { - connect(_canDevice, SIGNAL( framesReceived()), + connect(_canDevice, SIGNAL( framesReceived()), this , SLOT (onFrameReceive ())); connect(_canDevice, SIGNAL( errorOccurred(QCanBusDevice::CanBusError)), @@ -108,6 +108,7 @@ .arg(_canInterface) .arg(mError) ; + qDebug() << _canStatus; } /*! 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); } Index: sources/canbus/messagehandler.h =================================================================== diff -u -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/canbus/messagehandler.h (.../messagehandler.h) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) +++ sources/canbus/messagehandler.h (.../messagehandler.h) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -68,9 +68,9 @@ // friends friend class ::unittests; - const QHash payloadLen { - {GuiActionType::PowerOff, 0x01}, - {GuiActionType::Check_In, 0x00} + const QHash payloadLen { + {GuiActionType::PowerOff, 1}, + {GuiActionType::Check_In, 0} }; // constants @@ -82,6 +82,7 @@ enum Frame_Data : quint8 { eLenCanFrame = 8, eLenMaxHeaderData = 3, + eLenMaxData = 255, eLenSyncByte = 1, eLenActionId = 2, @@ -134,16 +135,15 @@ void initConnections(); void checked_in(); - void transmitFrame(MessageHandler::Can_Id vCan_Id, GuiActionType vAction, GuiActionData vData = GuiActionData::NoData); + void transmitFrame(MessageHandler::Can_Id vCan_Id, GuiActionType vAction, const QByteArray &vData = 0); bool ignoreChannel(const QCanBusFrame &vFrame); // build message to be sent - QByteArray buildMessage (GuiActionType vAction , GuiActionData vData); + QList buildMessage(GuiActionType vAction , const QByteArray &vData); void addSyncByte (QByteArray &vPayload); void addActionId (QByteArray &vPayload, GuiActionType vAction); - void addLegth (QByteArray &vPayload, GuiActionType vAction); - void addData (QByteArray &vPayload, GuiActionData vData); + void addData (QByteArray &vPayload, GuiActionType vAction, const QByteArray &vData); void addCRC (QByteArray &vPayload); void addPadding (QByteArray &vPayload); @@ -152,7 +152,7 @@ bool checkCRC (const QByteArray &vData, quint8 vCRC); // strip message to its parts - bool stripMessage(const QCanBusFrame &vFrame, Message &vMessage); + bool stripMessage (const QCanBusFrame &vFrame, Message &vMessage); bool hasSyncByte (QByteArray &vPayload); GuiActionType getActionId (QByteArray &vPayload); quint8 getLength (QByteArray &vPayload); @@ -162,8 +162,8 @@ bool interpretData(const Message &vMessage, GuiActionType &vActionId, GuiActionData &vData); private slots: // Should be private for thread safety and is connected internally. - void onActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG - void onFrameReceive (const QCanBusFrame &vFrame ); // UI <= HD/DG + void onActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG + void onFrameReceive (const QCanBusFrame &vFrame ); // UI <= HD/DG void onMainTimerTimeout(); Index: sources/gui/guicontroller.cpp =================================================================== diff -u -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/gui/guicontroller.cpp (.../guicontroller.cpp) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) +++ sources/gui/guicontroller.cpp (.../guicontroller.cpp) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -58,14 +58,14 @@ * Sometimes GuiController requires to investigate with the ApplicationController to get approval from HD device.\n * \param vAction - User requested Action */ -void GuiController::doActionTransmit(GuiActionType vAction, GuiActionData vData) +void GuiController::doActionTransmit(GuiActionType vAction, const QByteArray &vData) { if (! handleTransmit(vAction, vData)) { emit didActionTransmit(vAction, vData); } } -bool GuiController::handleTransmit(GuiActionType, GuiActionData) +bool GuiController::handleTransmit(GuiActionType, const QByteArray &) { // This is an example implementation of how to handle // which does not require HD approval in GuiController Index: sources/gui/guicontroller.h =================================================================== diff -u -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/gui/guicontroller.h (.../guicontroller.h) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) +++ sources/gui/guicontroller.h (.../guicontroller.h) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -37,17 +37,17 @@ private: void initConnections(); - bool handleTransmit(GuiActionType vAction, GuiActionData vData); + bool handleTransmit(GuiActionType vAction, const QByteArray &vData); public slots: - void doActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void doActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG private slots: // Should be private for thread safety and is connected internally. - void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG signals: - void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG - void didActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void didActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG }; } Index: sources/gui/guiview.cpp =================================================================== diff -u -r2085b749d1d0aafe823e840f5aa0bc88a340798a -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/gui/guiview.cpp (.../guiview.cpp) (revision 2085b749d1d0aafe823e840f5aa0bc88a340798a) +++ sources/gui/guiview.cpp (.../guiview.cpp) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -37,18 +37,40 @@ // since we don't have access to GuiView object because it is created in Qml. // Connection to the GuiController made here // It should be defined in the class which wants to connect to signal. - connect(this , SIGNAL(didActionTransmit(GuiActionType,GuiActionData)), - _GuiController, SLOT( doActionTransmit(GuiActionType,GuiActionData))); + connect(this , SIGNAL(didActionTransmit(GuiActionType,const QByteArray &)), + _GuiController, SLOT( doActionTransmit(GuiActionType,const QByteArray &))); + } +QByteArray GuiView::fromVariant(const QVariant &vData) +{ + QByteArray mData; + if(vData.type() == QVariant::String) { + mData += vData.toByteArray(); + } else { + mData += vData.toUInt(); + } + return mData; +} + void GuiView::onActionReceive (GuiActionType vAction, GuiActionData vData) { // process the evaluation and notify GUI // process ... emit didActionReceive (vAction, vData); } -void GuiView::doActionTransmit(GuiActionType vAction, GuiActionData vData) +void GuiView::doActionTransmit(GuiActionType vAction, const QVariantList &vData) { - emit didActionTransmit(vAction, vData); + QByteArray mData; + for (auto data: vData) { + mData += fromVariant(data); + } + emit didActionTransmit(vAction, mData); } + +void GuiView::doActionTransmit(GuiActionType vAction, const QVariant &vData) +{ + QByteArray mData = fromVariant(vData); + emit didActionTransmit(vAction, mData); +} Index: sources/gui/guiview.h =================================================================== diff -u -r2085b749d1d0aafe823e840f5aa0bc88a340798a -r4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3 --- sources/gui/guiview.h (.../guiview.h) (revision 2085b749d1d0aafe823e840f5aa0bc88a340798a) +++ sources/gui/guiview.h (.../guiview.h) (revision 4c53c7c62df7562a6c0915f0c5af7ea0ed884ca3) @@ -34,15 +34,18 @@ private: void initConnections(); + QByteArray fromVariant(const QVariant &vData); private slots: - void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void onActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG public slots: // is public since will be used in the UI and is in the same thread. - void doActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void doActionTransmit(GuiActionType vAction, const QVariantList &vData); // UI => HD/DG + void doActionTransmit(GuiActionType vAction, const QVariant &vData); // UI => HD/DG signals: - void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG - void didActionTransmit(GuiActionType vAction, GuiActionData vData); // UI => HD/DG + void didActionReceive (GuiActionType vAction, GuiActionData vData); // UI <= HD/DG + void didActionTransmit(GuiActionType vAction, const QByteArray &vData); // UI => HD/DG + }; }