forked from starchimpsgroup/GPS-Tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gpstracker.cpp
105 lines (90 loc) · 2.68 KB
/
gpstracker.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "gpstracker.h"
// Konstruktor mit Parameter
GPSTracker::GPSTracker(QObject *parent) :
QObject(parent) {
geoPositionInfoSource = QGeoPositionInfoSource::createDefaultSource(this);
// emit funktioniert erst nach dem Konstruktor
if(geoPositionInfoSource) {
connect(geoPositionInfoSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
this, SLOT(positionUpdated(QGeoPositionInfo)));
connect(geoPositionInfoSource, SIGNAL(updateTimeout()),
this, SLOT(updateTimeout()));
changeGPSStatus(INACTIVE);
} else {
changeGPSStatus(ERROR);
}
trackingInterval = 500;
tracking = false;
}
GPSTracker::~GPSTracker() {
delete geoPositionInfoSource;
}
void GPSTracker::startTracking() {
startGPS();
if(isGPSActiv()) {
tracking = true;
}
}
void GPSTracker::stopTracking() {
tracking = false;
}
void GPSTracker::setTrackingInterval(int msec) {
if(geoPositionInfoSource) {
geoPositionInfoSource->setUpdateInterval(msec);
trackingInterval = geoPositionInfoSource->updateInterval();
} else {
trackingInterval = msec;
}
}
void GPSTracker::recordActualPosition() {
if(isGPSActiv() && geoPositionInfoSource) {
geoPositionInfoSource->requestUpdate(); // richtig?
addPosition(geoPositionInfoSource->lastKnownPosition());
}
}
void GPSTracker::startGPS() {
if(geoPositionInfoSource) {
if(!isGPSActiv()){
setTrackingInterval(trackingInterval);
geoPositionInfoSource->startUpdates();
changeGPSStatus(ACTIVE);
}
} else {
changeGPSStatus(ERROR);
}
}
void GPSTracker::stopGPS() {
if(isGPSActiv()) {
geoPositionInfoSource->stopUpdates();
changeGPSStatus(INACTIVE);
}
}
bool GPSTracker::isGPSActiv() {
return gpsStatus == ACTIVE || gpsStatus == RECEIVE || gpsStatus == TIMEOUT;
}
void GPSTracker::changeGPSStatus(GPSStatus status) {
gpsStatus = status;
emit gpsStatusChanged(status);
}
void GPSTracker::positionUpdated(QGeoPositionInfo position) {
if(tracking){
addPosition(position);
}
emit positionUpdated(Point(position));
horizontalAccuracy = position.attribute(QGeoPositionInfo::HorizontalAccuracy);
verticalAccuracy = position.attribute(QGeoPositionInfo::VerticalAccuracy);
changeGPSStatus(RECEIVE);
}
void GPSTracker::addPosition(QGeoPositionInfo position) {
Point point(position);
if(points.rowCount() > 0){
if(!points.last().equals(point)) {
points.addPoint(point);
}
} else {
points.addPoint(point);
}
}
void GPSTracker::updateTimeout() {
changeGPSStatus(TIMEOUT);
}