added gps support

added compass support
added ui elements for gps and compass
added support for writing sensor data
This commit is contained in:
2017-03-21 16:27:14 +01:00
parent c7c94cbebe
commit b0712ec005
24 changed files with 586 additions and 30 deletions

12
sensors/CompassSensor.h Normal file
View File

@@ -0,0 +1,12 @@
#ifndef COMPASSSENSOR_H
#define COMPASSSENSOR_H
#include "Sensor.h"
#include <Indoor/sensors/imu/CompassData.h>
class CompassSensor : public Sensor<CompassData> {
};
#endif // COMPASSSENSOR_H

11
sensors/GPSSensor.h Normal file
View File

@@ -0,0 +1,11 @@
#ifndef GPSSENSOR_H
#define GPSSENSOR_H
#include "Sensor.h"
#include <Indoor/sensors/gps/GPSData.h>
class GPSSensor : public Sensor<GPSData> {
};
#endif // GPSSENSOR_H

View File

@@ -20,6 +20,14 @@
#include "android/BarometerSensorAndroid.h"
#include "dummy/BarometerSensorDummy.h"
#include "GPSSensor.h"
#include "android/GPSSensorAndroid.h"
#include "dummy/GPSSensorDummy.h"
#include "CompassSensor.h"
#include "android/CompassSensorAndroid.h"
#include "dummy/CompassSensorDummy.h"
#include "StepSensor.h"
#include "TurnSensor.h"
#include "ActivitySensor.h"
@@ -39,13 +47,13 @@ public:
/** set the to-be-used sensor-fatory */
static void set(SensorFactory* fac) {
Assert::isNull(*getPtr(), "set() was already called. currentely this is not intended");
Assert::isNull(*getPtr(), "SensorFactory::set() was already called. currentely this is not intended");
*getPtr() = fac;
}
/** get the currently configured sensory factory */
static SensorFactory& get() {
Assert::isNotNull(*getPtr(), "call set() first to set an actual factory instance!");
Assert::isNotNull(*getPtr(), "call SensorFactory::set() first to set an actual factory instance!");
return **getPtr();
}
@@ -63,6 +71,13 @@ public:
/** get the Barometer sensor */
virtual BarometerSensor& getBarometer() = 0;
/** get the compass sensor */
virtual CompassSensor& getCompass() = 0;
/** get the gps sensor */
virtual GPSSensor& getGPS() = 0;
/** get the Step sensor */
StepSensor& getSteps() {
static StepSensor steps(getAccelerometer());

101
sensors/SensorWriter.h Normal file
View File

@@ -0,0 +1,101 @@
#ifndef SENSORWRITER_H
#define SENSORWRITER_H
#include "AccelerometerSensor.h"
#include "GyroscopeSensor.h"
#include "BarometerSensor.h"
#include "StepSensor.h"
#include "TurnSensor.h"
#include "WiFiSensor.h"
#include "ActivitySensor.h"
#include "GPSSensor.h"
#include "CompassSensor.h"
#include "SensorFactory.h"
#include <Indoor/sensors/offline/FileWriter.h>
/**
* receives live sensor data
* writes it to a file
*/
class SensorWriter :
public SensorListener<AccelerometerData>,
public SensorListener<GyroscopeData>,
public SensorListener<BarometerData>,
// public SensorListener<ActivityData>,
// public SensorListener<StepData>,
// public SensorListener<TurnData>,
public SensorListener<WiFiMeasurements>,
public SensorListener<GPSData>,
public SensorListener<CompassData> {
private:
Offline::FileWriter writer;
bool active = false;
public:
/** empty ctor */
SensorWriter() {
// attach as listener to all sensors we want to store
SensorFactory::get().getAccelerometer().addListener(this);
SensorFactory::get().getGyroscope().addListener(this);
SensorFactory::get().getBarometer().addListener(this);
// SensorFactory::get().getActivity().addListener(this);
// SensorFactory::get().getSteps().addListener(this);
// SensorFactory::get().getTurns().addListener(this);
SensorFactory::get().getWiFi().addListener(this);
SensorFactory::get().getCompass().addListener(this);
SensorFactory::get().getGPS().addListener(this);
}
void start(const std::string& file) {
writer.open(file);
active = true;
}
void stop() {
active = false;
writer.close();
}
public:
virtual void onSensorData(Sensor<AccelerometerData>* , const Timestamp ts, const AccelerometerData& data) override {
if (!active) {return;}
writer.add(ts, data);
}
virtual void onSensorData(Sensor<GyroscopeData>* , const Timestamp ts, const GyroscopeData& data) override {
if (!active) {return;}
writer.add(ts, data);
}
virtual void onSensorData(Sensor<BarometerData>* , const Timestamp ts, const BarometerData& data) override {
if (!active) {return;}
writer.add(ts, data);
}
virtual void onSensorData(Sensor<WiFiMeasurements>* , const Timestamp ts, const WiFiMeasurements& data) override {
if (!active) {return;}
writer.add(ts, data);
}
virtual void onSensorData(Sensor<GPSData>* , const Timestamp ts, const GPSData& data) override {
if (!active) {return;}
writer.add(ts, data);
}
virtual void onSensorData(Sensor<CompassData>* , const Timestamp ts, const CompassData& data) override {
if (!active) {return;}
writer.add(ts, data);
}
};
#endif // SENSORWRITER_H

View File

@@ -1,7 +1,6 @@
#ifndef ACCELEROMETERSENSORANDROID_H
#define ACCELEROMETERSENSORANDROID_H
#ifdef ANDROID
#include <sstream>

View File

@@ -0,0 +1,63 @@
#ifndef COMPASSSENSORANDROID_H
#define COMPASSSENSORANDROID_H
#ifdef ANDROID
#include <sstream>
#include "../CompassSensor.h"
#include <QtSensors/QCompass>
class CompassSensorAndroid : public CompassSensor {
private:
QCompass compass;
/** hidden ctor. use singleton */
CompassSensorAndroid() {
;
}
bool started = false;
public:
/** singleton access */
static CompassSensorAndroid& get() {
static CompassSensorAndroid compass;
return compass;
}
void start() override {
if (started) {return;}
started = true;
auto onSensorData = [&] () {
CompassData data(
compass.reading()->azimuth(),
compass.reading()->calibrationLevel()
);
informListeners(data);
};
compass.connect(&compass, &QCompass::readingChanged, onSensorData);
compass.start();
}
bool isRunning() const override {
return started;
}
void stop() override {
throw "TODO";
}
};
#endif
#endif // COMPASSSENSORANDROID_H

View File

@@ -0,0 +1,74 @@
#ifndef GPSSENSORANDROID_H
#define GPSSENSORANDROID_H
#ifdef ANDROID
#include <sstream>
#include "../GPSSensor.h"
#include <QtPositioning>
class GPSSensorAndroid : public GPSSensor {
private:
QGeoPositionInfoSource* source;
/** hidden ctor. use singleton */
GPSSensorAndroid() {
source = QGeoPositionInfoSource::createDefaultSource(nullptr);
return;
}
bool started = false;
public:
/** singleton access */
static GPSSensorAndroid& get() {
static GPSSensorAndroid gps;
return gps;
}
void start() override {
if (started) {return;}
started = true;
auto onPositionData = [&] (const QGeoPositionInfo& update) {
GPSData data(
//Timestamp::ms(update.timestamp().toMSecsSinceEpoch()),
Timestamp::fromRunningTime(),
update.coordinate().latitude(),
update.coordinate().longitude(),
update.coordinate().altitude()
);
informListeners(data);
};
if (source) {
source->connect(source, &QGeoPositionInfoSource::positionUpdated, onPositionData);
source->startUpdates();
}
}
bool isRunning() const override {
return started;
}
void stop() override {
throw "TODO";
}
};
#endif // ANDROID
#endif // GPSSENSORANDROID_H

View File

@@ -9,6 +9,8 @@
#include "AccelerometerSensorAndroid.h"
#include "GyroscopeSensorAndroid.h"
#include "BarometerSensorAndroid.h"
#include "CompassSensorAndroid.h"
#include "GPSSensorAndroid.h"
/**
* sensor factory that provides real hardware sensors from
@@ -34,6 +36,14 @@ public:
return BarometerSensorAndroid::get();
}
CompassSensor& getCompass() override {
return CompassSensorAndroid::get();
}
GPSSensor& getGPS() override {
return GPSSensorAndroid::get();
}
};
#endif

View File

@@ -0,0 +1,43 @@
#ifndef COMPASSSENSORDUMMY_H
#define COMPASSSENSORDUMMY_H
#include "../CompassSensor.h"
#include "RandomSensor.h"
#include <random>
class CompassSensorDummy : public RandomSensor<CompassData, CompassSensor> {
private:
std::thread thread;
/** hidden ctor */
CompassSensorDummy() : RandomSensor(Timestamp::fromMS(100)) {
;
}
public:
/** singleton access */
static CompassSensorDummy& get() {
static CompassSensorDummy compass;
return compass;
}
protected:
std::minstd_rand gen;
std::uniform_real_distribution<float> distNoise = std::uniform_real_distribution<float>(-0.07, +0.07);
CompassData getRandomEntry() override {
const Timestamp ts = Timestamp::fromRunningTime();
const float azimuth = 0 + std::sin(ts.sec()) * 0.5 + distNoise(gen);
return CompassData(azimuth);
}
};
#endif // COMPASSSENSORDUMMY_H

View File

@@ -0,0 +1,46 @@
#ifndef GPSSENSORDUMMY_H
#define GPSSENSORDUMMY_H
#include "../GPSSensor.h"
#include "RandomSensor.h"
#include <random>
class GPSSensorDummy : public RandomSensor<GPSData, GPSSensor> {
private:
std::thread thread;
/** hidden ctor */
GPSSensorDummy() : RandomSensor(Timestamp::fromMS(1000)) {
;
}
public:
/** singleton access */
static GPSSensorDummy& get() {
static GPSSensorDummy gps;
return gps;
}
protected:
std::minstd_rand gen;
std::uniform_real_distribution<float> distNoise = std::uniform_real_distribution<float>(-0.09, +0.09);
GPSData getRandomEntry() override {
const Timestamp ts = Timestamp::fromRunningTime();
const float lat = 49.7773992;
const float lon = 9.9627029;
const float alt = 100;
return GPSData(ts, lat, lon, alt);
}
};
#endif // GPSSENSORDUMMY_H

View File

@@ -7,6 +7,8 @@
#include "AccelerometerSensorDummy.h"
#include "GyroscopeSensorDummy.h"
#include "BarometerSensorDummy.h"
#include "GPSSensorDummy.h"
#include "CompassSensorDummy.h"
/**
* sensor factory that provides sensors that fire dummy data
@@ -31,6 +33,14 @@ public:
return BarometerSensorDummy::get();
}
CompassSensor& getCompass() override {
return CompassSensorDummy::get();
}
GPSSensor& getGPS() override {
return GPSSensorDummy::get();
}
};
#endif // SENSORFACTORYDUMMY_H

View File

@@ -7,11 +7,16 @@
#include "../AccelerometerSensor.h"
#include "../GyroscopeSensor.h"
#include "../BarometerSensor.h"
#include "../CompassSensor.h"
#include "../GPSSensor.h"
#include <Indoor/sensors/offline/OfflineAndroid.h>
#include <Indoor/sensors/offline/Listener.h>
class AllInOneSensor :
public WiFiSensor, public AccelerometerSensor, public GyroscopeSensor, public BarometerSensor,
public OfflineAndroidListener {
public CompassSensor, public GPSSensor,
public Offline::Listener {
private:
@@ -74,6 +79,18 @@ protected:
BarometerSensor::informListeners(ts, data);
}
virtual void onGPS(const Timestamp _ts, const GPSData data) override {
const Timestamp ts = relativeTS(_ts);
handbrake(ts);
GPSSensor::informListeners(ts, data);
}
virtual void onCompass(const Timestamp _ts, const CompassData data) override {
const Timestamp ts = relativeTS(_ts);
handbrake(ts);
CompassSensor::informListeners(ts, data);
}
private:
Timestamp baseTS;

View File

@@ -38,6 +38,14 @@ public:
return allInOne;
}
CompassSensor& getCompass() override {
return allInOne;
}
GPSSensor& getGPS() override {
return allInOne;
}
};
#endif // SENSORFACTORYOFFLINE_H