forked from mavlink/qgroundcontrol
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MG.h
305 lines (261 loc) · 8.21 KB
/
MG.h
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
/**
* @file
* @brief Helper functions
*
* @author Lorenz Meier <[email protected]>
*
*/
#ifndef _MG_H_
#define _MG_H_
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QThread>
#include <cmath>
namespace MG
{
const static int MAX_FLIGHT_TIME = 60 * 60 * 24 * 21;
class VERSION
{
public:
static const int MAJOR = 1;
static const int MINOR = 01;
};
class SYSTEM
{
public:
static const int ID = 127;
static const int COMPID = 0;
static int getID() {
return SYSTEM::ID;
}
};
class UNITS
{
public:
/** The distance units supported for display by the groundstation **/
enum DistanceUnit {
METER,
CENTIMETER,
MILLIMETER,
INCH,
FEET,
MILE
};
/**
* @brief Convert a distance in meters into another distance unit system
*
* @param in The distance to convert
* @param newUnit The new unit to convert to
*
* @return The converted distance
*/
static double convertFromMeter(double in, DistanceUnit newUnit) {
double result = in;
// Conversion table in meter
static const double inInch = 39.3700787;
static const double inFeet = 3.2808399;
static const double inMile = 0.000000621371192;
static const double inCentimeter = 100;
static const double inMillimeter = 1000;
switch (newUnit) {
case METER:
result = in;
break;
case CENTIMETER:
result = in * inCentimeter;
break;
case MILLIMETER:
result = in * inMillimeter;
break;
case INCH:
result = in * inInch;
break;
case FEET:
result = in * inFeet;
break;
case MILE:
result = in * inMile;
break;
}
return result;
}
/**
* @brief Convert between two distance units
*
* This convenience function allows to convert between arbitrary distance units
*
* @param in The input distance
* @param inputUnit The input unit
* @param outputUnit The output unit
*
* @return The converted distance
*/
static double convert(double in, DistanceUnit inputUnit, DistanceUnit outputUnit) {
double meters = convertToMeter(in, inputUnit);
return convertFromMeter(meters, outputUnit);
}
/**
* @brief Convert a distance to the meter unit
*
* @param in The distance to convert
* @param inputUnit The unit the distance is represented in
*
* @return The converted distance
*/
static double convertToMeter(double in, DistanceUnit inputUnit) {
double result = in;
// Conversion table in meter
static const double inInch = 39.3700787;
static const double inFeet = 3.2808399;
static const double inMile = 0.000000621371192;
static const double inCentimeter = 100;
static const double inMillimeter = 1000;
// Don't convert if new unit is same unit
switch (inputUnit) {
case METER:
result = in;
break;
case CENTIMETER:
result = in / inCentimeter;
break;
case MILLIMETER:
result = in / inMillimeter;
break;
case INCH:
result = in / inInch;
break;
case FEET:
result = in / inFeet;
break;
case MILE:
result = in / inMile;
break;
}
return result;
}
};
class DISPLAY
{
public:
DISPLAY() {
// Initialize static class display with notebook display default value
//pixelSize = 0.224f;
//setPixelSize(0.224f);
}
~DISPLAY() {
}
/**
* @brief Get the size of a single pixel
*
* This value can be used to generate user interfaces with
* a size in physical units, for example a gauge which is
* always 50.8 mm (2") in diameter, regardless of the screen.
*
* @return The horizontal and vertical size of a pixel-square
*/
static double getPixelSize() {
return 0.224f;
}
/**
* @brief Set the size of a single pixel
*
* @param size The horizontal and vertical size of a pixel-square
*/
static void setPixelSize(double size) {
pixelSize = size;
}
/**
* @brief Set the size of a single pixel
*
* This method calculates the pixel size from the vertical and horizontal
* resolution and the screen diameter. The diameter is in mm (as this unit
* is a SI unit). One inch = 25.4 mm
*
* @param horizontalResolution The horizontal screen resolution, e.g. 1280.
* @param verticalResolution The vertical screen resolution, e.g. 800.
* @param screenDiameter The screen diameter in mm, e.g. 13.3" = 338 mm.
*/
static void setPixelSize(int horizontalResolution, int verticalResolution, double screenDiameter) {
pixelSize = screenDiameter / sqrt(static_cast<float>(horizontalResolution*horizontalResolution + verticalResolution*verticalResolution));
}
private:
/** The size of a single pixel **/
static double pixelSize;
};
class STAT
{
/** The time interval for the last few moments in milliseconds **/
static const int SHORT_TERM_INTERVAL = 300;
/** The time interval for the last moment in milliseconds **/
static const int CURRENT_INTERVAL = 50;
};
class TIME
{
public:
//static const QString ICONDIR = "./icons";
/**
* @brief Convenience method to get the milliseconds time stamp for now
*
* The timestamp is created at the instant of calling this method. It is
* defined as the number of milliseconds since unix epoch, which is
* 1.1.1970, 00:00 UTC.
*
* @return The number of milliseconds elapsed since unix epoch
* @deprecated Will the replaced by time helper class
**/
static quint64 getGroundTimeNow() {
QDateTime time = QDateTime::currentDateTime();
time = time.toUTC();
/* Return seconds and milliseconds, in milliseconds unit */
quint64 milliseconds = time.toTime_t() * static_cast<quint64>(1000);
return static_cast<quint64>(milliseconds + time.time().msec());
}
/**
* @brief Convenience method to get the milliseconds time stamp for now
*
* The timestamp is created at the instant of calling this method. It is
* defined as the number of milliseconds since unix epoch, which is
* 1.1.1970, 00:00 UTC.
*
* @return The number of milliseconds elapsed since unix epoch
* @deprecated Will the replaced by time helper class
**/
static quint64 getGroundTimeNowUsecs() {
QDateTime time = QDateTime::currentDateTime();
time = time.toUTC();
/* Return seconds and milliseconds, in milliseconds unit */
quint64 microseconds = time.toTime_t() * static_cast<quint64>(1000000);
return static_cast<quint64>(microseconds + (time.time().msec()*1000));
}
/*tatic quint64 getMissionTimeUsecs()
{
;
}*/
/**
* Convert milliseconds to an QDateTime object. This method converts the amount of
* milliseconds since 1.1.1970, 00:00 UTC (unix epoch) to a QDateTime date object.
*
* @param msecs The milliseconds since unix epoch (in Qt unsigned 64bit integer type quint64)
* @return The QDateTime object set to corresponding date and time
* @deprecated Will the replaced by time helper class
**/
static QDateTime msecToQDateTime(quint64 msecs) {
QDateTime time = QDateTime();
/* Set date and time depending on the seconds since unix epoch,
* integer division truncates the milliseconds */
time.setTime_t(msecs / 1000);
/* Add the milliseconds, modulo returns the milliseconds part */
return time.addMSecs(msecs % 1000);
}
};
}
#endif // _MG_H_