Added data logging

This commit is contained in:
2019-02-26 17:44:50 +01:00
parent 0032606d56
commit 799e563ff5
6 changed files with 121 additions and 23 deletions

View File

@@ -7,12 +7,29 @@
#include <iostream> #include <iostream>
#include <QDebug> #include <QDebug>
#include <sstream> #include <sstream>
#include <chrono>
#include <iomanip>
#include <QStandardPaths>
#include <QtGlobal>
#include <QDir>
const std::string NUC1 = "38:de:ad:6d:77:25"; const std::string NUC1 = "38:de:ad:6d:77:25";
const std::string NUC2 = "38:de:ad:6d:60:ff"; const std::string NUC2 = "38:de:ad:6d:60:ff";
const std::string NUC3 = "1c:1b:b5:ef:a2:9a"; const std::string NUC3 = "1c:1b:b5:ef:a2:9a";
const std::string NUC4 = "1c:1b:b5:ec:d1:82"; 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() { Manager::Manager() {
@@ -20,6 +37,26 @@ Manager::Manager() {
void Manager::trigger() { void Manager::trigger() {
QString folder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/ftm/";
dataLogger = std::make_shared<QFile>(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 #ifdef ANDROID
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I"); QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I");
@@ -27,22 +64,32 @@ void Manager::trigger() {
#else #else
//onData("38:de:ad:6d:77:25;FAILED"); //onData("38:de:ad:6d:77:25;FAILED");
onData(NUC1+";6230;1231"); onData("1337;"+NUC1+";6230;1231");
onData(NUC2+";3430;3423"); onData("1337;"+NUC2+";3430;3423");
onData(NUC3+";5630;2341"); onData("1337;"+NUC3+";5630;2341");
onData(NUC4+";8830;2241"); onData("1337;"+NUC4+";8830;2241");
#endif #endif
}
void Manager::stop() {
#ifdef ANDROID
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "stop", "()I");
#endif
dataLogger->flush();
dataLogger->close();
} }
void Manager::onData(std::string str) { void Manager::onData(std::string str) {
qDebug() << QString(str.c_str()); qDebug() << QString(str.c_str());
if (dataLogger) {
dataLogger->write(str.c_str());
dataLogger->write("\n");
}
std::stringstream lineStream(str); std::stringstream lineStream(str);
std::string cell; std::string cell;
@@ -57,6 +104,10 @@ void Manager::onData(std::string str) {
switch(i) { switch(i) {
case 0: { case 0: {
break;
}
case 1: {
if(NUC1 == cell) {distIndex = 0;} if(NUC1 == cell) {distIndex = 0;}
if(NUC2 == cell) {distIndex = 1;} if(NUC2 == cell) {distIndex = 1;}
if(NUC3 == cell) {distIndex = 2;} if(NUC3 == cell) {distIndex = 2;}
@@ -64,7 +115,7 @@ void Manager::onData(std::string str) {
break; break;
} }
case 1: { case 2: {
if ("FAILED" == cell) { if ("FAILED" == cell) {
_dist[distIndex] = 0; _dist[distIndex] = 0;
} else { } else {
@@ -74,11 +125,15 @@ void Manager::onData(std::string str) {
break; break;
} }
case 2: { case 3: {
_stdDev[distIndex] = atoi(cell.c_str()); _stdDev[distIndex] = atoi(cell.c_str());
break; break;
} }
case 4: {
// RSSI
}
} }
++i; ++i;
} }

View File

@@ -2,6 +2,7 @@
#define MANAGER_H #define MANAGER_H
#include <QObject> #include <QObject>
#include <QFile>
class Manager : public QObject { class Manager : public QObject {
@@ -12,6 +13,8 @@ private:
float _dist[4]; float _dist[4];
float _stdDev[4]; float _stdDev[4];
std::shared_ptr<QFile> dataLogger;
public: public:
Q_PROPERTY(float dist1 READ getDist1() NOTIFY distChanged) Q_PROPERTY(float dist1 READ getDist1() NOTIFY distChanged)
@@ -26,6 +29,7 @@ public:
Q_INVOKABLE void trigger(); Q_INVOKABLE void trigger();
Q_INVOKABLE void stop();
void onData(std::string str); void onData(std::string str);

View File

@@ -1,5 +1,8 @@
QT += quick QT += quick
QT += androidextras
android {
QT += androidextras
}
CONFIG += c++11 CONFIG += c++11
# The following define makes your compiler emit warnings if you use # 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 # use files in ./_android for the project as well
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/_android ANDROID_PACKAGE_SOURCE_DIR = $$PWD/_android
#ANDROID_PACKAGE_SOURCE_DIR =
# Additional import path used to resolve QML modules in Qt Creator's code model # Additional import path used to resolve QML modules in Qt Creator's code model

View File

@@ -1,14 +1,14 @@
package de.plinzen.android.rttmanager.permission; package de.plinzen.android.rttmanager.permission;
import android.Manifest; //import android.Manifest;
import android.app.Activity; //import android.app.Activity;
import android.content.Context; //import android.content.Context;
import android.content.pm.PackageManager; //import android.content.pm.PackageManager;
import android.support.annotation.NonNull; //import android.support.annotation.NonNull;
//import android.support.design.widget.Snackbar; ////import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat; //import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat; //import android.support.v4.content.ContextCompat;
import android.view.View; //import android.view.View;
//import de.plinzen.android.rttmanager.R; //import de.plinzen.android.rttmanager.R;

View File

@@ -5,6 +5,8 @@ import android.app.Activity;
import android.util.Log; import android.util.Log;
import android.content.Context; import android.content.Context;
import java.lang.System;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;
@@ -30,6 +32,8 @@ public class RTT {
private static Activity act; private static Activity act;
private static WifiRttManager rttManager; private static WifiRttManager rttManager;
private static Executor mainExecutor; private static Executor mainExecutor;
private static Thread ftmThread;
private static boolean ftmRunning;
// called when a RTT is completed successfully // called when a RTT is completed successfully
public static native void onRTTComplete(final byte[] result); public static native void onRTTComplete(final byte[] result);
@@ -68,16 +72,27 @@ public class RTT {
private static byte[] serialize(final RangingResult res) { private static byte[] serialize(final RangingResult res) {
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try { try {
char delim = ';'; 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(res.getMacAddress().toString().getBytes());
baos.write(delim); baos.write(delim);
if (res.getStatus() == RangingResult.STATUS_SUCCESS) { if (success) {
baos.write( ("" + res.getDistanceMm()).getBytes() ); baos.write( ("" + res.getDistanceMm()).getBytes() );
baos.write(delim); baos.write(delim);
baos.write( ("" + res.getDistanceStdDevMm()).getBytes() ); baos.write( ("" + res.getDistanceStdDevMm()).getBytes() );
baos.write(delim);
baos.write( ("" + res.getRssi()).getBytes() );
} else { } else {
baos.write( "FAILED".getBytes() ); baos.write( "FAILED".getBytes() );
} }
@@ -89,6 +104,9 @@ public class RTT {
public static int start() { public static int start() {
if (ftmRunning)
return 0;
Log.d("RTT", "start()"); Log.d("RTT", "start()");
MyActivity act = MyActivity.act; 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:ef:a2:9a")); // NUC 3
macs.add(MacAddress.fromString("1c:1b:b5:ec:d1:82")); // NUC 4 macs.add(MacAddress.fromString("1c:1b:b5:ec:d1:82")); // NUC 4
new Thread() { ftmRunning = true;
ftmThread = new Thread() {
public void run() { public void run() {
while(true) { while(ftmRunning) {
try { try {
Thread.sleep(200); Thread.sleep(200);
} catch (Exception e) {;} } catch (Exception e) {;}
startRangingOnMacs(macs); startRangingOnMacs(macs);
} }
} }
}.start(); };
ftmThread.start();
return 1337; return 1337;
}
public static int stop() {
Log.d("RTT", "stop()");
if (ftmRunning) {
ftmRunning = false;
}
return 1337*2;
} }
public static void startRangingOnMacs(final ArrayList<MacAddress> macs) { public static void startRangingOnMacs(final ArrayList<MacAddress> macs) {

View File

@@ -52,6 +52,11 @@ Window {
onClicked: mgmt.trigger(); onClicked: mgmt.trigger();
} }
Button {
text: "stop"
onClicked: mgmt.stop();
}
} }
Canvas { Canvas {