fixed some issues
some new helper methods added listener-support to offline-reader
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "Splitter.h"
|
#include "Splitter.h"
|
||||||
#include "Sensors.h"
|
#include "Sensors.h"
|
||||||
|
#include "Listener.h"
|
||||||
|
|
||||||
#warning "adjust to to use the new splitter for all parsers [gps, compass, etc. already do!]"
|
#warning "adjust to to use the new splitter for all parsers [gps, compass, etc. already do!]"
|
||||||
|
|
||||||
@@ -49,6 +50,8 @@ namespace Offline {
|
|||||||
|
|
||||||
static constexpr char sep = ';';
|
static constexpr char sep = ';';
|
||||||
|
|
||||||
|
Listener* listener = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** empty ctor. call open() */
|
/** empty ctor. call open() */
|
||||||
@@ -62,7 +65,8 @@ namespace Offline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** open the given file */
|
/** open the given file */
|
||||||
void open(const std::string& file) {
|
void open(const std::string& file, Listener* listener = nullptr) {
|
||||||
|
this->listener = listener;
|
||||||
parse(file);
|
parse(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,20 +146,27 @@ namespace Offline {
|
|||||||
TS<LinearAccelerationData> elem(ts, LinearAccelerationData(std::stof(x), std::stof(y), std::stof(z)));
|
TS<LinearAccelerationData> elem(ts, LinearAccelerationData(std::stof(x), std::stof(y), std::stof(z)));
|
||||||
lin_acc.push_back(elem);
|
lin_acc.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::LIN_ACC, ts, lin_acc.size()-1));
|
entries.push_back(Entry(Sensor::LIN_ACC, ts, lin_acc.size()-1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseGravity(const uint64_t ts, const std::string& data){
|
void parseGravity(const uint64_t ts, const std::string& data){
|
||||||
|
|
||||||
|
GravityData gravData;
|
||||||
|
|
||||||
const auto pos1 = data.find(';');
|
const auto pos1 = data.find(';');
|
||||||
const auto pos2 = data.find(';', pos1+1);
|
const auto pos2 = data.find(';', pos1+1);
|
||||||
|
|
||||||
const std::string x = data.substr(0, pos1);
|
gravData.x = std::stof(data.substr(0, pos1));
|
||||||
const std::string y = data.substr(pos1+1, pos2-pos1-1);
|
gravData.y = std::stof(data.substr(pos1+1, pos2-pos1-1));
|
||||||
const std::string z = data.substr(pos2+1);
|
gravData.z = std::stof(data.substr(pos2+1));
|
||||||
|
|
||||||
TS<GravityData> elem(ts, GravityData(std::stof(x), std::stof(y), std::stof(z)));
|
TS<GravityData> elem(ts, gravData);
|
||||||
gravity.push_back(elem);
|
gravity.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::GRAVITY, ts, gravity.size()-1));
|
entries.push_back(Entry(Sensor::GRAVITY, ts, gravity.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onGravity(Timestamp::fromMS(ts), gravData);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseAccelerometer(const uint64_t ts, const std::string& data) {
|
void parseAccelerometer(const uint64_t ts, const std::string& data) {
|
||||||
@@ -167,10 +178,14 @@ namespace Offline {
|
|||||||
const std::string y = data.substr(pos1+1, pos2-pos1-1);
|
const std::string y = data.substr(pos1+1, pos2-pos1-1);
|
||||||
const std::string z = data.substr(pos2+1);
|
const std::string z = data.substr(pos2+1);
|
||||||
|
|
||||||
TS<AccelerometerData> elem(ts, AccelerometerData(std::stof(x), std::stof(y), std::stof(z)));
|
const AccelerometerData accData(std::stof(x), std::stof(y), std::stof(z));
|
||||||
|
TS<AccelerometerData> elem(ts, accData);
|
||||||
acc.push_back(elem);
|
acc.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::ACC, ts, acc.size()-1));
|
entries.push_back(Entry(Sensor::ACC, ts, acc.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onAccelerometer(Timestamp::fromMS(ts), accData);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseGyroscope(const uint64_t ts, const std::string& data) {
|
void parseGyroscope(const uint64_t ts, const std::string& data) {
|
||||||
@@ -182,10 +197,14 @@ namespace Offline {
|
|||||||
const std::string y = data.substr(pos1+1, pos2-pos1-1);
|
const std::string y = data.substr(pos1+1, pos2-pos1-1);
|
||||||
const std::string z = data.substr(pos2+1);
|
const std::string z = data.substr(pos2+1);
|
||||||
|
|
||||||
TS<GyroscopeData> elem(ts, GyroscopeData(std::stof(x), std::stof(y), std::stof(z)));
|
const GyroscopeData gyroData(std::stof(x), std::stof(y), std::stof(z));
|
||||||
|
TS<GyroscopeData> elem(ts, gyroData);
|
||||||
gyro.push_back(elem);
|
gyro.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::GYRO, ts, gyro.size()-1));
|
entries.push_back(Entry(Sensor::GYRO, ts, gyro.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onGyroscope(Timestamp::fromMS(ts), gyroData);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseWiFi(const uint64_t ts, const std::string& data) {
|
void parseWiFi(const uint64_t ts, const std::string& data) {
|
||||||
@@ -210,6 +229,9 @@ namespace Offline {
|
|||||||
this->wifi.push_back(TS<WiFiMeasurements>(ts, wifi));
|
this->wifi.push_back(TS<WiFiMeasurements>(ts, wifi));
|
||||||
entries.push_back(Entry(Sensor::WIFI, ts, this->wifi.size()-1));
|
entries.push_back(Entry(Sensor::WIFI, ts, this->wifi.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onWiFi(Timestamp::fromMS(ts), wifi);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseBeacons(const uint64_t ts, const std::string& data) {
|
void parseBeacons(const uint64_t ts, const std::string& data) {
|
||||||
@@ -250,6 +272,9 @@ namespace Offline {
|
|||||||
barometer.push_back(elem);
|
barometer.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::BARO, ts, barometer.size()-1));
|
entries.push_back(Entry(Sensor::BARO, ts, barometer.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onBarometer(Timestamp::fromMS(ts), baro);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseCompass(const uint64_t ts, const std::string& data) {
|
void parseCompass(const uint64_t ts, const std::string& data) {
|
||||||
@@ -264,6 +289,9 @@ namespace Offline {
|
|||||||
this->compass.push_back(elem);
|
this->compass.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::COMPASS, ts, this->compass.size()-1));
|
entries.push_back(Entry(Sensor::COMPASS, ts, this->compass.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onCompass(Timestamp::fromMS(ts), compass);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** parse the given GPS entry */
|
/** parse the given GPS entry */
|
||||||
@@ -282,6 +310,8 @@ namespace Offline {
|
|||||||
this->gps.push_back(elem);
|
this->gps.push_back(elem);
|
||||||
entries.push_back(Entry(Sensor::GPS, ts, this->gps.size()-1));
|
entries.push_back(Entry(Sensor::GPS, ts, this->gps.size()-1));
|
||||||
|
|
||||||
|
// inform listener
|
||||||
|
if (listener) {listener->onGPS(Timestamp::fromMS(ts), gps);}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace Offline {
|
|||||||
|
|
||||||
virtual void onGyroscope(const Timestamp ts, const GyroscopeData data) = 0;
|
virtual void onGyroscope(const Timestamp ts, const GyroscopeData data) = 0;
|
||||||
virtual void onAccelerometer(const Timestamp ts, const AccelerometerData data) = 0;
|
virtual void onAccelerometer(const Timestamp ts, const AccelerometerData data) = 0;
|
||||||
virtual void onGravity(const Timestamp ts, const AccelerometerData data) = 0;
|
virtual void onGravity(const Timestamp ts, const GravityData data) = 0;
|
||||||
virtual void onWiFi(const Timestamp ts, const WiFiMeasurements data) = 0;
|
virtual void onWiFi(const Timestamp ts, const WiFiMeasurements data) = 0;
|
||||||
virtual void onBarometer(const Timestamp ts, const BarometerData data) = 0;
|
virtual void onBarometer(const Timestamp ts, const BarometerData data) = 0;
|
||||||
virtual void onGPS(const Timestamp ts, const GPSData data) = 0;
|
virtual void onGPS(const Timestamp ts, const GPSData data) = 0;
|
||||||
|
|||||||
@@ -22,6 +22,16 @@ struct WiFiMeasurements {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** get the measurements for the given MAC [if available] otherwise null */
|
||||||
|
WiFiMeasurement* getForMac(const MACAddress& mac) {
|
||||||
|
for (WiFiMeasurement& m : entries) {
|
||||||
|
if (m.getAP().getMAC() == mac) {
|
||||||
|
return &m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WIFIMEASUREMENTS_H
|
#endif // WIFIMEASUREMENTS_H
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class WiFiObserverFree : public WiFiProbability {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
const float sigma = 8.0f;
|
const float sigma;
|
||||||
|
|
||||||
const float sigmaPerSecond = 3.0f;
|
const float sigmaPerSecond = 3.0f;
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ public:
|
|||||||
const Timestamp age = curTime - entry.getTimestamp();
|
const Timestamp age = curTime - entry.getTimestamp();
|
||||||
|
|
||||||
Assert::isTrue(age.ms() >= 0, "found a negative wifi measurement age. this does not make sense");
|
Assert::isTrue(age.ms() >= 0, "found a negative wifi measurement age. this does not make sense");
|
||||||
//Assert::isTrue(age.ms() <= 40000, "found a 40 second old wifi measurement. maybe there is a coding error?");
|
Assert::isTrue(age.ms() <= 60000, "found a 60 second old wifi measurement. maybe there is a coding error?");
|
||||||
|
|
||||||
// sigma grows with measurement age
|
// sigma grows with measurement age
|
||||||
const float sigma = this->sigma + this->sigmaPerSecond * age.sec();
|
const float sigma = this->sigma + this->sigmaPerSecond * age.sec();
|
||||||
|
|||||||
@@ -60,12 +60,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** load AP information from the floorplan. use the given fixed TXP/EXP/WAF for all APs */
|
/** load AP information from the floorplan. use the given fixed TXP/EXP/WAF for all APs */
|
||||||
void loadAPs(const Floorplan::IndoorMap* map, const float txp = -40.0f, const float exp = 2.5f, const float waf = -8.0f) {
|
void loadAPs(const Floorplan::IndoorMap* map, const float txp = -40.0f, const float exp = 2.5f, const float waf = -8.0f, const bool assertSafe = true) {
|
||||||
|
|
||||||
for (const Floorplan::Floor* floor : map->floors) {
|
for (const Floorplan::Floor* floor : map->floors) {
|
||||||
for (const Floorplan::AccessPoint* ap : floor->accesspoints) {
|
for (const Floorplan::AccessPoint* ap : floor->accesspoints) {
|
||||||
const APEntry ape(ap->getPos(floor), txp, exp, waf);
|
const APEntry ape(ap->getPos(floor), txp, exp, waf);
|
||||||
addAP(MACAddress(ap->mac), ape);
|
addAP(MACAddress(ap->mac), ape, assertSafe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,15 @@ struct WiFiFingerprint {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** get all measurements for the given MAC */
|
||||||
|
std::vector<WiFiMeasurement> getAllForMAC(const MACAddress& mac) const {
|
||||||
|
std::vector<WiFiMeasurement> res;
|
||||||
|
for (const WiFiMeasurement& m : measurements.entries) {
|
||||||
|
if (m.getAP().getMAC() == mac) {res.push_back(m);}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
/** serialize */
|
/** serialize */
|
||||||
void write(std::ostream& out) const {
|
void write(std::ostream& out) const {
|
||||||
out << "pos: " << pos_m.x << " " << pos_m.y << " " << pos_m.z << "\n";
|
out << "pos: " << pos_m.x << " " << pos_m.y << " " << pos_m.z << "\n";
|
||||||
|
|||||||
@@ -15,22 +15,37 @@ class WiFiFingerprints {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** the file to save the calibration model to */
|
// /** the file to save the calibration model to */
|
||||||
std::string file;
|
// std::string file;
|
||||||
|
|
||||||
/** all fingerprints (position -> measurements) within the model */
|
/** all fingerprints (position -> measurements) within the model */
|
||||||
std::vector<WiFiFingerprint> fingerprints;
|
std::vector<WiFiFingerprint> fingerprints;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
WiFiFingerprints(const std::string& file) : file(file) {
|
/** empty ctor */
|
||||||
load();
|
WiFiFingerprints() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ctor from file */
|
||||||
|
WiFiFingerprints(const std::string& file) {
|
||||||
|
load(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<WiFiFingerprint>& getFingerprints() const {
|
const std::vector<WiFiFingerprint>& getFingerprints() const {
|
||||||
return fingerprints;
|
return fingerprints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<WiFiFingerprint>& getFingerprints() {
|
||||||
|
return fingerprints;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** attach the given fingerprint */
|
||||||
|
void add(const WiFiFingerprint& fp) {
|
||||||
|
fingerprints.push_back(fp);
|
||||||
|
}
|
||||||
|
|
||||||
/** get all fingerprints that measured exactly the given mac [no VAP grouping] */
|
/** get all fingerprints that measured exactly the given mac [no VAP grouping] */
|
||||||
const std::vector<WiFiFingerprint> getFingerprintsFor(const MACAddress& mac) const {
|
const std::vector<WiFiFingerprint> getFingerprintsFor(const MACAddress& mac) const {
|
||||||
|
|
||||||
@@ -58,7 +73,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** deserialize the model */
|
/** deserialize the model */
|
||||||
void load() {
|
void load(const std::string& file) {
|
||||||
|
|
||||||
// open and check
|
// open and check
|
||||||
std::ifstream inp(file.c_str());
|
std::ifstream inp(file.c_str());
|
||||||
@@ -87,7 +102,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
/** serialize the model */
|
/** serialize the model */
|
||||||
void save() {
|
void save(const std::string& file) {
|
||||||
|
|
||||||
// open and check
|
// open and check
|
||||||
std::ofstream out(file.c_str());
|
std::ofstream out(file.c_str());
|
||||||
|
|||||||
Reference in New Issue
Block a user