YULTek/Otarcik_CAN/Sources/CANMessage.cpp
2023-01-21 15:31:49 -05:00

136 lines
3.3 KiB
C++

#include "CANMessage.h"
#include "defines.h"
CCANMessage::CCANMessage()
{
mSignalsList.clear();
}
CCANMessage::CCANMessage(const CCANMessage &Src)
{
*this = Src;
}
CCANMessage::CCANMessage(const quint32 Channel, const TPCANMsg CANMsg, const TPCANTimestamp CANTimeStamp)
{
SetDataFromDriver(Channel,CANMsg,CANTimeStamp);
}
CCANMessage::~CCANMessage()
{
while (!mSignalsList.isEmpty())
{
delete mSignalsList.takeFirst();
}
}
int CCANMessage::SetDataFromDriver(quint32 Channel, TPCANMsg CANMsg, TPCANTimestamp CANTimeStamp)
{
mCANChannel = Channel;
mCANMsgID = (unsigned long long)CANMsg.ID;
mCANMsgLength = (unsigned char)CANMsg.LEN;
mCANMsgType = CANMsg.MSGTYPE;
//mCANMsgData = QByteArray((const char*)&CANMsg.DATA);
for(int i = 0; i < mCANMsgLength; i++)
{
mCANMsgData.append(CANMsg.DATA[i]);
}
mCANMsgMicrosecs = CANTimeStamp.micros;
mCANMsgMillisecs = CANTimeStamp.millis;
mCANMsgMillisecsOverflow = CANTimeStamp.millis_overflow;
return 0;
}
int CCANMessage::AddSignal(CCANSignal *NewSignal)
{
if(NewSignal == 0)
{
return RET_GENERAL_ERROR;
}
mSignalsList.append(NewSignal);
}
int CCANMessage::UpdateValue(CCANMessage *NewDeviceMessage)
{
if(NewDeviceMessage->mCANMsgID != mCANMsgID)
{
qDebug("CCANMEssage error: Trying to update mismatching message ID");
return RET_GENERAL_ERROR;
}
if(NewDeviceMessage->mCANMsgLength != mCANMsgLength)
{
qDebug("CCANMessage error: New device message length different than database!!!");
return RET_GENERAL_ERROR;
}
mCANMsgData = QByteArray(NewDeviceMessage->mCANMsgData);
mCANRawDataMotorola = mCANRawDataIntel= 0;
for(int i = 0; i < mCANMsgLength; i++)
{
mCANRawDataIntel += mCANMsgData[i];
mCANRawDataMotorola += mCANMsgData[(mCANMsgLength - 1) - i];
mCANRawDataIntel <<= 8;
mCANRawDataMotorola <<= 8;
}
for(int i = 0; i < mSignalsList.size(); i++)
{
mSignalsList.at(i)->ComputeNewSignalValue(mCANRawDataMotorola,mCANRawDataIntel);
}
}
QDataStream &operator<<(QDataStream &out, const CCANMessage &source)
{
out << source.mCANChannel
<< source.mCANMsgID
<< source.mCANMsgType
<< source.mCANMsgLength
<< source.mCANMsgData
<< source.mCANMsgMillisecs
<< source.mCANMsgMillisecsOverflow
<< source.mCANMsgMicrosecs;
return out;
}
QDataStream &operator>>(QDataStream &in, CCANMessage &dest)
{
in >> dest.mCANChannel
>> dest.mCANMsgID
>> dest.mCANMsgType
>> dest.mCANMsgLength
>> dest.mCANMsgData
>> dest.mCANMsgMillisecs
>> dest.mCANMsgMillisecsOverflow
>> dest.mCANMsgMicrosecs;
return in;
}
CCANMessage& CCANMessage::operator=(const CCANMessage *source)
{
if(source == this)
{
return *this;
}
this->mCANChannel = source->mCANChannel;
this->mCANMsgID = source->mCANMsgID;
this->mCANMsgType = source->mCANMsgType;
this->mCANMsgLength = source->mCANMsgLength;
this->mCANMsgData = source->mCANMsgData;
this->mCANMsgMillisecs = source->mCANMsgMillisecs;
this->mCANMsgMillisecsOverflow = source->mCANMsgMillisecsOverflow;
this->mCANMsgMicrosecs = source->mCANMsgMicrosecs;
return *this;
}