/*! * * 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.h * date 12/9/2019 * author Behrouz NematiPour * */ #pragma once // Qt #include // Project #include "main.h" #include "messageglobals.h" #include "messagebuilder.h" #include "messageinterpreter.h" // define #define _MessageDispatcher MessageDispatcher::I() using namespace Gui; namespace Can { /*! * \brief The MessageDispatcher class * \details Message Dispatcher is the class which is the mediator between CanBus Frames * and Application Messages. * The massages and frames need to be interpreted form/to hex * and also need to be split into frames or constructor from frames to be a message. * ---------------------------------------------------------------------------------------- * * Interpreter : message [ toHex , fromHex] * * Builder : message [ toFrame , fromFrame ] * * Dispatcher : signal->Handler( .. frame .. ) * * Handler : signal->Dispatcher( .. frame .. ) * * ---------------------------------------------------------------------------------------- * * *** UI <-> AppController <-> Dispatcher <-> Handler <-> HD *** * * ---------------------------------------------------------------------------------------- * * UI -> message -> * AppController { * signal->Dispatcher ( .. message .. ) * } * * Dispatcher { * .. * messageList[ch][frameList] += Builder.toFrame ( Interpreter.toHex ( message ) ) * .. * signal->Handler( .. frame .. ) * } * * ---------------------------------------------------------------------------------------- * * HD -> frame -> * Handler { * signal->Dispatcher ( .. frame .. ) * } * * Dispatcher { * messageList[ch][frameList] += Interpreter.fromHex( frame ) * isComplete => Builder.fromFrame( frameList ) : signal->AppController * } * * ---------------------------------------------------------------------------------------- */ class MessageDispatcher : public QObject { Q_OBJECT QHash _messageList; MessageBuilder _builder; MessageInterpreter _interpreter; // Singleton SINGLETON_DECL(MessageDispatcher) public: void init(); void enableConsoleOut(bool vEnable) { _builder.enableConsoleOut(vEnable); } private: void initConnections(); void keepAlive(); void actionTransmit(GuiActionType vActionId, const QVariantList &vData); signals: // When frames received and processed to action and are ready then notifies UI Action is ready void didActionReceive(GuiActionType vAction , const QVariantList &vData); void didFrameTransmit(Can_Id vCanId , const QByteArray &vPayload); private slots: // A Frame has been received from CanInterface void onFrameReceive (Can_Id vCanId , const QByteArray &vPayload); // An Action has been requested to be transmitted. void onActionTransmit(GuiActionType vActionId, const QVariantList &vData); void onMainTimerTimeout(); }; }