From 77031f131089dd82bf453bc69d92e554b72874d7 Mon Sep 17 00:00:00 2001 From: canpadawan Date: Tue, 31 May 2016 14:48:45 +0200 Subject: [PATCH 1/5] bug fix when no file is selected --- dbchandler.cpp | 5 ++++- dbcloadsavewindow.cpp | 10 ++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/dbchandler.cpp b/dbchandler.cpp index 2851c60..057ecb1 100644 --- a/dbchandler.cpp +++ b/dbchandler.cpp @@ -764,8 +764,11 @@ DBCFile* DBCHandler::loadDBCFile(int idx) DBCFile newFile; newFile.loadFile(filename); loadedFiles.append(newFile); + + return &loadedFiles.last(); } - return &loadedFiles.last(); + + return NULL; } void DBCHandler::removeDBCFile(int idx) diff --git a/dbcloadsavewindow.cpp b/dbcloadsavewindow.cpp index e66a9b5..0ef704d 100644 --- a/dbcloadsavewindow.cpp +++ b/dbcloadsavewindow.cpp @@ -48,10 +48,12 @@ void DBCLoadSaveWindow::newFile() void DBCLoadSaveWindow::loadFile() { DBCFile *file = dbcHandler->loadDBCFile(-1); - int idx = ui->tableFiles->rowCount(); - ui->tableFiles->insertRow(ui->tableFiles->rowCount()); - ui->tableFiles->setItem(idx, 0, new QTableWidgetItem(file->getFullFilename())); - ui->tableFiles->setItem(idx, 1, new QTableWidgetItem("-1")); + if(file) { + int idx = ui->tableFiles->rowCount(); + ui->tableFiles->insertRow(ui->tableFiles->rowCount()); + ui->tableFiles->setItem(idx, 0, new QTableWidgetItem(file->getFullFilename())); + ui->tableFiles->setItem(idx, 1, new QTableWidgetItem("-1")); + } } void DBCLoadSaveWindow::saveFile() From 90a0fb401b7bd5cabe2c1ab410876b99087e4fb2 Mon Sep 17 00:00:00 2001 From: canpadawan Date: Tue, 31 May 2016 14:50:50 +0200 Subject: [PATCH 2/5] fix bug when Msg ID is not set in DBC Editing Window --- dbcmaineditor.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/dbcmaineditor.cpp b/dbcmaineditor.cpp index 7a82e9b..596346e 100644 --- a/dbcmaineditor.cpp +++ b/dbcmaineditor.cpp @@ -382,16 +382,19 @@ void DBCMainEditor::onCellClickedMessage(int row, int col) { if (col == 3) //3 is the signals field. If clicked we go to the signals dialog { - QString idString = ui->MessagesTable->item(row, 0)->text(); - DBC_MESSAGE *message = dbcFile->messageHandler->findMsgByID(Utility::ParseStringToNum(idString)); - sigEditor->setMessageRef(message); - sigEditor->setFileIdx(fileIdx); - sigEditor->exec(); //blocks this window from being active until we're done - //now update the displayed # of signals - inhibitCellChanged = true; - QTableWidgetItem *replacement = new QTableWidgetItem(QString::number(message->sigHandler->getCount())); - ui->MessagesTable->setItem(row, col, replacement); - inhibitCellChanged = false; + QTableWidgetItem* msg = ui->MessagesTable->item(row, 0); + if(msg) { + QString idString = msg->text(); + DBC_MESSAGE *message = dbcFile->messageHandler->findMsgByID(Utility::ParseStringToNum(idString)); + sigEditor->setMessageRef(message); + sigEditor->setFileIdx(fileIdx); + sigEditor->exec(); //blocks this window from being active until we're done + //now update the displayed # of signals + inhibitCellChanged = true; + QTableWidgetItem *replacement = new QTableWidgetItem(QString::number(message->sigHandler->getCount())); + ui->MessagesTable->setItem(row, col, replacement); + inhibitCellChanged = false; + } } } From 3eda7ec0486a3921f333d47507e7ebb4b775b8c5 Mon Sep 17 00:00:00 2001 From: canpadawan Date: Tue, 31 May 2016 14:51:21 +0200 Subject: [PATCH 3/5] several bug fix regarding addition/removal of signals --- dbcsignaleditor.cpp | 57 +++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/dbcsignaleditor.cpp b/dbcsignaleditor.cpp index c7f73e0..9792439 100644 --- a/dbcsignaleditor.cpp +++ b/dbcsignaleditor.cpp @@ -172,7 +172,7 @@ DBCSignalEditor::DBCSignalEditor(DBCHandler *handler, QWidget *parent) : connect(ui->rbMultiplexed, &QRadioButton::toggled, [=](bool state) { - if (state) //signal is now set as a multiplexed signal + if (state && currentSignal) //signal is now set as a multiplexed signal { currentSignal->isMultiplexed = true; currentSignal->isMultiplexor = false; @@ -184,7 +184,7 @@ DBCSignalEditor::DBCSignalEditor(DBCHandler *handler, QWidget *parent) : connect(ui->rbMultiplexor, &QRadioButton::toggled, [=](bool state) { - if (state) //signal is now set as a multiplexed signal + if (state && currentSignal) //signal is now set as a multiplexed signal { //don't allow this signal to be a multiplexor if there is already one for this message. //if (dbcMessage->multiplexorSignal != currentSignal && dbcMessage->multiplexorSignal != NULL) return; //I spoke too soon above... @@ -198,7 +198,7 @@ DBCSignalEditor::DBCSignalEditor(DBCHandler *handler, QWidget *parent) : connect(ui->rbNotMulti, &QRadioButton::toggled, [=](bool state) { - if (state) //signal is now set as a multiplexed signal + if (state && currentSignal) //signal is now set as a multiplexed signal { currentSignal->isMultiplexed = false; currentSignal->isMultiplexor = false; @@ -260,19 +260,14 @@ void DBCSignalEditor::showEvent(QShowEvent* event) { QDialog::showEvent(event); - refreshSignalsList(); currentSignal = NULL; - if (dbcMessage->sigHandler->getCount() > 0) - { - currentSignal = dbcMessage->sigHandler->findSignalByIdx(0); - fillSignalForm(currentSignal); - fillValueTable(currentSignal); - } + refreshSignalsList(); } void DBCSignalEditor::onValuesCellChanged(int row,int col) { if (inhibitCellChanged) return; + if (row == ui->valuesTable->rowCount() - 1) { DBC_VAL newVal; @@ -340,9 +335,14 @@ void DBCSignalEditor::addNewSignal() newSig.isMultiplexor = false; newSig.multiplexValue = 0; newSig.parentMessage = dbcMessage; - ui->signalsList->addItem(newName); + dbcMessage->sigHandler->addSignal(newSig); - if (dbcMessage->sigHandler->getCount() == 1) clickSignalList(0); + + /* add item at the end of the list and select it */ + /* this will call clickSignalList */ + ui->signalsList->addItem(newName); + ui->signalsList->setCurrentRow(ui->signalsList->count()-1); + } void DBCSignalEditor::deleteCurrentSignal() @@ -353,10 +353,6 @@ void DBCSignalEditor::deleteCurrentSignal() delete(ui->signalsList->item(currIdx)); dbcMessage->sigHandler->removeSignal(currIdx); currentSignal = NULL; - currIdx = ui->signalsList->currentRow(); - if (currIdx > -1) currentSignal = dbcMessage->sigHandler->findSignalByIdx(currIdx); - fillSignalForm(currentSignal); - fillValueTable(currentSignal); } } @@ -373,21 +369,30 @@ void DBCSignalEditor::deleteCurrentValue() void DBCSignalEditor::refreshSignalsList() { ui->signalsList->clear(); + + for (int x = 0; x < dbcMessage->sigHandler->getCount(); x++) { DBC_SIGNAL *sig = dbcMessage->sigHandler->findSignalByIdx(x); ui->signalsList->addItem(sig->name); } + + if( ui->signalsList->count()>0 ) { + /* click first element */ + ui->signalsList->setCurrentRow(0); + } + else + clickSignalList(-1); } +/* fillSignalForm also handles group "enabled" state */ +/* WARNING: fillSignalForm can be called recursively since it is in the listener of cbIntelFormat */ void DBCSignalEditor::fillSignalForm(DBC_SIGNAL *sig) { unsigned char bitpattern[8]; - generateUsedBits(); - - if (sig == NULL) - { + if (sig == NULL) { + ui->groupBox->setEnabled(false); ui->txtName->setText(""); ui->txtBias->setText(""); ui->txtBitLength->setText(""); @@ -408,6 +413,10 @@ void DBCSignalEditor::fillSignalForm(DBC_SIGNAL *sig) return; } + /* we have a signal */ + ui->groupBox->setEnabled(true); + + generateUsedBits(); ui->txtName->setText(sig->name); ui->txtBias->setText(QString::number(sig->bias)); ui->txtBitLength->setText(QString::number(sig->signalSize)); @@ -489,6 +498,7 @@ void DBCSignalEditor::fillSignalForm(DBC_SIGNAL *sig) } } +/* fillValueTable also handles "enabled" state */ void DBCSignalEditor::fillValueTable(DBC_SIGNAL *sig) { int rowIdx; @@ -499,10 +509,13 @@ void DBCSignalEditor::fillValueTable(DBC_SIGNAL *sig) ui->valuesTable->setRowCount(0); if (sig == NULL) { + ui->valuesTable->setEnabled(false); inhibitCellChanged = false; return; } + ui->valuesTable->setEnabled(true); + for (int i = 0; i < sig->valList.count(); i++) { QTableWidgetItem *val = new QTableWidgetItem(Utility::formatNumber(sig->valList[i].value)); @@ -521,11 +534,9 @@ void DBCSignalEditor::fillValueTable(DBC_SIGNAL *sig) void DBCSignalEditor::clickSignalList(int row) { - if (row < 0) return; //qDebug() << ui->signalsList->item(row)->text(); - DBC_SIGNAL *thisSig = dbcMessage->sigHandler->findSignalByName(ui->signalsList->item(row)->text()); - if (thisSig == NULL) return; + DBC_SIGNAL *thisSig = (row<0) ? NULL : dbcMessage->sigHandler->findSignalByName(ui->signalsList->item(row)->text()); currentSignal = thisSig; fillSignalForm(thisSig); fillValueTable(thisSig); From 1a655fb7b32e1a53e5a948fdea78154eeb58ab1a Mon Sep 17 00:00:00 2001 From: canpadawan Date: Tue, 31 May 2016 14:52:09 +0200 Subject: [PATCH 4/5] add support for candump/kayak logs (loading only) --- framefileio.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ framefileio.h | 1 + 2 files changed, 83 insertions(+) diff --git a/framefileio.cpp b/framefileio.cpp index 211b23e..b1192ea 100644 --- a/framefileio.cpp +++ b/framefileio.cpp @@ -2,6 +2,8 @@ #include +#include + FrameFileIO::FrameFileIO() { @@ -122,6 +124,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache filters.append(QString(tr("IXXAT MiniLog (*.csv *.CSV)"))); filters.append(QString(tr("CAN-DO Log (*.avc *.can *.evc *.qcc *.AVC *.CAN *.EVC *.QCC)"))); filters.append(QString(tr("Vehicle Spy (*.csv *.CSV)"))); + filters.append(QString(tr("Candump/Kayak (*.log *.LOG)"))); dialog.setFileMode(QFileDialog::ExistingFile); dialog.setNameFilters(filters); @@ -150,6 +153,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector* frameCache if (dialog.selectedNameFilter() == filters[6]) result = loadIXXATFile(filename, frameCache); if (dialog.selectedNameFilter() == filters[7]) result = loadCANDOFile(filename, frameCache); if (dialog.selectedNameFilter() == filters[8]) result = loadVehicleSpyFile(filename, frameCache); + if (dialog.selectedNameFilter() == filters[9]) result = loadCanDumpFile(filename, frameCache); progress.cancel(); @@ -1264,6 +1268,84 @@ bool FrameFileIO::saveTraceFile(QString filename, const QVector * fram return true; } +/* (0.003800) vcan0 164#0000c01aa8000013 */ +bool FrameFileIO::loadCanDumpFile(QString filename, QVector* frames) +{ + QFile *inFile = new QFile(filename); + CANFrame thisFrame; + QByteArray line; + int lineCounter = 0; + int pos = 0; + bool ret; + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + { + delete inFile; + return false; + } + + while (!inFile->atEnd()) { + lineCounter++; + if (lineCounter > 100) + { + qApp->processEvents(); + lineCounter = 0; + } + + line = inFile->readLine().toUpper(); + if (line.length() > 1) + { + /* tokenize */ + QList tokens = line.split(' '); + if(tokens.count()<3) continue; + + /* timestamp */ + QRegExp timeExp("^\\((\\S+)\\)$"); + ret = timeExp.exactMatch(tokens[0]); + if(!ret) continue; + + thisFrame.timestamp = timeExp.cap(1).toDouble(&ret) * 1000000; + if(!ret) continue; + + /* ID & value */ + QRegExp IdValExp("^(\\S+)#(\\S+)\n$"); + qDebug() << tokens[2]; + ret = IdValExp.exactMatch(tokens[2]); + if(!ret) continue; + + /* ID */ + qDebug() << IdValExp.cap(1); + thisFrame.ID = IdValExp.cap(1).toInt(&ret, 16); + if(!ret) continue; + + QString val= IdValExp.cap(2); + QRegExp valExp("(\\S{2})"); + + /* val byte per byte */ + pos = 0; + thisFrame.len = 0; + while ((pos = valExp.indexIn(val, pos)) != -1) + { + thisFrame.data[thisFrame.len] = valExp.cap(1).toInt(&ret, 16); + if(!ret) continue; + + thisFrame.len++; + pos += valExp.matchedLength(); + } + + /*NB: should we make sure len <= 8? */ + thisFrame.extended = false; + thisFrame.isReceived = true; + thisFrame.bus = 0; + } + frames->append(thisFrame); + } + inFile->close(); + delete inFile; + return true; +} + + QString FrameFileIO::unQuote(QString inStr) { return inStr.split('\"')[1]; diff --git a/framefileio.h b/framefileio.h index d1a7169..44a648f 100644 --- a/framefileio.h +++ b/framefileio.h @@ -42,6 +42,7 @@ public: static bool saveVehicleSpyFile(QString, const QVector*); static bool loadFrameFile(QString &, QVector*); static bool saveFrameFile(QString &, const QVector*); + static bool loadCanDumpFile(QString, QVector*); private: static QString unQuote(QString); From 750f20a9d6a324ed781761ae211d411ca40bd79e Mon Sep 17 00:00:00 2001 From: canpadawan Date: Tue, 31 May 2016 14:52:49 +0200 Subject: [PATCH 5/5] bug fix when elaspedTime is 0 --- serialworker.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/serialworker.cpp b/serialworker.cpp index d70fc6c..85c7ec6 100644 --- a/serialworker.cpp +++ b/serialworker.cpp @@ -447,8 +447,14 @@ void SerialWorker::handleTick() } } - framesPerSec += gotFrames * 1000 / elapsedTime->elapsed() - (framesPerSec / 4); - elapsedTime->restart(); + int elapsed = elapsedTime->elapsed(); + if(elapsed) { + framesPerSec += gotFrames * 1000 / elapsed - (framesPerSec / 4); + elapsedTime->restart(); + } + else + framesPerSec = 0; + emit frameUpdateTick(framesPerSec / 4, gotFrames); //sends stats to interested parties canModel->sendBulkRefresh(gotFrames); gotFrames = 0;