Merge branch 'master' of github.com:qurrent-llc/SavvyCAN
This commit is contained in:
+14
-2
@@ -8,6 +8,7 @@ CANBus::CANBus()
|
|||||||
listenOnly = false;
|
listenOnly = false;
|
||||||
singleWire = false;
|
singleWire = false;
|
||||||
active = false;
|
active = false;
|
||||||
|
canFD = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -15,14 +16,16 @@ CANBus::CANBus(const CANBus& pBus) :
|
|||||||
speed(pBus.speed),
|
speed(pBus.speed),
|
||||||
listenOnly(pBus.listenOnly),
|
listenOnly(pBus.listenOnly),
|
||||||
singleWire(pBus.singleWire),
|
singleWire(pBus.singleWire),
|
||||||
active(pBus.active) {}
|
active(pBus.active),
|
||||||
|
canFD(pBus.canFD) {}
|
||||||
|
|
||||||
|
|
||||||
bool CANBus::operator==(const CANBus& bus) const{
|
bool CANBus::operator==(const CANBus& bus) const{
|
||||||
return speed == bus.speed &&
|
return speed == bus.speed &&
|
||||||
listenOnly == bus.listenOnly &&
|
listenOnly == bus.listenOnly &&
|
||||||
singleWire == bus.singleWire &&
|
singleWire == bus.singleWire &&
|
||||||
active == bus.active;
|
active == bus.active &&
|
||||||
|
canFD == bus.canFD;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CANBus::setSpeed(int newSpeed){
|
void CANBus::setSpeed(int newSpeed){
|
||||||
@@ -45,6 +48,11 @@ void CANBus::setActive(bool mode){
|
|||||||
active = mode;
|
active = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CANBus::setCanFD(bool mode){
|
||||||
|
//qDebug() << "CANBUS setCanFD = " << mode;
|
||||||
|
canFD = mode;
|
||||||
|
}
|
||||||
|
|
||||||
int CANBus::getSpeed(){
|
int CANBus::getSpeed(){
|
||||||
return speed;
|
return speed;
|
||||||
}
|
}
|
||||||
@@ -61,6 +69,10 @@ bool CANBus::isActive(){
|
|||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CANBus::isCanFD(){
|
||||||
|
return canFD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QDataStream& operator<<( QDataStream & pStream, const CANBus& pCanBus )
|
QDataStream& operator<<( QDataStream & pStream, const CANBus& pCanBus )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,16 +16,18 @@ public:
|
|||||||
bool listenOnly;
|
bool listenOnly;
|
||||||
bool singleWire;
|
bool singleWire;
|
||||||
bool active; //is this bus turned on?
|
bool active; //is this bus turned on?
|
||||||
|
bool canFD;
|
||||||
|
|
||||||
void setSpeed(int); // new speed
|
void setSpeed(int); // new speed
|
||||||
void setListenOnly(bool); //bool for whether to only listen
|
void setListenOnly(bool); //bool for whether to only listen
|
||||||
void setSingleWire(bool); //bool for whether to use single wire mode
|
void setSingleWire(bool); //bool for whether to use single wire mode
|
||||||
void setActive(bool); //whether this bus should be enabled or not.
|
void setActive(bool); //whether this bus should be enabled or not.
|
||||||
|
void setCanFD(bool); // enable or disable CANFD support
|
||||||
int getSpeed();
|
int getSpeed();
|
||||||
bool isListenOnly();
|
bool isListenOnly();
|
||||||
bool isSingleWire();
|
bool isSingleWire();
|
||||||
bool isActive();
|
bool isActive();
|
||||||
|
bool isCanFD();
|
||||||
};
|
};
|
||||||
|
|
||||||
QDataStream& operator<<( QDataStream & pStream, const CANBus& pCanBus );
|
QDataStream& operator<<( QDataStream & pStream, const CANBus& pCanBus );
|
||||||
|
|||||||
@@ -365,6 +365,7 @@ void ConnectionWindow::saveBusSettings()
|
|||||||
bus.setSpeed(ui->cbBusSpeed->currentText().toInt());
|
bus.setSpeed(ui->cbBusSpeed->currentText().toInt());
|
||||||
bus.setActive(ui->ckEnable->isChecked());
|
bus.setActive(ui->ckEnable->isChecked());
|
||||||
bus.setListenOnly(ui->ckListenOnly->isChecked());
|
bus.setListenOnly(ui->ckListenOnly->isChecked());
|
||||||
|
bus.setCanFD(ui->canFDEnable->isChecked());
|
||||||
conn_p->setBusSettings(offset, bus);
|
conn_p->setBusSettings(offset, bus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,7 +382,8 @@ void ConnectionWindow::populateBusDetails(int offset)
|
|||||||
{
|
{
|
||||||
//bool ret;
|
//bool ret;
|
||||||
//int numBuses;
|
//int numBuses;
|
||||||
|
ui->canFDEnable->setVisible(false);
|
||||||
|
ui->canFDEnable_label->setVisible(false);
|
||||||
CANConnection* conn_p = connModel->getAtIdx(selIdx);
|
CANConnection* conn_p = connModel->getAtIdx(selIdx);
|
||||||
CANBus bus;
|
CANBus bus;
|
||||||
if(!conn_p) return;
|
if(!conn_p) return;
|
||||||
@@ -396,6 +398,12 @@ void ConnectionWindow::populateBusDetails(int offset)
|
|||||||
//ui->lblBusNum->setText(QString::number(busBase + offset));
|
//ui->lblBusNum->setText(QString::number(busBase + offset));
|
||||||
ui->ckListenOnly->setChecked(bus.isListenOnly());
|
ui->ckListenOnly->setChecked(bus.isListenOnly());
|
||||||
ui->ckEnable->setChecked(bus.isActive());
|
ui->ckEnable->setChecked(bus.isActive());
|
||||||
|
if (conn_p->getType() == CANCon::type::SERIALBUS)
|
||||||
|
{
|
||||||
|
ui->canFDEnable->setVisible(true);
|
||||||
|
ui->canFDEnable_label->setVisible(true);
|
||||||
|
ui->canFDEnable->setChecked(bus.isCanFD());
|
||||||
|
}
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int i = 0; i < ui->cbBusSpeed->count(); i++)
|
for (int i = 0; i < ui->cbBusSpeed->count(); i++)
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ void SerialBusConnection::piStarted()
|
|||||||
mTimer.setSingleShot(false); //keep ticking
|
mTimer.setSingleShot(false); //keep ticking
|
||||||
mTimer.start();
|
mTimer.start();
|
||||||
mBusData[0].mBus.setActive(true);
|
mBusData[0].mBus.setActive(true);
|
||||||
|
mBusData[0].mBus.setCanFD(false);
|
||||||
mBusData[0].mConfigured = true;
|
mBusData[0].mConfigured = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,6 +104,7 @@ void SerialBusConnection::piSetBusSettings(int pBusIdx, CANBus bus)
|
|||||||
//You cannot set the speed of a socketcan interface, it has to be set with console commands.
|
//You cannot set the speed of a socketcan interface, it has to be set with console commands.
|
||||||
//But, you can probabaly set the speed of many of the other serialbus devices so go ahead and try
|
//But, you can probabaly set the speed of many of the other serialbus devices so go ahead and try
|
||||||
mDev_p->setConfigurationParameter(QCanBusDevice::BitRateKey, bus.speed);
|
mDev_p->setConfigurationParameter(QCanBusDevice::BitRateKey, bus.speed);
|
||||||
|
mDev_p->setConfigurationParameter(QCanBusDevice::CanFdKey, bus.canFD);
|
||||||
|
|
||||||
/* connect device */
|
/* connect device */
|
||||||
if (!mDev_p->connectDevice()) {
|
if (!mDev_p->connectDevice()) {
|
||||||
|
|||||||
@@ -288,18 +288,13 @@ QString SocketCANd::decodeFrames(QString data, int busNum)
|
|||||||
buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, frameParsed[2].toDouble() * 1000000l));
|
buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, frameParsed[2].toDouble() * 1000000l));
|
||||||
//buildFrame.len = frameParsed[3].length() * 0.5;
|
//buildFrame.len = frameParsed[3].length() * 0.5;
|
||||||
|
|
||||||
if(frameParsed.length() < 4)
|
int framelength = 0;
|
||||||
|
|
||||||
|
if(frameParsed.length() == 4)
|
||||||
{
|
{
|
||||||
qDebug() << "Received frame doesn't contain any data: " << data;
|
framelength = frameParsed[3].length() * 0.5;
|
||||||
|
|
||||||
//todo
|
|
||||||
//this is not totally true, ive seen frames come through that look like < frame 1F020240 1664924225.371291 >
|
|
||||||
//if we found the closing token but theres no data then remove the message from the buffer
|
|
||||||
return data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int framelength = frameParsed[3].length() * 0.5;
|
|
||||||
|
|
||||||
buildData.resize(framelength);
|
buildData.resize(framelength);
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
@@ -326,8 +321,8 @@ QString SocketCANd::decodeFrames(QString data, int busNum)
|
|||||||
getQueue().queue();
|
getQueue().queue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
//else
|
||||||
qDebug() << "can't get a frame, capture suspended";
|
// qDebug() << "can't get a frame, capture suspended";
|
||||||
|
|
||||||
//take out the data that we just processed and anything that is in front of it
|
//take out the data that we just processed and anything that is in front of it
|
||||||
//this should keep broken frames from accumulating at in the data buffer
|
//this should keep broken frames from accumulating at in the data buffer
|
||||||
|
|||||||
+173
-1
@@ -119,6 +119,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
connect(ui->actionFuzzy_Scope, &QAction::triggered, this, &MainWindow::showFuzzyScopeWindow);
|
connect(ui->actionFuzzy_Scope, &QAction::triggered, this, &MainWindow::showFuzzyScopeWindow);
|
||||||
connect(ui->actionRange_State_2, &QAction::triggered, this, &MainWindow::showRangeWindow);
|
connect(ui->actionRange_State_2, &QAction::triggered, this, &MainWindow::showRangeWindow);
|
||||||
connect(ui->actionSave_Decoded_Frames, &QAction::triggered, this, &MainWindow::handleSaveDecoded);
|
connect(ui->actionSave_Decoded_Frames, &QAction::triggered, this, &MainWindow::handleSaveDecoded);
|
||||||
|
connect(ui->actionSave_Decoded_Frames_CSV, &QAction::triggered, this, &MainWindow::handleSaveDecodedCsv);
|
||||||
connect(ui->actionSingle_Multi_State_2, &QAction::triggered, this, &MainWindow::showSingleMultiWindow);
|
connect(ui->actionSingle_Multi_State_2, &QAction::triggered, this, &MainWindow::showSingleMultiWindow);
|
||||||
connect(ui->actionFile_Comparison, &QAction::triggered, this, &MainWindow::showComparisonWindow);
|
connect(ui->actionFile_Comparison, &QAction::triggered, this, &MainWindow::showComparisonWindow);
|
||||||
connect(ui->actionDBC_Comparison, &QAction::triggered, this, &MainWindow::showDBCComparisonWindow);
|
connect(ui->actionDBC_Comparison, &QAction::triggered, this, &MainWindow::showDBCComparisonWindow);
|
||||||
@@ -988,6 +989,16 @@ void MainWindow::handleLoadFilters()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::handleSaveDecoded()
|
void MainWindow::handleSaveDecoded()
|
||||||
|
{
|
||||||
|
handleSaveDecodedMethod(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::handleSaveDecodedCsv()
|
||||||
|
{
|
||||||
|
handleSaveDecodedMethod(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::handleSaveDecodedMethod(bool csv)
|
||||||
{
|
{
|
||||||
QString filename;
|
QString filename;
|
||||||
QFileDialog dialog(this);
|
QFileDialog dialog(this);
|
||||||
@@ -1006,11 +1017,172 @@ void MainWindow::handleSaveDecoded()
|
|||||||
{
|
{
|
||||||
filename = dialog.selectedFiles()[0];
|
filename = dialog.selectedFiles()[0];
|
||||||
if (!filename.contains('.')) filename += ".txt";
|
if (!filename.contains('.')) filename += ".txt";
|
||||||
saveDecodedTextFile(filename);
|
|
||||||
|
if(csv)
|
||||||
|
saveDecodedTextFileAsColumns(filename);
|
||||||
|
else
|
||||||
|
saveDecodedTextFile(filename);
|
||||||
|
|
||||||
settings.setValue("FileIO/LoadSaveDirectory", dialog.directory().path());
|
settings.setValue("FileIO/LoadSaveDirectory", dialog.directory().path());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::saveDecodedTextFileAsColumns(QString filename)
|
||||||
|
{
|
||||||
|
QFile *outFile = new QFile(filename);
|
||||||
|
const QVector<CANFrame> *frames = model->getFilteredListReference();
|
||||||
|
|
||||||
|
const unsigned char *data;
|
||||||
|
int dataLen;
|
||||||
|
const CANFrame *frame;
|
||||||
|
|
||||||
|
if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text))
|
||||||
|
return;
|
||||||
|
/*
|
||||||
|
Time: 205.173000 ID: 0x20E Std Bus: 0 Len: 8
|
||||||
|
Data Bytes: 88 10 00 13 BB 00 06 00
|
||||||
|
SignalName Value
|
||||||
|
*/
|
||||||
|
QList<QPair<int, int>> msgsAndColumns;
|
||||||
|
int columnsAdded = 0;
|
||||||
|
int dataStartCol = 0;
|
||||||
|
|
||||||
|
QString builderString;
|
||||||
|
//time
|
||||||
|
builderString += tr("Time") + ",";
|
||||||
|
dataStartCol++;
|
||||||
|
//id
|
||||||
|
builderString += tr("ID") + ",";
|
||||||
|
dataStartCol++;
|
||||||
|
//if (frame->hasExtendedFrameFormat()) builderString += tr(" Ext ");
|
||||||
|
//else builderString += tr(" Std ");
|
||||||
|
//bus
|
||||||
|
builderString += tr("Bus") + ",";
|
||||||
|
dataStartCol++;
|
||||||
|
//len
|
||||||
|
builderString += tr("DataLen") + ",";
|
||||||
|
dataStartCol++;
|
||||||
|
|
||||||
|
columnsAdded = dataStartCol;
|
||||||
|
|
||||||
|
//loop through all the frames and the message data therein
|
||||||
|
for (int c = 0; c < frames->count(); c++)
|
||||||
|
{
|
||||||
|
frame = &frames->at(c);
|
||||||
|
data = reinterpret_cast<const unsigned char *>(frame->payload().constData());
|
||||||
|
dataLen = frame->payload().count();
|
||||||
|
|
||||||
|
//add all column names
|
||||||
|
if (dbcHandler != nullptr)
|
||||||
|
{
|
||||||
|
DBC_MESSAGE *msg = dbcHandler->findMessage(*frame);
|
||||||
|
if (msg != nullptr)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
for (int j = 0; j < msg->sigHandler->getCount(); j++)
|
||||||
|
{
|
||||||
|
if(j==0)
|
||||||
|
{
|
||||||
|
for(int m=0; m<msgsAndColumns.count(); m++)
|
||||||
|
{
|
||||||
|
if(msgsAndColumns[m].first == msg->ID)
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if(found == false)
|
||||||
|
msgsAndColumns.append(QPair<int,int>(msg->ID, columnsAdded));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found == false)
|
||||||
|
{
|
||||||
|
QString temp;
|
||||||
|
if (msg->sigHandler->findSignalByIdx(j)->processAsText(*frame, temp))
|
||||||
|
{
|
||||||
|
builderString.append(msg->sigHandler->findSignalByIdx(j)->name);
|
||||||
|
builderString.append(",");
|
||||||
|
columnsAdded++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//add EOL
|
||||||
|
builderString += "\n";
|
||||||
|
//write out the header row
|
||||||
|
outFile->write(builderString.toUtf8());
|
||||||
|
|
||||||
|
//builderString = tr("Data Bytes: ");
|
||||||
|
//for (int temp = 0; temp < dataLen; temp++)
|
||||||
|
//{
|
||||||
|
// builderString += Utility::formatNumber(data[temp]) + " ";
|
||||||
|
//}
|
||||||
|
//builderString += "\n";
|
||||||
|
//outFile->write(builderString.toUtf8());
|
||||||
|
|
||||||
|
int dataColumnsAdded = 0;
|
||||||
|
builderString = "";
|
||||||
|
for (int c = 0; c < frames->count(); c++)
|
||||||
|
{
|
||||||
|
dataColumnsAdded = 0;
|
||||||
|
frame = &frames->at(c);
|
||||||
|
data = reinterpret_cast<const unsigned char *>(frame->payload().constData());
|
||||||
|
dataLen = frame->payload().count();
|
||||||
|
|
||||||
|
QString builderString;
|
||||||
|
builderString += QString::number((frame->timeStamp().microSeconds() / 1000000.0), 'f', 6) + ",";
|
||||||
|
dataColumnsAdded++;
|
||||||
|
//id
|
||||||
|
builderString += Utility::formatCANID(frame->frameId(), frame->hasExtendedFrameFormat()) + ",";
|
||||||
|
dataColumnsAdded++;
|
||||||
|
//if (frame->hasExtendedFrameFormat()) builderString += tr(" Ext ");
|
||||||
|
//else builderString += tr(" Std ");
|
||||||
|
//bus
|
||||||
|
builderString += QString::number(frame->bus) + ",";
|
||||||
|
dataColumnsAdded++;
|
||||||
|
//len
|
||||||
|
builderString += QString::number(dataLen) + ",";
|
||||||
|
dataColumnsAdded++;
|
||||||
|
|
||||||
|
if (dbcHandler != nullptr)
|
||||||
|
{
|
||||||
|
DBC_MESSAGE *msg = dbcHandler->findMessage(*frame);
|
||||||
|
if (msg != nullptr)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < msg->sigHandler->getCount(); j++)
|
||||||
|
{
|
||||||
|
if(j==0)
|
||||||
|
{
|
||||||
|
for(int i = 0; i<msgsAndColumns.count(); i++)
|
||||||
|
{
|
||||||
|
if(msgsAndColumns[i].first == msg->ID)
|
||||||
|
{
|
||||||
|
int startCol = msgsAndColumns[i].second;
|
||||||
|
while(dataColumnsAdded < startCol)
|
||||||
|
{
|
||||||
|
builderString += ",";
|
||||||
|
dataColumnsAdded++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString temp;
|
||||||
|
if (msg->sigHandler->findSignalByIdx(j)->processAsText(*frame, temp, false))
|
||||||
|
{
|
||||||
|
builderString.append(temp);
|
||||||
|
builderString.append(",");
|
||||||
|
dataColumnsAdded++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builderString.append("\n");
|
||||||
|
outFile->write(builderString.toUtf8());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
outFile->close();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::saveDecodedTextFile(QString filename)
|
void MainWindow::saveDecodedTextFile(QString filename)
|
||||||
{
|
{
|
||||||
QFile *outFile = new QFile(filename);
|
QFile *outFile = new QFile(filename);
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ private slots:
|
|||||||
void showDBCComparisonWindow();
|
void showDBCComparisonWindow();
|
||||||
void exitApp();
|
void exitApp();
|
||||||
void handleSaveDecoded();
|
void handleSaveDecoded();
|
||||||
|
void handleSaveDecodedCsv();
|
||||||
void connectionStatusUpdated(int conns);
|
void connectionStatusUpdated(int conns);
|
||||||
void gridClicked(QModelIndex);
|
void gridClicked(QModelIndex);
|
||||||
void gridDoubleClicked(QModelIndex);
|
void gridDoubleClicked(QModelIndex);
|
||||||
@@ -195,7 +196,9 @@ private:
|
|||||||
//private methods
|
//private methods
|
||||||
QString getSignalNameFromPosition(QPoint pos);
|
QString getSignalNameFromPosition(QPoint pos);
|
||||||
uint32_t getMessageIDFromPosition(QPoint pos);
|
uint32_t getMessageIDFromPosition(QPoint pos);
|
||||||
|
void handleSaveDecodedMethod(bool csv);
|
||||||
void saveDecodedTextFile(QString);
|
void saveDecodedTextFile(QString);
|
||||||
|
void saveDecodedTextFileAsColumns(QString);
|
||||||
void addFrameToDisplay(CANFrame &, bool);
|
void addFrameToDisplay(CANFrame &, bool);
|
||||||
void updateFileStatus();
|
void updateFileStatus();
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event);
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ void GraphingWindow::changeEvent(QEvent *event)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
setWindowOpacity(0.25);
|
//setWindowOpacity(0.25);
|
||||||
// widget is now inactive
|
// widget is now inactive
|
||||||
qDebug() << "Hide";
|
qDebug() << "Hide";
|
||||||
}
|
}
|
||||||
@@ -199,7 +199,7 @@ void GraphingWindow::updatedFrames(int numFrames)
|
|||||||
ui->graphingView->replot(); //now, redisplay them all
|
ui->graphingView->replot(); //now, redisplay them all
|
||||||
}
|
}
|
||||||
else //just got some new frames. See if they are relevant.
|
else //just got some new frames. See if they are relevant.
|
||||||
{
|
{
|
||||||
if (numFrames > modelFrames->count()) return;
|
if (numFrames > modelFrames->count()) return;
|
||||||
|
|
||||||
for (int j = 0; j < graphParams.count(); j++)
|
for (int j = 0; j < graphParams.count(); j++)
|
||||||
|
|||||||
+14
-4
@@ -64,9 +64,6 @@
|
|||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="qhBox20">
|
<layout class="QVBoxLayout" name="qhBox20">
|
||||||
<item>
|
|
||||||
<widget class="QTabBar" name="tabBuses" native="true"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<layout class="QFormLayout" name="formLayout_2">
|
<layout class="QFormLayout" name="formLayout_2">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
@@ -107,15 +104,28 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QPushButton" name="btnSaveBus">
|
<widget class="QPushButton" name="btnSaveBus">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Save Bus Settings</string>
|
<string>Save Bus Settings</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QCheckBox" name="canFDEnable"/>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="canFDEnable_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable CAN FD:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTabBar" name="tabBuses" native="true"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
+7
-1
@@ -368,7 +368,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>800</width>
|
<width>800</width>
|
||||||
<height>22</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu_RE_Tools">
|
<widget class="QMenu" name="menu_RE_Tools">
|
||||||
@@ -415,6 +415,7 @@
|
|||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionDBC_File_Manager"/>
|
<addaction name="actionDBC_File_Manager"/>
|
||||||
<addaction name="actionSave_Decoded_Frames"/>
|
<addaction name="actionSave_Decoded_Frames"/>
|
||||||
|
<addaction name="actionSave_Decoded_Frames_CSV"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionPreferences"/>
|
<addaction name="actionPreferences"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
@@ -615,6 +616,11 @@
|
|||||||
<string>DBC Comparison</string>
|
<string>DBC Comparison</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionSave_Decoded_Frames_CSV">
|
||||||
|
<property name="text">
|
||||||
|
<string>Save Decoded Frames CSV</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<resources/>
|
<resources/>
|
||||||
|
|||||||
Reference in New Issue
Block a user