Addition of "System Time" mode where frames are timestamped by

absolute time from the PC clock.
This commit is contained in:
Collin Kidder
2017-07-09 16:54:26 -04:00
parent 8e6883f8f0
commit 8830950f85
13 changed files with 137 additions and 28 deletions
+16 -2
View File
@@ -3,6 +3,7 @@
#include <QFile> #include <QFile>
#include <QApplication> #include <QApplication>
#include <QPalette> #include <QPalette>
#include <QDateTime>
#include "utility.h" #include "utility.h"
@@ -91,6 +92,16 @@ void CANFrameModel::setSecondsMode(bool mode)
} }
} }
void CANFrameModel::setSysTimeMode(bool mode)
{
if (useSystemTime != mode)
{
this->beginResetModel();
useSystemTime = mode;
this->endResetModel();
}
}
void CANFrameModel::setInterpetMode(bool mode) void CANFrameModel::setInterpetMode(bool mode)
{ {
//if the state of interpretFrames changes then we need to reset the model //if the state of interpretFrames changes then we need to reset the model
@@ -237,8 +248,11 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const
switch (index.column()) switch (index.column())
{ {
case 0: //timestamp case 0: //timestamp
if (!timeSeconds) return QString::number(thisFrame.timestamp); if (!useSystemTime) {
else return QString::number((double)thisFrame.timestamp / 1000000.0, 'f', 6); if (!timeSeconds) return QString::number(thisFrame.timestamp);
else return QString::number((double)thisFrame.timestamp / 1000000.0, 'f', 6);
}
else return QDateTime::fromMSecsSinceEpoch(thisFrame.timestamp / 1000).toString("MMM-dd HH:mm:ss.zzz");
break; break;
case 1: //id case 1: //id
return Utility::formatNumber(thisFrame.ID); return Utility::formatNumber(thisFrame.ID);
+3 -1
View File
@@ -23,7 +23,7 @@ public:
QVariant headerData(int section, Qt::Orientation orientation, QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const; int role = Qt::DisplayRole) const;
int columnCount(const QModelIndex &) const; int columnCount(const QModelIndex &) const;
int totalFrameCount(); int totalFrameCount();
void sendRefresh(); void sendRefresh();
void sendRefresh(int); void sendRefresh(int);
@@ -32,6 +32,7 @@ public:
void setInterpetMode(bool); void setInterpetMode(bool);
void setOverwriteMode(bool); void setOverwriteMode(bool);
void setHexMode(bool); void setHexMode(bool);
void setSysTimeMode(bool);
void setFilterState(unsigned int ID, bool state); void setFilterState(unsigned int ID, bool state);
void setAllFilters(bool state); void setAllFilters(bool state);
void setSecondsMode(bool); void setSecondsMode(bool);
@@ -63,6 +64,7 @@ private:
bool overwriteDups; //should we display all frames or only the newest for each ID? bool overwriteDups; //should we display all frames or only the newest for each ID?
bool useHexMode; bool useHexMode;
bool timeSeconds; bool timeSeconds;
bool useSystemTime;
bool needFilterRefresh; bool needFilterRefresh;
uint64_t timeOffset; uint64_t timeOffset;
int lastUpdateNumFrames; int lastUpdateNumFrames;
+1 -1
View File
@@ -1,7 +1,7 @@
#ifndef CONFIG #ifndef CONFIG
#define CONFIG #define CONFIG
#define VERSION 169 #define VERSION 170
//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
+11 -1
View File
@@ -1,4 +1,5 @@
#include <QDateTime> #include <QDateTime>
#include <QSettings>
#include "canconmanager.h" #include "canconmanager.h"
@@ -24,6 +25,14 @@ CANConManager::CANConManager(QObject *parent): QObject(parent)
mNumActiveBuses = 0; mNumActiveBuses = 0;
resetTimeBasis(); resetTimeBasis();
QSettings settings;
if (settings.value("Main/TimeClock", false).toBool())
{
useSystemTime = true;
}
else useSystemTime = false;
} }
void CANConManager::resetTimeBasis() void CANConManager::resetTimeBasis()
@@ -168,7 +177,8 @@ bool CANConManager::sendFrame(const CANFrame& pFrame)
{ {
workingFrame.bus -= busBase; workingFrame.bus -= busBase;
workingFrame.isReceived = false; workingFrame.isReceived = false;
workingFrame.timestamp = ((QDateTime::currentMSecsSinceEpoch() * 1000) - mTimestampBasis); workingFrame.timestamp = (QDateTime::currentMSecsSinceEpoch() * 1000);
if (!useSystemTime) workingFrame.timestamp -= mTimestampBasis;
txFrame = conn->getQueue().get(); txFrame = conn->getQueue().get();
*txFrame = workingFrame; *txFrame = workingFrame;
conn->getQueue().queue(); conn->getQueue().queue();
+1
View File
@@ -74,6 +74,7 @@ private:
QTimer mTimer; QTimer mTimer;
uint64_t mTimestampBasis; uint64_t mTimestampBasis;
uint32_t mNumActiveBuses; uint32_t mNumActiveBuses;
bool useSystemTime;
}; };
#endif // CANCONNECTIONMODEL_H #endif // CANCONNECTIONMODEL_H
+9
View File
@@ -1,3 +1,4 @@
#include <QSettings>
#include <QThread> #include <QThread>
#include "canconnection.h" #include "canconnection.h"
@@ -79,6 +80,14 @@ void CANConnection::start()
/* set started flag */ /* set started flag */
mStarted = true; mStarted = true;
QSettings settings;
if (settings.value("Main/TimeClock", false).toBool())
{
useSystemTime = true;
}
else useSystemTime = false;
/* in multithread case, this will be called before entering thread event loop */ /* in multithread case, this will be called before entering thread event loop */
return piStarted(); return piStarted();
} }
+1
View File
@@ -237,6 +237,7 @@ protected:
void setCapSuspended(bool pIsSuspended); void setCapSuspended(bool pIsSuspended);
protected: protected:
bool useSystemTime;
/**************************************************************/ /**************************************************************/
/*********** protected interface to implement *******/ /*********** protected interface to implement *******/
+4
View File
@@ -400,6 +400,10 @@ void GVRetSerial::procRXChar(unsigned char c)
buildFrame.timestamp |= (uint)c << 24; buildFrame.timestamp |= (uint)c << 24;
buildFrame.timestamp += timeBasis; buildFrame.timestamp += timeBasis;
if (useSystemTime)
{
buildFrame.timestamp = QDateTime::currentMSecsSinceEpoch() * 1000l;
}
break; break;
case 4: case 4:
buildFrame.ID = c; buildFrame.ID = c;
+5 -1
View File
@@ -1,6 +1,7 @@
#include <QObject> #include <QObject>
#include <QDebug> #include <QDebug>
#include <QCanBusFrame> #include <QCanBusFrame>
#include <QDateTime>
#include "socketcan.h" #include "socketcan.h"
@@ -189,7 +190,10 @@ void SocketCan::framesReceived()
frame_p->extended = false; frame_p->extended = false;
frame_p->ID = recFrame.frameId(); frame_p->ID = recFrame.frameId();
frame_p->isReceived = true; frame_p->isReceived = true;
frame_p->timestamp = (recFrame.timeStamp().seconds()*1000000 + recFrame.timeStamp().microSeconds()) - timeBasis; if (useSystemTime) {
frame_p->timestamp = QDateTime::currentMSecsSinceEpoch() * 1000ul;
}
else frame_p->timestamp = (recFrame.timeStamp().seconds() * 1000000ul + recFrame.timeStamp().microSeconds()) - timeBasis;
checkTargettedFrame(*frame_p); checkTargettedFrame(*frame_p);
+30 -3
View File
@@ -26,7 +26,31 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) :
ui->cbRestorePositions->setChecked(settings->value("Main/SaveRestorePositions", true).toBool()); ui->cbRestorePositions->setChecked(settings->value("Main/SaveRestorePositions", true).toBool());
ui->cbValidate->setChecked(settings->value("Main/ValidateComm", true).toBool()); ui->cbValidate->setChecked(settings->value("Main/ValidateComm", true).toBool());
ui->spinPlaybackSpeed->setValue(settings->value("Playback/DefSpeed", 5).toInt()); ui->spinPlaybackSpeed->setValue(settings->value("Playback/DefSpeed", 5).toInt());
ui->cbTimeSeconds->setChecked(settings->value("Main/TimeSeconds", false).toBool());
bool secondsMode = settings->value("Main/TimeSeconds", false).toBool();
bool clockMode = settings->value("Main/TimeClock", false).toBool();
if (clockMode)
{
ui->rbSeconds->setChecked(false);
ui->rbMicros->setChecked(false);
ui->rbSysClock->setChecked(true);
}
else
{
if (secondsMode)
{
ui->rbSeconds->setChecked(true);
ui->rbMicros->setChecked(false);
ui->rbSysClock->setChecked(false);
}
else
{
ui->rbSeconds->setChecked(false);
ui->rbMicros->setChecked(true);
ui->rbSysClock->setChecked(false);
}
}
ui->comboSendingBus->setCurrentIndex(settings->value("Playback/SendingBus", 4).toInt()); ui->comboSendingBus->setCurrentIndex(settings->value("Playback/SendingBus", 4).toInt());
ui->cbUseFiltered->setChecked(settings->value("Main/UseFiltered", false).toBool()); ui->cbUseFiltered->setChecked(settings->value("Main/UseFiltered", false).toBool());
@@ -40,7 +64,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) :
connect(ui->cbRestorePositions, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbRestorePositions, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
connect(ui->cbValidate, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbValidate, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
connect(ui->spinPlaybackSpeed, SIGNAL(valueChanged(int)), this, SLOT(updateSettings())); connect(ui->spinPlaybackSpeed, SIGNAL(valueChanged(int)), this, SLOT(updateSettings()));
connect(ui->cbTimeSeconds, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->rbSeconds, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
connect(ui->rbMicros, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
connect(ui->rbSysClock, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
connect(ui->comboSendingBus, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSettings())); connect(ui->comboSendingBus, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSettings()));
connect(ui->cbUseFiltered, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbUseFiltered, SIGNAL(toggled(bool)), this, SLOT(updateSettings()));
} }
@@ -68,7 +94,8 @@ void MainSettingsDialog::updateSettings()
settings->setValue("Main/SaveRestorePositions", ui->cbRestorePositions->isChecked()); settings->setValue("Main/SaveRestorePositions", ui->cbRestorePositions->isChecked());
settings->setValue("Main/ValidateComm", ui->cbValidate->isChecked()); settings->setValue("Main/ValidateComm", ui->cbValidate->isChecked());
settings->setValue("Playback/DefSpeed", ui->spinPlaybackSpeed->value()); settings->setValue("Playback/DefSpeed", ui->spinPlaybackSpeed->value());
settings->setValue("Main/TimeSeconds", ui->cbTimeSeconds->isChecked()); settings->setValue("Main/TimeSeconds", ui->rbSeconds->isChecked());
settings->setValue("Main/TimeClock", ui->rbSysClock->isChecked());
settings->setValue("Playback/SendingBus", ui->comboSendingBus->currentIndex()); settings->setValue("Playback/SendingBus", ui->comboSendingBus->currentIndex());
settings->setValue("Main/UseFiltered", ui->cbUseFiltered->isChecked()); settings->setValue("Main/UseFiltered", ui->cbUseFiltered->isChecked());
+4 -15
View File
@@ -52,13 +52,13 @@ MainWindow::MainWindow(QWidget *parent) :
readSettings(); readSettings();
ui->canFramesView->setColumnWidth(0, 110); ui->canFramesView->setColumnWidth(0, 150);
ui->canFramesView->setColumnWidth(1, 70); ui->canFramesView->setColumnWidth(1, 70);
ui->canFramesView->setColumnWidth(2, 40); ui->canFramesView->setColumnWidth(2, 40);
ui->canFramesView->setColumnWidth(3, 40); ui->canFramesView->setColumnWidth(3, 40);
ui->canFramesView->setColumnWidth(4, 40); ui->canFramesView->setColumnWidth(4, 40);
ui->canFramesView->setColumnWidth(5, 40); ui->canFramesView->setColumnWidth(5, 40);
ui->canFramesView->setColumnWidth(6, 275); ui->canFramesView->setColumnWidth(6, 225);
QHeaderView *HorzHdr = ui->canFramesView->horizontalHeader(); QHeaderView *HorzHdr = ui->canFramesView->horizontalHeader();
HorzHdr->setStretchLastSection(true); //causes the data column to automatically fill the tableview HorzHdr->setStretchLastSection(true); //causes the data column to automatically fill the tableview
@@ -256,19 +256,6 @@ void MainWindow::readSettings()
ui->cbAutoScroll->setChecked(true); ui->cbAutoScroll->setChecked(true);
} }
/*
int cType = settings.value("Main/DefaultConnectionType", 0).toInt();
if (cType == 0) connType = "GVRET";
if (cType == 1) connType = "KVASER";
if (cType == 2) connType = "SOCKETCAN";
portName = settings.value("Main/DefaultConnectionPort", "").toString();
*/
//qDebug() << connType;
//qDebug() << portName;
//"Main/SingleWireMode"
readUpdateableSettings(); readUpdateableSettings();
} }
@@ -280,6 +267,8 @@ void MainWindow::readUpdateableSettings()
Utility::decimalMode = !useHex; Utility::decimalMode = !useHex;
secondsMode = settings.value("Main/TimeSeconds", false).toBool(); secondsMode = settings.value("Main/TimeSeconds", false).toBool();
model->setSecondsMode(secondsMode); model->setSecondsMode(secondsMode);
useSystemClock = settings.value("Main/TimeClock", false).toBool();
model->setSysTimeMode(useSystemClock);
useFiltered = settings.value("Main/UseFiltered", false).toBool(); useFiltered = settings.value("Main/UseFiltered", false).toBool();
} }
+1
View File
@@ -126,6 +126,7 @@ private:
bool useHex; bool useHex;
bool allowCapture; bool allowCapture;
bool secondsMode; bool secondsMode;
bool useSystemClock;
bool bDirty; //have frames been added or subtracted since the last save/load? bool bDirty; //have frames been added or subtracted since the last save/load?
bool useFiltered; //should sub-windows use the unfiltered or filtered frames list? bool useFiltered; //should sub-windows use the unfiltered or filtered frames list?
+51 -4
View File
@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>400</width>
<height>580</height> <height>687</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -42,10 +42,57 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="cbTimeSeconds"> <widget class="QGroupBox" name="groupBox_6">
<property name="text"> <property name="title">
<string>Display time in seconds</string> <string>Time Keeping</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Seconds/Microseconds are dongle based</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QRadioButton" name="rbSeconds">
<property name="text">
<string>Seconds</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbMicros">
<property name="text">
<string>Microseconds</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QRadioButton" name="rbSysClock">
<property name="text">
<string>System Clock</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget> </widget>
</item> </item>
<item> <item>