duplicate works! multiplexed signals are not copied at this time

need to learn more about them first

need to do clean up and corner case handling
This commit is contained in:
Andy Huska
2022-09-22 18:04:27 -05:00
parent 27b58552df
commit 47d63c6296
8 changed files with 409 additions and 6 deletions
+4
View File
@@ -21,6 +21,7 @@ ICON = icons/SavvyIcon.icns
SOURCES += main.cpp\ SOURCES += main.cpp\
connections/mqtt_bus.cpp \ connections/mqtt_bus.cpp \
dbc/dbcnodeduplicateeditor.cpp \
mqtt/qmqtt_client.cpp \ mqtt/qmqtt_client.cpp \
mqtt/qmqtt_client_p.cpp \ mqtt/qmqtt_client_p.cpp \
mqtt/qmqtt_frame.cpp \ mqtt/qmqtt_frame.cpp \
@@ -101,6 +102,7 @@ HEADERS += mainwindow.h \
canframemodel.h \ canframemodel.h \
connections/socketcand.h \ connections/socketcand.h \
connections/mqtt_bus.h \ connections/mqtt_bus.h \
dbc/dbcnodeduplicateeditor.h \
dbc/dbcnoderebaseeditor.h \ dbc/dbcnoderebaseeditor.h \
mqtt/qmqtt.h \ mqtt/qmqtt.h \
mqtt/qmqtt_client.h \ mqtt/qmqtt_client.h \
@@ -185,11 +187,13 @@ HEADERS += mainwindow.h \
pcaplite.h pcaplite.h
FORMS += ui/candatagrid.ui \ FORMS += ui/candatagrid.ui \
ui/dbcnodeduplicateeditor.ui \
ui/dbccomparatorwindow.ui \ ui/dbccomparatorwindow.ui \
ui/dbcmessageeditor.ui \ ui/dbcmessageeditor.ui \
ui/connectionwindow.ui \ ui/connectionwindow.ui \
ui/dbcloadsavewindow.ui \ ui/dbcloadsavewindow.ui \
ui/dbcmaineditor.ui \ ui/dbcmaineditor.ui \
ui/dbcnodeduplicateeditor.ui \
ui/dbcnoderebaseeditor.ui \ ui/dbcnoderebaseeditor.ui \
ui/dbcsignaleditor.ui \ ui/dbcsignaleditor.ui \
ui/dbcnodeeditor.ui \ ui/dbcnodeeditor.ui \
+101 -4
View File
@@ -31,7 +31,7 @@ DBCMainEditor::DBCMainEditor( const QVector<CANFrame> *frames, QWidget *parent)
connect(ui->treeDBC, &QTreeWidget::customContextMenuRequested, this, &DBCMainEditor::onTreeContextMenu); connect(ui->treeDBC, &QTreeWidget::customContextMenuRequested, this, &DBCMainEditor::onTreeContextMenu);
connect(ui->treeDBC, &QTreeWidget::currentItemChanged, this, &DBCMainEditor::currentItemChanged); connect(ui->treeDBC, &QTreeWidget::currentItemChanged, this, &DBCMainEditor::currentItemChanged);
connect(ui->btnDelete, &QAbstractButton::clicked, this, &DBCMainEditor::deleteCurrentTreeItem); connect(ui->btnDelete, &QAbstractButton::clicked, this, &DBCMainEditor::deleteCurrentTreeItem);
connect(ui->btnNewNode, &QAbstractButton::clicked, this, &DBCMainEditor::newNode); connect(ui->btnNewNode, &QAbstractButton::clicked, this, QOverload<>::of(&DBCMainEditor::newNode));
connect(ui->btnNewMessage, &QAbstractButton::clicked, this, &DBCMainEditor::newMessage); connect(ui->btnNewMessage, &QAbstractButton::clicked, this, &DBCMainEditor::newMessage);
connect(ui->btnNewSignal, &QAbstractButton::clicked, this, &DBCMainEditor::newSignal); connect(ui->btnNewSignal, &QAbstractButton::clicked, this, &DBCMainEditor::newSignal);
@@ -39,12 +39,17 @@ DBCMainEditor::DBCMainEditor( const QVector<CANFrame> *frames, QWidget *parent)
msgEditor = new DBCMessageEditor(this); msgEditor = new DBCMessageEditor(this);
nodeEditor = new DBCNodeEditor(this); nodeEditor = new DBCNodeEditor(this);
nodeRebaseEditor = new DBCNodeRebaseEditor(this); nodeRebaseEditor = new DBCNodeRebaseEditor(this);
nodeDuplicateEditor = new DBCNodeDuplicateEditor(this);
//all three might potentially change the data stored and force the tree to be updated //all three might potentially change the data stored and force the tree to be updated
connect(sigEditor, &DBCSignalEditor::updatedTreeInfo, this, &DBCMainEditor::updatedSignal); connect(sigEditor, &DBCSignalEditor::updatedTreeInfo, this, &DBCMainEditor::updatedSignal);
connect(msgEditor, &DBCMessageEditor::updatedTreeInfo, this, &DBCMainEditor::updatedMessage); connect(msgEditor, &DBCMessageEditor::updatedTreeInfo, this, &DBCMainEditor::updatedMessage);
connect(nodeEditor, &DBCNodeEditor::updatedTreeInfo, this, &DBCMainEditor::updatedNode); connect(nodeEditor, &DBCNodeEditor::updatedTreeInfo, this, &DBCMainEditor::updatedNode);
connect(nodeRebaseEditor, &DBCNodeRebaseEditor::updatedTreeInfo, this, &DBCMainEditor::updatedMessage); connect(nodeRebaseEditor, &DBCNodeRebaseEditor::updatedTreeInfo, this, &DBCMainEditor::updatedMessage);
connect(nodeDuplicateEditor, &DBCNodeDuplicateEditor::updatedTreeInfo, this, &DBCMainEditor::updatedMessage);
connect(nodeDuplicateEditor, &DBCNodeDuplicateEditor::createNode, this, QOverload<QString>::of(&DBCMainEditor::newNode));
connect(nodeDuplicateEditor, &DBCNodeDuplicateEditor::cloneMessageToNode, this, &DBCMainEditor::copyMessageToNode);
connect(nodeDuplicateEditor, &DBCNodeDuplicateEditor::nodeAdded, this, &DBCMainEditor::refreshTree);
nodeIcon = QIcon(":/icons/images/node.png"); nodeIcon = QIcon(":/icons/images/node.png");
messageIcon = QIcon(":/icons/images/message.png"); messageIcon = QIcon(":/icons/images/message.png");
@@ -360,7 +365,21 @@ void DBCMainEditor::onRebaseMessages()
void DBCMainEditor::onDuplicateNode() void DBCMainEditor::onDuplicateNode()
{ {
qDebug() << "dupe!!"; QTreeWidgetItem* firstCol = ui->treeDBC->currentItem();
bool ret = false;
DBC_MESSAGE *msg;
DBC_SIGNAL *sig;
DBC_NODE *node;
uint32_t msgID;
QString idString;
idString = firstCol->text(0).split(" ")[0];
node = dbcFile->findNodeByName(idString);
nodeDuplicateEditor->setFileIdx(fileIdx);
nodeDuplicateEditor->setNodeRef(node);
nodeDuplicateEditor->refreshView();
nodeDuplicateEditor->setModal(true);
nodeDuplicateEditor->show();
} }
/* /*
@@ -545,11 +564,18 @@ void DBCMainEditor::updatedSignal(DBC_SIGNAL *sig)
else qDebug() << "That signal doesn't exist. That's a bug dude."; else qDebug() << "That signal doesn't exist. That's a bug dude.";
} }
void DBCMainEditor::newNode() void DBCMainEditor::newNode(QString nodeName)
{ {
DBC_NODE node; DBC_NODE node;
DBC_NODE *nodePtr; DBC_NODE *nodePtr;
node.name = "Unnamed" + QString::number(randGen.bounded(50000)); if(nodeName.isEmpty())
{
node.name = "Unnamed" + QString::number(randGen.bounded(50000));
}
else
{
node.name = nodeName;
}
dbcFile->dbc_nodes.append(node); dbcFile->dbc_nodes.append(node);
nodePtr = dbcFile->findNodeByName(node.name); nodePtr = dbcFile->findNodeByName(node.name);
QTreeWidgetItem *nodeItem = new QTreeWidgetItem(); QTreeWidgetItem *nodeItem = new QTreeWidgetItem();
@@ -563,6 +589,77 @@ void DBCMainEditor::newNode()
dbcFile->setDirtyFlag(); dbcFile->setDirtyFlag();
} }
void DBCMainEditor::newNode()
{
newNode(QString());
}
void DBCMainEditor::copyMessageToNode(DBC_NODE *parentNode, DBC_MESSAGE *source, uint newMsgId)
{
DBC_NODE *node = parentNode;
if (!node) node = dbcFile->findNodeByIdx(0);
QTreeWidgetItem *nodeItem = nullptr;
DBC_MESSAGE msg;
DBC_MESSAGE *msgPtr;
nodeItem = ui->treeDBC->currentItem();
msg.name = source->name;
msg.ID = newMsgId;
msg.len = source->len;
msg.bgColor = source->bgColor;
msg.fgColor = source->fgColor;
msg.comment = source->comment;
msg.sender = node;
DBC_SIGNAL *sigSource;
int sigCount = source->sigHandler->getCount();
for(int i=0; i<sigCount; i++)
{
sigSource = source->sigHandler->findSignalByIdx(i);
DBC_SIGNAL sig;
//Does not properly handle multiplexed signals, for now
sig.name = sigSource->name;
sig.bias = sigSource->bias;
sig.isMultiplexed = false; //sigSource->isMultiplexed;
sig.isMultiplexor = false; //sigSource->isMultiplexor;
sig.max = sigSource->max;
sig.min = sigSource->min;
sig.multiplexLowValue = sigSource->multiplexLowValue;
sig.multiplexHighValue = sigSource->multiplexHighValue;
sig.factor = sigSource->factor;
sig.intelByteOrder = sigSource->intelByteOrder;
sig.parentMessage = &msg;
sig.multiplexParent = nullptr; //need to learn about multiplexed signals and track them when copying
sig.receiver = node;
sig.signalSize = sigSource->signalSize;
sig.startBit = sigSource->startBit;
sig.valType = sigSource->valType;
sig.parentMessage = &msg;
msg.sigHandler->addSignal(sig);
}
msg.sigHandler->sort();
dbcFile->messageHandler->addMessage(msg);
msgPtr = dbcFile->messageHandler->findMsgByIdx(dbcFile->messageHandler->getCount() - 1);
QTreeWidgetItem *newMsgItem = new QTreeWidgetItem();
QString msgInfo = Utility::formatCANID(msg.ID) + " " + msg.name;
if (msg.comment.count() > 0) msgInfo.append(" - ").append(msg.comment);
newMsgItem->setText(0, msgInfo);
newMsgItem->setIcon(0, messageIcon);
newMsgItem->setData(0, Qt::UserRole, 2);
messageToItem.insert(msgPtr, newMsgItem);
itemToMessage.insert(newMsgItem, msgPtr);
nodeItem->addChild(newMsgItem);
//ui->treeDBC->setCurrentItem(newMsgItem);
dbcFile->setDirtyFlag();
}
//create a new message with it's parent being the node we're currently within //create a new message with it's parent being the node we're currently within
void DBCMainEditor::newMessage() void DBCMainEditor::newMessage()
+4
View File
@@ -11,6 +11,7 @@
#include "dbcmessageeditor.h" #include "dbcmessageeditor.h"
#include "dbcnodeeditor.h" #include "dbcnodeeditor.h"
#include "dbcnoderebaseeditor.h" #include "dbcnoderebaseeditor.h"
#include "dbcnodeduplicateeditor.h"
#include "utility.h" #include "utility.h"
namespace Ui { namespace Ui {
@@ -43,7 +44,9 @@ private slots:
void handleSearch(); void handleSearch();
void handleSearchForward(); void handleSearchForward();
void handleSearchBackward(); void handleSearchBackward();
void newNode(QString nodeName);
void newNode(); void newNode();
void copyMessageToNode(DBC_NODE *node, DBC_MESSAGE *source, uint newMsgId);
void newMessage(); void newMessage();
void newSignal(); void newSignal();
void onRebaseMessages(); void onRebaseMessages();
@@ -57,6 +60,7 @@ private:
DBCMessageEditor *msgEditor; DBCMessageEditor *msgEditor;
DBCNodeEditor *nodeEditor; DBCNodeEditor *nodeEditor;
DBCNodeRebaseEditor *nodeRebaseEditor; DBCNodeRebaseEditor *nodeRebaseEditor;
DBCNodeDuplicateEditor *nodeDuplicateEditor;
DBCFile *dbcFile; DBCFile *dbcFile;
int fileIdx; int fileIdx;
QIcon nodeIcon; QIcon nodeIcon;
+171
View File
@@ -0,0 +1,171 @@
#include "dbcnodeduplicateeditor.h"
#include "ui_dbcnodeduplicateeditor.h"
#include <QSettings>
#include <QKeyEvent>
#include <QColorDialog>
#include "helpwindow.h"
#include "utility.h"
DBCNodeDuplicateEditor::DBCNodeDuplicateEditor(QWidget *parent) :
QDialog(parent),
ui(new Ui::DBCNodeDuplicateEditor)
{
ui->setupUi(this);
readSettings();
dbcHandler = DBCHandler::getReference();
dbcNode = nullptr;
connect(ui->btnDuplicate, &QPushButton::pressed,
[=]()
{
if (dbcNode == nullptr) return;
if (lowestMsgId > 0x1FFFFFFFul) return;
uint newBase = Utility::ParseStringToNum(ui->lineNewBaseId->text());
if (newBase <= 0x1FFFFFFFul && newBase != lowestMsgId)
{
uint rebaseDiff = newBase - lowestMsgId;
QList<DBC_MESSAGE*> messagesForNode = dbcFile->messageHandler->findMsgsByNode(dbcNode);
if(messagesForNode.count() == 0)
{
return;
}
if(ui->lineNodeName->text().isEmpty())
{
//tell!
return;
}
QString newNodeName = ui->lineNodeName->text();
emit createNode(newNodeName);
DBC_NODE *nodePtr = dbcFile->findNodeByName(newNodeName);
if(nodePtr == nullptr)
{
//uhoh
return;
}
for (int i=0; i<messagesForNode.count(); i++)
{
uint newMsgId = messagesForNode[i]->ID + rebaseDiff;
emit cloneMessageToNode(nodePtr, messagesForNode[i], newMsgId);
}
dbcFile->setDirtyFlag();
emit nodeAdded();
}
});
connect(ui->btnCancel, &QPushButton::pressed,
[=]()
{
});
installEventFilter(this);
}
DBCNodeDuplicateEditor::~DBCNodeDuplicateEditor()
{
removeEventFilter(this);
delete ui;
}
void DBCNodeDuplicateEditor::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event);
writeSettings();
}
bool DBCNodeDuplicateEditor::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyRelease) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
switch (keyEvent->key())
{
case Qt::Key_F1:
HelpWindow::getRef()->showHelp("nodeeditor.md");
break;
}
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
return false;
}
void DBCNodeDuplicateEditor::setFileIdx(int idx)
{
if (idx < 0 || idx > dbcHandler->getFileCount() - 1) return;
dbcFile = dbcHandler->getFileByIdx(idx);
}
void DBCNodeDuplicateEditor::readSettings()
{
QSettings settings;
if (settings.value("Main/SaveRestorePositions", false).toBool())
{
resize(settings.value("DBCNodeDuplicateEditor/WindowSize", QSize(312, 128)).toSize());
move(Utility::constrainedWindowPos(settings.value("DBCNodeDuplicateEditor/WindowPos", QPoint(100, 100)).toPoint()));
}
}
void DBCNodeDuplicateEditor::writeSettings()
{
QSettings settings;
if (settings.value("Main/SaveRestorePositions", false).toBool())
{
settings.setValue("DBCNodeDuplicateEditor/WindowSize", size());
settings.setValue("DBCNodeDuplicateEditor/WindowPos", pos());
}
}
void DBCNodeDuplicateEditor::setNodeRef(DBC_NODE *node)
{
dbcNode = node;
}
void DBCNodeDuplicateEditor::showEvent(QShowEvent* event)
{
QDialog::showEvent(event);
refreshView();
}
void DBCNodeDuplicateEditor::refreshView()
{
if(dbcNode)
{
QList<DBC_MESSAGE*> messagesForNode = dbcFile->messageHandler->findMsgsByNode(dbcNode);
if(messagesForNode.count() == 0)
{
//??
}
lowestMsgId = 0xFFFFFFFF;
for (int i=0; i<messagesForNode.count(); i++)
{
if(messagesForNode[i]->ID < lowestMsgId)
lowestMsgId = messagesForNode[i]->ID;
}
ui->lineOriginalBaseId->setText(Utility::formatCANID(lowestMsgId & 0x1FFFFFFFul));
ui->lineNodeName->setText(dbcNode->name + QString("_Copy"));
}
//generateSampleText();
}
+45
View File
@@ -0,0 +1,45 @@
#ifndef DBCNODEDUPLICATEEDITOR_H
#define DBCNODEDUPLICATEEDITOR_H
#include <QDialog>
#include "dbc_classes.h"
#include "dbchandler.h"
namespace Ui {
class DBCNodeDuplicateEditor;
}
class DBCNodeDuplicateEditor : public QDialog
{
Q_OBJECT
public:
explicit DBCNodeDuplicateEditor(QWidget *parent = nullptr);
~DBCNodeDuplicateEditor();
void showEvent(QShowEvent*);
void setNodeRef(DBC_NODE *node);
void setFileIdx(int idx);
void refreshView();
signals:
void updatedTreeInfo(DBC_MESSAGE *msg);
void createNode(QString nodeName);
void cloneMessageToNode(DBC_NODE *parentNode, DBC_MESSAGE *source, uint newMsgId);
void nodeAdded();
private:
Ui::DBCNodeDuplicateEditor *ui;
DBCHandler *dbcHandler;
DBC_NODE *dbcNode;
DBCFile *dbcFile;
void closeEvent(QCloseEvent *event);
bool eventFilter(QObject *obj, QEvent *event);
void readSettings();
void writeSettings();
uint lowestMsgId;
};
#endif // DBCNODEDUPLICATEEDITOR_H
+8 -1
View File
@@ -46,6 +46,13 @@ DBCNodeRebaseEditor::DBCNodeRebaseEditor(QWidget *parent) :
} }
});
connect(ui->btnCancel, &QPushButton::pressed,
[=]()
{
}); });
// connect(ui->lineOriginalBaseId, &QLineEdit::editingFinished, // connect(ui->lineOriginalBaseId, &QLineEdit::editingFinished,
@@ -159,7 +166,7 @@ void DBCNodeRebaseEditor::refreshView()
} }
ui->lineOriginalBaseId->setText(Utility::formatCANID(lowestMsgId & 0x1FFFFFFFul)); ui->lineOriginalBaseId->setText(Utility::formatCANID(lowestMsgId & 0x1FFFFFFFul));
ui->lineMsgName->setText(dbcNode->name); ui->lineNodeName->setText(dbcNode->name);
} }
//generateSampleText(); //generateSampleText();
+75
View File
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DBCNodeDuplicateEditor</class>
<widget class="QDialog" name="DBCNodeDuplicateEditor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>314</width>
<height>193</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QWidget" name="layoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>290</width>
<height>116</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>New Node Name:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineNodeName"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Current Base ID:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineOriginalBaseId"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>New Base ID:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineNewBaseId"/>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="btnDuplicate">
<property name="text">
<string>Duplicate Node</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
+1 -1
View File
@@ -31,7 +31,7 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QLineEdit" name="lineMsgName"/> <widget class="QLineEdit" name="lineNodeName"/>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">