fixed some compiler warnings
added equality checks to sensor-data classes more robust sensor reader [fixed some issues] added support for gps added support for compass added sensor-data-writer added test-cases minor changes
This commit is contained in:
@@ -12,8 +12,14 @@
|
||||
#include "../radio/WiFiMeasurements.h"
|
||||
#include "../imu/AccelerometerData.h"
|
||||
#include "../imu/GyroscopeData.h"
|
||||
#include "../imu/CompassData.h"
|
||||
#include "../gps/GPSData.h"
|
||||
#include "../pressure/BarometerData.h"
|
||||
|
||||
#include "Splitter.h"
|
||||
#include "Listener.h"
|
||||
#include "Sensors.h"
|
||||
|
||||
template <typename SensorData> struct OfflineEntry {
|
||||
|
||||
Timestamp ts;
|
||||
@@ -35,20 +41,12 @@ struct WalkedPath {
|
||||
};
|
||||
|
||||
|
||||
/** listener for event callbacks */
|
||||
class OfflineAndroidListener {
|
||||
public:
|
||||
virtual void onGyroscope(const Timestamp ts, const GyroscopeData data) = 0;
|
||||
virtual void onAccelerometer(const Timestamp ts, const AccelerometerData data) = 0;
|
||||
virtual void onGravity(const Timestamp ts, const AccelerometerData data) = 0;
|
||||
virtual void onWiFi(const Timestamp ts, const WiFiMeasurements data) = 0;
|
||||
virtual void onBarometer(const Timestamp ts, const BarometerData data) = 0;
|
||||
};
|
||||
|
||||
/** read recorded android sensor data files */
|
||||
/**
|
||||
* read sensor data files that were recorded using
|
||||
* the old java android app
|
||||
*/
|
||||
class OfflineAndroid {
|
||||
|
||||
|
||||
private:
|
||||
|
||||
std::vector<OfflineEntry<WiFiMeasurements>> wifi;
|
||||
@@ -57,11 +55,15 @@ private:
|
||||
|
||||
std::vector<OfflineEntry<AccelerometerData>> accel;
|
||||
std::vector<OfflineEntry<AccelerometerData>> gravity;
|
||||
std::vector<OfflineEntry<CompassData>> compass;
|
||||
|
||||
std::vector<OfflineEntry<BarometerData>> barometer;
|
||||
|
||||
std::vector<OfflineEntry<GPSData>> gps;
|
||||
|
||||
WalkedPath walkedPath;
|
||||
|
||||
static constexpr char sep = ';';
|
||||
const char* name = "OfflineData";
|
||||
|
||||
public:
|
||||
@@ -89,6 +91,12 @@ public:
|
||||
/** get all barometer readings */
|
||||
const std::vector<OfflineEntry<BarometerData>>& getBarometer() const {return barometer;}
|
||||
|
||||
/** get all compass readings */
|
||||
const std::vector<OfflineEntry<CompassData>>& getCompass() const {return compass;}
|
||||
|
||||
/** get all gps readings */
|
||||
const std::vector<OfflineEntry<GPSData>>& getGPS() const {return gps;}
|
||||
|
||||
|
||||
/** get the walked path */
|
||||
const WalkedPath& getWalkedPath() const {return walkedPath;}
|
||||
@@ -105,7 +113,7 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
void parse(const std::string& file, OfflineAndroidListener* listener = nullptr) {
|
||||
void parse(const std::string& file, Offline::Listener* listener = nullptr) {
|
||||
|
||||
Log::add(name, "parsing data file: " + file , false);
|
||||
Log::tick();
|
||||
@@ -152,47 +160,61 @@ public:
|
||||
private:
|
||||
|
||||
/** parse the given data */
|
||||
void parse(const Timestamp ts, const int32_t sensorID, const std::string& sensorData, OfflineAndroidListener* listener) {
|
||||
void parse(const Timestamp ts, const int32_t sensorID, const std::string& sensorData, Offline::Listener* listener) {
|
||||
|
||||
// how to parse
|
||||
switch(sensorID) {
|
||||
|
||||
case 0: {
|
||||
case (int) Offline::Sensor::ACC: {
|
||||
const AccelerometerData data = parseAccelerometer(sensorData);
|
||||
accel.push_back(OfflineEntry<AccelerometerData>(ts, data));
|
||||
if (listener) {listener->onAccelerometer(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 1: {
|
||||
case (int) Offline::Sensor::GRAVITY: {
|
||||
const AccelerometerData data = parseAccelerometer(sensorData);
|
||||
gravity.push_back(OfflineEntry<AccelerometerData>(ts, data));
|
||||
if (listener) {listener->onGravity(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
case (int) Offline::Sensor::GYRO: {
|
||||
const GyroscopeData data = parseGyroscope(sensorData);
|
||||
gyro.push_back(OfflineEntry<GyroscopeData>(ts, data));
|
||||
if (listener) {listener->onGyroscope(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: {
|
||||
case (int) Offline::Sensor::BARO: {
|
||||
const BarometerData data = parseBarometer(sensorData);
|
||||
barometer.push_back(OfflineEntry<BarometerData>(ts, data));
|
||||
if (listener) {listener->onBarometer(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 8: {
|
||||
case (int) Offline::Sensor::WIFI: {
|
||||
const WiFiMeasurements data = parseWiFi(ts, sensorData);
|
||||
wifi.push_back(OfflineEntry<WiFiMeasurements>(ts, data));
|
||||
if (listener) {listener->onWiFi(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 99: {
|
||||
case (int) Offline::Sensor::COMPASS: {
|
||||
const CompassData data = parseCompass(sensorData);
|
||||
compass.push_back(OfflineEntry<CompassData>(ts, data));
|
||||
if (listener) {listener->onCompass(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case (int) Offline::Sensor::GPS: {
|
||||
const GPSData data = parseGPS(sensorData);
|
||||
gps.push_back(OfflineEntry<GPSData>(ts, data));
|
||||
if (listener) {listener->onGPS(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case (int) Offline::Sensor::GROUND_TRUTH: {
|
||||
const GroundTruthID data = parseGroundTruthTick(sensorData);
|
||||
groundTruth.push_back(OfflineEntry<GroundTruthID>(ts, data));
|
||||
// TODO listener
|
||||
@@ -326,6 +348,35 @@ private:
|
||||
|
||||
}
|
||||
|
||||
/** parse the given Compass entry */
|
||||
static inline CompassData parseCompass(const std::string& data) {
|
||||
|
||||
CompassData compass;
|
||||
Splitter s(data, sep);
|
||||
|
||||
compass.azimuth = s.has(0) ? (s.getFloat(0)) : (NAN);
|
||||
compass.quality01 = s.has(1) ? (s.getFloat(1)) : (NAN);
|
||||
|
||||
return compass;
|
||||
|
||||
}
|
||||
|
||||
/** parse the given GPS entry */
|
||||
static inline GPSData parseGPS(const std::string& data) {
|
||||
|
||||
GPSData gps;
|
||||
Splitter s(data, sep);
|
||||
|
||||
gps.lat = s.has(0) ? (s.getFloat(0)) : (NAN);
|
||||
gps.lon = s.has(1) ? (s.getFloat(1)) : (NAN);
|
||||
gps.alt = s.has(2) ? (s.getFloat(2)) : (NAN);
|
||||
gps.accuracy = s.has(3) ? (s.getFloat(3)) : (NAN);
|
||||
gps.speed = s.has(4) ? (s.getFloat(4)) : (NAN);
|
||||
|
||||
return gps;
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // OFFLINEANDROID_H
|
||||
|
||||
Reference in New Issue
Block a user