Index: sources/canbus/messagehandler.cpp =================================================================== diff -u -r272bb81655222b2bf0c3c7099523c0b658eb9cb8 -r1732e83d2a0308b9c706f37d6d7724a364bbff2a --- sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision 272bb81655222b2bf0c3c7099523c0b658eb9cb8) +++ sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision 1732e83d2a0308b9c706f37d6d7724a364bbff2a) @@ -23,8 +23,8 @@ // Project #include "maintimer.h" -#include "applicationcontroller.h" -#include "guiglobals.h" +#include "messagedispatcher.h" +#include "caninterface.h" // namespace using namespace Can; @@ -54,90 +54,64 @@ void MessageHandler::initConnections() { // From GUI - connect(_ApplicationController, SIGNAL(didActionTransmit(GuiActionType, const QVariantList &)), - this , SLOT( onActionTransmit(GuiActionType, const QVariantList &))); + connect(_MessageDispatcher, SIGNAL(didFrameTransmit(Can_Id, const QByteArray &)), + this , SLOT( onFrameTransmit(Can_Id, const QByteArray &))); - // From HD/DG - connect(_CanInterface , SIGNAL( didRead(QCanBusFrame)), - this , SLOT(onFrameReceive (QCanBusFrame))); - - connect(_MainTimer , SIGNAL( didTimeout()), - this , SLOT(onMainTimerTimeout())); + // From CAN + connect(_CanInterface , SIGNAL( didFrameReceive( const QCanBusFrame &)), + this , SLOT( onFrameReceive( const QCanBusFrame &))); } -void MessageHandler::checked_in() +void MessageHandler::transmitFrame(Can_Id vFrameId, const QByteArray &vData) { - transmitFrame(eChlid_UI, GuiActions::Check_In); -} - -void MessageHandler::transmitFrame(Can_Id vFrameId, GuiActionType vAction, const QByteArray &vData) -{ QCanBusFrame mFrame; mFrame.setFrameId(vFrameId); - QList mFrames = _builder.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); + if (vData.length() > Can::eLenCanFrame) { + qDebug() << "Error :" << tr("Payload can't be larger than %1 bytes").arg(Can::eLenCanFrame); + return; } + mFrame.setPayload(vData); + emit didFrameTransmit(mFrame); } -bool MessageHandler::ignoreChannel(const QCanBusFrame &vFrame) +MessageHandler::ChannelGroup MessageHandler::checkChannel(quint32 vFrameId, bool *vOK) { - //TODO : There should be an easy way to find if the correct CAN ID has been received - Can_Id mCanId = static_cast(vFrame.frameId()); - switch (mCanId) { - case eChlid_HD_DG: - case eChlid_DG_HD: - return true; + bool ok = true; + MessageHandler::ChannelGroup channelGroup = ChannelGroup::eChannel_Unknown; + switch (vFrameId) { + case eChlid_HD_DG : + case eChlid_DG_HD : + channelGroup = ChannelGroup::eChannel_Ignores; break; - case eChlid_HD: + + case eChlid_HD : + case eChlid_HD_Alarm : + case eChlid_DG_Alarm : + case eChlid_HD_Sync : + case eChlid_DG_Sync : + //case eChlid_DG_UI : // has duplicate value as eChlid_DG_Alarm + //case eChlid_UI_DG : // has duplicate value as eChlid_UI_Sync + channelGroup = ChannelGroup::eChannel_Listens; break; - default: - break; - } - return false; -} -bool MessageHandler::interpretData(const Message &vMessage, GuiActionType &vActionId, QVariantList &vData) -{ - quint8 tmp; - quint8 l = vMessage.data.length(); - quint8 i = 0; - vActionId = vMessage.actionId; - vData.clear(); - switch (vActionId) { // notice we are in receive mode - case GuiActionType::PowerOff: - i = GuiActions::PowerOff_Show; - if (l >= i + 1) { - tmp = vMessage.data[GuiActions::PowerOff_Show]; - vData += static_cast(tmp); - } - //TODO: (MessageInterpreter) There should be an easy way to check if a correct data has been provided. + case eChlid_UI_Alarm : + case eChlid_UI_Sync : + case eChlid_UI : + channelGroup = ChannelGroup::eChannel_Outputs; break; - case GuiActionType::BloodFlow: - break; + default: - vData += GuiActionData::Command; + ok = false; break; } - return true; + + if (vOK) *vOK = ok; + return channelGroup; } -/*! - * \brief Process the requested action - * \details Processes the requested action - * \param vAction - User requested Action - */ -void MessageHandler::onActionTransmit(GuiActionType vAction, const QVariantList &vData) +void MessageHandler::onFrameTransmit(Can_Id vCan_ID, const QByteArray &vData) { - qDebug() << vData; - QByteArray mData; - for (auto data: vData) { - mData += fromVariant(data); - } - transmitFrame(eChlid_UI, vAction, mData); + transmitFrame(vCan_ID, vData); } /*! @@ -146,27 +120,19 @@ */ void MessageHandler::onFrameReceive(const QCanBusFrame &vFrame) { - if (ignoreChannel(vFrame)) { - return; - } + bool ok = false; + quint32 mFrameId = vFrame.frameId(); + ChannelGroup channelGroup = checkChannel(mFrameId, &ok); - Message mMessage; - if (! _builder.stripMessage(vFrame.payload(), mMessage)) { + if (!ok){ + qDebug() << "ERROR : " << "Unexpected Channel"; return; } - // FIXME: Needs MessageInterpreter class for data in each action [Sprint 8] - GuiActionType mActionId; - QVariantList mData; - if (! interpretData(mMessage, mActionId, mData)) { + if ( channelGroup != ChannelGroup::eChannel_Listens) { return; } - emit didActionReceive (mActionId, mData); + Can_Id mCanId = static_cast(mFrameId); + emit didFrameReceive(mCanId, vFrame.payload()); } - -void MessageHandler::onMainTimerTimeout() -{ - //QMetaObject::invokeMethod(this, "checked_in"); - checked_in(); -}