Preliminary pass at converting connection system to use a more generic

approach and support more devices and multiple devices at the same time.
This commit is contained in:
Collin Kidder
2016-03-19 21:40:21 -04:00
parent 8a886ddcc9
commit e7ded7737a
15 changed files with 739 additions and 287 deletions
+8 -2
View File
@@ -48,7 +48,10 @@ SOURCES += main.cpp\
udsscanwindow.cpp \
can_structs.cpp \
isotp_interpreterwindow.cpp \
isotp_decoder.cpp
isotp_decoder.cpp \
canconnectionmodel.cpp \
canconnection.cpp \
canconnectioncontainer.cpp
HEADERS += mainwindow.h \
can_structs.h \
@@ -83,7 +86,10 @@ HEADERS += mainwindow.h \
fuzzingwindow.h \
udsscanwindow.h \
isotp_interpreterwindow.h \
isotp_decoder.h
isotp_decoder.h \
canconnectionmodel.h \
canconnection.h \
canconnectioncontainer.h
FORMS += mainwindow.ui \
graphingwindow.ui \
+128
View File
@@ -0,0 +1,128 @@
#include "canconnection.h"
CAN_Bus::CAN_Bus()
{
speed = 250000;
listenOnly = false;
singleWire = false;
active = false;
connection = NULL;
busNum = 0;
}
void CAN_Bus::setSpeed(int newSpeed)
{
speed = newSpeed;
}
void CAN_Bus::setListenOnly(bool mode)
{
listenOnly = mode;
}
void CAN_Bus::setSingleWire(bool mode)
{
singleWire = mode;
}
void CAN_Bus::setEnabled(bool mode)
{
active = mode;
}
void CAN_Bus::setConnection(CANConnection *conn)
{
connection = conn;
}
void CAN_Bus::setBusNum(int num)
{
busNum = num;
}
int CAN_Bus::getSpeed()
{
return speed;
}
int CAN_Bus::getBusNum()
{
return busNum;
}
bool CAN_Bus::isListenOnly()
{
return listenOnly;
}
bool CAN_Bus::isSingleWire()
{
return singleWire;
}
bool CAN_Bus::isActive()
{
return active;
}
CANConnection* CAN_Bus::getConnection()
{
return connection;
}
CANConnection::CANConnection(CANFrameModel *pModel, int base)
{
model = pModel;
numBuses = getNumBuses();
busBase = base;
}
int CANConnection::getNumBuses()
{
return 1;
}
int CANConnection::getBusBase()
{
return busBase;
}
QString CANConnection::getConnTypeName()
{
return QString("Generic");
}
QString CANConnection::getConnPortName()
{
return portName;
}
void CANConnection::run()
{
}
void CANConnection::sendFrame(const CANFrame * frame)
{
}
void CANConnection::sendFrameBatch(const QList<CANFrame> *frames)
{
}
void CANConnection::updatePortName(QString portName)
{
this->portName = portName;
}
void CANConnection::stopFrameCapture(int bus)
{
}
void CANConnection::startFrameCapture(int bus)
{
}
+74
View File
@@ -0,0 +1,74 @@
#ifndef CANCONNECTION_H
#define CANCONNECTION_H
#include <Qt>
#include <QObject>
#include "can_structs.h"
#include "canframemodel.h"
class CANConnection;
class CAN_Bus
{
public:
CAN_Bus();
int busNum;
int speed;
bool listenOnly;
bool singleWire;
bool active; //is this bus turned on?
CANConnection *connection;
void setSpeed(int); // new speed
void setListenOnly(bool); //bool for whether to only listen
void setSingleWire(bool); //bool for whether to use single wire mode
void setEnabled(bool); //whether this bus should be enabled or not.
void setConnection(CANConnection *);
void setBusNum(int);
int getSpeed();
int getBusNum();
bool isListenOnly();
bool isSingleWire();
bool isActive();
CANConnection *getConnection();
};
class CANConnection : public QObject
{
Q_OBJECT
public:
CANConnection(CANFrameModel *, int);
virtual int getNumBuses();
int getBusBase();
QString getConnTypeName();
QString getConnPortName();
signals:
void error(const QString &);
void frameUpdateRapid(int);
void frameUpdate(int);
void connectionSuccess();
void connectionFailure();
void deviceInfo(int, int); //First param = driver version (or version of whatever you want), second param a status byte (listen only, single wire, etc)
public slots:
virtual void run();
virtual void sendFrame(const CANFrame *);
virtual void sendFrameBatch(const QList<CANFrame> *);
virtual void updatePortName(QString); //string version of the port to connect to. This base doesnt know a thing about this value
virtual void stopFrameCapture(int); //pass bus number
virtual void startFrameCapture(int); //pass bus number. Only if stopped. Defaults to started anyway
//virtual void updateBusSettings(int); //bus number that was updated.
protected:
bool quit;
int numBuses;
int busBase; //first bus this class is supposed to handle
QString portName; //for easy access later on
QString connType; //what kind of connection this is (socketcan, kvaser, etc)
bool isConnected; //is the whole device connected? (Is the code connected to the device itself)
CANFrameModel *model;
};
#endif // CANCONNECTION_H
+15
View File
@@ -0,0 +1,15 @@
#include "canconnectioncontainer.h"
CANConnectionContainer::CANConnectionContainer(CANConnection *conn)
{
thread = new QThread();
connection = conn;
connection->moveToThread(thread);
}
CANConnectionContainer::~CANConnectionContainer()
{
//have to stop the actual execution first before deleting
delete thread;
delete connection;
}
+21
View File
@@ -0,0 +1,21 @@
#ifndef CANCONNECTIONCONTAINER_H
#define CANCONNECTIONCONTAINER_H
#include "canconnection.h"
#include <QThread>
class CANConnectionContainer
{
public:
CANConnectionContainer(CANConnection *conn);
~CANConnectionContainer();
CANConnection* getRef();
private:
CANConnection *connection;
QThread *thread;
};
#endif // CANCONNECTIONCONTAINER_H
+130
View File
@@ -0,0 +1,130 @@
#include "canconnectionmodel.h"
CANConnectionModel::CANConnectionModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
QVariant CANConnectionModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
if (orientation == Qt::Horizontal)
{
switch (section)
{
case 0:
return QString(tr("Bus"));
break;
case 1:
return QString(tr("Type"));
break;
case 2:
return QString(tr("Port"));
break;
case 3:
return QString(tr("Speed"));
break;
case 4:
return QString(tr("Listen Only"));
break;
case 5:
return QString(tr("Single Wire"));
break;
case 6:
return QString(tr("Active"));
break;
}
}
else
return QString::number(section + 1);
return QVariant();
}
int CANConnectionModel::rowCount(const QModelIndex &parent) const
{
return buses.count();
}
int CANConnectionModel::columnCount(const QModelIndex &parent) const
{
return 7;
}
QVariant CANConnectionModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= (buses.count()))
return QVariant();
if (role == Qt::DisplayRole) {
CAN_Bus bus = buses[index.row()];
CANConnection *conn = bus.connection;
switch (index.column())
{
case 0: //bus
return QString::number(bus.busNum);
break;
case 1: //type
if (conn) conn->getConnTypeName();
break;
case 2: //port
if (conn) conn->getConnPortName();
break;
case 3: //speed
return QString::number(bus.speed);
break;
case 4: //Listen Only
if (bus.listenOnly) return QString("True");
else return QString("False");
break;
case 5: //Single Wire
if (bus.singleWire) return QString("True");
else return QString("False");
break;
case 6: //Active
if (bus.active) return QString("True");
else return QString("False");
break;
default:
return QVariant();
}
}
else
return QVariant();
}
void CANConnectionModel::addConnection(CANConnection *conn)
{
CAN_Bus bus;
beginResetModel();
CANConnectionContainer *cont = new CANConnectionContainer(conn);
connections.append(cont);
int numBuses = conn->getNumBuses();
for (int i = 0; i < numBuses; i++)
{
bus.busNum = conn->getBusBase() + i;
buses.append(bus);
}
endResetModel();
}
CAN_Bus* CANConnectionModel::findBusByNum(int bus)
{
for (int i = 0; i < buses.count(); i++)
{
if (buses[i].busNum == bus)
{
return &buses[i];
}
}
return NULL;
}
+33
View File
@@ -0,0 +1,33 @@
#ifndef CANCONNECTIONMODEL_H
#define CANCONNECTIONMODEL_H
#include "canconnection.h"
#include "canconnectioncontainer.h"
#include <QAbstractTableModel>
class CANConnectionModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit CANConnectionModel(QObject *parent = 0);
// Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
void addConnection(CANConnection *conn);
private:
QList<CANConnectionContainer *> connections;
QList<CAN_Bus> buses;
CAN_Bus *findBusByNum(int bus);
};
#endif // CANCONNECTIONMODEL_H
+90 -76
View File
@@ -2,7 +2,7 @@
#include "ui_connectionwindow.h"
#include <QtNetwork/QNetworkInterface>
ConnectionWindow::ConnectionWindow(QWidget *parent) :
ConnectionWindow::ConnectionWindow(CANFrameModel *cModel, QWidget *parent) :
QDialog(parent),
ui(new Ui::ConnectionWindow)
{
@@ -10,34 +10,34 @@ ConnectionWindow::ConnectionWindow(QWidget *parent) :
settings = new QSettings();
connModel = new CANConnectionModel();
ui->tableConnections->setModel(connModel);
canModel = cModel;
ui->tableConnections->setColumnWidth(0, 50);
ui->tableConnections->setColumnWidth(1, 110);
ui->tableConnections->setColumnWidth(2, 110);
ui->tableConnections->setColumnWidth(3, 150);
ui->tableConnections->setColumnWidth(4, 75);
ui->tableConnections->setColumnWidth(5, 75);
ui->tableConnections->setColumnWidth(6, 75);
int temp = settings->value("Main/DefaultConnectionType", 0).toInt();
if (temp == 0) currentConnType = ConnectionType::GVRET_SERIAL;
if (temp == 1) currentConnType = ConnectionType::KVASER;
if (temp == 2) currentConnType = ConnectionType::SOCKETCAN;
//currentPortName = settings->value("Main/DefaultConnectionPort", "").toString();
currentPortName = settings->value("Main/DefaultConnectionPort", "").toString();
currentSpeed1 = -1;
currentSpeed2 = -1;
//currentSpeed1 = -1;
ui->ckSingleWire->setChecked(settings->value("Main/SingleWireMode", false).toBool());
ui->cbSpeed0->addItem(tr("<Default>"));
ui->cbSpeed0->addItem(tr("Disabled"));
ui->cbSpeed0->addItem(tr("125000"));
ui->cbSpeed0->addItem(tr("250000"));
ui->cbSpeed0->addItem(tr("500000"));
ui->cbSpeed0->addItem(tr("1000000"));
ui->cbSpeed0->addItem(tr("33333"));
ui->cbSpeed1->addItem(tr("<Default>"));
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->cbSpeed->addItem(tr("<Default>"));
ui->cbSpeed->addItem(tr("Disabled"));
ui->cbSpeed->addItem(tr("125000"));
ui->cbSpeed->addItem(tr("250000"));
ui->cbSpeed->addItem(tr("500000"));
ui->cbSpeed->addItem(tr("1000000"));
ui->cbSpeed->addItem(tr("33333"));
#ifdef Q_OS_LINUX
ui->rbSocketCAN->setEnabled(true);
@@ -47,10 +47,12 @@ ConnectionWindow::ConnectionWindow(QWidget *parent) :
ui->rbKvaser->setEnabled(true);
#endif
connect(ui->btnOK, SIGNAL(clicked(bool)), this, SLOT(handleOKButton()));
connect(ui->rbGVRET, SIGNAL(toggled(bool)), this, SLOT(handleConnTypeChanged()));
connect(ui->rbKvaser, SIGNAL(toggled(bool)), this, SLOT(handleConnTypeChanged()));
connect(ui->rbSocketCAN, SIGNAL(toggled(bool)), this, SLOT(handleConnTypeChanged()));
connect(ui->btnOK, &QAbstractButton::clicked, this, &ConnectionWindow::handleOKButton);
connect(ui->rbGVRET, &QAbstractButton::toggled, this, &ConnectionWindow::handleConnTypeChanged);
connect(ui->rbKvaser, &QAbstractButton::toggled, this, &ConnectionWindow::handleConnTypeChanged);
connect(ui->rbSocketCAN, &QAbstractButton::toggled, this, &ConnectionWindow::handleConnTypeChanged);
connect(ui->btnRevert, &QPushButton::clicked, this, &ConnectionWindow::handleRevert);
connect(ui->tableConnections->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ConnectionWindow::handleConnSelectionChanged);
}
ConnectionWindow::~ConnectionWindow()
@@ -78,6 +80,28 @@ void ConnectionWindow::handleOKButton()
QString conn;
int connType = 0;
if (ui->tableConnections->selectionModel()->currentIndex().row() >= 0)
{
}
else //new connection
{
if (ui->rbGVRET->isChecked())
{
SerialWorker *serial = new SerialWorker(canModel, 0);
connModel->addConnection(serial);
}
else if (ui->rbKvaser->isChecked())
{
}
else if (ui->rbSocketCAN->isChecked())
{
}
}
/*
if (ui->rbGVRET->isChecked())
{
conn = "GVRET";
@@ -100,16 +124,29 @@ void ConnectionWindow::handleOKButton()
}
currentPortName = getPortName();
currentSpeed1 = getSpeed0();
currentSpeed2 = getSpeed1();
currentSpeed1 = getSpeed();
settings->setValue("Main/DefaultConnectionPort", currentPortName);
settings->setValue("Main/DefaultConnectionType", connType);
settings->setValue("Main/SingleWireMode", ui->ckSingleWire->isChecked());
emit updateConnectionSettings(conn, getPortName(), getSpeed0(), getSpeed1());
emit updateConnectionSettings(conn, getPortName(), getSpeed());
this->close();
*/
}
void ConnectionWindow::handleConnSelectionChanged()
{
int selIdx = ui->tableConnections->selectionModel()->currentIndex().row();
if (selIdx == 0)
{
ui->btnOK->setText(tr("Create New Connection"));
}
else
{
ui->btnOK->setText(tr("Update Connection Settings"));
}
}
void ConnectionWindow::getSerialPorts()
@@ -120,7 +157,7 @@ void ConnectionWindow::getSerialPorts()
for (int i = 0; i < ports.count(); i++)
{
ui->cbPort->addItem(ports[i].portName());
if (currentPortName == ports[i].portName()) ui->cbPort->setCurrentIndex(i);
//if (currentPortName == ports[i].portName()) ui->cbPort->setCurrentIndex(i);
}
}
@@ -147,47 +184,33 @@ void ConnectionWindow::getSocketcanPorts()
}
}
void ConnectionWindow::setSpeeds(int speed0, int speed1)
void ConnectionWindow::setSpeed(int speed0)
{
bool found = false;
qDebug() << speed0 << "X" << speed1;
qDebug() << speed0;
for (int i = 0; i < ui->cbSpeed0->count(); i++)
for (int i = 0; i < ui->cbSpeed->count(); i++)
{
if (ui->cbSpeed0->itemText(i).toInt() == speed0)
if (ui->cbSpeed->itemText(i).toInt() == speed0)
{
ui->cbSpeed0->setCurrentIndex(i);
ui->cbSpeed->setCurrentIndex(i);
found = true;
}
}
if (!found)
{
ui->cbSpeed0->addItem(QString::number(speed0));
ui->cbSpeed0->setCurrentIndex(ui->cbSpeed0->count() - 1);
ui->cbSpeed->addItem(QString::number(speed0));
ui->cbSpeed->setCurrentIndex(ui->cbSpeed->count() - 1);
}
found = false;
for (int i = 0; i < ui->cbSpeed1->count(); i++)
{
if (ui->cbSpeed1->itemText(i).toInt() == speed1)
{
ui->cbSpeed1->setCurrentIndex(i);
found = true;
}
}
if (!found)
{
ui->cbSpeed1->addItem(QString::number(speed1));
ui->cbSpeed1->setCurrentIndex(ui->cbSpeed1->count() - 1);
}
}
//-1 means leave it at whatever it booted up to. 0 means disable. Otherwise the actual rate we want.
int ConnectionWindow::getSpeed0()
int ConnectionWindow::getSpeed()
{
switch (ui->cbSpeed0->currentIndex())
switch (ui->cbSpeed->currentIndex())
{
case -1:
return -1;
@@ -199,26 +222,7 @@ int ConnectionWindow::getSpeed0()
return 0;
break;
default:
return (ui->cbSpeed0->currentText().toInt());
break;
}
}
int ConnectionWindow::getSpeed1()
{
switch (ui->cbSpeed1->currentIndex())
{
case -1:
return -1;
break;
case 0:
return -1;
break;
case 1:
return 0;
break;
default:
return (ui->cbSpeed1->currentText().toInt());
return (ui->cbSpeed->currentText().toInt());
break;
}
}
@@ -235,13 +239,23 @@ ConnectionType::ConnectionType ConnectionWindow::getConnectionType()
if (ui->rbSocketCAN->isChecked()) return ConnectionType::SOCKETCAN;
}
void ConnectionWindow::setCAN1SWMode(bool mode)
void ConnectionWindow::setSWMode(bool mode)
{
ui->ckSingleWire->setChecked(mode);
}
bool ConnectionWindow::getCAN1SWMode()
bool ConnectionWindow::getSWMode()
{
if (ui->ckSingleWire->checkState() == Qt::Checked) return true;
return false;
}
void ConnectionWindow::handleRemoveConn()
{
}
void ConnectionWindow::handleRevert()
{
}
+16 -10
View File
@@ -1,10 +1,14 @@
#ifndef CONNECTIONWINDOW_H
#define CONNECTIONWINDOW_H
#include "canconnectionmodel.h"
#include <QSerialPortInfo>
#include <QDialog>
#include <QDebug>
#include <QSettings>
#include "canconnection.h"
#include "serialworker.h"
namespace Ui {
class ConnectionWindow;
@@ -25,34 +29,36 @@ class ConnectionWindow : public QDialog
Q_OBJECT
public:
explicit ConnectionWindow(QWidget *parent = 0);
explicit ConnectionWindow(CANFrameModel *canModel, QWidget *parent = 0);
~ConnectionWindow();
void showEvent(QShowEvent *);
int getSpeed0();
int getSpeed1();
int getSpeed();
QString getPortName(); //name of port to connect to
ConnectionType::ConnectionType getConnectionType();
bool getCAN1SWMode();
bool getSWMode();
signals:
void updateConnectionSettings(QString connectionType, QString port, int speed0, int speed1);
void updateConnectionSettings(QString connectionType, QString port, int speed);
public slots:
void setSpeeds(int speed0, int speed1);
void setCAN1SWMode(bool mode);
void setSpeed(int speed0);
void setSWMode(bool mode);
private slots:
void handleOKButton();
void handleConnTypeChanged();
void handleConnSelectionChanged();
void handleRemoveConn();
void handleRevert();
private:
Ui::ConnectionWindow *ui;
QList<QSerialPortInfo> ports;
QSettings *settings;
CANConnectionModel *connModel;
CANFrameModel *canModel;
ConnectionType::ConnectionType currentConnType;
QString currentPortName;
int currentSpeed1, currentSpeed2;
void getSerialPorts();
void getKvaserPorts();
+103 -21
View File
@@ -6,14 +6,73 @@
<rect>
<x>0</x>
<y>0</y>
<width>335</width>
<height>235</height>
<width>952</width>
<height>433</height>
</rect>
</property>
<property name="windowTitle">
<string>Connection Settings</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="2,1">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item alignment="Qt::AlignHCenter">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Connections:</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tableConnections">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="btnBusActivate">
<property name="text">
<string>Activate Selected Connection</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRemoveBus">
<property name="text">
<string>Remove Selected Connection</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QPushButton" name="btnActivateAll">
<property name="text">
<string>Activate All Connections</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnDeactivateAll">
<property name="text">
<string>Deactivate All Connections</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
@@ -73,44 +132,67 @@
<widget class="QComboBox" name="cbPort"/>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QCheckBox" name="ckSingleWire">
<property name="text">
<string>Single Wire Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ckListenOnly">
<property name="text">
<string>Listen Only Mode</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3" stretch="1,2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>CAN0 Speed</string>
<string>CAN Speed</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_3">
<property name="text">
<string>CAN1 Speed</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="cbSpeed0"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="cbSpeed1"/>
<item>
<widget class="QComboBox" name="cbSpeed"/>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="ckSingleWire">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="btnOK">
<property name="text">
<string>Set CAN1 to Single Wire Mode</string>
<string>Create New Connection</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnOK">
<widget class="QPushButton" name="btnRevert">
<property name="text">
<string>Update Settings</string>
<string>Revert</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
+3 -3
View File
@@ -80,7 +80,7 @@ void FirmwareUploaderWindow::gotTargettedFrame(int frameLoc)
if ((frame.data[6] == ((token >> 16) & 0xFF)) && (frame.data[7] == ((token >> 24) & 0xFF)))
{
qDebug() << "starting firmware process";
MainWindow::getReference()->setTargettedID(baseAddress + 0x20);
//MainWindow::getReference()->setTargettedID(baseAddress + 0x20);
transferInProgress = true;
sendFirmwareChunk();
}
@@ -163,7 +163,7 @@ void FirmwareUploaderWindow::handleStartStopTransfer()
bus = ui->spinBus->value();
baseAddress = Utility::ParseStringToNum(ui->txtBaseAddr->text());
qDebug() << "Base address: " + QString::number(baseAddress);
MainWindow::getReference()->setTargettedID(baseAddress + 0x10);
//MainWindow::getReference()->setTargettedID(baseAddress + 0x10);
CANFrame *output = new CANFrame;
output->extended = false;
output->len = 8;
@@ -181,7 +181,7 @@ void FirmwareUploaderWindow::handleStartStopTransfer()
else //stop anything in process
{
ui->btnStartStop->setText("Start Upload");
MainWindow::getReference()->setTargettedID(-1);
//MainWindow::getReference()->setTargettedID(-1);
}
}
+8 -59
View File
@@ -64,6 +64,7 @@ MainWindow::MainWindow(QWidget *parent) :
//enabling the below line kills performance in every way imaginable. Left here as a warning. Do not do this.
//ui->canFramesView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
/*
worker = new SerialWorker(model);
worker->moveToThread(&serialWorkerThread);
connect(&serialWorkerThread, &QThread::finished, worker, &QObject::deleteLater);
@@ -81,6 +82,7 @@ MainWindow::MainWindow(QWidget *parent) :
connect(this, &MainWindow::settingsUpdated, worker, &SerialWorker::readSettings);
serialWorkerThread.start();
serialWorkerThread.setPriority(QThread::HighPriority);
*/
graphingWindow = NULL;
frameInfoWindow = NULL;
@@ -176,7 +178,7 @@ MainWindow::MainWindow(QWidget *parent) :
model->clearFrames();
//Automatically create the connection window so it can be updated even if we never opened it.
connectionWindow = new ConnectionWindow();
connectionWindow = new ConnectionWindow(model);
connect(connectionWindow, SIGNAL(updateConnectionSettings(QString,QString,int,int)), this, SLOT(updateConnectionSettings(QString,QString,int,int)));
}
@@ -384,45 +386,7 @@ void MainWindow::updateConnectionSettings(QString connectionType, QString port,
canSpeed1 = speed1;
if (isConnected)
{
emit updateBaudRates(speed0, speed1);
}
}
void MainWindow::connButtonPress()
{
if (!isConnected)
{
if (connType == "GVRET")
{
QList<QSerialPortInfo> ports;
ports = QSerialPortInfo::availablePorts();
for (int i = 0; i < ports.count(); i++)
{
if (ports[i].portName() == portName)
{
portInfo = ports[i];
//need to create some way to send single wire mode to serial port code
emit sendSerialPort(&portInfo);
lbStatusConnected.setText(tr("Attempting to connect to port ") + portName);
}
}
}
else if (connType == "KVASER")
{
}
else if (connType == "SOCKETCAN")
{
}
}
else
{
emit closeSerialPort();
isConnected = false;
lbStatusConnected.setText(tr("Not Connected"));
ui->actionConnect->setText(tr("Connect"));
//emit updateBaudRates(speed0, speed1);
}
}
@@ -576,16 +540,6 @@ void MainWindow::normalizeTiming()
emit framesUpdated(-2); //claim an all new set of frames because every frame was updated.
}
void MainWindow::changeBaudRates()
{
int Speed1 = 0, Speed2 = 0;
//Speed1 = ui->cbSpeed1->currentText().toInt();
//Speed2 = ui->cbSpeed2->currentText().toInt();
emit updateBaudRates(Speed1, Speed2);
}
void MainWindow::handleLoadFile()
{
QString filename;
@@ -785,7 +739,7 @@ void MainWindow::connectionSucceeded(int baud0, int baud1)
ui->cbSpeed2->setCurrentIndex(ui->cbSpeed2->count() - 1);
}
*/
if (connectionWindow) connectionWindow->setSpeeds(baud0, baud1);
if (connectionWindow) connectionWindow->setSpeed(baud0);
//ui->btnConnect->setEnabled(false);
ui->actionConnect->setText(tr("Disconnect"));
isConnected = true;
@@ -843,16 +797,11 @@ void MainWindow::gotDeviceInfo(int build, int swCAN)
if (connectionWindow)
{
if (swCAN == 1) connectionWindow->setCAN1SWMode(true);
else connectionWindow->setCAN1SWMode(false);
if (swCAN == 1) connectionWindow->setSWMode(true);
else connectionWindow->setSWMode(false);
}
}
void MainWindow::setTargettedID(int id)
{
worker->targetFrameID(id);
}
void MainWindow::showSettingsDialog()
{
if (!settingsDialog)
@@ -1039,7 +988,7 @@ void MainWindow::showConnectionSettingsWindow()
{
if (!connectionWindow)
{
connectionWindow = new ConnectionWindow();
connectionWindow = new ConnectionWindow(model);
connect(connectionWindow, SIGNAL(updateConnectionSettings(QString,QString,int,int)), this, SLOT(updateConnectionSettings(QString,QString,int,int)));
}
connectionWindow->show();
-6
View File
@@ -39,7 +39,6 @@ public:
explicit MainWindow(QWidget *parent = 0);
static QString loadedFileName;
static MainWindow *getReference();
void setTargettedID(int);
~MainWindow();
private slots:
@@ -48,7 +47,6 @@ private slots:
void handleSaveFilteredFile();
void handleSaveFilters();
void handleLoadFilters();
void connButtonPress();
void showGraphingWindow();
void showFrameDataAnalysis();
void clearFrames();
@@ -69,7 +67,6 @@ private slots:
void showISOInterpreterWindow();
void exitApp();
void handleSaveDecoded();
void changeBaudRates();
void connectionFailed();
void gotDeviceInfo(int, int);
void connectionSucceeded(int, int);
@@ -92,9 +89,6 @@ public slots:
void updateConnectionSettings(QString connectionType, QString port, int speed0, int speed1);
signals:
void sendSerialPort(QSerialPortInfo *port);
void closeSerialPort();
void updateBaudRates(int, int);
void sendCANFrame(const CANFrame *, int);
void stopFrameCapturing();
void startFrameCapturing();
+35 -22
View File
@@ -5,19 +5,16 @@
#include <QTimer>
#include <QSettings>
SerialWorker::SerialWorker(CANFrameModel *model, QObject *parent) : QObject(parent)
SerialWorker::SerialWorker(CANFrameModel *model, int base) : CANConnection(model, base)
{
serial = NULL;
rx_state = IDLE;
rx_step = 0;
buildFrame = new CANFrame;
canModel = model;
ticker = NULL;
framesRapid = 0;
capturing = true;
gotValidated = true;
isAutoRestart = false;
targetID = -1;
txTimestampBasis = QDateTime::currentMSecsSinceEpoch();
@@ -121,8 +118,8 @@ void SerialWorker::setSerialPort(QSerialPortInfo *port)
continuousTimeSync = true;
serial->write(output);
if (doValidation) connected = false;
else connected = true;
if (doValidation) isConnected = false;
else isConnected = true;
connect(serial, SIGNAL(readyRead()), this, SLOT(readSerialData()));
if (doValidation) QTimer::singleShot(1000, this, SLOT(connectionTimeout()));
}
@@ -130,7 +127,7 @@ void SerialWorker::setSerialPort(QSerialPortInfo *port)
void SerialWorker::connectionTimeout()
{
//one second after trying to connect are we actually connected?
if (!connected) //no?
if (!isConnected) //no?
{
//then emit the the failure signal and see if anyone cares
qDebug() << "Failed to connect to GVRET at that com port";
@@ -157,7 +154,7 @@ void SerialWorker::readSerialData()
}
}
void SerialWorker::sendFrame(const CANFrame *frame, int bus = 0)
void SerialWorker::sendFrame(const CANFrame *frame)
{
QByteArray buffer;
int c;
@@ -169,12 +166,12 @@ void SerialWorker::sendFrame(const CANFrame *frame, int bus = 0)
//qDebug() << "Sending out frame with id " << frame->ID;
//show our sent frames in the list too. This happens even if we're not connected.
canModel->addFrame(tempFrame, false);
model->addFrame(tempFrame, false);
framesRapid++;
if (serial == NULL) return;
if (!serial->isOpen()) return;
if (!connected) return;
if (!isConnected) return;
ID = frame->ID;
if (frame->extended) ID |= 1 << 31;
@@ -185,7 +182,7 @@ void SerialWorker::sendFrame(const CANFrame *frame, int bus = 0)
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[6] = (unsigned char)((frame->bus - this->getBusBase()) & 1);
buffer[7] = (unsigned char)frame->len;
for (c = 0; c < frame->len; c++)
{
@@ -203,7 +200,7 @@ void SerialWorker::sendFrame(const CANFrame *frame, int bus = 0)
void SerialWorker::sendFrameBatch(const QList<CANFrame> *frames)
{
sendBulkMutex.lock();
for (int i = 0; i < frames->length(); i++) sendFrame(&frames->at(i), frames->at(i).bus);
for (int i = 0; i < frames->length(); i++) sendFrame(&frames->at(i));
sendBulkMutex.unlock();
}
@@ -321,15 +318,14 @@ void SerialWorker::procRXChar(unsigned char c)
rx_state = IDLE;
rx_step = 0;
//qDebug() << "emit from serial handler to main form id: " << buildFrame->ID;
if (capturing)
{
//if (capturing)
//{
buildFrame->isReceived = true;
canModel->addFrame(*buildFrame, false);
model->addFrame(*buildFrame, false);
//take the time the frame came in and try to resync the time base.
if (continuousTimeSync) txTimestampBasis = QDateTime::currentMSecsSinceEpoch() - (buildFrame->timestamp / 1000);
framesRapid++;
if (buildFrame->ID == targetID) emit gotTargettedFrame(canModel->rowCount() - 1);
}
//}
}
break;
}
@@ -414,8 +410,8 @@ void SerialWorker::procRXChar(unsigned char c)
qDebug() << "Baud 1 = " << can1Baud;
if (!can1Enabled) can1Baud = 0;
if (!can0Enabled) can0Baud = 0;
connected = true;
emit connectionSuccess(can0Baud, can1Baud);
isConnected = true;
emit connectionSuccess();
break;
}
rx_step++;
@@ -462,7 +458,7 @@ void SerialWorker::handleTick()
{
//qDebug() << "Tick!";
if (connected)
if (isConnected)
{
if (!gotValidated && doValidation)
{
@@ -517,6 +513,7 @@ void SerialWorker::closeSerialPort()
serial = NULL;
}
/*
void SerialWorker::stopFrameCapture()
{
qDebug() << "Stopping frame capture";
@@ -528,8 +525,24 @@ void SerialWorker::startFrameCapture()
qDebug() << "Starting up frame capture";
capturing = true;
}
*/
void SerialWorker::targetFrameID(int target)
void SerialWorker::updatePortName(QString portName)
{
targetID = target;
QList<QSerialPortInfo> ports;
CANConnection::updatePortName(portName);
ports = QSerialPortInfo::availablePorts();
for (int i = 0; i < ports.count(); i++)
{
if (portName == ports[i].portName())
{
setSerialPort(&ports[i]);
return;
}
}
}
+9 -22
View File
@@ -8,6 +8,7 @@
#include <QTimer>
#include "can_structs.h"
#include "canframemodel.h"
#include "canconnection.h"
namespace SERIALSTATE {
@@ -29,23 +30,14 @@ enum STATE //keep this enum synchronized with the Arduino firmware project
}
using namespace SERIALSTATE;
class SerialWorker : public QObject
class SerialWorker : public CANConnection
{
Q_OBJECT
public:
SerialWorker(CANFrameModel *model, QObject *parent = 0);
SerialWorker(CANFrameModel *, int);
~SerialWorker();
void readSettings();
void targetFrameID(int);
signals: //we emit signals
void error(const QString &);
void frameUpdateRapid(int); //sent *much* more rapidly than the above signal - one param for # of frames
void connectionSuccess(int, int);
void connectionFailure();
void deviceInfo(int, int);
void gotTargettedFrame(int);
private slots: //we receive things in slots
void readSerialData();
@@ -54,31 +46,26 @@ private slots: //we receive things in slots
void handleReconnect();
public slots:
void run();
void run() override;
void setSerialPort(QSerialPortInfo*);
void closeSerialPort();
void sendFrame(const CANFrame *, int);
void sendFrameBatch(const QList<CANFrame> *);
void sendFrame(const CANFrame *) override;
void sendFrameBatch(const QList<CANFrame> *) override;
void updateBaudRates(int, int);
void stopFrameCapture();
void startFrameCapture(); //only need to call this if previously stopped. Otherwise it's the default
//void stopFrameCapture(int) override;
//void startFrameCapture(int) override;
void updatePortName(QString) override; //string version of the port to connect to. This base doesnt know a thing about this value
private:
QString portName;
bool quit;
bool connected;
bool capturing;
bool doValidation;
bool gotValidated;
bool isAutoRestart;
bool continuousTimeSync;
QSerialPort *serial;
QSerialPortInfo *currentPort;
CANFrameModel *canModel;
QTimer *ticker;
QMutex sendBulkMutex;
int framesRapid;
int targetID;
STATE rx_state;
int rx_step;
CANFrame *buildFrame;