/*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, * IN PART OR IN WHOLE, * WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * file messagepacker.cpp * date 12/9/2019 * author Behrouz NematiPour * */ #include "messagedispatcher.h" // Qt // Project #include "applicationcontroller.h" #include "messagehandler.h" #include "maintimer.h" using namespace Can; // Singleton SINGLETON_INIT(MessageDispatcher) /*! * \brief MessageDispatcher Constructor * \param parent */ MessageDispatcher::MessageDispatcher(QObject *parent) : QObject(parent) { } /*! * \brief Message Handler initializer */ void MessageDispatcher::init() { initConnections(); } /*! * \brief Message Handler connections definition * \details Initializes the required signal/slot connection between this class and other objects\n * to be able to communicate. */ void MessageDispatcher::initConnections() { // From GUI connect(_ApplicationController, SIGNAL(didActionTransmit(GuiActionType, const QVariantList &)), this , SLOT( onActionTransmit(GuiActionType, const QVariantList &))); // From HD connect(_MessageHandler , SIGNAL(didFrameReceive ( Can_Id, const QByteArray &)), this , SLOT( onFrameReceive ( Can_Id, const QByteArray &))); // From GUI : Scheduled keep alive signal connect(_MainTimer , SIGNAL( didTimeout()), this , SLOT(onMainTimerTimeout())); } void MessageDispatcher::keepAlive() { #ifndef QT_DEBUG QVariantList mData; mData += static_cast(GuiActionData::NoData); actionTransmit(GuiActionType::KeepAlive, mData); #endif } void MessageDispatcher::onFrameReceive(Can_Id vCanId, const QByteArray &vPayload) { // Append a message to the list if (_messageList[vCanId].isEmpty() || _messageList[vCanId].last().isComplete()) { _messageList[vCanId].append(Message()); } // build the message if (! _builder.buildMessage(vPayload, _messageList[vCanId].last())) { // Test for (const auto &key : _messageList.keys()) { for (const auto &item : _messageList[key]) { qDebug() << "item :" << key << item.actionId << item.data; } } qDebug() << ""; _messageList[vCanId].removeLast(); return; } Message mMessage = _messageList[vCanId].last(); // Test for (const auto &key : _messageList.keys()) { for (const auto &item : _messageList[key]) { qDebug() << "item :" << key << item.actionId << item.data; } } qDebug() << ""; // TODO : must be moved to a MessageModel class if (mMessage.isComplete()) { GuiActionType mActionId; QVariantList mData; if (_interpreter.interpretMessage(vCanId, mMessage, mActionId, mData)) { emit didActionReceive(mActionId, mData); } _messageList[vCanId].removeLast(); } } void MessageDispatcher::onActionTransmit(GuiActionType vActionId, const QVariantList &vData) { actionTransmit(vActionId, vData); } void MessageDispatcher::actionTransmit(GuiActionType vActionId, const QVariantList &vData) { QByteArray mData; if (! _interpreter.interpretAction(vActionId, vData, mData)) { qDebug() << "Error :" << "Incorrect Message"; return; } FrameList frameList = _builder.buildFrames(vActionId, mData); for (const auto &frame : frameList) { emit didFrameTransmit(eChlid_UI, frame); } } void MessageDispatcher::onMainTimerTimeout() { //QMetaObject::invokeMethod(this, "checked_in"); keepAlive(); }