1 #include "signalviewerwindow.h"
2 #include "ui_signalviewerwindow.h"
3 #include "helpwindow.h"
4 #include "mainwindow.h"
5 #include <QDebug>
6
SignalViewerWindow(const QVector<CANFrame> * frames,QWidget * parent)7 SignalViewerWindow::SignalViewerWindow(const QVector<CANFrame> *frames, QWidget *parent) :
8 QDialog(parent),
9 ui(new Ui::SignalViewerWindow)
10 {
11 ui->setupUi(this);
12 setWindowFlags(Qt::Window);
13
14 modelFrames = frames;
15
16 QStringList headers;
17 headers << "Signal" << "Value";
18 ui->tableViewer->setHorizontalHeaderLabels(headers);
19 ui->tableViewer->setColumnWidth(0, 150);
20 ui->tableViewer->setColumnWidth(1, 300);
21 QHeaderView *HorzHdr = ui->tableViewer->horizontalHeader();
22 HorzHdr->setStretchLastSection(true); //causes the data column to automatically fill the tableview
23
24 dbcHandler = DBCHandler::getReference();
25
26 connect(ui->cbMessages, SIGNAL(currentIndexChanged(int)), this, SLOT(loadSignals(int)));
27 connect(ui->btnAdd, SIGNAL(clicked(bool)), this, SLOT(addSignal()));
28 connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int)));
29 connect(ui->btnRemove, SIGNAL(clicked(bool)), this, SLOT(removeSelectedSignal()));
30
31 loadMessages();
32 }
33
~SignalViewerWindow()34 SignalViewerWindow::~SignalViewerWindow()
35 {
36 delete ui;
37 }
38
updatedFrames(int numFrames)39 void SignalViewerWindow::updatedFrames(int numFrames)
40 {
41 CANFrame thisFrame;
42
43 if (numFrames == -1) //all frames deleted. Don't care
44 {
45 }
46 else if (numFrames == -2) //all new set of frames. Reset
47 {
48 for (int i = 0; i < modelFrames->count(); i++)
49 {
50 thisFrame = modelFrames->at(i);
51 processFrame(thisFrame);
52 }
53 }
54 else //just got some new frames. See if they are relevant.
55 {
56 if (numFrames > modelFrames->count()) return;
57
58 for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++)
59 {
60 thisFrame = modelFrames->at(i);
61 processFrame(thisFrame);
62 }
63 }
64 }
65
processFrame(CANFrame & frame)66 void SignalViewerWindow::processFrame(CANFrame &frame)
67 {
68 QString sigString;
69 DBC_SIGNAL *sig;
70 for (int i = 0; i < signalList.count(); i++)
71 {
72 sig = signalList.at(i);
73 if (!sig) return;
74 if (sig->parentMessage->ID == frame.frameId())
75 {
76 if (sig->processAsText(frame, sigString, false)) //if true we could interpret the signal so update it in the list
77 {
78 QTableWidgetItem *item = ui->tableViewer->item(i, 1);
79 if (!item)
80 {
81 item = new QTableWidgetItem(sigString);
82 ui->tableViewer->setItem(i, 1, item);
83 }
84 else item->setText(sigString);
85 }
86 }
87 }
88 }
89
removeSelectedSignal()90 void SignalViewerWindow::removeSelectedSignal()
91 {
92 int selRow = ui->tableViewer->currentRow();
93 if (selRow < 0) return; //no selected row
94 signalList.removeAt(selRow);
95 ui->tableViewer->removeRow(selRow);
96 }
97
loadMessages()98 void SignalViewerWindow::loadMessages()
99 {
100 int numFiles;
101 ui->cbMessages->clear();
102 if (dbcHandler == nullptr) return;
103 if ((numFiles = dbcHandler->getFileCount()) == 0) return;
104 qDebug() << numFiles;
105 for (int f = 0; f < numFiles; f++)
106 {
107 qDebug() << dbcHandler->getFileByIdx(f)->messageHandler->getCount();
108 for (int x = 0; x < dbcHandler->getFileByIdx(f)->messageHandler->getCount(); x++)
109 {
110 ui->cbMessages->addItem(dbcHandler->getFileByIdx(f)->messageHandler->findMsgByIdx(x)->name);
111 }
112 }
113 }
114
loadSignals(int idx)115 void SignalViewerWindow::loadSignals(int idx)
116 {
117 Q_UNUSED(idx);
118 //messages were placed into the list in the same order as they exist
119 //in the data structure so it should have been possible to just
120 //look it up based on index but by name is probably safer and this operation
121 //is not time critical at all.
122 DBC_MESSAGE *msg = dbcHandler->findMessage(ui->cbMessages->currentText());
123
124 if (msg == nullptr) return;
125 ui->cbSignals->clear();
126 for (int x = 0; x < msg->sigHandler->getCount(); x++)
127 {
128 ui->cbSignals->addItem(msg->sigHandler->findSignalByIdx(x)->name);
129 }
130 }
131
addSignal()132 void SignalViewerWindow::addSignal()
133 {
134 DBC_MESSAGE *msg = dbcHandler->findMessage(ui->cbMessages->currentText());
135 if (!msg) return;
136 DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(ui->cbSignals->currentText());
137 if (!sig) return;
138
139 signalList.append(sig);
140
141 int rowIdx = ui->tableViewer->rowCount();
142 ui->tableViewer->insertRow(rowIdx);
143 QTableWidgetItem *item = new QTableWidgetItem(sig->name);
144 ui->tableViewer->setItem(rowIdx, 0, item);
145
146 }
147