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