#include "CANViewerPage.h" #include "ui_CANViewerPage.h" #include "defines.h" #include "CANDevice.h" #include "MQTTMessage.h" #include CCANViewerPage::CCANViewerPage(QWidget *parent) : QWidget(parent), ui(new Ui::CCANViewerPage) { //mMsgList = 0; ui->setupUi(this); ui->mCANDataTableWidget->setColumnCount(6); ui->mCANDataTableWidget->setHorizontalHeaderLabels(QStringList() << "Device" << "Channel" << "Msg ID" << "Msg Type" << "Msg Length" << "Data"); ui->mCANDataTableWidget->clearContents(); ui->mCANDataTableWidget->setRowCount(0); ui->mCANDataTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->mCANSignalTableWidget->setColumnCount(4); ui->mCANSignalTableWidget->setHorizontalHeaderLabels(QStringList() << "Nom du signal" << "Val. physique" << "Val. brute" << "Unités"); connect(ui->mCANDataTableWidget,&QTableWidget::itemSelectionChanged,this,&CCANViewerPage::MessageSelectionChanged); connect(ui->mCopyJSonToClipboardBtn,&QPushButton::pressed,this,&CCANViewerPage::CopyJSONToClipboardButtonPressed); } CCANViewerPage::~CCANViewerPage() { delete ui; } int CCANViewerPage::InitCANTable(QList *CANDevicesList) { //if(MsgList == 0) if(CANDevicesList == 0) { return RET_GENERAL_ERROR; } ResetPage(); mCANDevicesList = CANDevicesList; for(int Dev = 0; Dev < mCANDevicesList->size(); Dev++) { QList *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList(); int row = ui->mCANDataTableWidget->rowCount(); ui->mCANDataTableWidget->setRowCount(MsgList->size() + row); for(int Msg = 0; Msg < MsgList->size(); Msg++) { QTableWidgetItem *NewItem; NewItem = new QTableWidgetItem(mCANDevicesList->at(Dev)->mDeviceConfigInfo.mDeviceName); ui->mCANDataTableWidget->setItem(row,0,NewItem); //Set Msg name NewItem = new QTableWidgetItem(QString("%1").arg(MsgList->at(Msg)->mCANMsgName)); ui->mCANDataTableWidget->setItem(row,1,NewItem); //Set message ID value NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgID,0,16)); ui->mCANDataTableWidget->setItem(row,2,NewItem); NewItem->setData(Qt::UserRole,MsgList->at(Msg)->mCANMsgID); //Set message ID as reference to easily find the row when updating... //Set message type value NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgType,0,16)); ui->mCANDataTableWidget->setItem(row,3,NewItem); //Set message length value NewItem = new QTableWidgetItem(QString(" ")); ui->mCANDataTableWidget->setItem(row,4,NewItem); NewItem = new QTableWidgetItem(QString(" ")); ui->mCANDataTableWidget->setItem(row,5,NewItem); row++; } } return RET_OK; } int CCANViewerPage::UpdateCANTable(QList *MsgList) { //Find the row of each message and update values in table for(int msg = 0; msg < MsgList->size(); msg++) { int row = 0; for(row = 0; row < ui->mCANDataTableWidget->rowCount(); row++) { //Match device and message ID if(ui->mCANDataTableWidget->item(row,0)->text() == MsgList->at(msg)->mOwnerDeviceName && ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt() == MsgList->at(msg)->mCANMsgID) { //Set message length value ui->mCANDataTableWidget->item(row,4)->setText(QString("%1").arg(MsgList->at(msg)->mCANMsgLength)); QString Data; for(int byte = 0; byte < MsgList->at(msg)->mCANMsgData.size();byte++) { // Data.append(QString("%1 ").arg((unsigned int)MsgList->at(msg)->mCANMsgData.at(byte),2,16)); Data.append(QString().asprintf("%.2X ",(unsigned char)MsgList->at(msg)->mCANMsgData.at(byte))); } ui->mCANDataTableWidget->item(row,5)->setText(Data); } } } // UpdateSignalsTable(); MessageSelectionChanged(); return RET_OK; } void CCANViewerPage::MessageSelectionChanged() { if(mCANDevicesList->isEmpty()) { return; } ui->mCANSignalTableWidget->clearContents(); //Find message based on current table selection int row = ui->mCANDataTableWidget->currentRow(); if(row == -1) return; for(int Dev = 0; Dev < mCANDevicesList->size(); Dev++) { QString DeviceName = ui->mCANDataTableWidget->item(row,0)->text(); if(mCANDevicesList->at(Dev)->mDeviceConfigInfo.mDeviceName == DeviceName) //Find the device corresponding to the selected line { QList *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList(); for (int msg = 0; msg < MsgList->size(); msg++) { unsigned int ID = ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt(); if(ID == MsgList->at(msg)->mCANMsgID) //Find the message in the list corresponding to the selected line { CCANMessage *Msg = MsgList->at(msg); ui->mCANSignalTableWidget->clearContents(); ui->mCANSignalTableWidget->setRowCount(Msg->mSignalsList.size()); for(int signal = 0; signal < Msg->mSignalsList.size(); signal++) { //Signal name QTableWidgetItem *NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalName); ui->mCANSignalTableWidget->setItem(signal,0,NewItem); //Phys value #ifdef FORCE_FLOAT_REPRESENTATION //JFM 2023-06-13 changé pour forcer toujours à float NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1)); #else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT) { NewItem = new QTableWidgetItem(QString("%1").arg((quint64)Msg->mSignalsList.at(signal).mPhysicalValue)); } else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT) { NewItem = new QTableWidgetItem(QString("%1").arg((qint64)Msg->mSignalsList.at(signal).mPhysicalValue)); } else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT || Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE) { NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1)); } #endif ui->mCANSignalTableWidget->setItem(signal,1,NewItem); //Raw value NewItem = new QTableWidgetItem(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16)); ui->mCANSignalTableWidget->setItem(signal,2,NewItem); //Units NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalUnit); ui->mCANSignalTableWidget->setItem(signal,3,NewItem); } ui->mJSonSignalViewTxtEdit->clear(); CMQTTMessage MQTTMsg = mCANDevicesList->at(Dev)->mCANDataLogger.GetMQTTMessage(Msg,true); QString MQTTMsgDisplay = QString("Topic: %1\n\nPayload:\n%2").arg(MQTTMsg.mMessageTopic).arg(MQTTMsg.mMessagePayload); ui->mJSonSignalViewTxtEdit->insertPlainText(MQTTMsgDisplay); } } } } } int CCANViewerPage::ResetPage() { ui->mCANDataTableWidget->clearContents(); ui->mCANDataTableWidget->setRowCount(0); ui->mCANSignalTableWidget->clearContents(); ui->mCANSignalTableWidget->setRowCount(0); return RET_OK; } int CCANViewerPage::UpdateSignalsTable() { // int row = ui->mCANDataTableWidget->currentRow(); // for (int msg = 0; msg < mMsgList->size(); msg++) // { // unsigned int ID = ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt(); // if(ID == mMsgList->at(msg)->mCANMsgID) // { // CCANMessage *Msg = mMsgList->at(msg); // ui->mCANSignalTableWidget->clearContents(); // ui->mCANSignalTableWidget->setRowCount(Msg->mSignalsList.size()); // for(int signal = 0; signal < Msg->mSignalsList.size(); signal++) // { // //Signal name // ui->mCANSignalTableWidget->item(row,0)->setText(Msg->mSignalsList.at(signal).mSignalName); // //Phys value // //JFM 2023-06-13 changé pour forcer toujours à float // //Mais cette fonciton n'est jamais appelée et NE FONCTIONNE PAS. // //TODO: Corriger les index des colonnes des items à afficher // ui->mCANSignalTableWidget->item(row,0)->setText(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1)); // /* // if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT) // { // ui->mCANSignalTableWidget->item(row,0)->setText(QString("%1").arg((quint64)Msg->mSignalsList.at(signal).mPhysicalValue)); // } // else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT) // { // ui->mCANSignalTableWidget->item(row,0)->setText(QString("%1").arg((qint64)Msg->mSignalsList.at(signal).mPhysicalValue)); // } // else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT || // Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE) // { // ui->mCANSignalTableWidget->item(row,0)->setText(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1)); // }*/ // //Raw value // ui->mCANSignalTableWidget->item(row,0)->setText(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16)); // //Units // ui->mCANSignalTableWidget->item(row,0)->setText(Msg->mSignalsList.at(signal).mSignalUnit); // } // } // } return RET_OK; } void CCANViewerPage::CopyJSONToClipboardButtonPressed() { // QApplication::clipboard()->setText(ui->mJSonSignalViewTxtEdit->); ui->mJSonSignalViewTxtEdit->selectAll(); ui->mJSonSignalViewTxtEdit->copy(); }