From 799e563ff5d590dfe01c8b33a9e7f389d72b2aed Mon Sep 17 00:00:00 2001 From: Markus Bullmann Date: Tue, 26 Feb 2019 17:44:50 +0100 Subject: [PATCH] Added data logging --- Manager.cpp | 71 ++++++++++++++++--- Manager.h | 4 ++ RTT.pro | 6 +- .../src/LocationPermissionController.java | 18 ++--- _android/src/RTT.java | 40 +++++++++-- main.qml | 5 ++ 6 files changed, 121 insertions(+), 23 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 1883c11..45d1ce3 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -7,12 +7,29 @@ #include #include #include +#include +#include + +#include +#include +#include const std::string NUC1 = "38:de:ad:6d:77:25"; const std::string NUC2 = "38:de:ad:6d:60:ff"; const std::string NUC3 = "1c:1b:b5:ef:a2:9a"; const std::string NUC4 = "1c:1b:b5:ec:d1:82"; + +static QString GetCurrentTimeForFileName() +{ + auto time = std::time(nullptr); + std::stringstream ss; + ss << std::put_time(std::localtime(&time), "%F_%T"); // ISO 8601 without timezone information. + auto s = ss.str(); + std::replace(s.begin(), s.end(), ':', '-'); + return QString::fromStdString(s); +} + Manager::Manager() { @@ -20,6 +37,26 @@ Manager::Manager() { void Manager::trigger() { + QString folder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/ftm/"; + + dataLogger = std::make_shared(folder+"/ftm_"+GetCurrentTimeForFileName()+".txt"); + + if (!dataLogger->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 (!dataLogger->open(QIODevice::ReadWrite)) { + qWarning() << "Failed to create data logger file" << dataLogger->fileName(); + dataLogger = nullptr; + } + #ifdef ANDROID QAndroidJniObject::callStaticMethod("android/net/wifi/RTT", "start", "()I"); @@ -27,22 +64,32 @@ void Manager::trigger() { #else //onData("38:de:ad:6d:77:25;FAILED"); - onData(NUC1+";6230;1231"); - onData(NUC2+";3430;3423"); - onData(NUC3+";5630;2341"); - onData(NUC4+";8830;2241"); + onData("1337;"+NUC1+";6230;1231"); + onData("1337;"+NUC2+";3430;3423"); + onData("1337;"+NUC3+";5630;2341"); + onData("1337;"+NUC4+";8830;2241"); #endif +} +void Manager::stop() { +#ifdef ANDROID + QAndroidJniObject::callStaticMethod("android/net/wifi/RTT", "stop", "()I"); +#endif - - + dataLogger->flush(); + dataLogger->close(); } void Manager::onData(std::string str) { qDebug() << QString(str.c_str()); + if (dataLogger) { + dataLogger->write(str.c_str()); + dataLogger->write("\n"); + } + std::stringstream lineStream(str); std::string cell; @@ -57,6 +104,10 @@ void Manager::onData(std::string str) { switch(i) { case 0: { + + break; + } + case 1: { if(NUC1 == cell) {distIndex = 0;} if(NUC2 == cell) {distIndex = 1;} if(NUC3 == cell) {distIndex = 2;} @@ -64,7 +115,7 @@ void Manager::onData(std::string str) { break; } - case 1: { + case 2: { if ("FAILED" == cell) { _dist[distIndex] = 0; } else { @@ -74,11 +125,15 @@ void Manager::onData(std::string str) { break; } - case 2: { + case 3: { _stdDev[distIndex] = atoi(cell.c_str()); break; } + case 4: { + // RSSI + } + } ++i; } diff --git a/Manager.h b/Manager.h index a84958d..c24d1bf 100644 --- a/Manager.h +++ b/Manager.h @@ -2,6 +2,7 @@ #define MANAGER_H #include +#include class Manager : public QObject { @@ -12,6 +13,8 @@ private: float _dist[4]; float _stdDev[4]; + std::shared_ptr dataLogger; + public: Q_PROPERTY(float dist1 READ getDist1() NOTIFY distChanged) @@ -26,6 +29,7 @@ public: Q_INVOKABLE void trigger(); + Q_INVOKABLE void stop(); void onData(std::string str); diff --git a/RTT.pro b/RTT.pro index 2203fb9..67670db 100644 --- a/RTT.pro +++ b/RTT.pro @@ -1,5 +1,8 @@ QT += quick -QT += androidextras + +android { + QT += androidextras +} CONFIG += c++11 # The following define makes your compiler emit warnings if you use @@ -28,6 +31,7 @@ OTHER_FILES += \ # use files in ./_android for the project as well ANDROID_PACKAGE_SOURCE_DIR = $$PWD/_android +#ANDROID_PACKAGE_SOURCE_DIR = # Additional import path used to resolve QML modules in Qt Creator's code model diff --git a/_android/src/LocationPermissionController.java b/_android/src/LocationPermissionController.java index ae59b39..74df8ee 100644 --- a/_android/src/LocationPermissionController.java +++ b/_android/src/LocationPermissionController.java @@ -1,14 +1,14 @@ package de.plinzen.android.rttmanager.permission; -import android.Manifest; -import android.app.Activity; -import android.content.Context; -import android.content.pm.PackageManager; -import android.support.annotation.NonNull; -//import android.support.design.widget.Snackbar; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.view.View; +//import android.Manifest; +//import android.app.Activity; +//import android.content.Context; +//import android.content.pm.PackageManager; +//import android.support.annotation.NonNull; +////import android.support.design.widget.Snackbar; +//import android.support.v4.app.ActivityCompat; +//import android.support.v4.content.ContextCompat; +//import android.view.View; //import de.plinzen.android.rttmanager.R; diff --git a/_android/src/RTT.java b/_android/src/RTT.java index d3ab95f..41dcd9c 100644 --- a/_android/src/RTT.java +++ b/_android/src/RTT.java @@ -5,6 +5,8 @@ import android.app.Activity; import android.util.Log; import android.content.Context; +import java.lang.System; + import java.util.List; import java.util.ArrayList; @@ -30,6 +32,8 @@ public class RTT { private static Activity act; private static WifiRttManager rttManager; private static Executor mainExecutor; + private static Thread ftmThread; + private static boolean ftmRunning; // called when a RTT is completed successfully public static native void onRTTComplete(final byte[] result); @@ -68,16 +72,27 @@ public class RTT { private static byte[] serialize(final RangingResult res) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { - char delim = ';'; + boolean success = res.getStatus() == RangingResult.STATUS_SUCCESS; + + if (success) { + baos.write(("" + res.getRangingTimestampMillis()).getBytes()); + baos.write(delim); + } else { + baos.write(("" + System.currentTimeMillis()).getBytes()); + baos.write(delim); + } baos.write(res.getMacAddress().toString().getBytes()); baos.write(delim); - if (res.getStatus() == RangingResult.STATUS_SUCCESS) { + if (success) { baos.write( ("" + res.getDistanceMm()).getBytes() ); baos.write(delim); baos.write( ("" + res.getDistanceStdDevMm()).getBytes() ); + baos.write(delim); + baos.write( ("" + res.getRssi()).getBytes() ); + } else { baos.write( "FAILED".getBytes() ); } @@ -89,6 +104,9 @@ public class RTT { public static int start() { + if (ftmRunning) + return 0; + Log.d("RTT", "start()"); MyActivity act = MyActivity.act; @@ -102,20 +120,32 @@ public class RTT { macs.add(MacAddress.fromString("1c:1b:b5:ef:a2:9a")); // NUC 3 macs.add(MacAddress.fromString("1c:1b:b5:ec:d1:82")); // NUC 4 - new Thread() { + ftmRunning = true; + + ftmThread = new Thread() { public void run() { - while(true) { + while(ftmRunning) { try { Thread.sleep(200); } catch (Exception e) {;} startRangingOnMacs(macs); } } - }.start(); + }; + ftmThread.start(); return 1337; + } + public static int stop() { + Log.d("RTT", "stop()"); + + if (ftmRunning) { + ftmRunning = false; + } + + return 1337*2; } public static void startRangingOnMacs(final ArrayList macs) { diff --git a/main.qml b/main.qml index dbcca1e..6618ebe 100644 --- a/main.qml +++ b/main.qml @@ -52,6 +52,11 @@ Window { onClicked: mgmt.trigger(); } + Button { + text: "stop" + onClicked: mgmt.stop(); + } + } Canvas {