YULTek/Otarcik_CAN/Sources/CANBus/CANDataLogger.cpp
2023-09-30 10:01:52 -04:00

194 lines
6.1 KiB
C++

#include "CANDataLogger.h"
#include "defines.h"
CCANDataLogger::CCANDataLogger():
mTopicDeviceString("")
{
mMQTTCLient = 0;
mCANMsgList.clear();
}
int CCANDataLogger::LogNewData(const QList<CCANMessage *> *MsgList)
{
//Since the MQTT msg timeout is different from the CAN read timeout (much faster), and also each CAN device can have it's own timeout we need
//store the messages and update the values until it's ready to send to the MQTT broker.
for(int i = 0; i < MsgList->size(); i++)
{
bool found = false;
int j = 0;
while(j < mCANMsgList.size() && found == false)
{
if(MsgList->at(i)->mCANMsgID == mCANMsgList.at(j).mCANMsgID &&
MsgList->at(i)->mPendingData == true)
{
//We already had this msg in the list, just update it's value
found = true;
mCANMsgList[j] = *MsgList->at(i);
}
j++;
}
if(found == false && MsgList->at(i)->mPendingData == true)
{
//Message is not in our list, we must add it.
CCANMessage NewMsg = *MsgList->at(i);
mCANMsgList.append(NewMsg);
}
}
return RET_OK;
}
int CCANDataLogger::SetMQTTTopicDevice(QString DeviceString)
{
mTopicDeviceString = DeviceString;
return RET_OK;
}
int CCANDataLogger::SetMQTTClient(CMQTTClientWrapper *MQTTClient)
{
mMQTTCLient = MQTTClient;
return RET_OK;
}
QList<CMQTTMessage> *CCANDataLogger::GetMQTTMessagesList()
{
//MQTT
//The MQTT client wants to send the messages
//For each CAN message in the list, we create a MQTT Message
//First, clear the current list
mMQTTMsgList.clear();
//qDebug("\n\n\n");
for(int i = 0; i < mCANMsgList.size(); i++)
{
// if(mCANMsgList.size() != 0)
{
CCANMessage Msg = mCANMsgList[i];
// QString MsgPayload = "{";
// QString MsgTopic = mTopicDeviceString;
// MsgTopic.append(Msg.mCANMsgName);
// // MsgTopic.append("/");
// //For each signal with new data, insert an entry in the JSon payload string
// for(int signal = 0; signal < Msg.mSignalsList.size(); signal++)
// {
// QString SignalData;
// CCANSignal Signal = Msg.mSignalsList.at(signal);
// if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT)
// {
// SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg((quint64)Signal.mPhysicalValue);
// }
// else if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT)
// {
// SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg((qint64)Signal.mPhysicalValue);
// }
// else if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT ||
// Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE)
// {
// SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg(Signal.mPhysicalValue,0,'f',1);
// }
// MsgPayload.append(SignalData);
// if(signal < Msg.mSignalsList.size()-1)
// {
// MsgPayload.append(",");
// }
// }
// MsgPayload.append("}");
// qDebug("%s",qPrintable(MsgPayload));
// CMQTTMessage NewMessage(MsgTopic, MsgPayload);
mMQTTMsgList.append(GetMQTTMessage(&Msg));
} //if(MsgList->at(i)->mPendingData == true)
}
mCANMsgList.clear();
// if(mMQTTCLient != 0)
// {
// mMQTTCLient->NewMQTTMessages(mMQTTMsgList);
// }
return &mMQTTMsgList;
}
CMQTTMessage CCANDataLogger::GetMQTTMessage(CCANMessage *Msg, bool Format )
{
QString MsgPayload = "{";
QString MsgTopic = mTopicDeviceString;
MsgTopic.append(Msg->mCANMsgName);
// MsgTopic.append("/");
#ifdef MQTT_TIMESTAMP_IN_PAYLOAD
//Millisecs to EPOCH timestamp format
qint64 TimeStamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
MsgPayload.append(QString("\"timestamp\":%1,").arg(TimeStamp));
//ISO date timestamp format
// QDateTime datetime(QDateTime::currentDateTime());
//// datetime.setOffsetFromUtc(datetime.offsetFromUtc()); //this makes no sense but it's to circumvent a bug in QT
// QString TimeStamp = datetime.toString(Qt::ISODate);
// MsgPayload.append(QString("\"timestamp\":\"%1\",").arg(TimeStamp));
if(Format == true)
{
MsgPayload.append("\n");
}
#endif
//For each signal with new data, insert an entry in the JSon payload string
for(int signal = 0; signal < Msg->mSignalsList.size(); signal++)
{
QString SignalData;
CCANSignal Signal = Msg->mSignalsList.at(signal);
#ifdef FORCE_FLOAT_REPRESENTATION
//JFM 2023-06-16 changé pour forcer toujours à float
SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg(Signal.mPhysicalValue,0,'f',1);
#else
if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT)
{
SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg((quint64)Signal.mPhysicalValue);
}
else if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT)
{
SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg((qint64)Signal.mPhysicalValue);
}
else if(Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT ||
Signal.mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE)
{
SignalData = QString("\"%1\":%2").arg(Signal.mSignalName).arg(Signal.mPhysicalValue,0,'f',1);
}
#endif
MsgPayload.append(SignalData);
if(signal < Msg->mSignalsList.size()-1)
{
MsgPayload.append(",");
if(Format == true)
{
MsgPayload.append("\n");
}
}
}
MsgPayload.append("}");
// qDebug("%s",qPrintable(MsgPayload));
CMQTTMessage NewMessage(MsgTopic, MsgPayload);
return NewMessage;
}