Index: sources/canbus/messagedispatcher.cpp =================================================================== diff -u -rb2ebb6f71cf9b0c2ba68a47776e5b220b165b21c -r1732e83d2a0308b9c706f37d6d7724a364bbff2a --- sources/canbus/messagedispatcher.cpp (.../messagedispatcher.cpp) (revision b2ebb6f71cf9b0c2ba68a47776e5b220b165b21c) +++ sources/canbus/messagedispatcher.cpp (.../messagedispatcher.cpp) (revision 1732e83d2a0308b9c706f37d6d7724a364bbff2a) @@ -13,9 +13,123 @@ */ #include "messagedispatcher.h" +// Qt + +// Project +#include "applicationcontroller.h" +#include "messagehandler.h" +#include "maintimer.h" + using namespace Can; -MessageDispatcher::MessageDispatcher(QObject *parent) : QObject(parent) +// 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(); +}