Implementation of colored signals in the can data grid. Not entirely

perfect yet but it's something.
This commit is contained in:
Collin Kidder
2021-08-19 21:17:40 -04:00
parent f37926a497
commit d8f2c2d0e3
4 changed files with 82 additions and 21 deletions
+61 -17
View File
@@ -4,6 +4,7 @@
#include <QPainter> #include <QPainter>
#include <QDebug> #include <QDebug>
#include <QMouseEvent> #include <QMouseEvent>
#include <QRandomGenerator>
CANDataGrid::CANDataGrid(QWidget *parent) : CANDataGrid::CANDataGrid(QWidget *parent) :
QWidget(parent), QWidget(parent),
@@ -14,7 +15,7 @@ CANDataGrid::CANDataGrid(QWidget *parent) :
memset(data, 0, 8); memset(data, 0, 8);
memset(refData, 0, 8); memset(refData, 0, 8);
memset(usedData, 0, 8); memset(usedData, 0, 8);
memset(usedSignalNum, 0, 64); memset(usedSignalNum, -1, 64);
for (int x = 0; x < 8; x++) for (int x = 0; x < 8; x++)
for (int y = 0; y < 8; y++) for (int y = 0; y < 8; y++)
textStates[x][y] = GridTextState::NORMAL; textStates[x][y] = GridTextState::NORMAL;
@@ -63,14 +64,31 @@ GridTextState CANDataGrid::getCellTextState(int x, int y)
return textStates[x][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 < 0) return;
if (bit > 63) return; if (bit > 63) return;
usedSignalNum[bit] = signal; usedSignalNum[bit] = signal;
} }
unsigned char CANDataGrid::getUsedSignalNum(int bit) int CANDataGrid::getUsedSignalNum(int bit)
{ {
if (bit < 0) return 0; if (bit < 0) return 0;
if (bit > 63) return 0; if (bit > 63) return 0;
@@ -82,12 +100,26 @@ void CANDataGrid::paintEvent(QPaintEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
qDebug() << "CANDataGrid Paint Event"; qDebug() << "CANDataGrid Paint Event";
int x, y; int x, y, bit;
unsigned char prevByte, thisByte; unsigned char prevByte, thisByte;
bool thisBit, prevBit; bool thisBit, prevBit;
QBrush blackBrush, whiteBrush, redBrush, greenBrush, grayBrush; QBrush blackBrush, whiteBrush, redBrush, greenBrush, grayBrush;
QPainter painter(this); 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(); 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 //into the 8x8 grid of bits in the bottom right and the other parts
//taken up by helper text //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 bigTextSize = qMin(xSector, ySector) * 0.5;
double smallTextSize = qMin(xSector, ySector) * 0.3; double smallTextSize = qMin(xSector, ySector) * 0.3;
@@ -123,7 +154,10 @@ void CANDataGrid::paintEvent(QPaintEvent *event)
boldFont.setPixelSize(bigTextSize); boldFont.setPixelSize(bigTextSize);
boldFont.setBold(true); boldFont.setBold(true);
painter.setFont(smallFont);
painter.drawText(QRect(viewport.left(), viewport.top(), xSector, ySector), Qt::AlignCenter, "BITS ->"); painter.drawText(QRect(viewport.left(), viewport.top(), xSector, ySector), Qt::AlignCenter, "BITS ->");
painter.setFont(boldFont);
for (x = 0; x < 8; x++) 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(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() + (xSector / 4.0), 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() + (xSector / 4.0), 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() + (xSector / 4.0), 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() + (xSector / 4.0), 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() + (xSector / 4.0), 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() + (xSector / 4.0), 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() + (xSector / 4.0), 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 * 8, xSector, ySector), Qt::AlignCenter, "7");
//now, color the bitfield by seeing if a given bit is freshly set/unset in the new data //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 //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 //are green
painter.setPen(QPen(Qt::gray)); painter.setPen(QPen(Qt::gray));
//painter.setFont(smallFont); painter.setFont(mainFont);
for (y = 0; y < 8; y++) for (y = 0; y < 8; y++)
{ {
@@ -164,6 +198,7 @@ void CANDataGrid::paintEvent(QPaintEvent *event)
prevByte = refData[y]; prevByte = refData[y];
for (x = 0; x < 8; x++) for (x = 0; x < 8; x++)
{ {
bit = (y * 8) + (7 - x);
thisBit = false; thisBit = false;
prevBit = false; prevBit = false;
if ((thisByte & (1 << (7-x))) == (1 << (7-x))) thisBit = true; 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))) if ((usedData[y] & (1 << (7-x))) == (1 << (7-x)))
{ {
grayBrush = QBrush(QColor(0xB6, 0xB6, 0xB6), Qt::BDiagPattern); int usedSigNum = getUsedSignalNum(bit);
painter.setBrush(grayBrush); if (usedSigNum == -1)
{
grayBrush = QBrush(QColor(0xB6, 0xB6, 0xB6), Qt::BDiagPattern);
painter.setBrush(grayBrush);
}
else painter.setBrush(QBrush(signalColors[usedSigNum]));
} }
else painter.setBrush(whiteBrush); 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())); painter.setPen(QColor(255-brushColor.red(), 255-brushColor.green(), 255-brushColor.blue()));
break; 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)); painter.setPen(QPen(Qt::gray));
} }
} }
+7 -3
View File
@@ -45,8 +45,10 @@ public:
void saveImage(QString filename, int width, int height); void saveImage(QString filename, int width, int height);
void setCellTextState(int x, int y, GridTextState state); void setCellTextState(int x, int y, GridTextState state);
GridTextState getCellTextState(int x, int y); GridTextState getCellTextState(int x, int y);
void setUsedSignalNum(int bit, unsigned char signal); void setUsedSignalNum(int bit, int signal);
unsigned char getUsedSignalNum(int bit); void setSignalNames(int sigIdx, const QString sigName);
void clearSignalNames();
int getUsedSignalNum(int bit);
protected: protected:
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
@@ -59,7 +61,9 @@ private:
unsigned char refData[8]; unsigned char refData[8];
unsigned char data[8]; unsigned char data[8];
unsigned char usedData[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<QString> signalNames;
QVector<QColor> signalColors;
GridTextState textStates[8][8]; GridTextState textStates[8][8];
QPoint upperLeft, gridSize; QPoint upperLeft, gridSize;
}; };
+6
View File
@@ -368,6 +368,12 @@ QString DBCMainEditor::createSignalText(DBC_SIGNAL *sig)
sigInfo += ") "; sigInfo += ") ";
} }
sigInfo.append(sig->name); 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); if (sig->comment.count() > 0) sigInfo.append(" - ").append(sig->comment);
return sigInfo; return sigInfo;
} }
+8 -1
View File
@@ -371,6 +371,13 @@ void DBCSignalEditor::showEvent(QShowEvent* event)
fillSignalForm(currentSignal); fillSignalForm(currentSignal);
fillValueTable(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() void DBCSignalEditor::refreshView()
@@ -633,7 +640,7 @@ void DBCSignalEditor::generateUsedBits()
for (int x = 0; x < dbcMessage->sigHandler->getCount(); x++) 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; startBit = sig->startBit;