From d86f539d5adf6f66c93748940850b88761830c7f Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 7 May 2015 22:18:18 -0400 Subject: [PATCH] Reorganized the main window to properly resize. Added baud rate setting. Added ability to send frames from this application. --- SavvyCAN.pro.user | 19 ++-- mainwindow.cpp | 66 ++++++++++- mainwindow.h | 2 + mainwindow.ui | 277 +++++++++++++++++++++++++++------------------- serialworker.cpp | 48 ++++++++ serialworker.h | 13 ++- 6 files changed, 292 insertions(+), 133 deletions(-) diff --git a/SavvyCAN.pro.user b/SavvyCAN.pro.user index 67f93d8..9279630 100644 --- a/SavvyCAN.pro.user +++ b/SavvyCAN.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -8,7 +8,7 @@ ProjectExplorer.Project.ActiveTarget - 0 + 1 ProjectExplorer.Project.EditorSettings @@ -413,15 +413,16 @@ 13 14 - -1 + 2 - - - false - %{buildDir} - Custom Executable + SavvyCAN - ProjectExplorer.CustomExecutableRunConfiguration + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Collin/Desktop/SavvyCAN/SavvyCAN.pro + + SavvyCAN.pro + false + false + 3768 false true diff --git a/mainwindow.cpp b/mainwindow.cpp index dda37a5..72d886a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -45,13 +45,25 @@ MainWindow::MainWindow(QWidget *parent) : ui->cbSerialPorts->addItem(ports[i].portName()); } + ui->cbSpeed1->addItem(tr("Disabled")); + ui->cbSpeed1->addItem(tr("125000")); + ui->cbSpeed1->addItem(tr("250000")); + ui->cbSpeed1->addItem(tr("500000")); + ui->cbSpeed1->addItem(tr("1000000")); + ui->cbSpeed1->addItem(tr("33333")); + ui->cbSpeed2->addItem(tr("Disabled")); + ui->cbSpeed2->addItem(tr("125000")); + ui->cbSpeed2->addItem(tr("250000")); + ui->cbSpeed2->addItem(tr("500000")); + ui->cbSpeed2->addItem(tr("1000000")); + ui->cbSpeed2->addItem(tr("33333")); + SerialWorker *worker = new SerialWorker(); worker->moveToThread(&serialWorkerThread); connect(&serialWorkerThread, &QThread::finished, worker, &QObject::deleteLater); - //connect(this, &Controller::operate, worker, &Worker::doWork); - //connect(worker, &Worker::resultReady, this, &Controller::handleResults); connect(this, &MainWindow::sendSerialPort, worker, &SerialWorker::setSerialPort, Qt::QueuedConnection); connect(worker, &SerialWorker::receivedFrame, this, &MainWindow::gotFrame, Qt::QueuedConnection); + connect(this, &MainWindow::updateBaudRates, worker, &SerialWorker::updateBaudRates, Qt::QueuedConnection); serialWorkerThread.start(); graphingWindow = NULL; @@ -65,7 +77,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->btnClearFrames, SIGNAL(clicked(bool)), this, SLOT(clearFrames())); connect(ui->actionSave_Log_File, SIGNAL(triggered(bool)), this, SLOT(handleSaveFile())); connect(ui->action_Playback, SIGNAL(triggered(bool)), this, SLOT(showPlaybackWindow())); - + connect(ui->btnBaudSet, SIGNAL(clicked(bool)), this, SLOT(changeBaudRates())); } MainWindow::~MainWindow() @@ -101,6 +113,54 @@ void MainWindow::clearFrames() ui->lbNumFrames->setText(QString::number(model->rowCount())); } +void MainWindow::changeBaudRates() +{ + int Speed1 = 0, Speed2 = 0; + + switch (ui->cbSpeed1->currentIndex()) + { + case 0: //disable + break; + case 1: + Speed1 = 125000; + break; + case 2: + Speed1 = 250000; + break; + case 3: + Speed1 = 500000; + break; + case 4: + Speed1 = 1000000; + break; + case 5: + Speed1 = 33333; + break; + } + switch (ui->cbSpeed2->currentIndex()) + { + case 0: //disable + break; + case 1: + Speed2 = 125000; + break; + case 2: + Speed2 = 250000; + break; + case 3: + Speed2 = 500000; + break; + case 4: + Speed2 = 1000000; + break; + case 5: + Speed2 = 33333; + break; + } + + emit updateBaudRates(Speed1, Speed2); +} + //CRTD format from Mark Webb-Johnson / OVMS project /* Sample data in CRTD format diff --git a/mainwindow.h b/mainwindow.h index 65ae24e..1ac3a5a 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -29,12 +29,14 @@ private slots: void showFrameDataAnalysis(); void clearFrames(); void showPlaybackWindow(); + void changeBaudRates(); public slots: void gotFrame(CANFrame *frame); signals: void sendSerialPort(QString portName); + void updateBaudRates(int, int); private: Ui::MainWindow *ui; diff --git a/mainwindow.ui b/mainwindow.ui index 5f742d5..f2b03a0 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 927 + 800 500 @@ -26,127 +26,172 @@ SavvyCAN - - - - 20 - 10 - 675 - 421 - - - - - 11 - 50 - false - - - - true - - - false - - - - - - 720 - 20 - 71 - 16 - - - - Serial Port - - - - - - 790 - 20 - 131 - 22 - - - - - - - 720 - 50 - 201 - 28 - - - - Connect To Dongle - - - - - - 720 - 160 - 71 - 16 - - - - # of frames: - - - Qt::PlainText - - - - - - 710 - 180 - 201 - 28 - - - - Clear Frames - - - - - - 810 - 160 - 55 - 16 - - - - - - - - - - 710 - 250 - 201 - 20 - - - - Auto scroll window - - + + + + + + 11 + 50 + false + + + + true + + + false + + + + + + + + + + 0 + 0 + + + + Serial Port + + + + + + + + + + Connect To Dongle + + + + + + + + 0 + 0 + + + + CANBus Speeds: + + + + + + + QLayout::SetDefaultConstraint + + + + + + + + 0 + 0 + + + + First Bus: + + + + + + + + + + + + 7 + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Second Bus: + + + + + + + + + + + + + + Set Baud Rates + + + + + + + + 0 + 0 + + + + # Of Frames: + + + + + + + + 0 + 0 + + + + + + + + + + + Auto Scroll Window + + + + + + + Clear Frames + + + + + + 0 0 - 927 + 800 26 diff --git a/serialworker.cpp b/serialworker.cpp index 09581d0..7e133a7 100644 --- a/serialworker.cpp +++ b/serialworker.cpp @@ -50,6 +50,54 @@ void SerialWorker::readSerialData() } } +void SerialWorker::sendFrame(CANFrame *frame, int bus = 0) +{ + QByteArray buffer; + int c; + int ID; + + ID = frame->ID; + if (frame->extended) ID |= 1 << 31; + + buffer[0] = 0xF1; //start of a command over serial + buffer[1] = 0; //command ID for sending a CANBUS frame + buffer[2] = (unsigned char)(ID & 0xFF); //four bytes of ID LSB first + buffer[3] = (unsigned char)(ID >> 8); + buffer[4] = (unsigned char)(ID >> 16); + buffer[5] = (unsigned char)(ID >> 24); + buffer[6] = (unsigned char)(bus & 1); + buffer[7] = (unsigned char)frame->len; + for (c = 0; c < frame->len; c++) + { + buffer[8 + c] = frame->data[c]; + } + buffer[8 + frame->len] = 0; + + if (serial == NULL) return; + if (!serial->isOpen()) return; + serial->write(buffer); +} + +void SerialWorker::updateBaudRates(int Speed1, int Speed2) +{ + QByteArray buffer; + qDebug() << "Got signal to update bauds. 1: " << Speed1 <<" 2: " << Speed2; + buffer[0] = 0xF1; //start of a command over serial + buffer[1] = 5; //setup canbus + buffer[2] = (unsigned char)(Speed1 & 0xFF); //four bytes of ID LSB first + buffer[3] = (unsigned char)(Speed1 >> 8); + buffer[4] = (unsigned char)(Speed1 >> 16); + buffer[5] = (unsigned char)(Speed1 >> 24); + buffer[6] = (unsigned char)(Speed2 & 0xFF); //four bytes of ID LSB first + buffer[7] = (unsigned char)(Speed2 >> 8); + buffer[8] = (unsigned char)(Speed2 >> 16); + buffer[9] = (unsigned char)(Speed2 >> 24); + buffer[10] = 0; + if (serial == NULL) return; + if (!serial->isOpen()) return; + serial->write(buffer); +} + void SerialWorker::procRXChar(unsigned char c) { switch (rx_state) diff --git a/serialworker.h b/serialworker.h index e88c3cc..181eef0 100644 --- a/serialworker.h +++ b/serialworker.h @@ -26,14 +26,17 @@ public: ~SerialWorker(); signals: //we emit signals - void error(const QString &s); - void receivedFrame(CANFrame *frame); + void error(const QString &); + void receivedFrame(CANFrame *); private slots: //we receive things in slots - void readSerialData(); + void readSerialData(); public slots: - void setSerialPort(QString portName); + void setSerialPort(QString); + void sendFrame(CANFrame *, int); + void updateBaudRates(int, int); + private: QString portName; @@ -43,7 +46,7 @@ private: int rx_step; CANFrame *buildFrame; - void procRXChar(unsigned char c); + void procRXChar(unsigned char); }; #endif // SERIALTHREAD_H