From 257d0766682402a9477f303abd5fe1fbe90f16fb Mon Sep 17 00:00:00 2001 From: Markus Bullmann Date: Sat, 9 Nov 2019 12:06:59 +0100 Subject: [PATCH] Added data logger (again) --- Manager.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++- Manager.h | 11 ++++++++- histogramchart.h | 2 +- main.qml | 16 ++++++++++++- 4 files changed, 85 insertions(+), 4 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index fc7a372..33e01b7 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -28,7 +28,7 @@ const std::string NUC5 = "d0:c6:37:bc:5c:41"; static long long startTime = 0; -static QString GetCurrentTimeForFileName() +static QString getCurrentTimeForFileName() { auto time = std::time(nullptr); std::stringstream ss; @@ -66,8 +66,43 @@ bool Manager::trigger() { } void Manager::start() { + if (_logToDisk) { + QString folder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/ftm/"; + QString prefix = getCurrentTimeForFileName(); + + ftmLogger = std::make_shared(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(); + #ifdef ANDROID //QAndroidJniObject::callStaticMethod("android/net/wifi/UWB", "start", "()I"); QAndroidJniObject::callStaticMethod("android/net/wifi/RTT", "start", "()I"); @@ -91,6 +126,8 @@ void Manager::start() { onWifiData(res); } + + stop(); #endif } @@ -101,6 +138,12 @@ void Manager::stop() { //QAndroidJniObject::callStaticMethod("android/net/wifi/UWB", "stop", "()I"); #endif + if (ftmLogger) { + ftmLogger->flush(); + ftmLogger->close(); + ftmLogger = nullptr; + } + isRunning = false; } @@ -125,6 +168,21 @@ void Manager::onWifiData(WifiRttResult result) { if(NUC5 == result.mac) {nucIdx = 4;} 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; + } } } diff --git a/Manager.h b/Manager.h index 9a11ffc..d9b2130 100644 --- a/Manager.h +++ b/Manager.h @@ -41,8 +41,13 @@ private: float _uwbDist[4]; bool isRunning = false; + bool _logToDisk = false; + + std::shared_ptr ftmLogger; public: + Q_PROPERTY(bool logToDisk READ getLogToDisk WRITE setLogToDisk NOTIFY logToDiskChanged) + Q_PROPERTY(float uwbDist1 READ getUwbDist1() NOTIFY uwbDistChanged) Q_PROPERTY(float uwbDist2 READ getUwbDist2() NOTIFY uwbDistChanged) Q_PROPERTY(float uwbDist3 READ getUwbDist3() NOTIFY uwbDistChanged) @@ -63,6 +68,9 @@ public: public: + bool getLogToDisk() const { return _logToDisk; } + void setLogToDisk(bool v) { _logToDisk = v; emit logToDiskChanged(v); } + float getUwbDist1() {return _uwbDist[0];} float getUwbDist2() {return _uwbDist[1];} float getUwbDist3() {return _uwbDist[2];} @@ -71,7 +79,8 @@ public: signals: void uwbDistChanged(); - void newDistMeas(int idx, int value); + void newDistMeas(int idx, int value); + void logToDiskChanged(bool newValue); public: diff --git a/histogramchart.h b/histogramchart.h index e097bbe..85db393 100644 --- a/histogramchart.h +++ b/histogramchart.h @@ -66,7 +66,7 @@ public: qreal mean() const { return stats.getMean(); } qreal stdDev() const { return stats.getStdDev(); } int totalCount() const { return stats.getCount(); } - qreal maxBinValue() const { return maxBinIndex * binWidth(); } + qreal maxBinValue() const { return minValue + (maxBinIndex * binWidth()); } void paint(QPainter *painter); diff --git a/main.qml b/main.qml index d9649d6..98b17e4 100644 --- a/main.qml +++ b/main.qml @@ -38,6 +38,7 @@ Window { ComboBox { id: cbNUC; + height: 60; model: ["NUC1", "NUC2", "NUC3", "NUC4", "NUC5"]; onCurrentIndexChanged: { chart.reset(); @@ -47,23 +48,36 @@ Window { Button { id: btnTrigger; text: "Start"; + height: 60; + onClicked: { if (mgmt.trigger()) { // running btnTrigger.text = "Stop"; + cbLogToDisk.enabled = false; } else { btnTrigger.text = "Start"; + cbLogToDisk.enabled = true; } } } Button { - text: "Reset" + text: "Reset"; + height: 60; + onClicked: { chart.reset(); chart.update(); } } + + CheckBox { + id: cbLogToDisk; + text: "Log"; + onClicked: mgmt.logToDisk = checked + } + } Row {