#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; mCANReadTimer = new QTimer; mCANReadTimer->setInterval(200); mCANReadTimer->setSingleShot(true); connect(mCANReadTimer,SIGNAL(timeout()),this,SLOT(CANTimerExpired())); } CCANAnalyzer::~CCANAnalyzer() { mCANDriverIF->DeInit(); delete mCANDriverIF; delete mCANReadTimer; } int CCANAnalyzer::Init(TPCANHandle CANDeviceChannel, TPCANBaudrate CANDeviceBaudrate, QList *MsgList) { if(MsgList == 0) { return RET_GENERAL_ERROR; } mCANDeviceChannel = CANDeviceChannel; CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Démarrage d'un module CAN..."); mDeviceMessagesList = MsgList; if(mCANDriverIF->Init(mCANDeviceChannel,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(); 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(mCANDeviceChannel); 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)); } } } //Don't leak!! while(!NewMessagesList.isEmpty()) { delete NewMessagesList.takeFirst(); } if(NewMessagesList.isEmpty()) { mCANReadTimer->start(); return; } // for(int i = 0; i < NewMessagesList.size(); i++) // { // if(mLastMessagesList.isEmpty()) // { // mLastMessagesList.append(NewMessagesList.at(i)); // } // else // { // //Check if new message ID for this device already exists in the list. // bool found = false; // for(int j = 0; j < mLastMessagesList.size(); j++) // { // if(NewMessagesList[i]->mCANChannel == mLastMessagesList[j]->mCANChannel && // NewMessagesList[i]->mCANMsgID == mLastMessagesList[j]->mCANMsgID) // { // //This message ID is already populated in the list. Update the value and delete the new instance // mLastMessagesList[j]->mCANMsgData = NewMessagesList[i]->mCANMsgData; // mLastMessagesList[j]->mCANMsgMicrosecs = NewMessagesList[i]->mCANMsgMicrosecs; // mLastMessagesList[j]->mCANMsgMillisecs = NewMessagesList[i]->mCANMsgMillisecs; // mLastMessagesList[j]->mCANMsgMillisecsOverflow = NewMessagesList[i]->mCANMsgMillisecsOverflow; // delete NewMessagesList[i]; // DeletedPtrs++; // found = true; // break; // } // } // if(!found) // { // //This is the first time we receive this message, just add it to the list. // mLastMessagesList.append(NewMessagesList[i]); // } // } // } NewMessagesList.clear(); mCANReadTimer->start(); // mProgramPtr->UpdateCANViewerDataRequest(mLastMessagesList); }