From 0268e36d2604cc910dade1884bff285752ebe698 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Mon, 27 Apr 2015 20:47:57 -0400 Subject: [PATCH] Fleshed out more importers, added some preliminaries for serial port support. --- SavvyCAN.pro | 8 +-- SavvyCAN.pro.user | 2 +- mainwindow.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++++-- mainwindow.h | 3 ++ mainwindow.ui | 61 +++++++++++++++++++++-- utility.cpp | 3 ++ utility.h | 45 +++++++++++++++++ 7 files changed, 231 insertions(+), 12 deletions(-) create mode 100644 utility.cpp create mode 100644 utility.h diff --git a/SavvyCAN.pro b/SavvyCAN.pro index be34fac..22465d3 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -6,7 +6,7 @@ QT += core gui -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets serialport TARGET = SavvyCAN TEMPLATE = app @@ -14,10 +14,12 @@ TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ - canframemodel.cpp + canframemodel.cpp \ + utility.cpp HEADERS += mainwindow.h \ can_structs.h \ - canframemodel.h + canframemodel.h \ + utility.h FORMS += mainwindow.ui diff --git a/SavvyCAN.pro.user b/SavvyCAN.pro.user index 047ed8b..900f1ec 100644 --- a/SavvyCAN.pro.user +++ b/SavvyCAN.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/mainwindow.cpp b/mainwindow.cpp index cb431d2..0eb66c7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,7 +3,9 @@ #include "can_structs.h" #include #include +#include #include "canframemodel.h" +#include "utility.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -22,6 +24,15 @@ MainWindow::MainWindow(QWidget *parent) : ui->canFramesView->setColumnWidth(3, 40); ui->canFramesView->setColumnWidth(4, 40); ui->canFramesView->setColumnWidth(5, 300); + + QList ports = QSerialPortInfo::availablePorts(); + + for (int i = 0; i < ports.count(); i++) + { + ui->cbSerialPorts->addItem(ports[i].portName()); + } + + port = new QSerialPort(this); } MainWindow::~MainWindow() @@ -43,12 +54,15 @@ void MainWindow::loadNativeCSVFile(QString filename) { QFile *inFile = new QFile(filename); CANFrame thisFrame; + QByteArray line; if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) return; + line = inFile->readLine(); //read out the header first and discard it. + while (!inFile->atEnd()) { - QByteArray line = inFile->readLine(); + line = inFile->readLine(); if (line.length() > 2) { QList tokens = line.split(','); @@ -64,7 +78,8 @@ void MainWindow::loadNativeCSVFile(QString filename) } thisFrame.ID = tokens[1].toInt(NULL, 16); - thisFrame.extended = tokens[2].toInt(); + if (tokens[2].contains("True")) thisFrame.extended = 1; + else thisFrame.extended = 0; thisFrame.bus = tokens[3].toInt(); thisFrame.len = tokens[4].toInt(); for (int c = 0; c < 8; c++) thisFrame.data[c] = 0; @@ -80,6 +95,37 @@ void MainWindow::loadNativeCSVFile(QString filename) void MainWindow::loadGenericCSVFile(QString filename) { + QFile *inFile = new QFile(filename); + CANFrame thisFrame; + QByteArray line; + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + line = inFile->readLine(); //read out the header first and discard it. + + while (!inFile->atEnd()) { + line = inFile->readLine(); + if (line.length() > 2) + { + QList tokens = line.split(','); + + QDateTime stamp = QDateTime::currentDateTime(); + thisFrame.timestamp = (long)(((stamp.time().hour() * 3600) + (stamp.time().minute() * 60) + (stamp.time().second()) * 1000) + stamp.time().msec()); + thisFrame.ID = tokens[0].toInt(NULL, 16); + if (thisFrame.ID > 0x7FF) thisFrame.extended = true; + else thisFrame.extended = false; + thisFrame.bus = 0; + QList dataTok = tokens[1].split(' '); + thisFrame.len = dataTok.length(); + if (thisFrame.len > 8) thisFrame.len = 8; + for (int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = dataTok[d].toInt(NULL, 16); + + addFrameToDisplay(thisFrame); + } + } + inFile->close(); + model->sendRefresh(); } @@ -90,11 +136,58 @@ void MainWindow::loadLogFile(QString filename) void MainWindow::loadMicrochipFile(QString filename) { + QFile *inFile = new QFile(filename); + CANFrame thisFrame; + QByteArray line; + bool inComment = false; + + if (!inFile->open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + line = inFile->readLine(); //read out the header first and discard it. + + while (!inFile->atEnd()) { + line = inFile->readLine(); + if (line.length() > 2) + { + if (line.startsWith("//")) + { + inComment = !inComment; + } + else + { + + /* + tokens: + 0 = timestamp + 1 = Transmission direction + 2 = ID + 3 = Data byte length + 4-x = The data bytes + */ + if (!inComment) + { + QList tokens = line.split(';'); + QDateTime stamp = QDateTime::currentDateTime(); + thisFrame.timestamp = (long)(((stamp.time().hour() * 3600) + (stamp.time().minute() * 60) + (stamp.time().second()) * 1000) + stamp.time().msec()); + + //thisFrame.ID = Utility::ParseStringToNum(tokens[2]); + if (thisFrame.ID <= 0x7FF) thisFrame.extended = false; + else thisFrame.extended = true; + thisFrame.bus = 0; + thisFrame.len = tokens[3].toInt(); + //for (int d = 0; d < thisFrame.len; d++) thisFrame.data[d] = (unsigned char)Utility::ParseStringToNum(tokens[4 + d]); + addFrameToDisplay(thisFrame); + } + } + } + } + inFile->close(); + model->sendRefresh(); + } - - void MainWindow::handleLoadFile() { QString filename; @@ -122,3 +215,23 @@ void MainWindow::handleLoadFile() if (dialog.selectedNameFilter() == filters[3]) loadLogFile(filename); if (dialog.selectedNameFilter() == filters[4]) loadMicrochipFile(filename); } + +void MainWindow::connButtonPress() +{ + if (port->isOpen()) + { + port->close(); + } + else + { + port->setPortName(ui->cbSerialPorts->currentText()); + port->open(QIODevice::ReadWrite); + QByteArray output; + output.append(0xE7); + output.append(0xE7); + port->write(output); + ///isConnected = true; + + } + +} diff --git a/mainwindow.h b/mainwindow.h index eb0279a..b49e886 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -2,6 +2,7 @@ #define MAINWINDOW_H #include +#include #include "canframemodel.h" #include "can_structs.h" @@ -19,10 +20,12 @@ public: private slots: void handleLoadFile(); + void connButtonPress(); private: Ui::MainWindow *ui; CANFrameModel *model; + QSerialPort *port; void loadCRTDFile(QString); void loadNativeCSVFile(QString); void loadGenericCSVFile(QString); diff --git a/mainwindow.ui b/mainwindow.ui index a8573a8..9598433 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 1016 - 600 + 927 + 500 @@ -19,7 +19,7 @@ 800 - 600 + 500 @@ -42,13 +42,49 @@ false + + + + 720 + 20 + 71 + 16 + + + + Serial Port + + + + + + 790 + 20 + 131 + 22 + + + + + + + 720 + 50 + 201 + 28 + + + + Connect To Dongle + + 0 0 - 1016 + 927 26 @@ -154,8 +190,25 @@ + + btnConnect + clicked() + MainWindow + connButtonPress() + + + 820 + 103 + + + 463 + 249 + + + handleLoadFile() + connButtonPress() diff --git a/utility.cpp b/utility.cpp new file mode 100644 index 0000000..6c3df41 --- /dev/null +++ b/utility.cpp @@ -0,0 +1,3 @@ +#include "utility.h" + + diff --git a/utility.h b/utility.h new file mode 100644 index 0000000..bcd3d37 --- /dev/null +++ b/utility.h @@ -0,0 +1,45 @@ +#ifndef UTILITY_H +#define UTILITY_H + +#include +#include + + + +class Utility +{ +public: + static int ParseStringToNum(QByteArray input) + { + int temp = 0; + + input = input.toUpper(); + if (input.startsWith("0X")) //hex number + { + temp = input.right(input.size() - 2).toInt(NULL, 16); + } + else if (input.startsWith("B")) //binary number + { + input = input.right(input.size() - 1); //remove the B + for (int i = 0; i < input.length(); i++) + { + if (input[i] == '1') temp += 1 << (input.length() - i - 1); + } + } + else //decimal number + { + temp = input.toInt(); + } + + return temp; + + } + + static long GetTimeMS() + { + QDateTime stamp = QDateTime::currentDateTime(); + return (long)(((stamp.time().hour() * 3600) + (stamp.time().minute() * 60) + (stamp.time().second()) * 1000) + stamp.time().msec()); + } +}; + +#endif // UTILITY_H