Index: sources/canbus/messagehandler.cpp =================================================================== diff -u -rf37a92ae779a27d59fa26d91f0656bd55852c6e1 -rf36dd9c29f633b54bf7f0232093ecaefa5452ca8 --- sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision f37a92ae779a27d59fa26d91f0656bd55852c6e1) +++ sources/canbus/messagehandler.cpp (.../messagehandler.cpp) (revision f36dd9c29f633b54bf7f0232093ecaefa5452ca8) @@ -22,6 +22,7 @@ #include // Project +#include "maintimer.h" #include "applicationcontroller.h" // namespace @@ -42,8 +43,6 @@ void MessageHandler::init() { initConnections(); - checked_in(); - //startTimer(1000); } /*! @@ -59,6 +58,9 @@ // From HD/DG connect(_CanInterface , SIGNAL( didRead(QCanBusFrame)), this , SLOT(onFrameReceive (QCanBusFrame))); + + connect(_MainTimer , SIGNAL( didTimeout()), + this , SLOT(onMainTimerTimeout())); } void MessageHandler::checked_in() @@ -74,6 +76,23 @@ emit didFrameTransmit(mFrame); } +bool MessageHandler::ignoreChannel(const QCanBusFrame &vFrame) +{ + //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; + break; + case eChlid_HD: + break; + default: + break; + } + return false; +} + QByteArray MessageHandler::buildMessage(GuiActionType vAction, GuiActionData vData) { QByteArray mPayload ; @@ -131,6 +150,38 @@ return true;//calcCRC(vData) == vCRC; } +bool MessageHandler::stripMessage(const QCanBusFrame &vFrame, Message &vMessage) +{ + QByteArray mPayload = vFrame.payload(); + + //if (messages[mCanId].isEmpty()) { + // messages[mCanId].append(Message()); + //} + //if (messages[mCanId].last().isComplete()) { + // messages[mCanId].append(Message()); + //} + // + //Message message = messages[mCanId].last(); + + // when we are here the message is new or partial. + bool ok = false; + if (hasSyncByte(mPayload)) { + vMessage.actionId = getActionId(mPayload); + vMessage.length = getLength (mPayload); + vMessage.data = getData (mPayload, vMessage.length, &ok); + if (!ok) { + qDebug() << "ERROR : CRC error"; + return false; + } + } else { + qDebug() << "ERROR : incomplete message or corrupted without sync byte (without header)"; + return false; + } + + //messages[mCanId].append(message); + return true; +} + bool MessageHandler::hasSyncByte(QByteArray &vPayload) { quint8 mSyncByte = vPayload[0]; @@ -174,12 +225,28 @@ return mData; } +bool MessageHandler::interpretData(const Message &vMessage, GuiActionType &vActionId, GuiActionData &vData) +{ + quint8 tmp; + vActionId = vMessage.actionId; + switch (vActionId) { // notice we are in receive mode + case GuiActionType::PowerOff: + tmp = vMessage.data[0]; + vData = static_cast(tmp); + //TODO: (MessageInterpreter) There should be an easy way to check if a correct data has been provided. + break; + default: + vData = GuiActionData::Command; + break; + } + return true; +} + void MessageHandler::addCRC(QByteArray &vPayload) { vPayload += calcCRC(vPayload); } - /*! * \brief Process the requested action * \details Processes the requested action @@ -196,55 +263,27 @@ */ void MessageHandler::onFrameReceive(const QCanBusFrame &vFrame) { - bool isUnknown = false; - bool isIgnored = false; + if (ignoreChannel(vFrame)) { + return; + } - //TODO : There should be a 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: - isIgnored = true; - break; - case eChlid_HD: - break; - default: - break; + Message mMessage; + if (! stripMessage(vFrame,mMessage)) { + return; } - QByteArray mPayload = vFrame.payload(); - - //if (messages[mCanId].isEmpty()) { - // messages[mCanId].append(Message()); - //} - //if (messages[mCanId].last().isComplete()) { - // messages[mCanId].append(Message()); - //} - // - //Message message = messages[mCanId].last(); - - Message message; - // when we are here the message is new or partial. - bool ok = false; - if (hasSyncByte(mPayload)) { - message.actionId = getActionId(mPayload); - message.length = getLength (mPayload); - message.data = getData (mPayload, message.length, &ok); - if (!ok) { - qDebug() << "ERROR : CRC error"; - } - } else { - qDebug() << "ERROR : incomplete message or corrupted without sync byte (without header)"; + // FIXME: Needs MessageInterpreter class for data in each action [Sprint 8] + GuiActionType mActionId; + GuiActionData mData; + if (! interpretData(mMessage, mActionId, mData)) { + return; } - //messages[mCanId].append(message); - - if (isUnknown || isIgnored) return; - - emit didActionReceive (message.actionId, GuiActionData::Accepted); + emit didActionReceive (mActionId, mData); } -void MessageHandler::timerEvent(QTimerEvent *event) +void MessageHandler::onMainTimerTimeout() { - QObject::timerEvent(event); + //QMetaObject::invokeMethod(this, "checked_in"); + checked_in(); }