Overwrite mode now respects the bus number and will only overwrite frames with the same ID and bus number. Overwrite now also shows time delta instead of timestamp.
This commit is contained in:
@@ -16,6 +16,7 @@ public:
|
|||||||
uint32_t len;
|
uint32_t len;
|
||||||
unsigned char data[8];
|
unsigned char data[8];
|
||||||
uint64_t timestamp;
|
uint64_t timestamp;
|
||||||
|
uint64_t timedelta;
|
||||||
uint32_t frameCount; //used in overwrite mode
|
uint32_t frameCount; //used in overwrite mode
|
||||||
|
|
||||||
friend bool operator<(const CANFrame& l, const CANFrame& r)
|
friend bool operator<(const CANFrame& l, const CANFrame& r)
|
||||||
@@ -32,6 +33,7 @@ public:
|
|||||||
isReceived = true;
|
isReceived = true;
|
||||||
len = 0;
|
len = 0;
|
||||||
timestamp = 0;
|
timestamp = 0;
|
||||||
|
timedelta = 0;
|
||||||
frameCount = 1;
|
frameCount = 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+36
-9
@@ -176,6 +176,11 @@ void CANFrameModel::setAllFilters(bool state)
|
|||||||
sendRefresh();
|
sendRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There is probably a more correct way to have done this but below are several functions that collectively implement
|
||||||
|
* quicksort on the columns and interpret the columns numerically. But, correct or not, this implementation is quite fast
|
||||||
|
* and sorts the columns properly.
|
||||||
|
*/
|
||||||
uint64_t CANFrameModel::getCANFrameVal(int row, Column col)
|
uint64_t CANFrameModel::getCANFrameVal(int row, Column col)
|
||||||
{
|
{
|
||||||
uint64_t temp = 0;
|
uint64_t temp = 0;
|
||||||
@@ -184,6 +189,7 @@ uint64_t CANFrameModel::getCANFrameVal(int row, Column col)
|
|||||||
switch (col)
|
switch (col)
|
||||||
{
|
{
|
||||||
case Column::TimeStamp:
|
case Column::TimeStamp:
|
||||||
|
if (overwriteDups) return frame.timedelta;
|
||||||
return frame.timestamp;
|
return frame.timestamp;
|
||||||
case Column::FrameId:
|
case Column::FrameId:
|
||||||
return frame.ID;
|
return frame.ID;
|
||||||
@@ -191,6 +197,7 @@ uint64_t CANFrameModel::getCANFrameVal(int row, Column col)
|
|||||||
if (frame.extended) return 1;
|
if (frame.extended) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
case Column::Remote:
|
case Column::Remote:
|
||||||
|
if (overwriteDups) return frame.frameCount;
|
||||||
if (frame.remote) return 1;
|
if (frame.remote) return 1;
|
||||||
return 0;
|
return 0;
|
||||||
case Column::Direction:
|
case Column::Direction:
|
||||||
@@ -280,6 +287,8 @@ void CANFrameModel::sortByColumn(int column)
|
|||||||
sendRefresh();
|
sendRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//End of custom sorting code
|
||||||
|
|
||||||
void CANFrameModel::recalcOverwrite()
|
void CANFrameModel::recalcOverwrite()
|
||||||
{
|
{
|
||||||
if (!overwriteDups) return; //no need to do a thing if mode is disabled
|
if (!overwriteDups) return; //no need to do a thing if mode is disabled
|
||||||
@@ -293,14 +302,24 @@ void CANFrameModel::recalcOverwrite()
|
|||||||
beginResetModel();
|
beginResetModel();
|
||||||
|
|
||||||
//Look at the current list of frames and turn it into just a list of unique IDs
|
//Look at the current list of frames and turn it into just a list of unique IDs
|
||||||
QHash<int, CANFrame> overWriteFrames;
|
QHash<uint64_t, CANFrame> overWriteFrames;
|
||||||
|
uint64_t idAugmented; //id in lower 29 bits, bus number shifted up 29 bits
|
||||||
foreach(CANFrame frame, frames)
|
foreach(CANFrame frame, frames)
|
||||||
{
|
{
|
||||||
if (!overWriteFrames.contains(frame.ID))
|
idAugmented = frame.ID;
|
||||||
|
idAugmented = idAugmented + (frame.bus << 29ull);
|
||||||
|
if (!overWriteFrames.contains(idAugmented))
|
||||||
{
|
{
|
||||||
overWriteFrames.insert(frame.ID, frame);
|
frame.timedelta = 0;
|
||||||
|
frame.frameCount = 1;
|
||||||
|
overWriteFrames.insert(idAugmented, frame);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
frame.timedelta = frame.timestamp - overWriteFrames[idAugmented].timestamp;
|
||||||
|
frame.frameCount = overWriteFrames[idAugmented].frameCount + 1;
|
||||||
|
overWriteFrames[idAugmented] = frame;
|
||||||
}
|
}
|
||||||
else overWriteFrames[frame.ID] = frame;
|
|
||||||
}
|
}
|
||||||
//Then replace the old list of frames with just the unique list
|
//Then replace the old list of frames with just the unique list
|
||||||
frames.clear();
|
frames.clear();
|
||||||
@@ -373,9 +392,14 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
|
|||||||
if (role == Qt::DisplayRole) {
|
if (role == Qt::DisplayRole) {
|
||||||
switch (Column(index.column()))
|
switch (Column(index.column()))
|
||||||
{
|
{
|
||||||
case Column::TimeStamp:
|
case Column::TimeStamp:
|
||||||
//Reformatting the output a bit with custom code
|
//Reformatting the output a bit with custom code
|
||||||
ts = Utility::formatTimestamp(thisFrame.timestamp);
|
if (overwriteDups)
|
||||||
|
{
|
||||||
|
if (timeSeconds) return QString::number(thisFrame.timedelta / 1000000.0, 'f', 5);
|
||||||
|
return QString::number(thisFrame.timedelta);
|
||||||
|
}
|
||||||
|
else ts = Utility::formatTimestamp(thisFrame.timestamp);
|
||||||
if (ts.type() == QVariant::Double) return QString::number(ts.toDouble(), 'f', 5); //never scientific notation, 5 decimal places
|
if (ts.type() == QVariant::Double) return QString::number(ts.toDouble(), 'f', 5); //never scientific notation, 5 decimal places
|
||||||
if (ts.type() == QVariant::LongLong) return QString::number(ts.toLongLong()); //never scientific notion, all digits shown
|
if (ts.type() == QVariant::LongLong) return QString::number(ts.toLongLong()); //never scientific notion, all digits shown
|
||||||
if (ts.type() == QVariant::DateTime) return ts.toDateTime().toString(timeFormat); //custom set format for dates and times
|
if (ts.type() == QVariant::DateTime) return ts.toDateTime().toString(timeFormat); //custom set format for dates and times
|
||||||
@@ -474,13 +498,14 @@ QVariant CANFrameModel::headerData(int section, Qt::Orientation orientation,
|
|||||||
switch (Column(section))
|
switch (Column(section))
|
||||||
{
|
{
|
||||||
case Column::TimeStamp:
|
case Column::TimeStamp:
|
||||||
|
if (overwriteDups) return QString(tr("Time Delta"));
|
||||||
return QString(tr("Timestamp"));
|
return QString(tr("Timestamp"));
|
||||||
case Column::FrameId:
|
case Column::FrameId:
|
||||||
return QString(tr("ID"));
|
return QString(tr("ID"));
|
||||||
case Column::Extended:
|
case Column::Extended:
|
||||||
return QString(tr("Ext"));
|
return QString(tr("Ext"));
|
||||||
case Column::Remote:
|
case Column::Remote:
|
||||||
if (!overwriteDups) return QString(tr("Rem"));
|
if (!overwriteDups) return QString(tr("RTR"));
|
||||||
return QString(tr("Cnt"));
|
return QString(tr("Cnt"));
|
||||||
case Column::Direction:
|
case Column::Direction:
|
||||||
return QString(tr("Dir"));
|
return QString(tr("Dir"));
|
||||||
@@ -537,9 +562,10 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
|
|||||||
bool found = false;
|
bool found = false;
|
||||||
for (int i = 0; i < frames.count(); i++)
|
for (int i = 0; i < frames.count(); i++)
|
||||||
{
|
{
|
||||||
if (frames[i].ID == tempFrame.ID)
|
if ( (frames[i].ID == tempFrame.ID) && (frames[i].bus == tempFrame.bus) )
|
||||||
{
|
{
|
||||||
tempFrame.frameCount = frames[i].frameCount + 1;
|
tempFrame.frameCount = frames[i].frameCount + 1;
|
||||||
|
tempFrame.timedelta = tempFrame.timestamp - frames[i].timestamp;
|
||||||
frames.replace(i, tempFrame);
|
frames.replace(i, tempFrame);
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
@@ -552,6 +578,7 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
|
|||||||
{
|
{
|
||||||
if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count());
|
if (autoRefresh) beginInsertRows(QModelIndex(), filteredFrames.count(), filteredFrames.count());
|
||||||
tempFrame.frameCount = 1;
|
tempFrame.frameCount = 1;
|
||||||
|
tempFrame.timedelta = 0;
|
||||||
filteredFrames.append(tempFrame);
|
filteredFrames.append(tempFrame);
|
||||||
if (autoRefresh) endInsertRows();
|
if (autoRefresh) endInsertRows();
|
||||||
}
|
}
|
||||||
@@ -560,7 +587,7 @@ void CANFrameModel::addFrame(const CANFrame& frame, bool autoRefresh = false)
|
|||||||
{
|
{
|
||||||
for (int j = 0; j < filteredFrames.count(); j++)
|
for (int j = 0; j < filteredFrames.count(); j++)
|
||||||
{
|
{
|
||||||
if (filteredFrames[j].ID == tempFrame.ID)
|
if ( (filteredFrames[j].ID == tempFrame.ID) && (filteredFrames[j].bus == tempFrame.bus) )
|
||||||
{
|
{
|
||||||
if (autoRefresh) beginResetModel();
|
if (autoRefresh) beginResetModel();
|
||||||
filteredFrames.replace(j, tempFrame);
|
filteredFrames.replace(j, tempFrame);
|
||||||
|
|||||||
Reference in New Issue
Block a user