*Very* drastic changes to the graphing system. Now all graphs are done very much like DBC signals. Quite a bit has changed.
This commit compiles but the results are all funky. Just committing to give a good reference point during debugging. Don't use compiles from this revision. Wait young Jedi...
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
#ifndef CONFIG
|
#ifndef CONFIG
|
||||||
#define CONFIG
|
#define CONFIG
|
||||||
|
|
||||||
#define VERSION 154
|
#define VERSION 155
|
||||||
|
|
||||||
//try to keep this in sync.
|
//try to keep this in sync.
|
||||||
//SavvyCAN will complain if you connect a GVRET board with a revision
|
//SavvyCAN will complain if you connect a GVRET board with a revision
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ bool DBC_SIGNAL::processAsDouble(const CANFrame &frame, double &outValue)
|
|||||||
endResult = ((double)result * factor) + bias;
|
endResult = ((double)result * factor) + bias;
|
||||||
result = (int64_t)endResult;
|
result = (int64_t)endResult;
|
||||||
}
|
}
|
||||||
|
/*TODO: It should be noted that the below floating point has not even been tested. For shame! Test it!*/
|
||||||
else if (valType == SP_FLOAT)
|
else if (valType == SP_FLOAT)
|
||||||
{
|
{
|
||||||
//The theory here is that we force the integer signal code to treat this as
|
//The theory here is that we force the integer signal code to treat this as
|
||||||
|
|||||||
+66
-369
@@ -685,33 +685,24 @@ void GraphingWindow::saveDefinitions()
|
|||||||
QList<GraphParams>::iterator iter;
|
QList<GraphParams>::iterator iter;
|
||||||
for (iter = graphParams.begin(); iter != graphParams.end(); ++iter)
|
for (iter = graphParams.begin(); iter != graphParams.end(); ++iter)
|
||||||
{
|
{
|
||||||
|
outFile->write("X,");
|
||||||
outFile->write(QString::number(iter->ID, 16).toUtf8());
|
outFile->write(QString::number(iter->ID, 16).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
if (iter->isDBCSignal)
|
outFile->write(QString::number(iter->mask, 16).toUtf8());
|
||||||
{
|
outFile->putChar(',');
|
||||||
outFile->putChar('S');
|
outFile->write(QString::number(iter->startBit).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
outFile->write(iter->signal.toUtf8());
|
outFile->write(QString::number(iter->numBits).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
}
|
if (iter->isSigned) outFile->putChar('Y');
|
||||||
else
|
else outFile->putChar('N');
|
||||||
{
|
outFile->putChar(',');
|
||||||
outFile->write(QString::number(iter->mask, 16).toUtf8());
|
outFile->write(QString::number(iter->bias).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
outFile->write(QString::number(iter->startByte).toUtf8());
|
outFile->write(QString::number(iter->scale).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
outFile->write(QString::number(iter->endByte).toUtf8());
|
outFile->write(QString::number(iter->stride).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
if (iter->isSigned) outFile->putChar('Y');
|
|
||||||
else outFile->putChar('N');
|
|
||||||
outFile->putChar(',');
|
|
||||||
outFile->write(QString::number(iter->bias).toUtf8());
|
|
||||||
outFile->putChar(',');
|
|
||||||
outFile->write(QString::number(iter->scale).toUtf8());
|
|
||||||
outFile->putChar(',');
|
|
||||||
outFile->write(QString::number(iter->stride).toUtf8());
|
|
||||||
outFile->putChar(',');
|
|
||||||
}
|
|
||||||
outFile->write(QString::number(iter->color.red()).toUtf8());
|
outFile->write(QString::number(iter->color.red()).toUtf8());
|
||||||
outFile->putChar(',');
|
outFile->putChar(',');
|
||||||
outFile->write(QString::number(iter->color.green()).toUtf8());
|
outFile->write(QString::number(iter->color.green()).toUtf8());
|
||||||
@@ -729,7 +720,6 @@ void GraphingWindow::loadDefinitions()
|
|||||||
{
|
{
|
||||||
QString filename;
|
QString filename;
|
||||||
QFileDialog dialog;
|
QFileDialog dialog;
|
||||||
bool dbcMissing = false;
|
|
||||||
|
|
||||||
QStringList filters;
|
QStringList filters;
|
||||||
filters.append(QString(tr("Graph definition (*.gdf)")));
|
filters.append(QString(tr("Graph definition (*.gdf)")));
|
||||||
@@ -755,66 +745,33 @@ void GraphingWindow::loadDefinitions()
|
|||||||
if (line.length() > 2)
|
if (line.length() > 2)
|
||||||
{
|
{
|
||||||
GraphParams gp;
|
GraphParams gp;
|
||||||
QList<QByteArray> tokens = line.split(',');
|
|
||||||
gp.isDBCSignal = false;
|
|
||||||
|
|
||||||
gp.ID = tokens[0].toInt(NULL, 16);
|
QList<QByteArray> tokens = line.split(',');
|
||||||
if (tokens[1] == "S")
|
|
||||||
|
if (tokens[0] == "X")
|
||||||
{
|
{
|
||||||
gp.isDBCSignal = true;
|
gp.ID = tokens[1].toInt(NULL, 16);
|
||||||
//tokens[2] is the signal name. Need to use the message ID and this name to look it up
|
gp.mask = tokens[2].toULongLong(NULL, 16);
|
||||||
DBC_MESSAGE *msg = dbcHandler->getFileByIdx(0)->messageHandler->findMsgByID(gp.ID);
|
gp.startBit = tokens[3].toInt();
|
||||||
if (msg != NULL)
|
gp.numBits = tokens[4].toInt();
|
||||||
{
|
if (tokens[5] == "Y") gp.isSigned = true;
|
||||||
DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(tokens[2]);
|
|
||||||
if (sig == NULL) dbcMissing = true;
|
|
||||||
gp.signal = tokens[2];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gp.signal = "";
|
|
||||||
dbcMissing = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gp.mask = tokens[1].toULongLong(NULL, 16);
|
|
||||||
qDebug() << gp.mask;
|
|
||||||
gp.startByte = tokens[2].toInt();
|
|
||||||
gp.endByte = tokens[3].toInt();
|
|
||||||
if (tokens[4] == "Y") gp.isSigned = true;
|
|
||||||
else gp.isSigned = false;
|
else gp.isSigned = false;
|
||||||
gp.bias = tokens[5].toFloat();
|
gp.bias = tokens[6].toFloat();
|
||||||
gp.scale = tokens[6].toFloat();
|
gp.scale = tokens[7].toFloat();
|
||||||
gp.stride = tokens[7].toInt();
|
gp.stride = tokens[8].toInt();
|
||||||
}
|
|
||||||
if (!gp.isDBCSignal)
|
gp.color.setRed(tokens[9].toInt());
|
||||||
{
|
gp.color.setGreen(tokens[10].toInt());
|
||||||
gp.color.setRed(tokens[8].toInt());
|
gp.color.setBlue(tokens[11].toInt());
|
||||||
gp.color.setGreen(tokens[9].toInt());
|
if (tokens.length() > 12)
|
||||||
gp.color.setBlue(tokens[10].toInt());
|
gp.graphName = tokens[12];
|
||||||
if (tokens.length() > 11)
|
|
||||||
gp.graphName = tokens[11];
|
|
||||||
else
|
else
|
||||||
gp.graphName = QString();
|
gp.graphName = QString();
|
||||||
|
createGraph(gp, true);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
gp.color.setRed(tokens[3].toInt());
|
|
||||||
gp.color.setGreen(tokens[4].toInt());
|
|
||||||
gp.color.setBlue(tokens[5].toInt());
|
|
||||||
gp.graphName = tokens[6];
|
|
||||||
}
|
|
||||||
createGraph(gp, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
inFile->close();
|
inFile->close();
|
||||||
if (dbcMissing)
|
|
||||||
{
|
|
||||||
QMessageBox msg;
|
|
||||||
msg.setText("One or more graphs could not be loaded\r\nbecause the signal could not be found.\r\nPerhaps you forgot to load\r\nthe DBC file?");
|
|
||||||
msg.exec();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -851,133 +808,16 @@ void GraphingWindow::addNewGraph()
|
|||||||
void GraphingWindow::appendToGraph(GraphParams ¶ms, CANFrame &frame)
|
void GraphingWindow::appendToGraph(GraphParams ¶ms, CANFrame &frame)
|
||||||
{
|
{
|
||||||
int64_t tempVal; //64 bit temp value.
|
int64_t tempVal; //64 bit temp value.
|
||||||
if (params.isDBCSignal)
|
tempVal = Utility::processIntegerSignal(frame.data, params.startBit, params.numBits, params.intelFormat, params.isSigned) & params.mask;
|
||||||
|
if (secondsMode)
|
||||||
{
|
{
|
||||||
double tempValue;
|
params.x.append((double)(frame.timestamp) / 1000000.0 - params.xbias);
|
||||||
DBC_MESSAGE *msg = dbcHandler->getFileByIdx(0)->messageHandler->findMsgByID(params.ID);
|
|
||||||
DBC_SIGNAL *sig = NULL;
|
|
||||||
if (msg) sig = msg->sigHandler->findSignalByName(params.signal);
|
|
||||||
if (sig == NULL) return;
|
|
||||||
//if the given signal was found and successfully processed in this frame then add it to the graph
|
|
||||||
if (sig->processAsDouble(frame, tempValue))
|
|
||||||
{
|
|
||||||
//qDebug() << "tempValue: " << tempValue;
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x.append((double)(frame.timestamp) / 1000000.0 - params.xbias);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x.append(frame.timestamp - params.xbias);
|
|
||||||
}
|
|
||||||
params.y.append(tempValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (params.endByte == -1 || params.startByte == params.endByte)
|
params.x.append(frame.timestamp - params.xbias);
|
||||||
{
|
|
||||||
tempVal = (frame.data[params.startByte] & params.mask);
|
|
||||||
if (params.isSigned && tempVal > 127)
|
|
||||||
{
|
|
||||||
tempVal = tempVal - 256;
|
|
||||||
}
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x.append((double)(frame.timestamp) / 1000000.0 - params.xbias);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x.append(frame.timestamp - params.xbias);
|
|
||||||
}
|
|
||||||
params.y.append((tempVal * params.scale) + params.bias);
|
|
||||||
}
|
|
||||||
else if (params.endByte > params.startByte) //big endian
|
|
||||||
{
|
|
||||||
float tempValue;
|
|
||||||
int64_t tempValInt;
|
|
||||||
int numBytes = (params.endByte - params.startByte) + 1;
|
|
||||||
int64_t shiftRef = 1 << (numBytes * 8);
|
|
||||||
uint64_t maskShifter;
|
|
||||||
uint8_t tempByte;
|
|
||||||
tempValInt = 0;
|
|
||||||
int64_t expon = 1;
|
|
||||||
maskShifter = params.mask;
|
|
||||||
for (int c = 0; c < numBytes; c++)
|
|
||||||
{
|
|
||||||
tempByte = frame.data[params.endByte - c];
|
|
||||||
tempByte &= maskShifter;
|
|
||||||
tempValInt += (tempByte * expon);
|
|
||||||
expon *= 256;
|
|
||||||
maskShifter = maskShifter >> 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValInt &= params.mask;
|
|
||||||
|
|
||||||
int64_t twocompPoint = params.mask;
|
|
||||||
if (shiftRef < twocompPoint || twocompPoint == -1) twocompPoint = shiftRef;
|
|
||||||
//qDebug() << "two comp point: " << twocompPoint;
|
|
||||||
if (params.isSigned && tempValInt > ((twocompPoint / 2)))
|
|
||||||
{
|
|
||||||
tempValInt = tempValInt - twocompPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValue = (float)tempValInt;
|
|
||||||
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x.append((double)(frame.timestamp) / 1000000.0 - params.xbias);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x.append(frame.timestamp - params.xbias);
|
|
||||||
}
|
|
||||||
|
|
||||||
params.y.append((tempValue * params.scale) + params.bias);
|
|
||||||
}
|
|
||||||
else //little endian
|
|
||||||
{
|
|
||||||
float tempValue;
|
|
||||||
int64_t tempValInt;
|
|
||||||
int numBytes = (params.startByte - params.endByte) + 1;
|
|
||||||
int64_t shiftRef = 1 << (numBytes * 8);
|
|
||||||
uint64_t maskShifter;
|
|
||||||
uint8_t tempByte;
|
|
||||||
tempValInt = 0;
|
|
||||||
int64_t expon = 1;
|
|
||||||
maskShifter = params.mask;
|
|
||||||
for (int c = 0; c < numBytes; c++)
|
|
||||||
{
|
|
||||||
tempByte = frame.data[params.endByte + c];
|
|
||||||
tempByte &= maskShifter;
|
|
||||||
tempValInt += tempByte * expon;
|
|
||||||
expon *= 256;
|
|
||||||
maskShifter = maskShifter >> 8;
|
|
||||||
}
|
|
||||||
tempValInt &= params.mask;
|
|
||||||
|
|
||||||
int64_t twocompPoint = params.mask;
|
|
||||||
if (shiftRef < twocompPoint || twocompPoint == -1) twocompPoint = shiftRef;
|
|
||||||
//qDebug() << "two comp point: " << twocompPoint;
|
|
||||||
if (params.isSigned && tempValInt > ((twocompPoint / 2)))
|
|
||||||
{
|
|
||||||
tempValInt = tempValInt - twocompPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValue = (float)tempValInt;
|
|
||||||
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x.append((double)(frame.timestamp) / 1000000.0 - params.xbias);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x.append(frame.timestamp - params.xbias);
|
|
||||||
}
|
|
||||||
|
|
||||||
params.y.append((tempValue * params.scale) + params.bias);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
params.y.append((tempVal * params.scale) + params.bias);
|
||||||
|
|
||||||
params.ref->setData(params.x,params.y);
|
params.ref->setData(params.x,params.y);
|
||||||
}
|
}
|
||||||
@@ -988,23 +828,15 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
float yminval=10000000.0, ymaxval = -1000000.0;
|
float yminval=10000000.0, ymaxval = -1000000.0;
|
||||||
float xminval=10000000000.0, xmaxval = -10000000000.0;
|
float xminval=10000000000.0, xmaxval = -10000000000.0;
|
||||||
GraphParams *refParam = ¶ms;
|
GraphParams *refParam = ¶ms;
|
||||||
DBC_MESSAGE *msg = NULL;
|
int sBit, bits;
|
||||||
DBC_SIGNAL *sig = NULL;
|
bool intelFormat, isSigned;
|
||||||
|
|
||||||
if (params.isDBCSignal)
|
qDebug() << "New Graph ID: " << params.ID;
|
||||||
{
|
qDebug() << "Start bit: " << params.startBit;
|
||||||
msg = dbcHandler->getFileByIdx(0)->messageHandler->findMsgByID(params.ID);
|
qDebug() << "Data length: " << params.numBits;
|
||||||
if (msg) sig = msg->sigHandler->findSignalByName(params.signal);
|
qDebug() << "Intel Mode: " << params.intelFormat;
|
||||||
if (sig == NULL) return;
|
qDebug() << "Signed: " << params.isSigned;
|
||||||
qDebug() << "New signal graph: " << params.signal <<" in ID:" << params.ID;
|
qDebug() << "Mask: " << params.mask;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qDebug() << "New Graph ID: " << params.ID;
|
|
||||||
qDebug() << "Start byte: " << params.startByte;
|
|
||||||
qDebug() << "End Byte: " << params.endByte;
|
|
||||||
qDebug() << "Mask: " << params.mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
frameCache.clear();
|
frameCache.clear();
|
||||||
for (int i = 0; i < modelFrames->count(); i++)
|
for (int i = 0; i < modelFrames->count(); i++)
|
||||||
@@ -1020,163 +852,28 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
params.x.fill(0, numEntries);
|
params.x.fill(0, numEntries);
|
||||||
params.y.fill(0, numEntries);
|
params.y.fill(0, numEntries);
|
||||||
|
|
||||||
if (params.isDBCSignal)
|
sBit = params.startBit;
|
||||||
|
bits = params.numBits;
|
||||||
|
intelFormat = params.intelFormat;
|
||||||
|
isSigned = params.isSigned;
|
||||||
|
|
||||||
|
for (int j = 0; j < numEntries; j++)
|
||||||
{
|
{
|
||||||
double tempValue;
|
tempVal = Utility::processIntegerSignal(frameCache[j /** params.stride*/].data, sBit, bits, intelFormat, isSigned) & params.mask;
|
||||||
int l = 0;
|
//qDebug() << tempVal;
|
||||||
for (int j = 0; j < numEntries; j++)
|
if (secondsMode)
|
||||||
{
|
{
|
||||||
//if the given signal was found and successfully processed in this frame then add it to the graph
|
params.x[j] = (double)(frameCache[j].timestamp) / 1000000.0;
|
||||||
if (sig->processAsDouble(frameCache[j], tempValue))
|
|
||||||
{
|
|
||||||
//qDebug() << "tempValue: " << tempValue;
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x[l] = (double)(frameCache[j].timestamp) / 1000000.0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x[l] = frameCache[j].timestamp;
|
|
||||||
}
|
|
||||||
params.y[l] = tempValue;
|
|
||||||
if (params.y[l] < yminval) yminval = params.y[l];
|
|
||||||
if (params.y[l] > ymaxval) ymaxval = params.y[l];
|
|
||||||
if (params.x[l] < xminval) xminval = params.x[l];
|
|
||||||
if (params.x[l] > xmaxval) xmaxval = params.x[l];
|
|
||||||
l++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
params.x.resize(l);
|
else
|
||||||
params.y.resize(l);
|
|
||||||
params.x.squeeze();
|
|
||||||
params.y.squeeze();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
if (params.endByte == -1 || params.startByte == params.endByte)
|
|
||||||
{
|
{
|
||||||
for (int j = 0; j < numEntries; j++)
|
params.x[j] = frameCache[j].timestamp;
|
||||||
{
|
|
||||||
tempVal = (frameCache[j * params.stride].data[params.startByte] & params.mask);
|
|
||||||
if (params.isSigned && tempVal > 127)
|
|
||||||
{
|
|
||||||
tempVal = tempVal - 256;
|
|
||||||
}
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x[j] = (double)(frameCache[j].timestamp) / 1000000.0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x[j] = frameCache[j].timestamp;
|
|
||||||
}
|
|
||||||
params.y[j] = (tempVal * params.scale) + params.bias;
|
|
||||||
if (params.y[j] < yminval) yminval = params.y[j];
|
|
||||||
if (params.y[j] > ymaxval) ymaxval = params.y[j];
|
|
||||||
if (params.x[j] < xminval) xminval = params.x[j];
|
|
||||||
if (params.x[j] > xmaxval) xmaxval = params.x[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (params.endByte > params.startByte) //big endian
|
|
||||||
{
|
|
||||||
float tempValue;
|
|
||||||
int64_t tempValInt;
|
|
||||||
int numBytes = (params.endByte - params.startByte) + 1;
|
|
||||||
int64_t shiftRef = (uint64_t)1 << (numBytes * 8);
|
|
||||||
uint64_t maskShifter;
|
|
||||||
uint8_t tempByte;
|
|
||||||
for (int j = 0; j < numEntries; j++)
|
|
||||||
{
|
|
||||||
tempValInt = 0;
|
|
||||||
int64_t expon = 1;
|
|
||||||
maskShifter = params.mask;
|
|
||||||
for (int c = 0; c < numBytes; c++)
|
|
||||||
{
|
|
||||||
tempByte = frameCache[j * params.stride].data[params.endByte - c];
|
|
||||||
tempByte &= maskShifter;
|
|
||||||
tempValInt += (tempByte * expon);
|
|
||||||
expon *= 256;
|
|
||||||
maskShifter = maskShifter >> 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValInt &= params.mask;
|
|
||||||
|
|
||||||
int64_t twocompPoint = params.mask;
|
|
||||||
if (shiftRef < twocompPoint || twocompPoint == -1) twocompPoint = shiftRef;
|
|
||||||
//qDebug() << "two comp point: " << twocompPoint;
|
|
||||||
if (params.isSigned && tempValInt > ((twocompPoint / 2)))
|
|
||||||
{
|
|
||||||
tempValInt = tempValInt - twocompPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValue = (float)tempValInt;
|
|
||||||
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x[j] = (double)(frameCache[j].timestamp) / 1000000.0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x[j] = frameCache[j].timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
params.y[j] = (tempValue * params.scale) + params.bias;
|
|
||||||
if (params.y[j] < yminval) yminval = params.y[j];
|
|
||||||
if (params.y[j] > ymaxval) ymaxval = params.y[j];
|
|
||||||
if (params.x[j] < xminval) xminval = params.x[j];
|
|
||||||
if (params.x[j] > xmaxval) xmaxval = params.x[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else //little endian
|
|
||||||
{
|
|
||||||
float tempValue;
|
|
||||||
int64_t tempValInt;
|
|
||||||
int numBytes = (params.startByte - params.endByte) + 1;
|
|
||||||
int64_t shiftRef = (uint64_t)1 << (numBytes * 8);
|
|
||||||
uint64_t maskShifter;
|
|
||||||
uint8_t tempByte;
|
|
||||||
for (int j = 0; j < numEntries; j++)
|
|
||||||
{
|
|
||||||
tempValInt = 0;
|
|
||||||
int64_t expon = 1;
|
|
||||||
maskShifter = params.mask;
|
|
||||||
for (int c = 0; c < numBytes; c++)
|
|
||||||
{
|
|
||||||
tempByte = frameCache[j * params.stride].data[params.endByte + c];
|
|
||||||
tempByte &= maskShifter;
|
|
||||||
tempValInt += tempByte * expon;
|
|
||||||
expon *= 256;
|
|
||||||
maskShifter = maskShifter >> 8;
|
|
||||||
}
|
|
||||||
tempValInt &= params.mask;
|
|
||||||
|
|
||||||
int64_t twocompPoint = params.mask;
|
|
||||||
if (shiftRef < twocompPoint || twocompPoint == -1) twocompPoint = shiftRef;
|
|
||||||
//qDebug() << "two comp point: " << twocompPoint;
|
|
||||||
if (params.isSigned && tempValInt > ((twocompPoint / 2)))
|
|
||||||
{
|
|
||||||
tempValInt = tempValInt - twocompPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
tempValue = (float)tempValInt;
|
|
||||||
|
|
||||||
if (secondsMode)
|
|
||||||
{
|
|
||||||
params.x[j] = (double)(frameCache[j].timestamp) / 1000000.0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
params.x[j] = frameCache[j].timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
params.y[j] = (tempValue * params.scale) + params.bias;
|
|
||||||
if (params.y[j] < yminval) yminval = params.y[j];
|
|
||||||
if (params.y[j] > ymaxval) ymaxval = params.y[j];
|
|
||||||
if (params.x[j] < xminval) xminval = params.x[j];
|
|
||||||
if (params.x[j] > xmaxval) xmaxval = params.x[j];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
params.y[j] = (tempVal * params.scale) + params.bias;
|
||||||
|
if (params.y[j] < yminval) yminval = params.y[j];
|
||||||
|
if (params.y[j] > ymaxval) ymaxval = params.y[j];
|
||||||
|
if (params.x[j] < xminval) xminval = params.x[j];
|
||||||
|
if (params.x[j] > xmaxval) xmaxval = params.x[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
params.xbias = 0;
|
params.xbias = 0;
|
||||||
@@ -1193,8 +890,8 @@ void GraphingWindow::createGraph(GraphParams ¶ms, bool createGraphParam)
|
|||||||
|
|
||||||
if (params.graphName == NULL || params.graphName.length() == 0)
|
if (params.graphName == NULL || params.graphName.length() == 0)
|
||||||
{
|
{
|
||||||
params.graphName = QString("0x") + QString::number(params.ID, 16) + ":" + QString::number(params.startByte);
|
params.graphName = QString("0x") + QString::number(params.ID, 16) + ":" + QString::number(params.startBit);
|
||||||
if ((params.endByte != -1) && (params.endByte != params.startByte)) params.graphName += "-" + QString::number(params.endByte);
|
params.graphName += "-" + QString::number(params.numBits);
|
||||||
}
|
}
|
||||||
ui->graphingView->graph()->setName(params.graphName);
|
ui->graphingView->graph()->setName(params.graphName);
|
||||||
ui->graphingView->graph()->setProperty("id", params.ID);
|
ui->graphingView->graph()->setProperty("id", params.ID);
|
||||||
|
|||||||
+2
-3
@@ -15,7 +15,8 @@ class GraphParams
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint32_t ID;
|
uint32_t ID;
|
||||||
int startByte, endByte;
|
int startBit, numBits;
|
||||||
|
bool intelFormat;
|
||||||
bool isSigned;
|
bool isSigned;
|
||||||
uint64_t mask;
|
uint64_t mask;
|
||||||
float bias;
|
float bias;
|
||||||
@@ -24,8 +25,6 @@ public:
|
|||||||
QColor color;
|
QColor color;
|
||||||
QCPGraph *ref;
|
QCPGraph *ref;
|
||||||
QString graphName;
|
QString graphName;
|
||||||
bool isDBCSignal; //is this graph actually a DBC signal? If so the below pointer should be filled out
|
|
||||||
QString signal;
|
|
||||||
//the below stuff is used for internal purposes only - code should be refactored so these can be private
|
//the below stuff is used for internal purposes only - code should be refactored so these can be private
|
||||||
QVector<double> x, y;
|
QVector<double> x, y;
|
||||||
double xbias;
|
double xbias;
|
||||||
|
|||||||
+103
-133
@@ -24,9 +24,13 @@ NewGraphDialog::NewGraphDialog(DBCHandler *handler, QWidget *parent) :
|
|||||||
ui->colorSwatch->setPalette(p);
|
ui->colorSwatch->setPalette(p);
|
||||||
|
|
||||||
connect(ui->cbMessages, SIGNAL(currentIndexChanged(int)), this, SLOT(loadSignals(int)));
|
connect(ui->cbMessages, SIGNAL(currentIndexChanged(int)), this, SLOT(loadSignals(int)));
|
||||||
connect(ui->cbSignals, SIGNAL(currentIndexChanged(int)), this, SLOT(fillFormFromSignal(int)));
|
connect(ui->gridData, SIGNAL(gridClicked(int,int)), this, SLOT(bitfieldClicked(int,int)));
|
||||||
connect(ui->rbSignalGraph, SIGNAL(toggled(bool)), this, SLOT(setSignalActive(bool)));
|
connect(ui->txtDataLen, SIGNAL(textChanged(QString)), this, SLOT(handleDataLenUpdate()));
|
||||||
connect(ui->rbStandardGraph, SIGNAL(toggled(bool)), this, SLOT(setStandardActive(bool)));
|
connect(ui->cbIntel, SIGNAL(toggled(bool)), this, SLOT(drawBitfield()));
|
||||||
|
connect(ui->btnCopySignal, SIGNAL(clicked(bool)), this, SLOT(copySignalToParamsUI()));
|
||||||
|
|
||||||
|
startBit = 0;
|
||||||
|
dataLen = 1;
|
||||||
|
|
||||||
loadMessages();
|
loadMessages();
|
||||||
}
|
}
|
||||||
@@ -36,6 +40,12 @@ NewGraphDialog::~NewGraphDialog()
|
|||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NewGraphDialog::showEvent(QShowEvent* event)
|
||||||
|
{
|
||||||
|
QDialog::showEvent(event);
|
||||||
|
loadMessages();
|
||||||
|
}
|
||||||
|
|
||||||
void NewGraphDialog::addButtonClicked()
|
void NewGraphDialog::addButtonClicked()
|
||||||
{
|
{
|
||||||
accept();
|
accept();
|
||||||
@@ -59,91 +69,47 @@ void NewGraphDialog::clearParams()
|
|||||||
ui->txtScale->clear();
|
ui->txtScale->clear();
|
||||||
ui->txtStride->clear();
|
ui->txtStride->clear();
|
||||||
ui->txtName->clear();
|
ui->txtName->clear();
|
||||||
ui->txtData->clear();
|
|
||||||
ui->rbStandardGraph->setChecked(true);
|
|
||||||
setStandardActive(true);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewGraphDialog::setParams(GraphParams ¶ms)
|
void NewGraphDialog::setParams(GraphParams ¶ms)
|
||||||
{
|
{
|
||||||
if (params.isDBCSignal)
|
ui->txtBias->setText(QString::number(params.bias));
|
||||||
{
|
ui->txtMask->setText(Utility::formatNumber(params.mask));
|
||||||
clearParams();
|
ui->txtScale->setText(QString::number(params.scale));
|
||||||
setSignalActive(true);
|
ui->txtStride->setText(QString::number(params.stride));
|
||||||
//loadMessages();
|
ui->cbSigned->setChecked(params.isSigned);
|
||||||
|
|
||||||
}
|
startBit = params.startBit;
|
||||||
else
|
dataLen = params.numBits;
|
||||||
{
|
|
||||||
setStandardActive(true);
|
|
||||||
ui->txtBias->setText(QString::number(params.bias));
|
|
||||||
ui->txtMask->setText(Utility::formatNumber(params.mask));
|
|
||||||
ui->txtScale->setText(QString::number(params.scale));
|
|
||||||
ui->txtStride->setText(QString::number(params.stride));
|
|
||||||
ui->cbSigned->setChecked(params.isSigned);
|
|
||||||
|
|
||||||
if (params.endByte > -1)
|
|
||||||
{
|
|
||||||
ui->txtData->setText(QString::number(params.startByte) + "-" + QString::number(params.endByte));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui->txtData->setText(QString::number(params.startByte));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->txtID->setText(Utility::formatNumber(params.ID));
|
ui->txtID->setText(Utility::formatNumber(params.ID));
|
||||||
ui->txtName->setText(params.graphName);
|
ui->txtName->setText(params.graphName);
|
||||||
QPalette p = ui->colorSwatch->palette();
|
QPalette p = ui->colorSwatch->palette();
|
||||||
p.setColor(QPalette::Button, params.color);
|
p.setColor(QPalette::Button, params.color);
|
||||||
ui->colorSwatch->setPalette(p);
|
ui->colorSwatch->setPalette(p);
|
||||||
|
|
||||||
|
drawBitfield();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewGraphDialog::getParams(GraphParams ¶ms)
|
void NewGraphDialog::getParams(GraphParams ¶ms)
|
||||||
{
|
{
|
||||||
params.isDBCSignal = ui->rbSignalGraph->isChecked();
|
|
||||||
params.color = ui->colorSwatch->palette().button().color();
|
params.color = ui->colorSwatch->palette().button().color();
|
||||||
params.graphName = ui->txtName->text();
|
params.graphName = ui->txtName->text();
|
||||||
|
|
||||||
if (params.isDBCSignal)
|
params.ID = Utility::ParseStringToNum(ui->txtID->text());
|
||||||
{
|
params.bias = ui->txtBias->text().toFloat();
|
||||||
params.signal = ui->cbSignals->currentText();
|
params.isSigned = ui->cbSigned->isChecked();
|
||||||
params.ID = Utility::ParseStringToNum(ui->txtID->text());
|
params.mask = Utility::ParseStringToNum(ui->txtMask->text());
|
||||||
params.bias = 0;
|
params.scale = ui->txtScale->text().toFloat();
|
||||||
params.isSigned = false;
|
params.stride = Utility::ParseStringToNum(ui->txtStride->text());
|
||||||
params.mask = 0;
|
|
||||||
params.scale = 1;
|
|
||||||
params.bias = 0;
|
|
||||||
params.stride = 1;
|
|
||||||
|
|
||||||
}
|
params.startBit = startBit;
|
||||||
else {
|
params.numBits = dataLen;
|
||||||
params.ID = Utility::ParseStringToNum(ui->txtID->text());
|
|
||||||
params.bias = ui->txtBias->text().toFloat();
|
|
||||||
params.isSigned = ui->cbSigned->isChecked();
|
|
||||||
params.mask = Utility::ParseStringToNum(ui->txtMask->text());
|
|
||||||
params.scale = ui->txtScale->text().toFloat();
|
|
||||||
params.stride = Utility::ParseStringToNum(ui->txtStride->text());
|
|
||||||
params.signal = "";
|
|
||||||
|
|
||||||
QStringList values = ui->txtData->text().split('-');
|
//now catch stupidity and bring it to defaults
|
||||||
params.startByte = -1;
|
if (params.mask == 0) params.mask = 0xFFFFFFFF;
|
||||||
params.endByte = -1;
|
if (fabs(params.scale) < 0.00000001) params.scale = 1.0f;
|
||||||
if (values.count() > 0)
|
if (params.stride < 1) params.stride = 1;
|
||||||
{
|
|
||||||
params.startByte = values[0].toInt();
|
|
||||||
if (values.count() > 1)
|
|
||||||
{
|
|
||||||
params.endByte = values[1].toInt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//now catch stupidity and bring it to defaults
|
|
||||||
if (params.mask == 0) params.mask = 0xFFFFFFFF;
|
|
||||||
if (fabs(params.scale) < 0.00000001) params.scale = 1.0f;
|
|
||||||
if (params.stride < 1) params.stride = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewGraphDialog::loadMessages()
|
void NewGraphDialog::loadMessages()
|
||||||
@@ -174,73 +140,77 @@ void NewGraphDialog::loadSignals(int idx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NewGraphDialog::fillFormFromSignal(int idx)
|
void NewGraphDialog::bitfieldClicked(int x,int y)
|
||||||
|
{
|
||||||
|
int bit = (y * 8 + (7-x));
|
||||||
|
int res;
|
||||||
|
|
||||||
|
qDebug() << "Clicked bit: " << bit;
|
||||||
|
startBit = bit;
|
||||||
|
drawBitfield();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewGraphDialog::drawBitfield()
|
||||||
|
{
|
||||||
|
int64_t bitField = 0;
|
||||||
|
int endBit, sBit;
|
||||||
|
|
||||||
|
bitField |= 1ull << (startBit); //make the start bit a different color to set it apart
|
||||||
|
ui->gridData->setReference((unsigned char *)&bitField, false);
|
||||||
|
|
||||||
|
if (ui->cbIntel->isChecked())
|
||||||
|
{
|
||||||
|
endBit = startBit + dataLen - 1;
|
||||||
|
if (startBit < 0) startBit = 0;
|
||||||
|
if (endBit > 63) endBit = 63;
|
||||||
|
for (int y = startBit; y <= endBit; y++)
|
||||||
|
{
|
||||||
|
bitField |= 1ull << y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //big endian / motorola format
|
||||||
|
{
|
||||||
|
//much more irritating than the intel version...
|
||||||
|
int size = dataLen;
|
||||||
|
sBit = startBit;
|
||||||
|
while (size > 0)
|
||||||
|
{
|
||||||
|
bitField |= 1ull << sBit;
|
||||||
|
size--;
|
||||||
|
if ((sBit % 8) == 0) sBit += 15;
|
||||||
|
else sBit--;
|
||||||
|
if (sBit > 63) sBit = 63;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->gridData->updateData((unsigned char *)&bitField, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewGraphDialog::handleDataLenUpdate()
|
||||||
|
{
|
||||||
|
dataLen = ui->txtDataLen->text().toInt();
|
||||||
|
if (dataLen < 1) dataLen = 1;
|
||||||
|
if (dataLen > 63) dataLen = 63;
|
||||||
|
drawBitfield();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NewGraphDialog::copySignalToParamsUI()
|
||||||
{
|
{
|
||||||
Q_UNUSED(idx);
|
|
||||||
GraphParams params;
|
|
||||||
DBC_MESSAGE *msg = dbcHandler->getFileByIdx(0)->messageHandler->findMsgByName(ui->cbMessages->currentText());
|
DBC_MESSAGE *msg = dbcHandler->getFileByIdx(0)->messageHandler->findMsgByName(ui->cbMessages->currentText());
|
||||||
|
if (!msg) return;
|
||||||
if (msg == NULL) return;
|
|
||||||
|
|
||||||
DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(ui->cbSignals->currentText());
|
DBC_SIGNAL *sig = msg->sigHandler->findSignalByName(ui->cbSignals->currentText());
|
||||||
|
if (!sig) return;
|
||||||
|
|
||||||
if (sig == NULL) return;
|
startBit = sig->startBit;
|
||||||
|
ui->txtBias->setText(QString::number(sig->bias));
|
||||||
params.graphName = sig->name;
|
ui->txtDataLen->setText(QString::number(sig->signalSize));
|
||||||
params.ID = msg->ID;
|
ui->txtID->setText(Utility::formatNumber(msg->ID));
|
||||||
//params.bias = sig->bias;
|
ui->txtMask->setText("0xFFFFFFFF");
|
||||||
//params.scale = sig->factor;
|
ui->txtName->setText(sig->name);
|
||||||
//params.stride = 1;
|
ui->txtScale->setText(QString::number(sig->factor));
|
||||||
//params.mask = (1 << (sig->signalSize)) - 1;
|
ui->txtStride->setText("1");
|
||||||
//if (sig->valType == SIGNED_INT) params.isSigned = true;
|
ui->cbIntel->setChecked(sig->intelByteOrder);
|
||||||
//else params.isSigned = false;
|
if (sig->valType == SIGNED_INT) ui->cbSigned->setChecked(true);
|
||||||
params.color = ui->colorSwatch->palette().color(QPalette::Button);
|
else ui->cbSigned->setChecked(false);
|
||||||
/*
|
drawBitfield();
|
||||||
if (sig->intelByteOrder)
|
|
||||||
{
|
|
||||||
//for this ordering the byte order is reserved and starting byte
|
|
||||||
//will be the higher value
|
|
||||||
params.endByte = sig->startBit / 8;
|
|
||||||
params.startByte = (sig->startBit + sig->signalSize - 1) / 8;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//for this ordering it goes in normal numerical order
|
|
||||||
params.startByte = sig->startBit / 8;
|
|
||||||
params.endByte = (sig->startBit + sig->signalSize - 1) / 8;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
setParams(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NewGraphDialog::setSignalActive(bool state)
|
|
||||||
{
|
|
||||||
if (!state) return;
|
|
||||||
ui->rbSignalGraph->setChecked(true);
|
|
||||||
ui->rbStandardGraph->setChecked(false);
|
|
||||||
ui->cbMessages->setEnabled(true);
|
|
||||||
ui->cbSignals->setEnabled(true);
|
|
||||||
ui->cbSigned->setEnabled(false);
|
|
||||||
ui->txtBias->setEnabled(false);
|
|
||||||
ui->txtData->setEnabled(false);
|
|
||||||
ui->txtID->setEnabled(false);
|
|
||||||
ui->txtMask->setEnabled(false);
|
|
||||||
ui->txtScale->setEnabled(false);
|
|
||||||
ui->txtStride->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NewGraphDialog::setStandardActive(bool state)
|
|
||||||
{
|
|
||||||
if (!state) return;
|
|
||||||
ui->rbStandardGraph->setChecked(true);
|
|
||||||
ui->rbSignalGraph->setChecked(false);
|
|
||||||
ui->cbMessages->setEnabled(false);
|
|
||||||
ui->cbSignals->setEnabled(false);
|
|
||||||
ui->cbSigned->setEnabled(true);
|
|
||||||
ui->txtBias->setEnabled(true);
|
|
||||||
ui->txtData->setEnabled(true);
|
|
||||||
ui->txtID->setEnabled(true);
|
|
||||||
ui->txtMask->setEnabled(true);
|
|
||||||
ui->txtScale->setEnabled(true);
|
|
||||||
ui->txtStride->setEnabled(true);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -16,6 +16,7 @@ class NewGraphDialog : public QDialog
|
|||||||
public:
|
public:
|
||||||
explicit NewGraphDialog(DBCHandler *handler, QWidget *parent = 0);
|
explicit NewGraphDialog(DBCHandler *handler, QWidget *parent = 0);
|
||||||
~NewGraphDialog();
|
~NewGraphDialog();
|
||||||
|
void showEvent(QShowEvent*);
|
||||||
void getParams(GraphParams &);
|
void getParams(GraphParams &);
|
||||||
void setParams(GraphParams &);
|
void setParams(GraphParams &);
|
||||||
void clearParams();
|
void clearParams();
|
||||||
@@ -25,13 +26,15 @@ private slots:
|
|||||||
void colorSwatchClick();
|
void colorSwatchClick();
|
||||||
void loadMessages();
|
void loadMessages();
|
||||||
void loadSignals(int idx);
|
void loadSignals(int idx);
|
||||||
void fillFormFromSignal(int idx);
|
void bitfieldClicked(int,int);
|
||||||
void setSignalActive(bool);
|
void handleDataLenUpdate();
|
||||||
void setStandardActive(bool);
|
void drawBitfield();
|
||||||
|
void copySignalToParamsUI();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::NewGraphDialog *ui;
|
Ui::NewGraphDialog *ui;
|
||||||
DBCHandler *dbcHandler;
|
DBCHandler *dbcHandler;
|
||||||
|
int startBit, dataLen;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NEWGRAPHDIALOG_H
|
#endif // NEWGRAPHDIALOG_H
|
||||||
|
|||||||
+85
-44
@@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>492</width>
|
<width>681</width>
|
||||||
<height>340</height>
|
<height>640</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -15,31 +15,7 @@
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout" stretch="3,2">
|
||||||
<item>
|
|
||||||
<widget class="QRadioButton" name="rbStandardGraph">
|
|
||||||
<property name="text">
|
|
||||||
<string>Standard Graph</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QRadioButton" name="rbSignalGraph">
|
|
||||||
<property name="text">
|
|
||||||
<string>DBC Signal Graph</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,1">
|
|
||||||
<item>
|
<item>
|
||||||
<layout class="QFormLayout" name="formLayout">
|
<layout class="QFormLayout" name="formLayout">
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
@@ -55,28 +31,25 @@
|
|||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Data:</string>
|
<string>Start Bit:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="5" column="0">
|
||||||
<widget class="QLineEdit" name="txtData"/>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Signed:</string>
|
<string>Signed:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QCheckBox" name="cbSigned">
|
<widget class="QCheckBox" name="cbSigned">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::NoFrame</enum>
|
<enum>QFrame::NoFrame</enum>
|
||||||
@@ -86,47 +59,47 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLineEdit" name="txtMask"/>
|
<widget class="QLineEdit" name="txtMask"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QLabel" name="label_5">
|
<widget class="QLabel" name="label_5">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Bias:</string>
|
<string>Bias:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QLineEdit" name="txtBias"/>
|
<widget class="QLineEdit" name="txtBias"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Scale</string>
|
<string>Scale</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLineEdit" name="txtScale"/>
|
<widget class="QLineEdit" name="txtScale"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Stride</string>
|
<string>Stride</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLineEdit" name="txtStride"/>
|
<widget class="QLineEdit" name="txtStride"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Color</string>
|
<string>Color</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QPushButton" name="colorSwatch">
|
<widget class="QPushButton" name="colorSwatch">
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -139,7 +112,7 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="11" column="1">
|
||||||
<widget class="QPushButton" name="btnAddGraph">
|
<widget class="QPushButton" name="btnAddGraph">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Add this graph</string>
|
<string>Add this graph</string>
|
||||||
@@ -156,6 +129,46 @@
|
|||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QLineEdit" name="txtName"/>
|
<widget class="QLineEdit" name="txtName"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="CANDataGrid" name="gridData" native="true">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>290</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="baseSize">
|
||||||
|
<size>
|
||||||
|
<width>150</width>
|
||||||
|
<height>150</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QLabel" name="label_13">
|
||||||
|
<property name="text">
|
||||||
|
<string>Intel Format</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QCheckBox" name="cbIntel">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_14">
|
||||||
|
<property name="text">
|
||||||
|
<string>Data Len:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="txtDataLen"/>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -214,12 +227,40 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="cbSignals"/>
|
<widget class="QComboBox" name="cbSignals"/>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnCopySignal">
|
||||||
|
<property name="text">
|
||||||
|
<string>Copy Signal Parameters</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>CANDataGrid</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>candatagrid.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
Reference in New Issue
Block a user