aboutsummaryrefslogtreecommitdiff
path: root/src/drone_controller.cc
blob: 2f1364e17bc46fee26b1f35a66cf91f11664be86 (plain)
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
106
107
108
109
110
111
112
113
#include "drone_controller.hh"

#include <QJsonArray>
#include <QDebug>


Waypoint::Waypoint(unsigned frame, QVector3D pos)
	:frame(frame),
	 pos(pos) {}


Waypoint::Waypoint(const QJsonObject &json)
	:Waypoint(json["frame"].toInt(),
			  QVector3D(json["position"]["lng_X"].toInt(),
						json["position"]["alt_Y"].toInt(),
						json["position"]["lat_Z"].toInt())) {}


Drone::Drone(const QJsonObject &json) {
	QJsonArray ja = json["waypoints"].toArray();
	waypoints.reserve(ja.size());
	for (const QJsonValue &o : ja) {
		waypoints.append(Waypoint(o.toObject()));
	}
}


const QVector<Waypoint> Drone::getWaypoints() const {
	return waypoints;
}


DroneController::DroneController(const QJsonObject &json)
	:framerate(json["framerate"].toInt()) {

	// TODO: REMOVE!!
	framerate = 1;

	QJsonArray ja = json["drones"].toArray();
	drones.reserve(ja.size());
	for (const QJsonValue &o : ja) {
		drones.append(Drone(o.toObject()));
	}
	for (const Drone &d : drones) {
		for (const Waypoint &wp : d.getWaypoints()) {
			if (wp.frame > duration) duration = wp.frame;
		}
	}

	connect(&timer, &QTimer::timeout, this, &DroneController::step);
	pause();
}


DroneController::~DroneController() {
}


int DroneController::getDuration() const {
	return duration;
}


void DroneController::step() {
	qDebug("frame %d (%d%%)", frame, (int) ((double) frame / duration * 100));
	emit frameChanged(frame);
	if (frame == duration) {
		pause();
	} else {
		frame++;
	}
}


void DroneController::play() {
	if (!paused) return;
	paused = false;
	timer.start(1000. / framerate);
	qDebug() << "playing";
	emit playing();
}


void DroneController::pause() {
	if (paused) return;
	paused = true;
	timer.stop();
	qDebug() << "pausing";
	emit pausing();
}


void DroneController::suspend() {
	if (!paused) {
		pause();
		paused = false;
	}
}


void DroneController::resume() {
	if (!paused) {
		paused = true;
		play();
	}
}


void DroneController::seek(int frame) {
	if (this->frame == frame) return;
	this->frame = frame;
	step();
}