From d8f2c2d0e392734b42741f39a22e5d857eec4798 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 19 Aug 2021 21:17:40 -0400 Subject: [PATCH] Implementation of colored signals in the can data grid. Not entirely perfect yet but it's something. --- candatagrid.cpp | 78 ++++++++++++++++++++++++++++++++--------- candatagrid.h | 10 ++++-- dbc/dbcmaineditor.cpp | 6 ++++ dbc/dbcsignaleditor.cpp | 9 ++++- 4 files changed, 82 insertions(+), 21 deletions(-) diff --git a/candatagrid.cpp b/candatagrid.cpp index 723c6f5..15afe31 100644 --- a/candatagrid.cpp +++ b/candatagrid.cpp @@ -4,6 +4,7 @@ #include #include #include +#include CANDataGrid::CANDataGrid(QWidget *parent) : QWidget(parent), @@ -14,7 +15,7 @@ CANDataGrid::CANDataGrid(QWidget *parent) : memset(data, 0, 8); memset(refData, 0, 8); memset(usedData, 0, 8); - memset(usedSignalNum, 0, 64); + memset(usedSignalNum, -1, 64); for (int x = 0; x < 8; x++) for (int y = 0; y < 8; y++) textStates[x][y] = GridTextState::NORMAL; @@ -63,14 +64,31 @@ GridTextState CANDataGrid::getCellTextState(int x, int y) return textStates[x][y]; } -void CANDataGrid::setUsedSignalNum(int bit, unsigned char signal) +void CANDataGrid::setSignalNames(int sigIdx, const QString sigName) +{ + if (sigIdx < 0) return; + if (sigIdx > signalNames.size()) + { + signalNames.resize(sigIdx * 2); + } + signalNames[sigIdx] = sigName; +} + +void CANDataGrid::clearSignalNames() +{ + signalNames.clear(); + signalNames.resize(40); + signalColors.clear(); +} + +void CANDataGrid::setUsedSignalNum(int bit, int signal) { if (bit < 0) return; if (bit > 63) return; usedSignalNum[bit] = signal; } -unsigned char CANDataGrid::getUsedSignalNum(int bit) +int CANDataGrid::getUsedSignalNum(int bit) { if (bit < 0) return 0; if (bit > 63) return 0; @@ -82,12 +100,26 @@ void CANDataGrid::paintEvent(QPaintEvent *event) { Q_UNUSED(event); qDebug() << "CANDataGrid Paint Event"; - int x, y; + int x, y, bit; unsigned char prevByte, thisByte; bool thisBit, prevBit; QBrush blackBrush, whiteBrush, redBrush, greenBrush, grayBrush; QPainter painter(this); + //if this is true then generate unique colors for each signal + if ((signalColors.count() == 0) && (signalNames.count() > 0)) + { + qDebug() << "Generating colors"; + signalColors.resize(signalNames.count()); + for (int i = 0; i < signalNames.count(); i++) + { + QColor newColor; + while (newColor.saturation() < 40) + newColor.setRgb(QRandomGenerator::global()->bounded(160),QRandomGenerator::global()->bounded(160), QRandomGenerator::global()->bounded(160)); + qDebug() << newColor; + signalColors[i] = newColor; + } + } QRect viewport = painter.viewport(); @@ -109,7 +141,6 @@ void CANDataGrid::paintEvent(QPaintEvent *event) //into the 8x8 grid of bits in the bottom right and the other parts //taken up by helper text - //bigTextSize is too large when the grid gets small. Might need to tweak it then. double bigTextSize = qMin(xSector, ySector) * 0.5; double smallTextSize = qMin(xSector, ySector) * 0.3; @@ -123,7 +154,10 @@ void CANDataGrid::paintEvent(QPaintEvent *event) boldFont.setPixelSize(bigTextSize); boldFont.setBold(true); + + painter.setFont(smallFont); painter.drawText(QRect(viewport.left(), viewport.top(), xSector, ySector), Qt::AlignCenter, "BITS ->"); + painter.setFont(boldFont); for (x = 0; x < 8; x++) { @@ -141,14 +175,14 @@ void CANDataGrid::paintEvent(QPaintEvent *event) painter.drawText(viewport.left() + 4, viewport.top() + ySector * 7, "S"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 1, xSector, ySector), Qt::AlignCenter, "0"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 2, xSector, ySector), Qt::AlignCenter, "1"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 3, xSector, ySector), Qt::AlignCenter, "2"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 4, xSector, ySector), Qt::AlignCenter, "3"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 5, xSector, ySector), Qt::AlignCenter, "4"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 6, xSector, ySector), Qt::AlignCenter, "5"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 7, xSector, ySector), Qt::AlignCenter, "6"); - painter.drawText(QRect(viewport.left(), viewport.top() + ySector * 8, xSector, ySector), Qt::AlignCenter, "7"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 1, xSector, ySector), Qt::AlignCenter, "0"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 2, xSector, ySector), Qt::AlignCenter, "1"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 3, xSector, ySector), Qt::AlignCenter, "2"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 4, xSector, ySector), Qt::AlignCenter, "3"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 5, xSector, ySector), Qt::AlignCenter, "4"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 6, xSector, ySector), Qt::AlignCenter, "5"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 7, xSector, ySector), Qt::AlignCenter, "6"); + painter.drawText(QRect(viewport.left() + (xSector / 4.0), viewport.top() + ySector * 8, xSector, ySector), Qt::AlignCenter, "7"); //now, color the bitfield by seeing if a given bit is freshly set/unset in the new data //compared to the old. Bits that are not set in either are white, bits set in both are black @@ -156,7 +190,7 @@ void CANDataGrid::paintEvent(QPaintEvent *event) //are green painter.setPen(QPen(Qt::gray)); - //painter.setFont(smallFont); + painter.setFont(mainFont); for (y = 0; y < 8; y++) { @@ -164,6 +198,7 @@ void CANDataGrid::paintEvent(QPaintEvent *event) prevByte = refData[y]; for (x = 0; x < 8; x++) { + bit = (y * 8) + (7 - x); thisBit = false; prevBit = false; if ((thisByte & (1 << (7-x))) == (1 << (7-x))) thisBit = true; @@ -190,8 +225,13 @@ void CANDataGrid::paintEvent(QPaintEvent *event) { if ((usedData[y] & (1 << (7-x))) == (1 << (7-x))) { - grayBrush = QBrush(QColor(0xB6, 0xB6, 0xB6), Qt::BDiagPattern); - painter.setBrush(grayBrush); + int usedSigNum = getUsedSignalNum(bit); + if (usedSigNum == -1) + { + grayBrush = QBrush(QColor(0xB6, 0xB6, 0xB6), Qt::BDiagPattern); + painter.setBrush(grayBrush); + } + else painter.setBrush(QBrush(signalColors[usedSigNum])); } else painter.setBrush(whiteBrush); } @@ -215,8 +255,12 @@ void CANDataGrid::paintEvent(QPaintEvent *event) painter.setPen(QColor(255-brushColor.red(), 255-brushColor.green(), 255-brushColor.blue())); break; } + //change style of bit number output for current signal + if (thisBit) painter.setFont(boldFont); + else painter.setFont(mainFont); - painter.drawText(viewport.left() + (x+1) * xSector + (xSector / 8), viewport.top() + (y + 2) * ySector - (ySector / 3), QString::number(y * 8 + (7-x))); + painter.drawText(viewport.left() + (x+1) * xSector + (xSector / 8), viewport.top() + (y + 2) * ySector - (ySector / 3), QString::number(bit)); + painter.setFont(mainFont); painter.setPen(QPen(Qt::gray)); } } diff --git a/candatagrid.h b/candatagrid.h index 572e87f..a48321a 100644 --- a/candatagrid.h +++ b/candatagrid.h @@ -45,8 +45,10 @@ public: void saveImage(QString filename, int width, int height); void setCellTextState(int x, int y, GridTextState state); GridTextState getCellTextState(int x, int y); - void setUsedSignalNum(int bit, unsigned char signal); - unsigned char getUsedSignalNum(int bit); + void setUsedSignalNum(int bit, int signal); + void setSignalNames(int sigIdx, const QString sigName); + void clearSignalNames(); + int getUsedSignalNum(int bit); protected: void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; @@ -59,7 +61,9 @@ private: unsigned char refData[8]; unsigned char data[8]; unsigned char usedData[8]; - unsigned char usedSignalNum[64]; //allows a full char per 64 bits we track so we can specify which signal claims this bit + int usedSignalNum[64]; //so we can specify which signal claims this bit + QVector signalNames; + QVector signalColors; GridTextState textStates[8][8]; QPoint upperLeft, gridSize; }; diff --git a/dbc/dbcmaineditor.cpp b/dbc/dbcmaineditor.cpp index 96d76fa..cc0bac0 100644 --- a/dbc/dbcmaineditor.cpp +++ b/dbc/dbcmaineditor.cpp @@ -368,6 +368,12 @@ QString DBCMainEditor::createSignalText(DBC_SIGNAL *sig) sigInfo += ") "; } sigInfo.append(sig->name); + + if (sig->intelByteOrder) + sigInfo.append(" [" + QString::number(sig->startBit) + "i " + QString::number(sig->signalSize) + "]"); + else + sigInfo.append(" [" + QString::number(sig->startBit) + "m " + QString::number(sig->signalSize) + "]"); + if (sig->comment.count() > 0) sigInfo.append(" - ").append(sig->comment); return sigInfo; } diff --git a/dbc/dbcsignaleditor.cpp b/dbc/dbcsignaleditor.cpp index 167e01f..d506c79 100644 --- a/dbc/dbcsignaleditor.cpp +++ b/dbc/dbcsignaleditor.cpp @@ -371,6 +371,13 @@ void DBCSignalEditor::showEvent(QShowEvent* event) fillSignalForm(currentSignal); fillValueTable(currentSignal); + + ui->bitfield->clearSignalNames(); + for (int x = 0; x < dbcMessage->sigHandler->getCount(); x++) + { + DBC_SIGNAL *sig = dbcMessage->sigHandler->findSignalByIdx(x); + ui->bitfield->setSignalNames(x, sig->name); + } } void DBCSignalEditor::refreshView() @@ -633,7 +640,7 @@ void DBCSignalEditor::generateUsedBits() for (int x = 0; x < dbcMessage->sigHandler->getCount(); x++) { - DBC_SIGNAL *sig = dbcMessage->sigHandler->findSignalByIdx(x); + DBC_SIGNAL *sig = dbcMessage->sigHandler->findSignalByIdx(x); startBit = sig->startBit;