#include "CANAnalyzer.h" #include "GeneralMessagesLogDispatcher.h" #include "CANDatabase.h" #include "OtarcikCan.h" CCANAnalyzer::CCANAnalyzer(QObject *parent) : QObject(parent) { mCANDriverIF = new CPCANInterface; mIsCANInitialized = false; mDevicePtr = 0; mDeviceMessagesList = 0; mCANPollPeriod = 0; mCANReadTimer = new QTimer; mCANReadTimer->setInterval(1000); mCANReadTimer->setSingleShot(true); connect(mCANReadTimer,SIGNAL(timeout()),this,SLOT(CANTimerExpired())); } CCANAnalyzer::~CCANAnalyzer() { mCANDriverIF->DeInit(); delete mCANDriverIF; delete mCANReadTimer; } int CCANAnalyzer::Init(quint8 CANDeviceChannel, TPCANBaudrate CANDeviceBaudrate, QList *MsgList, unsigned int PollPeriod) { if(MsgList == 0) { return RET_GENERAL_ERROR; } if(PollPeriod < 200) { PollPeriod = 200; qDebug("CANAnalyzer:: Trying to init with poll period lower tan 200ms"); } mCANDeviceChannel = CANDeviceChannel; mCANPollPeriod = PollPeriod; CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Démarrage d'un module CAN..."); mDeviceMessagesList = MsgList; if(mCANDriverIF->GetDeviceHandle(mCANDeviceChannel,mCANDeviceHandle) != RET_OK) { QString Log = QString("Impossible de trouver le module CAN sur le channel %1").arg(mCANDeviceChannel); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(Log,true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); mIsCANInitialized = false; return RET_GENERAL_ERROR; } if(mCANDriverIF->Init(mCANDeviceHandle,CANDeviceBaudrate) != RET_OK) { CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Impossible d'initialiser le matériel CAN",true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); mIsCANInitialized = false; return RET_GENERAL_ERROR; } else { mCANReadTimer->start(mCANPollPeriod); mIsCANInitialized = true; } return RET_OK; } int CCANAnalyzer::ReadCAN() { // TPCANMsg CANMsg; // TPCANTimestamp CANTimeStamp; // // We execute the "Read" function of the PCANBasic // TPCANStatus stsResult = CAN_Read(PcanHandle, &CANMsg, &CANTimeStamp); // if (stsResult != PCAN_ERROR_QRCVEMPTY) // { // // We process the received message // ProcessMessageCan(CANMsg, CANTimeStamp); // } // return stsResult; return RET_OK; } void CCANAnalyzer::CANTimerExpired() { QList NewMessagesList = mCANDriverIF->ReadCANFullBuffer(mCANDeviceHandle); qDebug("CAN Buffer size: %d",NewMessagesList.size()); for(int i = 0 ; i < NewMessagesList.size(); i++) { for(int j = 0; j < mDeviceMessagesList->size(); j++) { if(NewMessagesList.at(i)->mCANMsgID == mDeviceMessagesList->at(j)->mCANMsgID) { mDeviceMessagesList->at(j)->UpdateValue(NewMessagesList.at(i)); mDeviceMessagesList->at(j)->mPendingData = true; } } } //Don't leak!! while(!NewMessagesList.isEmpty()) { delete NewMessagesList.takeFirst(); } mDevicePtr->NewMessageParsed(); if(NewMessagesList.isEmpty()) { mCANReadTimer->start(); return; } NewMessagesList.clear(); mCANReadTimer->start(); // mProgramPtr->UpdateCANViewerDataRequest(mLastMessagesList); }