YULTek/Otarcik_CAN/Sources/PCANInterface.cpp
2023-01-18 17:57:12 -05:00

114 lines
4.2 KiB
C++

/*******************************************************************************
* *
* Gros Gin électronique *
* 2023 *
* *
* Project: Otarcik CAN *
* *
* *
* *
*******************************************************************************/
/*
Description:
This class interfaces the PCAN USB CAN puck
*/
#include "PCANInterface.h"
#include "GeneralMessagesLogDispatcher.h"
//#include "CANMessage.h"
CPCANInterface::CPCANInterface(QObject *parent) : QObject(parent)
{
//Init only... values not used.
mInterfaceBaudrate = PCAN_BAUD_500K;
mInterfaceCANHandle = PCAN_USBBUS1;
CANInterfaceOpened = false;
}
int CPCANInterface::Init(TPCANHandle CANDeviceChannel, TPCANBaudrate CANBaudRate)
{
mInterfaceBaudrate = CANBaudRate;
mInterfaceCANHandle = CANDeviceChannel;
TPCANStatus Result;
// Result = CAN_Initialize(PCAN_USBBUS1, PCAN_BAUD_500K);
Result = CAN_Initialize(CANDeviceChannel, CANBaudRate);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Initializing PCAN USB module. Channel:%1, Baudrate:%2").arg(PCAN_USBBUS1).arg(PCAN_BAUD_500K));
if(Result != PCAN_ERROR_OK)
{
// An error occurred, get a text describing the error and show it
//
char strMsg[256];
CAN_GetErrorText(Result, 0, strMsg);
qDebug("%s",strMsg);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Could not initialize PCAN USB module. Error:%1").arg(strMsg),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
CANInterfaceOpened = false;
return RET_GENERAL_ERROR;
}
else
{
CANInterfaceOpened = true;
CGeneralMessagesLogDispatcher::instance()->AddLogMessage("PCAN USB init SUCCESS");
}
return RET_OK;
}
int CPCANInterface::DeInit()
{
TPCANStatus Result;
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Uninitializing PCAN USB module ID %1").arg(mInterfaceCANHandle));
Result = CAN_Uninitialize(mInterfaceCANHandle) != PCAN_ERROR_OK;
if(Result)
{
char strMsg[256];
CAN_GetErrorText(Result, 0, strMsg);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Could not uninitialize PCAN USB module. Error:%1").arg(strMsg),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
}
else
{
CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Uninitializing PCAN USB module...");
}
return RET_OK;
}
QList<CCANMessage *> CPCANInterface::ReadCANFullBuffer(unsigned short Channel)
{
TPCANMsg CANMsg;
TPCANTimestamp CANTimeStamp;
TPCANStatus stsResult;
int cnt = 0;
QList<CCANMessage *> MessagesList;
MessagesList.clear();
do
{
// We execute the "Read" function of the PCANBasic
stsResult = CAN_Read(Channel, &CANMsg, &CANTimeStamp);
if (stsResult != PCAN_ERROR_QRCVEMPTY)
{
CCANMessage *NewMsg = new CCANMessage(Channel,CANMsg,CANTimeStamp);
MessagesList.append(NewMsg);
// We process the received message
qDebug("Type: 0x%X ",CANMsg.MSGTYPE);
qDebug("ID: 0x%X",CANMsg.ID);
qDebug("Length: %d",CANMsg.LEN);
qDebug("Time: micros %d - millis %d - overflow %d", CANTimeStamp.micros, CANTimeStamp.millis, CANTimeStamp.millis_overflow);
// qDebug("Data: " << GetDataString(CANMsg.DATA, CANMsg.MSGTYPE, GetLengthFromDLC(CANMsg.DLC)) << "\n";
qDebug("Count: %d",cnt++);
qDebug("----------------------------------------------------------");
}
}
while (!(stsResult & PCAN_ERROR_QRCVEMPTY));
return MessagesList;
}