Merge branch 'master' of github.com:qurrent-llc/SavvyCAN

This commit is contained in:
Andy Huska
2022-11-02 16:48:02 -05:00
10 changed files with 233 additions and 23 deletions
+14 -2
View File
@@ -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 )
{ {
+3 -1
View File
@@ -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 );
+9 -1
View File
@@ -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++)
+2
View File
@@ -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()) {
+6 -11
View File
@@ -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
View File
@@ -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);
+3
View File
@@ -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);
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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/>