Merge branch 'master' of github.com:collin80/SavvyCAN into WIP2
This commit is contained in:
+8
-3
@@ -58,7 +58,9 @@ SOURCES += main.cpp\
|
|||||||
connections/canconmanager.cpp \
|
connections/canconmanager.cpp \
|
||||||
re/sniffer/snifferitem.cpp \
|
re/sniffer/snifferitem.cpp \
|
||||||
re/sniffer/sniffermodel.cpp \
|
re/sniffer/sniffermodel.cpp \
|
||||||
re/sniffer/snifferwindow.cpp
|
re/sniffer/snifferwindow.cpp \
|
||||||
|
motorcontrollerconfigwindow.cpp
|
||||||
|
motorcontrollerconfigwindow.cpp
|
||||||
|
|
||||||
HEADERS += mainwindow.h \
|
HEADERS += mainwindow.h \
|
||||||
can_structs.h \
|
can_structs.h \
|
||||||
@@ -105,7 +107,9 @@ HEADERS += mainwindow.h \
|
|||||||
connections/canconmanager.h \
|
connections/canconmanager.h \
|
||||||
re/sniffer/snifferitem.h \
|
re/sniffer/snifferitem.h \
|
||||||
re/sniffer/sniffermodel.h \
|
re/sniffer/sniffermodel.h \
|
||||||
re/sniffer/snifferwindow.h
|
re/sniffer/snifferwindow.h \
|
||||||
|
motorcontrollerconfigwindow.h
|
||||||
|
motorcontrollerconfigwindow.h
|
||||||
|
|
||||||
FORMS += mainwindow.ui \
|
FORMS += mainwindow.ui \
|
||||||
graphingwindow.ui \
|
graphingwindow.ui \
|
||||||
@@ -128,7 +132,8 @@ FORMS += mainwindow.ui \
|
|||||||
fuzzingwindow.ui \
|
fuzzingwindow.ui \
|
||||||
udsscanwindow.ui \
|
udsscanwindow.ui \
|
||||||
isotp_interpreterwindow.ui \
|
isotp_interpreterwindow.ui \
|
||||||
snifferwindow.ui
|
snifferwindow.ui \
|
||||||
|
motorcontrollerconfigwindow.ui
|
||||||
|
|
||||||
DISTFILES +=
|
DISTFILES +=
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -197,6 +197,7 @@ void CANFrameModel::recalcOverwrite()
|
|||||||
|
|
||||||
QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
|
int dLen;
|
||||||
QString tempString;
|
QString tempString;
|
||||||
if (!index.isValid())
|
if (!index.isValid())
|
||||||
return QVariant();
|
return QVariant();
|
||||||
@@ -229,7 +230,10 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
return QString::number(thisFrame.len);
|
return QString::number(thisFrame.len);
|
||||||
break;
|
break;
|
||||||
case 6: //data
|
case 6: //data
|
||||||
for (unsigned int i = 0; i < thisFrame.len; i++)
|
dLen = thisFrame.len;
|
||||||
|
if (dLen < 0) dLen = 0;
|
||||||
|
if (dLen > 8) dLen = 8;
|
||||||
|
for (int i = 0; i < dLen; i++)
|
||||||
{
|
{
|
||||||
tempString.append(Utility::formatNumber(thisFrame.data[i]));
|
tempString.append(Utility::formatNumber(thisFrame.data[i]));
|
||||||
tempString.append(" ");
|
tempString.append(" ");
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#ifndef CONFIG
|
#ifndef CONFIG
|
||||||
#define CONFIG
|
#define CONFIG
|
||||||
|
|
||||||
#define VERSION 160
|
#define VERSION 161
|
||||||
|
|
||||||
//try to keep this in sync.
|
//try to keep this in sync.
|
||||||
//SavvyCAN will complain if you connect a GVRET board with a revision
|
//SavvyCAN will complain if you connect a GVRET board with a revision
|
||||||
|
|||||||
+2
-2
@@ -91,10 +91,10 @@ class DBC_MESSAGE
|
|||||||
public:
|
public:
|
||||||
DBC_MESSAGE();
|
DBC_MESSAGE();
|
||||||
|
|
||||||
int ID;
|
uint32_t ID;
|
||||||
QString name;
|
QString name;
|
||||||
QString comment;
|
QString comment;
|
||||||
int len;
|
unsigned int len;
|
||||||
DBC_NODE *sender;
|
DBC_NODE *sender;
|
||||||
QList<DBC_ATTRIBUTE> attributes;
|
QList<DBC_ATTRIBUTE> attributes;
|
||||||
DBCSignalHandler *sigHandler;
|
DBCSignalHandler *sigHandler;
|
||||||
|
|||||||
+3
-3
@@ -289,7 +289,7 @@ void DBCFile::loadFile(QString fileName)
|
|||||||
if (match.hasMatch())
|
if (match.hasMatch())
|
||||||
{
|
{
|
||||||
DBC_MESSAGE msg;
|
DBC_MESSAGE msg;
|
||||||
msg.ID = match.captured(1).toInt(); //the ID is always stored in decimal format
|
msg.ID = match.captured(1).toULong() & 0x7FFFFFFFul; //the ID is always stored in decimal format
|
||||||
msg.name = match.captured(2);
|
msg.name = match.captured(2);
|
||||||
msg.len = match.captured(3).toInt();
|
msg.len = match.captured(3).toInt();
|
||||||
msg.sender = findNodeByName(match.captured(4));
|
msg.sender = findNodeByName(match.captured(4));
|
||||||
@@ -310,7 +310,7 @@ void DBCFile::loadFile(QString fileName)
|
|||||||
sig.isMultiplexor = false;
|
sig.isMultiplexor = false;
|
||||||
|
|
||||||
qDebug() << "Found a SG line";
|
qDebug() << "Found a SG line";
|
||||||
regex.setPattern("^SG\\_ *(\\w+) *M *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)");
|
regex.setPattern("^SG\\_ *(\\w+)^ *M *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)");
|
||||||
|
|
||||||
match = regex.match(line);
|
match = regex.match(line);
|
||||||
if (match.hasMatch())
|
if (match.hasMatch())
|
||||||
@@ -321,7 +321,7 @@ void DBCFile::loadFile(QString fileName)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
regex.setPattern("^SG\\_ *(\\w+) *m(\\d+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)");
|
regex.setPattern("^SG\\_ *(\\w+)^ *m(\\d+) *: *(\\d+)\\|(\\d+)@(\\d+)([\\+|\\-]) \\(([0-9.+\\-eE]+),([0-9.+\\-eE]+)\\) \\[([0-9.+\\-eE]+)\\|([0-9.+\\-eE]+)\\] \\\"(.*)\\\" (.*)");
|
||||||
match = regex.match(line);
|
match = regex.match(line);
|
||||||
if (match.hasMatch())
|
if (match.hasMatch())
|
||||||
{
|
{
|
||||||
|
|||||||
+13
-11
@@ -71,10 +71,11 @@ void FirmwareUploaderWindow::gotTargettedFrame(int frameLoc)
|
|||||||
const CANFrame &frame = modelFrames->at(frameLoc);
|
const CANFrame &frame = modelFrames->at(frameLoc);
|
||||||
if (frame.ID == (baseAddress + 0x10)) {
|
if (frame.ID == (baseAddress + 0x10)) {
|
||||||
qDebug() << "Start firmware reply";
|
qDebug() << "Start firmware reply";
|
||||||
if ((frame.data[0] == 0xDE) && (frame.data[1] == 0xAF))
|
if ((frame.data[0] == 0xAD) && (frame.data[1] == 0xDE))
|
||||||
{
|
{
|
||||||
if ((frame.data[2] == 0xDE) && (frame.data[3] == 0xED))
|
if ((frame.data[2] == 0xAF) && (frame.data[3] == 0xDE))
|
||||||
{
|
{
|
||||||
|
qDebug() << "THere's dead beef here";
|
||||||
if ((frame.data[4] == (token & 0xFF)) && (frame.data[5] == ((token >> 8) & 0xFF)))
|
if ((frame.data[4] == (token & 0xFF)) && (frame.data[5] == ((token >> 8) & 0xFF)))
|
||||||
{
|
{
|
||||||
if ((frame.data[6] == ((token >> 16) & 0xFF)) && (frame.data[7] == ((token >> 24) & 0xFF)))
|
if ((frame.data[6] == ((token >> 16) & 0xFF)) && (frame.data[7] == ((token >> 24) & 0xFF)))
|
||||||
@@ -146,11 +147,11 @@ void FirmwareUploaderWindow::sendFirmwareEnding()
|
|||||||
output->bus = bus;
|
output->bus = bus;
|
||||||
output->len = 4;
|
output->len = 4;
|
||||||
output->ID = baseAddress + 0x30;
|
output->ID = baseAddress + 0x30;
|
||||||
output->data[0] = 0xC0;
|
output->data[3] = 0xC0;
|
||||||
output->data[1] = 0xDE;
|
output->data[2] = 0xDE;
|
||||||
output->data[2] = 0xFA;
|
output->data[1] = 0xFA;
|
||||||
output->data[3] = 0xDE;
|
output->data[0] = 0xDE;
|
||||||
sendCANFrame(output);
|
//sendCANFrame(output, bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareUploaderWindow::handleStartStopTransfer()
|
void FirmwareUploaderWindow::handleStartStopTransfer()
|
||||||
@@ -171,10 +172,11 @@ void FirmwareUploaderWindow::handleStartStopTransfer()
|
|||||||
output->len = 8;
|
output->len = 8;
|
||||||
output->bus = bus;
|
output->bus = bus;
|
||||||
output->ID = baseAddress;
|
output->ID = baseAddress;
|
||||||
output->data[0] = 0xDE;
|
|
||||||
output->data[1] = 0xAD;
|
output->data[0] = 0xEF;
|
||||||
output->data[2] = 0xBE;
|
output->data[1] = 0xBE;
|
||||||
output->data[3] = 0xEF;
|
output->data[2] = 0xAD;
|
||||||
|
output->data[3] = 0xDE;
|
||||||
output->data[4] = token & 0xFF;
|
output->data[4] = token & 0xFF;
|
||||||
output->data[5] = (token >> 8) & 0xFF;
|
output->data[5] = (token >> 8) & 0xFF;
|
||||||
output->data[6] = (token >> 16) & 0xFF;
|
output->data[6] = (token >> 16) & 0xFF;
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector<CANFrame>* frameCache
|
|||||||
filters.append(QString(tr("CAN-DO Log (*.avc *.can *.evc *.qcc *.AVC *.CAN *.EVC *.QCC)")));
|
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("Vehicle Spy (*.csv *.CSV)")));
|
||||||
filters.append(QString(tr("Candump/Kayak (*.log *.LOG)")));
|
filters.append(QString(tr("Candump/Kayak (*.log *.LOG)")));
|
||||||
|
filters.append(QString(tr("PCAN Viewer (*.txt *.TXT)")));
|
||||||
|
|
||||||
dialog.setFileMode(QFileDialog::ExistingFile);
|
dialog.setFileMode(QFileDialog::ExistingFile);
|
||||||
dialog.setNameFilters(filters);
|
dialog.setNameFilters(filters);
|
||||||
@@ -155,6 +156,7 @@ bool FrameFileIO::loadFrameFile(QString &fileName, QVector<CANFrame>* frameCache
|
|||||||
if (dialog.selectedNameFilter() == filters[7]) result = loadCANDOFile(filename, frameCache);
|
if (dialog.selectedNameFilter() == filters[7]) result = loadCANDOFile(filename, frameCache);
|
||||||
if (dialog.selectedNameFilter() == filters[8]) result = loadVehicleSpyFile(filename, frameCache);
|
if (dialog.selectedNameFilter() == filters[8]) result = loadVehicleSpyFile(filename, frameCache);
|
||||||
if (dialog.selectedNameFilter() == filters[9]) result = loadCanDumpFile(filename, frameCache);
|
if (dialog.selectedNameFilter() == filters[9]) result = loadCanDumpFile(filename, frameCache);
|
||||||
|
if (dialog.selectedNameFilter() == filters[10]) result = loadPCANFile(filename, frameCache);
|
||||||
|
|
||||||
progress.cancel();
|
progress.cancel();
|
||||||
|
|
||||||
@@ -393,6 +395,70 @@ bool FrameFileIO::saveCRTDFile(QString filename, const QVector<CANFrame>* frames
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//; Message Number
|
||||||
|
//; | Time Offset (ms)
|
||||||
|
//; | | Type
|
||||||
|
//; | | | ID (hex)
|
||||||
|
//; | | | | Data Length Code
|
||||||
|
//; | | | | | Data Bytes (hex) ...
|
||||||
|
//; | | | | | |
|
||||||
|
//;---+-- ----+---- --+-- ----+--- + -+ -- -- -- -- -- -- --
|
||||||
|
// 0-6 10-18 21-25 28-35 38 41-?
|
||||||
|
//Fixed length lines
|
||||||
|
bool FrameFileIO::loadPCANFile(QString filename, QVector<CANFrame>* frames)
|
||||||
|
{
|
||||||
|
QFile *inFile = new QFile(filename);
|
||||||
|
CANFrame thisFrame;
|
||||||
|
QByteArray line;
|
||||||
|
int lineCounter = 0;
|
||||||
|
bool foundErrors = false;
|
||||||
|
|
||||||
|
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();
|
||||||
|
if (line.startsWith(';')) continue;
|
||||||
|
if (line.length() > 2)
|
||||||
|
{
|
||||||
|
thisFrame.timestamp = line.mid(10, 8).simplified().toFloat() * 1000ull;
|
||||||
|
thisFrame.ID = line.mid(28, 8).simplified().toUInt(NULL, 16);
|
||||||
|
if (thisFrame.ID < 0x1FFFFFFF)
|
||||||
|
{
|
||||||
|
thisFrame.len = line.mid(38,1).toInt();
|
||||||
|
thisFrame.isReceived = true;
|
||||||
|
thisFrame.bus = 0;
|
||||||
|
thisFrame.extended = false;
|
||||||
|
QList<QByteArray> tokens = line.mid(41, thisFrame.len * 3).split(' ');
|
||||||
|
for (int d = 0; d < thisFrame.len; d++)
|
||||||
|
{
|
||||||
|
if (tokens[d] != "")
|
||||||
|
{
|
||||||
|
thisFrame.data[d] = tokens[d].toInt(NULL, 16);
|
||||||
|
}
|
||||||
|
else thisFrame.data[d] = 0;
|
||||||
|
}
|
||||||
|
frames->append(thisFrame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//else foundErrors = true;
|
||||||
|
}
|
||||||
|
inFile->close();
|
||||||
|
delete inFile;
|
||||||
|
return !foundErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//The "native" file format for this program
|
//The "native" file format for this program
|
||||||
bool FrameFileIO::loadNativeCSVFile(QString filename, QVector<CANFrame>* frames)
|
bool FrameFileIO::loadNativeCSVFile(QString filename, QVector<CANFrame>* frames)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public:
|
|||||||
static bool loadFrameFile(QString &, QVector<CANFrame>*);
|
static bool loadFrameFile(QString &, QVector<CANFrame>*);
|
||||||
static bool saveFrameFile(QString &, const QVector<CANFrame>*);
|
static bool saveFrameFile(QString &, const QVector<CANFrame>*);
|
||||||
static bool loadCanDumpFile(QString, QVector<CANFrame>*);
|
static bool loadCanDumpFile(QString, QVector<CANFrame>*);
|
||||||
|
static bool loadPCANFile(QString, QVector<CANFrame>*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QString unQuote(QString);
|
static QString unQuote(QString);
|
||||||
|
|||||||
+22
-2
@@ -114,6 +114,9 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
|
|||||||
int targettedID;
|
int targettedID;
|
||||||
int minLen, maxLen, thisLen;
|
int minLen, maxLen, thisLen;
|
||||||
int avgInterval;
|
int avgInterval;
|
||||||
|
int minInterval;
|
||||||
|
int maxInterval;
|
||||||
|
int thisInterval;
|
||||||
int minData[8];
|
int minData[8];
|
||||||
int maxData[8];
|
int maxData[8];
|
||||||
int dataHistogram[256][8];
|
int dataHistogram[256][8];
|
||||||
@@ -195,6 +198,8 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
|
|||||||
//clear out all the counters and accumulators
|
//clear out all the counters and accumulators
|
||||||
minLen = 8;
|
minLen = 8;
|
||||||
maxLen = 0;
|
maxLen = 0;
|
||||||
|
minInterval = 0x7FFFFFFF;
|
||||||
|
maxInterval = 0;
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
minData[i] = 256;
|
minData[i] = 256;
|
||||||
@@ -213,7 +218,13 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
|
|||||||
//then find all data points
|
//then find all data points
|
||||||
for (int j = 0; j < frameCache.count(); j++)
|
for (int j = 0; j < frameCache.count(); j++)
|
||||||
{
|
{
|
||||||
if (j != 0) avgInterval += (frameCache[j].timestamp - frameCache[j-1].timestamp);
|
if (j != 0)
|
||||||
|
{
|
||||||
|
thisInterval = (frameCache[j].timestamp - frameCache[j-1].timestamp);
|
||||||
|
if (thisInterval > maxInterval) maxInterval = thisInterval;
|
||||||
|
if (thisInterval < minInterval) minInterval = thisInterval;
|
||||||
|
avgInterval += thisInterval;
|
||||||
|
}
|
||||||
thisLen = frameCache.at(j).len;
|
thisLen = frameCache.at(j).len;
|
||||||
if (thisLen > maxLen) maxLen = thisLen;
|
if (thisLen > maxLen) maxLen = thisLen;
|
||||||
if (thisLen < minLen) minLen = thisLen;
|
if (thisLen < minLen) minLen = thisLen;
|
||||||
@@ -249,7 +260,16 @@ void FrameInfoWindow::updateDetailsWindow(QString newID)
|
|||||||
baseNode->addChild(tempItem);
|
baseNode->addChild(tempItem);
|
||||||
|
|
||||||
tempItem = new QTreeWidgetItem();
|
tempItem = new QTreeWidgetItem();
|
||||||
tempItem->setText(0, tr("Average inter-frame interval: ") + QString::number(avgInterval) + "us");
|
tempItem->setText(0, tr("Average inter-frame interval: ") + QString::number(avgInterval / 1000.0f) + "ms");
|
||||||
|
baseNode->addChild(tempItem);
|
||||||
|
tempItem = new QTreeWidgetItem();
|
||||||
|
tempItem->setText(0, tr("Minimum inter-frame interval: ") + QString::number(minInterval / 1000.0f) + "ms");
|
||||||
|
baseNode->addChild(tempItem);
|
||||||
|
tempItem = new QTreeWidgetItem();
|
||||||
|
tempItem->setText(0, tr("Maximum inter-frame interval: ") + QString::number(maxInterval / 1000.0f) + "ms");
|
||||||
|
baseNode->addChild(tempItem);
|
||||||
|
tempItem = new QTreeWidgetItem();
|
||||||
|
tempItem->setText(0, tr("Inter-frame interval variation: ") + QString::number((maxInterval - minInterval) / 1000.0f) + "ms");
|
||||||
baseNode->addChild(tempItem);
|
baseNode->addChild(tempItem);
|
||||||
|
|
||||||
for (int c = 0; c < maxLen; c++)
|
for (int c = 0; c < maxLen; c++)
|
||||||
|
|||||||
+7
-2
@@ -197,12 +197,16 @@ void GraphingWindow::titleDoubleClick(QMouseEvent* event, QCPPlotTitle* title)
|
|||||||
Q_UNUSED(event)
|
Q_UNUSED(event)
|
||||||
// Set the plot title by double clicking on it
|
// Set the plot title by double clicking on it
|
||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
|
/*
|
||||||
QString newTitle = QInputDialog::getText(this, "SavvyCAN Graphing", "New plot title:", QLineEdit::Normal, title->text(), &ok);
|
QString newTitle = QInputDialog::getText(this, "SavvyCAN Graphing", "New plot title:", QLineEdit::Normal, title->text(), &ok);
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
title->setText(newTitle);
|
title->setText(newTitle);
|
||||||
ui->graphingView->replot();
|
ui->graphingView->replot();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
editSelectedGraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphingWindow::axisLabelDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part)
|
void GraphingWindow::axisLabelDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part)
|
||||||
@@ -225,7 +229,7 @@ void GraphingWindow::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem
|
|||||||
// Rename a graph by double clicking on its legend item
|
// Rename a graph by double clicking on its legend item
|
||||||
Q_UNUSED(legend)
|
Q_UNUSED(legend)
|
||||||
if (item) // only react if item was clicked (user could have clicked on border padding of legend where there is no item, then item is 0)
|
if (item) // only react if item was clicked (user could have clicked on border padding of legend where there is no item, then item is 0)
|
||||||
{
|
{/*
|
||||||
QCPPlottableLegendItem *plItem = qobject_cast<QCPPlottableLegendItem*>(item);
|
QCPPlottableLegendItem *plItem = qobject_cast<QCPPlottableLegendItem*>(item);
|
||||||
bool ok;
|
bool ok;
|
||||||
QString newName = QInputDialog::getText(this, "SavvyCAN Graphing", "New graph name:", QLineEdit::Normal, plItem->plottable()->name(), &ok);
|
QString newName = QInputDialog::getText(this, "SavvyCAN Graphing", "New graph name:", QLineEdit::Normal, plItem->plottable()->name(), &ok);
|
||||||
@@ -246,7 +250,8 @@ void GraphingWindow::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem
|
|||||||
}
|
}
|
||||||
|
|
||||||
ui->graphingView->replot();
|
ui->graphingView->replot();
|
||||||
}
|
} */
|
||||||
|
editSelectedGraph();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-2
@@ -79,6 +79,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
dbcFileWindow = NULL;
|
dbcFileWindow = NULL;
|
||||||
fuzzingWindow = NULL;
|
fuzzingWindow = NULL;
|
||||||
udsScanWindow = NULL;
|
udsScanWindow = NULL;
|
||||||
|
motorctrlConfigWindow = NULL;
|
||||||
isoWindow = NULL;
|
isoWindow = NULL;
|
||||||
snifferWindow = NULL;
|
snifferWindow = NULL;
|
||||||
dbcHandler = new DBCHandler;
|
dbcHandler = new DBCHandler;
|
||||||
@@ -119,12 +120,13 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
connect(ui->listFilters, &QListWidget::itemChanged, this, &MainWindow::filterListItemChanged);
|
connect(ui->listFilters, &QListWidget::itemChanged, this, &MainWindow::filterListItemChanged);
|
||||||
connect(ui->btnFilterAll, &QAbstractButton::clicked, this, &MainWindow::filterSetAll);
|
connect(ui->btnFilterAll, &QAbstractButton::clicked, this, &MainWindow::filterSetAll);
|
||||||
connect(ui->btnFilterNone, &QAbstractButton::clicked, this, &MainWindow::filterClearAll);
|
connect(ui->btnFilterNone, &QAbstractButton::clicked, this, &MainWindow::filterClearAll);
|
||||||
connect(ui->actionFirmware_Uploader, &QAction::triggered, this, &MainWindow::showFirmwareUploaderWindow);
|
connect(ui->actionFirmware_Update, &QAction::triggered, this, &MainWindow::showFirmwareUploaderWindow);
|
||||||
connect(ui->actionDBC_File_Manager, &QAction::triggered, this, &MainWindow::showDBCFileWindow);
|
connect(ui->actionDBC_File_Manager, &QAction::triggered, this, &MainWindow::showDBCFileWindow);
|
||||||
connect(ui->actionFuzzing, &QAction::triggered, this, &MainWindow::showFuzzingWindow);
|
connect(ui->actionFuzzing, &QAction::triggered, this, &MainWindow::showFuzzingWindow);
|
||||||
connect(ui->actionUDS_Scanner, &QAction::triggered, this, &MainWindow::showUDSScanWindow);
|
connect(ui->actionUDS_Scanner, &QAction::triggered, this, &MainWindow::showUDSScanWindow);
|
||||||
connect(ui->actionISO_TP_Decoder, &QAction::triggered, this, &MainWindow::showISOInterpreterWindow);
|
connect(ui->actionISO_TP_Decoder, &QAction::triggered, this, &MainWindow::showISOInterpreterWindow);
|
||||||
connect(ui->actionSniffer, &QAction::triggered, this, &MainWindow::showSnifferWindow);
|
connect(ui->actionSniffer, &QAction::triggered, this, &MainWindow::showSnifferWindow);
|
||||||
|
connect(ui->actionMotorControlConfig, &QAction::triggered, this, &MainWindow::showMCConfigWindow);
|
||||||
|
|
||||||
connect(CANConManager::getInstance(), &CANConManager::framesReceived, model, &CANFrameModel::addFrames);
|
connect(CANConManager::getInstance(), &CANConManager::framesReceived, model, &CANFrameModel::addFrames);
|
||||||
|
|
||||||
@@ -273,7 +275,6 @@ MainWindow::~MainWindow()
|
|||||||
snifferWindow = NULL;
|
snifferWindow = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
delete model;
|
delete model;
|
||||||
delete elapsedTime;
|
delete elapsedTime;
|
||||||
delete dbcHandler;
|
delete dbcHandler;
|
||||||
@@ -917,6 +918,17 @@ void MainWindow::showFuzzingWindow()
|
|||||||
fuzzingWindow->show();
|
fuzzingWindow->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::showMCConfigWindow()
|
||||||
|
{
|
||||||
|
if (!motorctrlConfigWindow)
|
||||||
|
{
|
||||||
|
motorctrlConfigWindow = new MotorControllerConfigWindow(model->getListReference());
|
||||||
|
//connect(motorctrlConfigWindow, SIGNAL(sendCANFrame(const CANFrame*,int)), worker, SLOT(sendFrame(const CANFrame*,int)));
|
||||||
|
//connect(motorctrlConfigWindow, SIGNAL(sendFrameBatch(const QList<CANFrame>*)), worker, SLOT(sendFrameBatch(const QList<CANFrame>*)));
|
||||||
|
}
|
||||||
|
motorctrlConfigWindow->show();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::showUDSScanWindow()
|
void MainWindow::showUDSScanWindow()
|
||||||
{
|
{
|
||||||
if (!udsScanWindow)
|
if (!udsScanWindow)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "udsscanwindow.h"
|
#include "udsscanwindow.h"
|
||||||
#include "re/sniffer/snifferwindow.h"
|
#include "re/sniffer/snifferwindow.h"
|
||||||
#include "isotp_interpreterwindow.h"
|
#include "isotp_interpreterwindow.h"
|
||||||
|
#include "motorcontrollerconfigwindow.h"
|
||||||
|
|
||||||
class ConnectionWindow;
|
class ConnectionWindow;
|
||||||
|
|
||||||
@@ -66,6 +67,7 @@ private slots:
|
|||||||
void showScriptingWindow();
|
void showScriptingWindow();
|
||||||
void showDBCFileWindow();
|
void showDBCFileWindow();
|
||||||
void showFuzzingWindow();
|
void showFuzzingWindow();
|
||||||
|
void showMCConfigWindow();
|
||||||
void showUDSScanWindow();
|
void showUDSScanWindow();
|
||||||
void showISOInterpreterWindow();
|
void showISOInterpreterWindow();
|
||||||
void showSnifferWindow();
|
void showSnifferWindow();
|
||||||
@@ -140,6 +142,7 @@ private:
|
|||||||
UDSScanWindow *udsScanWindow;
|
UDSScanWindow *udsScanWindow;
|
||||||
ISOTP_InterpreterWindow *isoWindow;
|
ISOTP_InterpreterWindow *isoWindow;
|
||||||
SnifferWindow* snifferWindow;
|
SnifferWindow* snifferWindow;
|
||||||
|
MotorControllerConfigWindow *motorctrlConfigWindow;
|
||||||
|
|
||||||
//various private storage
|
//various private storage
|
||||||
QLabel lbStatusConnected;
|
QLabel lbStatusConnected;
|
||||||
|
|||||||
@@ -225,6 +225,8 @@
|
|||||||
<addaction name="actionScripting_INterface"/>
|
<addaction name="actionScripting_INterface"/>
|
||||||
<addaction name="actionFuzzing"/>
|
<addaction name="actionFuzzing"/>
|
||||||
<addaction name="actionUDS_Scanner"/>
|
<addaction name="actionUDS_Scanner"/>
|
||||||
|
<addaction name="actionFirmware_Update"/>
|
||||||
|
<addaction name="actionMotorControlConfig"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
@@ -401,6 +403,16 @@
|
|||||||
<string>Sniffer</string>
|
<string>Sniffer</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionFirmware_Update">
|
||||||
|
<property name="text">
|
||||||
|
<string>Firmware Update</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionMotorControlConfig">
|
||||||
|
<property name="text">
|
||||||
|
<string>MotorControlConfig</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|||||||
@@ -0,0 +1,406 @@
|
|||||||
|
#include "motorcontrollerconfigwindow.h"
|
||||||
|
#include "ui_motorcontrollerconfigwindow.h"
|
||||||
|
|
||||||
|
#include "mainwindow.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
MotorControllerConfigWindow::MotorControllerConfigWindow(const QVector<CANFrame> *frames, QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::MotorControllerConfigWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
modelFrames = frames;
|
||||||
|
|
||||||
|
timer.setInterval(40);
|
||||||
|
transmitStep = 0;
|
||||||
|
doingRequest = false;
|
||||||
|
|
||||||
|
connect(MainWindow::getReference(), SIGNAL(framesUpdated(int)), this, SLOT(updatedFrames(int)));
|
||||||
|
connect(ui->btnRefresh, SIGNAL(clicked(bool)), this, SLOT(refreshData()));
|
||||||
|
connect(ui->btnSave, SIGNAL(clicked(bool)), this, SLOT(saveData()));
|
||||||
|
connect(&timer, SIGNAL(timeout()), this, SLOT(timerTick()));
|
||||||
|
}
|
||||||
|
|
||||||
|
MotorControllerConfigWindow::~MotorControllerConfigWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::updatedFrames(int numFrames)
|
||||||
|
{
|
||||||
|
CANFrame thisFrame;
|
||||||
|
int id;
|
||||||
|
int param;
|
||||||
|
float valu;
|
||||||
|
uint8_t eightval;
|
||||||
|
uint16_t sixteenval;
|
||||||
|
uint32_t thirtytwoval;
|
||||||
|
if (numFrames == -1) //all frames deleted
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (numFrames == -2) //all new set of frames. Reset
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else //just got some new frames. See if they are relevant.
|
||||||
|
{
|
||||||
|
if (numFrames > modelFrames->count()) return;
|
||||||
|
for (int i = modelFrames->count() - numFrames; i < modelFrames->count(); i++)
|
||||||
|
{
|
||||||
|
thisFrame = modelFrames->at(i);
|
||||||
|
id = thisFrame.ID;
|
||||||
|
|
||||||
|
if (id == 0x420)
|
||||||
|
{
|
||||||
|
param = thisFrame.data[0];
|
||||||
|
eightval = thisFrame.data[1];
|
||||||
|
sixteenval = thisFrame.data[1] + (thisFrame.data[2] * 256ul);
|
||||||
|
thirtytwoval = sixteenval + (thisFrame.data[3] * 65536ul) + (thisFrame.data[4] * 256ul * 65536ul);
|
||||||
|
|
||||||
|
switch (param)
|
||||||
|
{
|
||||||
|
case 0: //voltage scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editVoltageScale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 1: //voltage bias
|
||||||
|
ui->editVoltageOffset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 2: //current 1 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editCurrent1Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 3: //current 1 bias
|
||||||
|
ui->editCurrent1Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 4: //current 2 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editCurrent2Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 5: //current 2 bias
|
||||||
|
ui->editCurrent2Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 6: //Inverter temp 1 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editInvTemp1Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 7: //Inverter temp 1 bias
|
||||||
|
ui->editInvTemp1Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 8: //Inverter temp 2 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editInvTemp2Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 9: //Inverter temp 2 bias
|
||||||
|
ui->editInvTemp2Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 10: //Motor temp 1 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editMotorTemp1Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 11: //Motor temp 1 bias
|
||||||
|
ui->editMotorTemp1Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 12: //Motor temp 2 scale (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editMotorTemp2Scale->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 13: //Motor temp 2 bias
|
||||||
|
ui->editMotorTemp2Offset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 14: //motor type (inductive, pmac, bldc)
|
||||||
|
ui->editMotorType->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 15: //control type (vhz, foc)
|
||||||
|
ui->editControlType->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 16: //encoder count
|
||||||
|
ui->editEncoderCount->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 17: //encoder direction (0 = normal, 1 = reversed)
|
||||||
|
ui->editEncoderDir->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
ui->editPolePairs->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 19: //rotor time const (*65536)
|
||||||
|
valu = thirtytwoval / 65536.0f;
|
||||||
|
ui->editRotorTime->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 20: //Torque KP (*4096)
|
||||||
|
valu = thirtytwoval / 4096.0f;
|
||||||
|
ui->editTorqueKP->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 21: //Torque KI (*4096)
|
||||||
|
valu = thirtytwoval / 4096.0f;
|
||||||
|
ui->editTorqueKI->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 22: //Torque KD (*4096)
|
||||||
|
valu = thirtytwoval / 4096.0f;
|
||||||
|
ui->editTorqueKD->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 23: //Max RPM
|
||||||
|
ui->editMaxRPM->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 24: //Max Torque
|
||||||
|
valu = sixteenval / 10.0f;
|
||||||
|
ui->editMaxTorque->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 25: //Max Amps in Drive
|
||||||
|
valu = sixteenval / 10.0f;
|
||||||
|
ui->editMaxAmpsDrive->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 26: //Max Amps in Regen
|
||||||
|
valu = sixteenval / 10.0f;
|
||||||
|
ui->editMaxAmpsRegen->setText(QString::number(valu, 'g', 4));
|
||||||
|
break;
|
||||||
|
case 27: //VHz Full Speed
|
||||||
|
ui->editVHZFull->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 28: //Theta offset
|
||||||
|
ui->editThetaOffset->setText(QString::number(sixteenval));
|
||||||
|
break;
|
||||||
|
case 29: //Hall AB
|
||||||
|
ui->editHallAB->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 30: //Hall BC
|
||||||
|
ui->editHallBC->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
case 31: //Hall CA
|
||||||
|
ui->editHallCA->setText(QString::number(eightval));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::refreshData()
|
||||||
|
{
|
||||||
|
doingRequest = true;
|
||||||
|
transmitStep = 0;
|
||||||
|
timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::saveData()
|
||||||
|
{
|
||||||
|
doingRequest = false;
|
||||||
|
transmitStep = 0;
|
||||||
|
timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::timerTick()
|
||||||
|
{
|
||||||
|
float valu;
|
||||||
|
uint32_t intval32;
|
||||||
|
uint16_t intval16;
|
||||||
|
uint8_t intval8;
|
||||||
|
|
||||||
|
if (doingRequest) //send requests for data
|
||||||
|
{
|
||||||
|
//qDebug() << "Request: " << QString::number(transmitStep);
|
||||||
|
send8BitParam(transmitStep, 0);
|
||||||
|
transmitStep++;
|
||||||
|
if (transmitStep == 32)
|
||||||
|
{
|
||||||
|
timer.stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //save current value of all data items
|
||||||
|
{
|
||||||
|
//qDebug() << "Transmission: " << QString::number(transmitStep);
|
||||||
|
switch (transmitStep)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
valu = ui->editVoltageScale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
intval16 = ui->editVoltageOffset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
valu = ui->editCurrent1Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
intval16 = ui->editCurrent1Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
valu = ui->editCurrent2Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
intval16 = ui->editCurrent2Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 6: //Inverter temp 1 scale (*65536)
|
||||||
|
valu = ui->editInvTemp1Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 7: //Inverter temp 1 bias
|
||||||
|
intval16 = ui->editInvTemp1Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 8: //Inverter temp 2 scale (*65536)
|
||||||
|
valu = ui->editInvTemp2Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 9: //Inverter temp 2 bias
|
||||||
|
intval16 = ui->editInvTemp2Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 10: //Motor temp 1 scale (*65536)
|
||||||
|
valu = ui->editMotorTemp1Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 11: //Motor temp 1 bias
|
||||||
|
intval16 = ui->editMotorTemp1Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 12: //Motor temp 2 scale (*65536)
|
||||||
|
valu = ui->editMotorTemp2Scale->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 13: //Motor temp 2 bias
|
||||||
|
intval16 = ui->editMotorTemp2Offset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 14: //motor type (inductive, pmac, bldc)
|
||||||
|
intval8 = ui->editMotorType->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 15: //control type (vhz, foc)
|
||||||
|
intval8 = ui->editControlType->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 16: //encoder count
|
||||||
|
intval16 = ui->editEncoderCount->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 17: //encoder direction (0 = normal, 1 = reversed)
|
||||||
|
intval8 = ui->editEncoderDir->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
intval8 = ui->editPolePairs->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 19: //rotor time const (*65536)
|
||||||
|
valu = ui->editRotorTime->text().toFloat();
|
||||||
|
intval32 = valu * 65536;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 20: //Torque KP (*4096)
|
||||||
|
valu = ui->editTorqueKP->text().toFloat();
|
||||||
|
intval32 = valu * 4096;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 21: //Torque KI (*4096)
|
||||||
|
valu = ui->editTorqueKI->text().toFloat();
|
||||||
|
intval32 = valu * 4096;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 22: //Torque KD (*4096)
|
||||||
|
valu = ui->editTorqueKD->text().toFloat();
|
||||||
|
intval32 = valu * 4096;
|
||||||
|
send32BitParam(0x80 + transmitStep, intval32);
|
||||||
|
break;
|
||||||
|
case 23: //Max RPM
|
||||||
|
intval16 = ui->editMaxRPM->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 24: //Max Torque
|
||||||
|
valu = ui->editMaxTorque->text().toFloat();
|
||||||
|
intval16 = valu * 10;
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 25: //Max Amps in Drive
|
||||||
|
valu = ui->editMaxAmpsDrive->text().toFloat();
|
||||||
|
intval16 = valu * 10;
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 26: //Max Amps in Regen
|
||||||
|
valu = ui->editMaxAmpsRegen->text().toFloat();
|
||||||
|
intval16 = valu * 10;
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 27: //VHz Full Speed
|
||||||
|
intval16 = ui->editVHZFull->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 28: //Theta offset
|
||||||
|
intval16 = ui->editThetaOffset->text().toInt();
|
||||||
|
send16BitParam(0x80 + transmitStep, intval16);
|
||||||
|
break;
|
||||||
|
case 29: //Hall AB
|
||||||
|
intval8 = ui->editHallAB->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 30: //Hall BC
|
||||||
|
intval8 = ui->editHallBC->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 31: //Hall CA
|
||||||
|
intval8 = ui->editHallCA->text().toInt();
|
||||||
|
send8BitParam(0x80 + transmitStep, intval8);
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
timer.stop();
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
transmitStep++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::send32BitParam(int param, uint32_t valu)
|
||||||
|
{
|
||||||
|
outFrame.ID = 0x230;
|
||||||
|
outFrame.len = 5;
|
||||||
|
outFrame.bus = 0;
|
||||||
|
outFrame.extended = false;
|
||||||
|
outFrame.data[0] = param & 0xFF;
|
||||||
|
outFrame.data[1] = valu & 0xFF;
|
||||||
|
outFrame.data[2] = (valu >> 8) & 0xFF;
|
||||||
|
outFrame.data[3] = (valu >> 16) & 0xFF;
|
||||||
|
outFrame.data[4] = (valu >> 24) & 0xFF;
|
||||||
|
|
||||||
|
emit sendCANFrame(&outFrame, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::send16BitParam(int param, uint16_t valu)
|
||||||
|
{
|
||||||
|
outFrame.ID = 0x230;
|
||||||
|
outFrame.len = 3;
|
||||||
|
outFrame.bus = 0;
|
||||||
|
outFrame.extended = false;
|
||||||
|
outFrame.data[0] = param & 0xFF;
|
||||||
|
outFrame.data[1] = valu & 0xFF;
|
||||||
|
outFrame.data[2] = (valu >> 8) & 0xFF;
|
||||||
|
|
||||||
|
emit sendCANFrame(&outFrame, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MotorControllerConfigWindow::send8BitParam(int param, uint8_t valu)
|
||||||
|
{
|
||||||
|
outFrame.ID = 0x230;
|
||||||
|
outFrame.len = 2;
|
||||||
|
outFrame.bus = 0;
|
||||||
|
outFrame.extended = false;
|
||||||
|
outFrame.data[0] = param & 0xFF;
|
||||||
|
outFrame.data[1] = valu;
|
||||||
|
|
||||||
|
emit sendCANFrame(&outFrame, 0);
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#ifndef MOTORCONTROLLERCONFIGWINDOW_H
|
||||||
|
#define MOTORCONTROLLERCONFIGWINDOW_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QTimer>
|
||||||
|
#include "can_structs.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MotorControllerConfigWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MotorControllerConfigWindow : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MotorControllerConfigWindow(const QVector<CANFrame> *frames, QWidget *parent = 0);
|
||||||
|
~MotorControllerConfigWindow();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void sendCANFrame(const CANFrame *, int);
|
||||||
|
void sendFrameBatch(const QList<CANFrame> *);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void updatedFrames(int numFrames);
|
||||||
|
void refreshData();
|
||||||
|
void saveData();
|
||||||
|
void timerTick();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MotorControllerConfigWindow *ui;
|
||||||
|
const QVector<CANFrame> *modelFrames;
|
||||||
|
QTimer timer;
|
||||||
|
CANFrame outFrame;
|
||||||
|
bool doingRequest;
|
||||||
|
int transmitStep;
|
||||||
|
|
||||||
|
void send32BitParam(int param, uint32_t valu);
|
||||||
|
void send16BitParam(int param, uint16_t valu);
|
||||||
|
void send8BitParam(int param, uint8_t valu);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MOTORCONTROLLERCONFIGWINDOW_H
|
||||||
@@ -0,0 +1,363 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MotorControllerConfigWindow</class>
|
||||||
|
<widget class="QDialog" name="MotorControllerConfigWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>902</width>
|
||||||
|
<height>328</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Controller Configuration</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="2" column="7">
|
||||||
|
<widget class="QLineEdit" name="editMotorTemp1Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="2">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>Inv Temp 2 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="6">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Current 1 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="4">
|
||||||
|
<widget class="QLabel" name="label_23">
|
||||||
|
<property name="text">
|
||||||
|
<string>Motor Type</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="7">
|
||||||
|
<widget class="QLineEdit" name="editCurrent1Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="4">
|
||||||
|
<widget class="QLabel" name="label_15">
|
||||||
|
<property name="text">
|
||||||
|
<string>Motor Temp 1 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QLabel" name="label_14">
|
||||||
|
<property name="text">
|
||||||
|
<string>Inv Temp 1 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="2">
|
||||||
|
<widget class="QLabel" name="label_18">
|
||||||
|
<property name="text">
|
||||||
|
<string>Motor Temp 2 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_8">
|
||||||
|
<property name="text">
|
||||||
|
<string>Encoder Count</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="4">
|
||||||
|
<widget class="QLabel" name="label_25">
|
||||||
|
<property name="text">
|
||||||
|
<string>Pole Pairs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QLineEdit" name="editEncoderCount"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="5">
|
||||||
|
<widget class="QLineEdit" name="editCurrent1Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="3">
|
||||||
|
<widget class="QLineEdit" name="editEncoderDir"/>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="7">
|
||||||
|
<widget class="QLineEdit" name="editRotorTime"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="editCurrent2Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLabel" name="label_10">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max Torque</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="6">
|
||||||
|
<widget class="QLabel" name="label_17">
|
||||||
|
<property name="text">
|
||||||
|
<string>Motor Temp 1 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QLabel" name="label_19">
|
||||||
|
<property name="text">
|
||||||
|
<string>Encoder Direction</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Voltage Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="6">
|
||||||
|
<widget class="QLabel" name="label_24">
|
||||||
|
<property name="text">
|
||||||
|
<string>Control Type</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="3">
|
||||||
|
<widget class="QLineEdit" name="editVoltageOffset"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QLineEdit" name="editCurrent2Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<widget class="QLineEdit" name="editInvTemp1Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="7">
|
||||||
|
<widget class="QLineEdit" name="editInvTemp1Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="3">
|
||||||
|
<widget class="QLineEdit" name="editInvTemp2Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="label_9">
|
||||||
|
<property name="text">
|
||||||
|
<string>Torque KP</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>Motor Temp 2 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="4">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Current 1 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>Inv Temp 2 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="6">
|
||||||
|
<widget class="QLabel" name="label_30">
|
||||||
|
<property name="text">
|
||||||
|
<string>VHz Full RPM</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="3">
|
||||||
|
<widget class="QLineEdit" name="editMotorTemp2Offset"/>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="5">
|
||||||
|
<widget class="QLineEdit" name="editMotorType"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLineEdit" name="editVoltageScale"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="2">
|
||||||
|
<widget class="QLabel" name="label_20">
|
||||||
|
<property name="text">
|
||||||
|
<string>Torque KI</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLineEdit" name="editInvTemp2Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="2">
|
||||||
|
<widget class="QLabel" name="label_12">
|
||||||
|
<property name="text">
|
||||||
|
<string>Current 2 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="2">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Voltage Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Current 2 Scale</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="6">
|
||||||
|
<widget class="QLabel" name="label_26">
|
||||||
|
<property name="text">
|
||||||
|
<string>Rotor Time Const</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="4">
|
||||||
|
<widget class="QLabel" name="label_27">
|
||||||
|
<property name="text">
|
||||||
|
<string>Torque KD</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="2">
|
||||||
|
<widget class="QLabel" name="label_21">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max Amps Drive</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="6">
|
||||||
|
<widget class="QLabel" name="label_16">
|
||||||
|
<property name="text">
|
||||||
|
<string>Inv Temp 1 Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="4">
|
||||||
|
<widget class="QLabel" name="label_29">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max Amps Regen</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="editMotorTemp2Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="2">
|
||||||
|
<widget class="QLabel" name="label_22">
|
||||||
|
<property name="text">
|
||||||
|
<string>Hall AB</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QLabel" name="label_11">
|
||||||
|
<property name="text">
|
||||||
|
<string>Theta Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="5">
|
||||||
|
<widget class="QLineEdit" name="editMotorTemp1Scale"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="6">
|
||||||
|
<widget class="QLabel" name="label_32">
|
||||||
|
<property name="text">
|
||||||
|
<string>Hall CA</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="5">
|
||||||
|
<widget class="QLineEdit" name="editPolePairs"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="6">
|
||||||
|
<widget class="QLabel" name="label_28">
|
||||||
|
<property name="text">
|
||||||
|
<string>Max RPM</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="4">
|
||||||
|
<widget class="QLabel" name="label_31">
|
||||||
|
<property name="text">
|
||||||
|
<string>Hall BC</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="7">
|
||||||
|
<widget class="QLineEdit" name="editControlType"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLineEdit" name="editTorqueKP"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="3">
|
||||||
|
<widget class="QLineEdit" name="editTorqueKI"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="5">
|
||||||
|
<widget class="QLineEdit" name="editTorqueKD"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="7">
|
||||||
|
<widget class="QLineEdit" name="editMaxRPM"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QLineEdit" name="editMaxTorque"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="3">
|
||||||
|
<widget class="QLineEdit" name="editMaxAmpsDrive"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="5">
|
||||||
|
<widget class="QLineEdit" name="editMaxAmpsRegen"/>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="7">
|
||||||
|
<widget class="QLineEdit" name="editVHZFull"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QLineEdit" name="editThetaOffset"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="3">
|
||||||
|
<widget class="QLineEdit" name="editHallAB"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="5">
|
||||||
|
<widget class="QLineEdit" name="editHallBC"/>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="7">
|
||||||
|
<widget class="QLineEdit" name="editHallCA"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnRefresh">
|
||||||
|
<property name="text">
|
||||||
|
<string>Refresh</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnSave">
|
||||||
|
<property name="text">
|
||||||
|
<string>Save</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
Reference in New Issue
Block a user