Histogram implementation
This commit is contained in:
235
Manager.cpp
235
Manager.cpp
@@ -9,7 +9,8 @@
|
||||
#include <sstream>
|
||||
#include <chrono>
|
||||
#include <iomanip>
|
||||
#include <thread>>
|
||||
#include <thread>
|
||||
#include <random>
|
||||
|
||||
#include <QStandardPaths>
|
||||
#include <QtGlobal>
|
||||
@@ -23,6 +24,7 @@ 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";
|
||||
const std::string NUC5 = "d0:c6:37:bc:5c:41";
|
||||
|
||||
static long long startTime = 0;
|
||||
|
||||
@@ -49,178 +51,81 @@ Manager::Manager() {
|
||||
|
||||
}
|
||||
|
||||
void Manager::test() {
|
||||
|
||||
void Manager::trigger() {
|
||||
}
|
||||
|
||||
QString folder = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + "/ftm/";
|
||||
|
||||
QString prefix = GetCurrentTimeForFileName();
|
||||
|
||||
dataLogger = std::make_shared<QFile>(folder+"/"+prefix+"_ftm.txt");
|
||||
uwbLogger = std::make_shared<QFile>(folder+"/"+prefix+"_uwb.txt");
|
||||
gtLogger = std::make_shared<QFile>(folder+"/"+prefix+"_gt.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;
|
||||
}
|
||||
|
||||
if (!uwbLogger->open(QIODevice::ReadWrite)) {
|
||||
qWarning() << "Failed to create uwb data logger file" << uwbLogger->fileName();
|
||||
uwbLogger = nullptr;
|
||||
bool Manager::trigger() {
|
||||
if (isRunning) {
|
||||
stop();
|
||||
} else {
|
||||
start();
|
||||
}
|
||||
|
||||
if (!gtLogger->open(QIODevice::ReadWrite)) {
|
||||
qWarning() << "Failed to create gt data logger file" << gtLogger->fileName();
|
||||
gtLogger = nullptr;
|
||||
}
|
||||
return isRunning;
|
||||
}
|
||||
|
||||
void Manager::start() {
|
||||
startTime = nowInMsec();
|
||||
|
||||
#ifdef ANDROID
|
||||
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "start", "()I");
|
||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I");
|
||||
|
||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "start", "()I");
|
||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "start", "()I");
|
||||
|
||||
|
||||
isRunning = true;
|
||||
#else
|
||||
std::random_device rd;
|
||||
std::mt19937 gen{rd()};
|
||||
std::normal_distribution<float> d{5000,1000};
|
||||
//std::uniform_real<float> d{0, 500};
|
||||
|
||||
//onData("38:de:ad:6d:77:25;FAILED");
|
||||
onData("1337;"+NUC1+";6230;1231");
|
||||
onData("1337;"+NUC2+";3430;3423");
|
||||
onData("1337;"+NUC3+";5630;2341");
|
||||
onData("1337;"+NUC4+";8830;2241");
|
||||
WifiRttResult res;
|
||||
res.success = 1;
|
||||
res.mac = NUC1;
|
||||
res.numAttemptedMeas = 8;
|
||||
res.numSuccessfullMeas = 8;
|
||||
|
||||
for(int n=0; n<1000; ++n) {
|
||||
res.timeMS = nowInMsec();
|
||||
res.distMM = static_cast<int>(std::round(d(gen)));
|
||||
|
||||
onWifiData(res);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void Manager::stop() {
|
||||
#ifdef ANDROID
|
||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/RTT", "stop", "()I");
|
||||
QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "stop", "()I");
|
||||
//QAndroidJniObject::callStaticMethod<int>("android/net/wifi/UWB", "stop", "()I");
|
||||
#endif
|
||||
|
||||
dataLogger->flush();
|
||||
dataLogger->close();
|
||||
|
||||
uwbLogger->flush();
|
||||
uwbLogger->close();
|
||||
|
||||
gtLogger->flush();
|
||||
gtLogger->close();
|
||||
isRunning = false;
|
||||
}
|
||||
|
||||
int Manager::runTimeInMs() const {
|
||||
return static_cast<int>(nowInMsec() - startTime);
|
||||
}
|
||||
|
||||
void Manager::manualCheckpoint() {
|
||||
qDebug() << "Manual checkpoint";
|
||||
|
||||
long long timestamp = nowInMsec();
|
||||
timestamp -= startTime;
|
||||
|
||||
QTextStream out(gtLogger.get());
|
||||
|
||||
out << timestamp << endl;
|
||||
}
|
||||
|
||||
void Manager::onData(std::string str) {
|
||||
void Manager::onWifiData(WifiRttResult result) {
|
||||
qDebug() << result;
|
||||
|
||||
qDebug() << QString(str.c_str());
|
||||
if (result.success == 1 && result.numSuccessfullMeas > 3) {
|
||||
int nucIdx = 0;
|
||||
|
||||
long long timestamp = nowInMsec();
|
||||
timestamp -= startTime;
|
||||
if(NUC1 == result.mac) {nucIdx = 0;}
|
||||
if(NUC2 == result.mac) {nucIdx = 1;}
|
||||
if(NUC3 == result.mac) {nucIdx = 2;}
|
||||
if(NUC4 == result.mac) {nucIdx = 3;}
|
||||
if(NUC5 == result.mac) {nucIdx = 4;}
|
||||
|
||||
bool successfullMeas = true;
|
||||
std::stringstream lineStream(str);
|
||||
std::string cell;
|
||||
|
||||
std::string mac;
|
||||
|
||||
int distIndex = 0;
|
||||
int i = 0;
|
||||
const float alpha = 0.7f;
|
||||
|
||||
QTextStream out(dataLogger.get());
|
||||
|
||||
out << timestamp << ";";
|
||||
|
||||
while (std::getline(lineStream, cell, ';')) {
|
||||
|
||||
switch(i) {
|
||||
|
||||
case 0: {
|
||||
// success flag
|
||||
successfullMeas = (cell == "1");
|
||||
|
||||
out << (successfullMeas ? 1 : 0) << ";";
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
// timestamp; ignore;
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
if(NUC1 == cell) {distIndex = 0;}
|
||||
if(NUC2 == cell) {distIndex = 1;}
|
||||
if(NUC3 == cell) {distIndex = 2;}
|
||||
if(NUC4 == cell) {distIndex = 3;}
|
||||
|
||||
out << QString(cell.c_str()) << ";";
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
if (successfullMeas) {
|
||||
_dist[distIndex] = std::stoi(cell) + _offset;
|
||||
//_dist[distIndex] = _dist[distIndex] * alpha + atoi(cell.c_str()) * (1-alpha);
|
||||
} else {
|
||||
_dist[distIndex] = 0;
|
||||
}
|
||||
|
||||
out << _dist[distIndex] << ";";
|
||||
break;
|
||||
}
|
||||
|
||||
case 4: {
|
||||
if (successfullMeas) {
|
||||
_stdDev[distIndex] = atoi(cell.c_str());
|
||||
} else {
|
||||
_stdDev[distIndex] = 0;
|
||||
}
|
||||
|
||||
out << _stdDev[distIndex] << ";";
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: {
|
||||
// RSSI
|
||||
|
||||
out << cell.c_str() << ";";
|
||||
break;
|
||||
}
|
||||
}
|
||||
++i;
|
||||
}
|
||||
|
||||
out << endl;
|
||||
|
||||
|
||||
// if (dataLogger && successfullMeas) {
|
||||
// dataLogger->write(str.c_str());
|
||||
// dataLogger->write("\n");
|
||||
// }
|
||||
|
||||
emit distChanged();
|
||||
emit newDistMeas(nucIdx, result.distMM);
|
||||
}
|
||||
}
|
||||
|
||||
void Manager::onUWBData(std::vector<uchar> data) {
|
||||
@@ -245,16 +150,9 @@ void Manager::onUWBData(std::vector<uchar> data) {
|
||||
case 0x863B: _uwbDist[2] = static_cast<float>(dist.distance); break;
|
||||
case 0x58B4: _uwbDist[3] = static_cast<float>(dist.distance); break;
|
||||
}
|
||||
|
||||
if (uwbLogger) {
|
||||
|
||||
QTextStream out(uwbLogger.get());
|
||||
|
||||
out << timestamp << ";" << "1;" << "DW" << hex << dist.nodeID << dec << ";" << dist.distance << endl;
|
||||
}
|
||||
}
|
||||
|
||||
emit distChanged();
|
||||
emit uwbDistChanged();
|
||||
}
|
||||
|
||||
Manager mgmt;
|
||||
@@ -262,19 +160,34 @@ Manager mgmt;
|
||||
#ifdef ANDROID
|
||||
extern "C" {
|
||||
|
||||
JNIEXPORT void JNICALL Java_android_net_wifi_RTT_onRTTComplete(JNIEnv* env, jobject jobj, jbyteArray arrayID) {
|
||||
(void) env; (void) jobj;
|
||||
jsize length = env->GetArrayLength(arrayID);
|
||||
jbyte* data = env->GetByteArrayElements(arrayID, 0);
|
||||
std::string str((char*)data, length);
|
||||
env->ReleaseByteArrayElements(arrayID, data, JNI_ABORT);
|
||||
mgmt.onData(str);
|
||||
}
|
||||
JNIEXPORT void JNICALL Java_android_net_wifi_RTT_onRttData(JNIEnv* env, jobject jobj, jint success, jbyteArray macString, jlong timeMS, jint distMM, jint distStdDevMM, jint numMeas, jint numSuccessfullMeas, jint rssi) {
|
||||
(void) env;
|
||||
(void) jobj;
|
||||
|
||||
jsize length = env->GetArrayLength(macString);
|
||||
jbyte* data = env->GetByteArrayElements(macString, nullptr);
|
||||
std::string str(reinterpret_cast<char*>(data), static_cast<std::string::size_type>(length));
|
||||
env->ReleaseByteArrayElements(macString, data, JNI_ABORT);
|
||||
|
||||
WifiRttResult result;
|
||||
result.success = success;
|
||||
result.mac = str;
|
||||
result.timeMS = timeMS;
|
||||
result.distMM = distMM;
|
||||
result.distStdDevMM = distStdDevMM;
|
||||
result.numAttemptedMeas = numMeas;
|
||||
result.numSuccessfullMeas = numSuccessfullMeas;
|
||||
result.rssi = rssi;
|
||||
|
||||
mgmt.onWifiData(result);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_android_net_wifi_UWB_onUWBComplete(JNIEnv* env, jobject jobj, jbyteArray arrayID) {
|
||||
(void) env; (void) jobj;
|
||||
(void) env;
|
||||
(void) jobj;
|
||||
|
||||
jsize length = env->GetArrayLength(arrayID);
|
||||
jbyte* data = env->GetByteArrayElements(arrayID, 0);
|
||||
jbyte* data = env->GetByteArrayElements(arrayID, nullptr);
|
||||
std::vector<uchar> c_data;
|
||||
c_data.assign(reinterpret_cast<char*>(data), reinterpret_cast<char*>(data)+length);
|
||||
env->ReleaseByteArrayElements(arrayID, data, JNI_ABORT);
|
||||
|
||||
Reference in New Issue
Block a user