Added data logger (again)
This commit is contained in:
60
Manager.cpp
60
Manager.cpp
@@ -28,7 +28,7 @@ const std::string NUC5 = "d0:c6:37:bc:5c:41";
|
|||||||
|
|
||||||
static long long startTime = 0;
|
static long long startTime = 0;
|
||||||
|
|
||||||
static QString GetCurrentTimeForFileName()
|
static QString getCurrentTimeForFileName()
|
||||||
{
|
{
|
||||||
auto time = std::time(nullptr);
|
auto time = std::time(nullptr);
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
@@ -66,8 +66,43 @@ bool Manager::trigger() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Manager::start() {
|
void Manager::start() {
|
||||||
|
if (_logToDisk) {
|
||||||
|
QString folder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/ftm/";
|
||||||
|
QString prefix = getCurrentTimeForFileName();
|
||||||
|
|
||||||
|
ftmLogger = std::make_shared<QFile>(folder+"/"+prefix+"_ftm.txt");
|
||||||
|
|
||||||
|
if (!ftmLogger->exists()) {
|
||||||
|
// create the folder, if necessary
|
||||||
|
QDir dir(folder);
|
||||||
|
if (!dir.exists()) {
|
||||||
|
qWarning("creating new folder");
|
||||||
|
if (!dir.mkpath(".")) {
|
||||||
|
qWarning() << "Failed to create new folder";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ftmLogger->open(QIODevice::ReadWrite)) {
|
||||||
|
qWarning() << "Failed to create data logger file" << ftmLogger->fileName();
|
||||||
|
ftmLogger = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// write header
|
||||||
|
if (ftmLogger) {
|
||||||
|
QTextStream out(ftmLogger.get());
|
||||||
|
out << "timeInMS;" << "MAC;" << "NucIdx;" << "Success;"
|
||||||
|
<< "DistMM;" << "DistStdDevMM;" << "Rssi;" << "NumSuccessfullMeas;" << "NumAttemptedMeas"
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ftmLogger = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
startTime = nowInMsec();
|
startTime = nowInMsec();
|
||||||
|
|
||||||
|
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "start", "()I");
|
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "start", "()I");
|
||||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I");
|
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I");
|
||||||
@@ -91,6 +126,8 @@ void Manager::start() {
|
|||||||
|
|
||||||
onWifiData(res);
|
onWifiData(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +138,12 @@ void Manager::stop() {
|
|||||||
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "stop", "()I");
|
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "stop", "()I");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (ftmLogger) {
|
||||||
|
ftmLogger->flush();
|
||||||
|
ftmLogger->close();
|
||||||
|
ftmLogger = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
isRunning = false;
|
isRunning = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,6 +168,21 @@ void Manager::onWifiData(WifiRttResult result) {
|
|||||||
if(NUC5 == result.mac) {nucIdx = 4;}
|
if(NUC5 == result.mac) {nucIdx = 4;}
|
||||||
|
|
||||||
emit newDistMeas(nucIdx, result.distMM);
|
emit newDistMeas(nucIdx, result.distMM);
|
||||||
|
|
||||||
|
if (ftmLogger) {
|
||||||
|
QTextStream out(ftmLogger.get());
|
||||||
|
|
||||||
|
out << result.timeMS << ";"
|
||||||
|
<< QString::fromStdString(result.mac) << ";"
|
||||||
|
<< nucIdx << ";"
|
||||||
|
<< result.success << ";"
|
||||||
|
<< result.distMM << ";"
|
||||||
|
<< result.distStdDevMM << ";"
|
||||||
|
<< result.rssi << ";"
|
||||||
|
<< result.numSuccessfullMeas << ";"
|
||||||
|
<< result.numAttemptedMeas
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,8 +41,13 @@ private:
|
|||||||
float _uwbDist[4];
|
float _uwbDist[4];
|
||||||
|
|
||||||
bool isRunning = false;
|
bool isRunning = false;
|
||||||
|
bool _logToDisk = false;
|
||||||
|
|
||||||
|
std::shared_ptr<QFile> ftmLogger;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Q_PROPERTY(bool logToDisk READ getLogToDisk WRITE setLogToDisk NOTIFY logToDiskChanged)
|
||||||
|
|
||||||
Q_PROPERTY(float uwbDist1 READ getUwbDist1() NOTIFY uwbDistChanged)
|
Q_PROPERTY(float uwbDist1 READ getUwbDist1() NOTIFY uwbDistChanged)
|
||||||
Q_PROPERTY(float uwbDist2 READ getUwbDist2() NOTIFY uwbDistChanged)
|
Q_PROPERTY(float uwbDist2 READ getUwbDist2() NOTIFY uwbDistChanged)
|
||||||
Q_PROPERTY(float uwbDist3 READ getUwbDist3() NOTIFY uwbDistChanged)
|
Q_PROPERTY(float uwbDist3 READ getUwbDist3() NOTIFY uwbDistChanged)
|
||||||
@@ -63,6 +68,9 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
bool getLogToDisk() const { return _logToDisk; }
|
||||||
|
void setLogToDisk(bool v) { _logToDisk = v; emit logToDiskChanged(v); }
|
||||||
|
|
||||||
float getUwbDist1() {return _uwbDist[0];}
|
float getUwbDist1() {return _uwbDist[0];}
|
||||||
float getUwbDist2() {return _uwbDist[1];}
|
float getUwbDist2() {return _uwbDist[1];}
|
||||||
float getUwbDist3() {return _uwbDist[2];}
|
float getUwbDist3() {return _uwbDist[2];}
|
||||||
@@ -72,6 +80,7 @@ signals:
|
|||||||
|
|
||||||
void uwbDistChanged();
|
void uwbDistChanged();
|
||||||
void newDistMeas(int idx, int value);
|
void newDistMeas(int idx, int value);
|
||||||
|
void logToDiskChanged(bool newValue);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public:
|
|||||||
qreal mean() const { return stats.getMean(); }
|
qreal mean() const { return stats.getMean(); }
|
||||||
qreal stdDev() const { return stats.getStdDev(); }
|
qreal stdDev() const { return stats.getStdDev(); }
|
||||||
int totalCount() const { return stats.getCount(); }
|
int totalCount() const { return stats.getCount(); }
|
||||||
qreal maxBinValue() const { return maxBinIndex * binWidth(); }
|
qreal maxBinValue() const { return minValue + (maxBinIndex * binWidth()); }
|
||||||
|
|
||||||
void paint(QPainter *painter);
|
void paint(QPainter *painter);
|
||||||
|
|
||||||
|
|||||||
16
main.qml
16
main.qml
@@ -38,6 +38,7 @@ Window {
|
|||||||
|
|
||||||
ComboBox {
|
ComboBox {
|
||||||
id: cbNUC;
|
id: cbNUC;
|
||||||
|
height: 60;
|
||||||
model: ["NUC1", "NUC2", "NUC3", "NUC4", "NUC5"];
|
model: ["NUC1", "NUC2", "NUC3", "NUC4", "NUC5"];
|
||||||
onCurrentIndexChanged: {
|
onCurrentIndexChanged: {
|
||||||
chart.reset();
|
chart.reset();
|
||||||
@@ -47,23 +48,36 @@ Window {
|
|||||||
Button {
|
Button {
|
||||||
id: btnTrigger;
|
id: btnTrigger;
|
||||||
text: "Start";
|
text: "Start";
|
||||||
|
height: 60;
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (mgmt.trigger()) {
|
if (mgmt.trigger()) {
|
||||||
// running
|
// running
|
||||||
btnTrigger.text = "Stop";
|
btnTrigger.text = "Stop";
|
||||||
|
cbLogToDisk.enabled = false;
|
||||||
} else {
|
} else {
|
||||||
btnTrigger.text = "Start";
|
btnTrigger.text = "Start";
|
||||||
|
cbLogToDisk.enabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
text: "Reset"
|
text: "Reset";
|
||||||
|
height: 60;
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
chart.reset();
|
chart.reset();
|
||||||
chart.update();
|
chart.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: cbLogToDisk;
|
||||||
|
text: "Log";
|
||||||
|
onClicked: mgmt.logToDisk = checked
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
|
|||||||
Reference in New Issue
Block a user