• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mavlink / MAVSDK / 4899817366

pending completion
4899817366

Pull #1772

github

GitHub
Merge c0bb90862 into e4e9c71dd
Pull Request #1772: Refactor MAVLinkParameters into client and server classes

2192 of 2192 new or added lines in 34 files covered. (100.0%)

7708 of 24812 relevant lines covered (31.07%)

19.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

42.0
/src/mavsdk/core/param_value.cpp
1
#include "param_value.h"
2

3
#include <cassert>
4

5
namespace mavsdk {
6

7
// std::to_string doesn't work for std::string, so we need this workaround.
8
template<typename T> std::string to_string(T&& value)
×
9
{
10
    return std::to_string(std::forward<T>(value));
×
11
}
12

13
inline std::string& to_string(std::string& value)
4✔
14
{
15
    return value;
4✔
16
}
17

18
bool ParamValue::set_from_mavlink_param_value_bytewise(const mavlink_param_value_t& mavlink_value)
33✔
19
{
20
    switch (mavlink_value.param_type) {
33✔
21
        case MAV_PARAM_TYPE_UINT8: {
×
22
            uint8_t temp;
×
23
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
×
24
            _value = temp;
×
25
        } break;
26

27
        case MAV_PARAM_TYPE_INT8: {
×
28
            int8_t temp;
×
29
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
×
30
            _value = temp;
×
31
        } break;
32

33
        case MAV_PARAM_TYPE_UINT16: {
×
34
            uint16_t temp;
×
35
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
×
36
            _value = temp;
×
37
        } break;
38

39
        case MAV_PARAM_TYPE_INT16: {
×
40
            int16_t temp;
×
41
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
×
42
            _value = temp;
×
43
        } break;
44

45
        case MAV_PARAM_TYPE_UINT32: {
×
46
            uint32_t temp;
×
47
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
×
48
            _value = temp;
×
49
        } break;
50

51
        case MAV_PARAM_TYPE_INT32: {
17✔
52
            int32_t temp;
17✔
53
            memcpy(&temp, &mavlink_value.param_value, sizeof(temp));
17✔
54
            _value = temp;
17✔
55
        } break;
56

57
        case MAV_PARAM_TYPE_REAL32: {
16✔
58
            _value = mavlink_value.param_value;
16✔
59
        } break;
16✔
60

61
        default:
×
62
            // This would be worrying
63
            LogErr() << "Error: unknown mavlink param type: "
×
64
                     << std::to_string(mavlink_value.param_type);
×
65
            return false;
×
66
    }
67
    return true;
33✔
68
}
69

70
bool ParamValue::set_from_mavlink_param_value_cast(const mavlink_param_value_t& mavlink_value)
×
71
{
72
    switch (mavlink_value.param_type) {
×
73
        case MAV_PARAM_TYPE_UINT8: {
×
74
            _value = static_cast<uint8_t>(mavlink_value.param_value);
×
75
        } break;
×
76

77
        case MAV_PARAM_TYPE_INT8: {
×
78
            _value = static_cast<int8_t>(mavlink_value.param_value);
×
79
        } break;
×
80

81
        case MAV_PARAM_TYPE_UINT16: {
×
82
            _value = static_cast<uint16_t>(mavlink_value.param_value);
×
83
        } break;
×
84

85
        case MAV_PARAM_TYPE_INT16: {
×
86
            _value = static_cast<int16_t>(mavlink_value.param_value);
×
87
        } break;
×
88

89
        case MAV_PARAM_TYPE_UINT32: {
×
90
            _value = static_cast<uint32_t>(mavlink_value.param_value);
×
91
        } break;
×
92

93
        case MAV_PARAM_TYPE_INT32: {
×
94
            _value = static_cast<int32_t>(mavlink_value.param_value);
×
95
        } break;
×
96

97
        case MAV_PARAM_TYPE_REAL32: {
×
98
            float temp = mavlink_value.param_value;
×
99
            _value = temp;
×
100
        } break;
101

102
        default:
×
103
            // This would be worrying
104
            LogErr() << "Error: unknown mavlink param type: "
×
105
                     << std::to_string(mavlink_value.param_type);
×
106
            return false;
×
107
    }
108
    return true;
×
109
}
110

111
bool ParamValue::set_from_mavlink_param_value(
26✔
112
    const mavlink_param_value_t& mavlink_value, const ParamValue::Conversion& conversion)
113
{
114
    if (conversion == Conversion::Cast) {
26✔
115
        return set_from_mavlink_param_value_cast(mavlink_value);
×
116
    } else {
117
        return set_from_mavlink_param_value_bytewise(mavlink_value);
26✔
118
    }
119
}
120

121
bool ParamValue::set_from_mavlink_param_set_bytewise(const mavlink_param_set_t& mavlink_set)
7✔
122
{
123
    mavlink_param_value_t mavlink_value{};
7✔
124
    mavlink_value.param_value = mavlink_set.param_value;
7✔
125
    mavlink_value.param_type = mavlink_set.param_type;
7✔
126

127
    return set_from_mavlink_param_value_bytewise(mavlink_value);
7✔
128
}
129

130
bool ParamValue::set_from_mavlink_param_ext_set(const mavlink_param_ext_set_t& mavlink_ext_set)
2✔
131
{
132
    switch (mavlink_ext_set.param_type) {
2✔
133
        case MAV_PARAM_EXT_TYPE_UINT8: {
×
134
            uint8_t temp;
×
135
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
136
            _value = temp;
×
137
        } break;
138
        case MAV_PARAM_EXT_TYPE_INT8: {
×
139
            int8_t temp;
×
140
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
141
            _value = temp;
×
142
        } break;
143
        case MAV_PARAM_EXT_TYPE_UINT16: {
×
144
            uint16_t temp;
×
145
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
146
            _value = temp;
×
147
        } break;
148
        case MAV_PARAM_EXT_TYPE_INT16: {
×
149
            int16_t temp;
×
150
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
151
            _value = temp;
×
152
        } break;
153
        case MAV_PARAM_EXT_TYPE_UINT32: {
×
154
            uint32_t temp;
×
155
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
156
            _value = temp;
×
157
        } break;
158
        case MAV_PARAM_EXT_TYPE_INT32: {
×
159
            int32_t temp;
×
160
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
161
            _value = temp;
×
162
        } break;
163
        case MAV_PARAM_EXT_TYPE_UINT64: {
×
164
            uint64_t temp;
×
165
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
166
            _value = temp;
×
167
        } break;
168
        case MAV_PARAM_EXT_TYPE_INT64: {
×
169
            int64_t temp;
×
170
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
171
            _value = temp;
×
172
        } break;
173
        case MAV_PARAM_EXT_TYPE_REAL32: {
×
174
            float temp;
×
175
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
176
            _value = temp;
×
177
        } break;
178
        case MAV_PARAM_EXT_TYPE_REAL64: {
×
179
            double temp;
×
180
            memcpy(&temp, &mavlink_ext_set.param_value[0], sizeof(temp));
×
181
            _value = temp;
×
182
        } break;
183
        case MAV_PARAM_EXT_TYPE_CUSTOM: {
2✔
184
            std::size_t len = std::min(std::size_t(128), strlen(mavlink_ext_set.param_value));
2✔
185
            _value = std::string(mavlink_ext_set.param_value, mavlink_ext_set.param_value + len);
2✔
186
        } break;
2✔
187
        default:
×
188
            // This would be worrying
189
            LogErr() << "Error: unknown mavlink ext param type";
×
190
            assert(false);
×
191
            return false;
192
    }
193
    return true;
2✔
194
}
195

196
// FIXME: this function can collapse with the one above.
197
bool ParamValue::set_from_mavlink_param_ext_value(
28✔
198
    const mavlink_param_ext_value_t& mavlink_ext_value)
199
{
200
    switch (mavlink_ext_value.param_type) {
28✔
201
        case MAV_PARAM_EXT_TYPE_UINT8: {
×
202
            uint8_t temp;
×
203
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
204
            _value = temp;
×
205
        } break;
206
        case MAV_PARAM_EXT_TYPE_INT8: {
×
207
            int8_t temp;
×
208
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
209
            _value = temp;
×
210
        } break;
211
        case MAV_PARAM_EXT_TYPE_UINT16: {
×
212
            uint16_t temp;
×
213
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
214
            _value = temp;
×
215
        } break;
216
        case MAV_PARAM_EXT_TYPE_INT16: {
×
217
            int16_t temp;
×
218
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
219
            _value = temp;
×
220
        } break;
221
        case MAV_PARAM_EXT_TYPE_UINT32: {
×
222
            uint32_t temp;
×
223
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
224
            _value = temp;
×
225
        } break;
226
        case MAV_PARAM_EXT_TYPE_INT32: {
7✔
227
            int32_t temp;
7✔
228
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
7✔
229
            _value = temp;
7✔
230
        } break;
231
        case MAV_PARAM_EXT_TYPE_UINT64: {
×
232
            uint64_t temp;
×
233
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
234
            _value = temp;
×
235
        } break;
236
        case MAV_PARAM_EXT_TYPE_INT64: {
×
237
            int64_t temp;
×
238
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
239
            _value = temp;
×
240
        } break;
241
        case MAV_PARAM_EXT_TYPE_REAL32: {
9✔
242
            float temp;
9✔
243
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
9✔
244
            _value = temp;
9✔
245
        } break;
246
        case MAV_PARAM_EXT_TYPE_REAL64: {
×
247
            double temp;
×
248
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
×
249
            _value = temp;
×
250
        } break;
251
        case MAV_PARAM_EXT_TYPE_CUSTOM: {
12✔
252
            std::size_t len = strnlen(mavlink_ext_value.param_value, 128);
12✔
253
            _value =
12✔
254
                std::string(mavlink_ext_value.param_value, mavlink_ext_value.param_value + len);
12✔
255
        } break;
12✔
256
        default:
×
257
            // This would be worrying
258
            LogErr() << "Error: unknown mavlink ext param type";
×
259
            assert(false);
×
260
            return false;
261
    }
262
    return true;
28✔
263
}
264

265
bool ParamValue::set_from_xml(const std::string& type_str, const std::string& value_str)
6,091✔
266
{
267
    if (strcmp(type_str.c_str(), "uint8") == 0) {
6,091✔
268
        _value = static_cast<uint8_t>(std::stoi(value_str));
50✔
269
    } else if (strcmp(type_str.c_str(), "int8") == 0) {
6,041✔
270
        _value = static_cast<int8_t>(std::stoi(value_str));
×
271
    } else if (strcmp(type_str.c_str(), "uint16") == 0) {
6,041✔
272
        _value = static_cast<uint16_t>(std::stoi(value_str));
30✔
273
    } else if (strcmp(type_str.c_str(), "int16") == 0) {
6,011✔
274
        _value = static_cast<int16_t>(std::stoi(value_str));
×
275
    } else if (strcmp(type_str.c_str(), "uint32") == 0) {
6,011✔
276
        _value = static_cast<uint32_t>(std::stoi(value_str));
1,114✔
277
    } else if (strcmp(type_str.c_str(), "int32") == 0) {
4,897✔
278
        _value = static_cast<int32_t>(std::stoi(value_str));
287✔
279
    } else if (strcmp(type_str.c_str(), "uint64") == 0) {
4,610✔
280
        _value = static_cast<uint64_t>(std::stoll(value_str));
×
281
    } else if (strcmp(type_str.c_str(), "int64") == 0) {
4,610✔
282
        _value = static_cast<int64_t>(std::stoll(value_str));
×
283
    } else if (strcmp(type_str.c_str(), "float") == 0) {
4,610✔
284
        _value = static_cast<float>(std::stof(value_str));
4,610✔
285
    } else if (strcmp(type_str.c_str(), "double") == 0) {
×
286
        _value = static_cast<double>(std::stod(value_str));
×
287
    } else {
288
        LogErr() << "Unknown type: " << type_str;
×
289
        return false;
×
290
    }
291
    return true;
6,091✔
292
}
293

294
bool ParamValue::set_empty_type_from_xml(const std::string& type_str)
291✔
295
{
296
    if (strcmp(type_str.c_str(), "uint8") == 0) {
291✔
297
        _value = uint8_t(0);
20✔
298
    } else if (strcmp(type_str.c_str(), "int8") == 0) {
271✔
299
        _value = int8_t(0);
×
300
    } else if (strcmp(type_str.c_str(), "uint16") == 0) {
271✔
301
        _value = uint16_t(0);
20✔
302
    } else if (strcmp(type_str.c_str(), "int16") == 0) {
251✔
303
        _value = int16_t(0);
×
304
    } else if (strcmp(type_str.c_str(), "uint32") == 0) {
251✔
305
        _value = uint32_t(0);
127✔
306
    } else if (strcmp(type_str.c_str(), "int32") == 0) {
124✔
307
        _value = int32_t(0);
84✔
308
    } else if (strcmp(type_str.c_str(), "uint64") == 0) {
40✔
309
        _value = uint64_t(0);
10✔
310
    } else if (strcmp(type_str.c_str(), "int64") == 0) {
30✔
311
        _value = int64_t(0);
×
312
    } else if (strcmp(type_str.c_str(), "float") == 0) {
30✔
313
        _value = 0.0f;
30✔
314
    } else if (strcmp(type_str.c_str(), "double") == 0) {
×
315
        _value = 0.0;
×
316
    } else {
317
        LogErr() << "Unknown type: " << type_str;
×
318
        return false;
×
319
    }
320
    return true;
291✔
321
}
322

323
[[nodiscard]] MAV_PARAM_TYPE ParamValue::get_mav_param_type() const
39✔
324
{
325
    if (std::get_if<uint8_t>(&_value)) {
39✔
326
        return MAV_PARAM_TYPE_UINT8;
×
327
    } else if (std::get_if<int8_t>(&_value)) {
39✔
328
        return MAV_PARAM_TYPE_INT8;
×
329
    } else if (std::get_if<uint16_t>(&_value)) {
39✔
330
        return MAV_PARAM_TYPE_UINT16;
×
331
    } else if (std::get_if<int16_t>(&_value)) {
39✔
332
        return MAV_PARAM_TYPE_INT16;
×
333
    } else if (std::get_if<uint32_t>(&_value)) {
39✔
334
        return MAV_PARAM_TYPE_UINT32;
×
335
    } else if (std::get_if<int32_t>(&_value)) {
39✔
336
        return MAV_PARAM_TYPE_INT32;
19✔
337
    } else if (std::get_if<uint64_t>(&_value)) {
20✔
338
        return MAV_PARAM_TYPE_UINT64;
×
339
    } else if (std::get_if<int64_t>(&_value)) {
20✔
340
        return MAV_PARAM_TYPE_INT64;
×
341
    } else if (std::get_if<float>(&_value)) {
20✔
342
        return MAV_PARAM_TYPE_REAL32;
20✔
343
    } else if (std::get_if<double>(&_value)) {
×
344
        return MAV_PARAM_TYPE_REAL64;
×
345
    } else {
346
        LogErr() << "Unknown data type for param.";
×
347
        assert(false);
×
348
        return MAV_PARAM_TYPE_INT32;
349
    }
350
}
351

352
[[nodiscard]] MAV_PARAM_EXT_TYPE ParamValue::get_mav_param_ext_type() const
37✔
353
{
354
    if (std::get_if<uint8_t>(&_value)) {
37✔
355
        return MAV_PARAM_EXT_TYPE_UINT8;
×
356
    } else if (std::get_if<int8_t>(&_value)) {
37✔
357
        return MAV_PARAM_EXT_TYPE_INT8;
×
358
    } else if (std::get_if<uint16_t>(&_value)) {
37✔
359
        return MAV_PARAM_EXT_TYPE_UINT16;
×
360
    } else if (std::get_if<int16_t>(&_value)) {
37✔
361
        return MAV_PARAM_EXT_TYPE_INT16;
×
362
    } else if (std::get_if<uint32_t>(&_value)) {
37✔
363
        return MAV_PARAM_EXT_TYPE_UINT32;
×
364
    } else if (std::get_if<int32_t>(&_value)) {
37✔
365
        return MAV_PARAM_EXT_TYPE_INT32;
9✔
366
    } else if (std::get_if<uint64_t>(&_value)) {
28✔
367
        return MAV_PARAM_EXT_TYPE_UINT64;
×
368
    } else if (std::get_if<int64_t>(&_value)) {
28✔
369
        return MAV_PARAM_EXT_TYPE_INT64;
×
370
    } else if (std::get_if<float>(&_value)) {
28✔
371
        return MAV_PARAM_EXT_TYPE_REAL32;
9✔
372
    } else if (std::get_if<double>(&_value)) {
19✔
373
        return MAV_PARAM_EXT_TYPE_REAL64;
×
374
    } else if (std::get_if<std::string>(&_value)) {
19✔
375
        return MAV_PARAM_EXT_TYPE_CUSTOM;
19✔
376
    } else {
377
        LogErr() << "Unknown data type for param.";
×
378
        assert(false);
×
379
        return MAV_PARAM_EXT_TYPE_INT32;
380
    }
381
}
382

383
bool ParamValue::set_as_same_type(const std::string& value_str)
×
384
{
385
    if (std::get_if<uint8_t>(&_value)) {
×
386
        _value = uint8_t(std::stoi(value_str));
×
387
    } else if (std::get_if<int8_t>(&_value)) {
×
388
        _value = int8_t(std::stoi(value_str));
×
389
    } else if (std::get_if<uint16_t>(&_value)) {
×
390
        _value = uint16_t(std::stoi(value_str));
×
391
    } else if (std::get_if<int16_t>(&_value)) {
×
392
        _value = int16_t(std::stoi(value_str));
×
393
    } else if (std::get_if<uint32_t>(&_value)) {
×
394
        _value = uint32_t(std::stoi(value_str));
×
395
    } else if (std::get_if<int32_t>(&_value)) {
×
396
        _value = int32_t(std::stoi(value_str));
×
397
    } else if (std::get_if<uint64_t>(&_value)) {
×
398
        _value = uint64_t(std::stoll(value_str));
×
399
    } else if (std::get_if<int64_t>(&_value)) {
×
400
        _value = int64_t(std::stoll(value_str));
×
401
    } else if (std::get_if<float>(&_value)) {
×
402
        _value = float(std::stof(value_str));
×
403
    } else if (std::get_if<double>(&_value)) {
×
404
        _value = double(std::stod(value_str));
×
405
    } else {
406
        LogErr() << "Unknown type";
×
407
        return false;
×
408
    }
409
    return true;
×
410
}
411

412
[[nodiscard]] float ParamValue::get_4_float_bytes_bytewise() const
39✔
413
{
414
    if (std::get_if<float>(&_value)) {
39✔
415
        return std::get<float>(_value);
20✔
416
    } else if (std::get_if<int32_t>(&_value)) {
19✔
417
        return *(reinterpret_cast<const float*>(&std::get<int32_t>(_value)));
19✔
418
    } else {
419
        LogErr() << "Unknown type";
×
420
        assert(false);
×
421
        return NAN;
422
    }
423
}
424

425
[[nodiscard]] float ParamValue::get_4_float_bytes_cast() const
×
426
{
427
    if (std::get_if<float>(&_value)) {
×
428
        return std::get<float>(_value);
×
429
    } else if (std::get_if<uint32_t>(&_value)) {
×
430
        return static_cast<float>(std::get<uint32_t>(_value));
×
431
    } else if (std::get_if<int32_t>(&_value)) {
×
432
        return static_cast<float>(std::get<int32_t>(_value));
×
433
    } else if (std::get_if<uint16_t>(&_value)) {
×
434
        return static_cast<float>(std::get<uint16_t>(_value));
×
435
    } else if (std::get_if<int16_t>(&_value)) {
×
436
        return static_cast<float>(std::get<int16_t>(_value));
×
437
    } else if (std::get_if<uint8_t>(&_value)) {
×
438
        return static_cast<float>(std::get<uint8_t>(_value));
×
439
    } else if (std::get_if<int8_t>(&_value)) {
×
440
        return static_cast<float>(std::get<int8_t>(_value));
×
441
    } else {
442
        LogErr() << "Unknown type";
×
443
        assert(false);
×
444
        return NAN;
445
    }
446
}
447

448
[[nodiscard]] std::optional<int> ParamValue::get_int() const
×
449
{
450
    if (std::get_if<uint32_t>(&_value)) {
×
451
        return static_cast<int>(std::get<uint32_t>(_value));
×
452
    } else if (std::get_if<int32_t>(&_value)) {
×
453
        return static_cast<int>(std::get<int32_t>(_value));
×
454
    } else if (std::get_if<uint16_t>(&_value)) {
×
455
        return static_cast<int>(std::get<uint16_t>(_value));
×
456
    } else if (std::get_if<int16_t>(&_value)) {
×
457
        return static_cast<int>(std::get<int16_t>(_value));
×
458
    } else if (std::get_if<uint8_t>(&_value)) {
×
459
        return static_cast<int>(std::get<uint8_t>(_value));
×
460
    } else if (std::get_if<int8_t>(&_value)) {
×
461
        return static_cast<int>(std::get<int8_t>(_value));
×
462
    } else {
463
        LogErr() << "Not int type";
×
464
        return {};
×
465
    }
466
}
467

468
bool ParamValue::set_int(int new_value)
4✔
469
{
470
    if (std::get_if<uint8_t>(&_value)) {
4✔
471
        _value = static_cast<uint8_t>(new_value);
2✔
472
        return true;
2✔
473
    } else if (std::get_if<int8_t>(&_value)) {
2✔
474
        _value = static_cast<int8_t>(new_value);
×
475
        return true;
×
476
    } else if (std::get_if<uint16_t>(&_value)) {
2✔
477
        _value = static_cast<uint16_t>(new_value);
×
478
        return true;
×
479
    } else if (std::get_if<int16_t>(&_value)) {
2✔
480
        _value = static_cast<int16_t>(new_value);
×
481
        return true;
×
482
    } else if (std::get_if<uint32_t>(&_value)) {
2✔
483
        _value = static_cast<uint32_t>(new_value);
×
484
        return true;
×
485
    } else if (std::get_if<int32_t>(&_value)) {
2✔
486
        _value = static_cast<int32_t>(new_value);
2✔
487
        return true;
2✔
488
    } else {
489
        return false;
×
490
    }
491
}
492

493
void ParamValue::set_float(float new_value)
2✔
494
{
495
    _value = new_value;
2✔
496
}
2✔
497

498
void ParamValue::set_custom(const std::string& new_value)
2✔
499
{
500
    _value = new_value;
2✔
501
}
2✔
502

503
[[nodiscard]] std::optional<float> ParamValue::get_float() const
×
504
{
505
    if (std::get_if<float>(&_value)) {
×
506
        return std::get<float>(_value);
×
507
    } else {
508
        LogErr() << "Not float type";
×
509
        return {};
×
510
    }
511
}
512

513
[[nodiscard]] std::optional<std::string> ParamValue::get_custom() const
×
514
{
515
    if (std::get_if<std::string>(&_value)) {
×
516
        return std::get<std::string>(_value);
×
517
    } else {
518
        LogErr() << "Not custom type";
×
519
        return {};
×
520
    }
521
}
522

523
std::array<char, 128> ParamValue::get_128_bytes() const
37✔
524
{
525
    std::array<char, 128> bytes{};
37✔
526

527
    if (std::get_if<uint8_t>(&_value)) {
37✔
528
        memcpy(bytes.data(), &std::get<uint8_t>(_value), sizeof(uint8_t));
×
529
    } else if (std::get_if<int8_t>(&_value)) {
37✔
530
        memcpy(bytes.data(), &std::get<int8_t>(_value), sizeof(int8_t));
×
531
    } else if (std::get_if<uint16_t>(&_value)) {
37✔
532
        memcpy(bytes.data(), &std::get<uint16_t>(_value), sizeof(uint16_t));
×
533
    } else if (std::get_if<int16_t>(&_value)) {
37✔
534
        memcpy(bytes.data(), &std::get<int16_t>(_value), sizeof(int16_t));
×
535
    } else if (std::get_if<uint32_t>(&_value)) {
37✔
536
        memcpy(bytes.data(), &std::get<uint32_t>(_value), sizeof(uint32_t));
×
537
    } else if (std::get_if<int32_t>(&_value)) {
37✔
538
        memcpy(bytes.data(), &std::get<int32_t>(_value), sizeof(int32_t));
9✔
539
    } else if (std::get_if<uint64_t>(&_value)) {
28✔
540
        memcpy(bytes.data(), &std::get<uint64_t>(_value), sizeof(uint64_t));
×
541
    } else if (std::get_if<int64_t>(&_value)) {
28✔
542
        memcpy(bytes.data(), &std::get<int64_t>(_value), sizeof(int64_t));
×
543
    } else if (std::get_if<float>(&_value)) {
28✔
544
        memcpy(bytes.data(), &std::get<float>(_value), sizeof(float));
9✔
545
    } else if (std::get_if<double>(&_value)) {
19✔
546
        memcpy(bytes.data(), &std::get<double>(_value), sizeof(double));
×
547
    } else if (std::get_if<std::string>(&_value)) {
19✔
548
        auto str_ptr = &std::get<std::string>(_value);
19✔
549
        // Copy all data in string, max 128 bytes
550
        memcpy(bytes.data(), str_ptr->data(), std::min(bytes.size(), str_ptr->size()));
19✔
551
    } else {
552
        LogErr() << "Unknown type";
×
553
        assert(false);
×
554
    }
555

556
    return bytes;
37✔
557
}
558

559
[[nodiscard]] std::string ParamValue::get_string() const
96✔
560
{
561
    return std::visit([](auto value) { return to_string(value); }, _value);
96✔
562
}
563

564
[[nodiscard]] bool ParamValue::is_same_type(const ParamValue& rhs) const
2,374✔
565
{
566
    if ((std::get_if<uint8_t>(&_value) && std::get_if<uint8_t>(&rhs._value)) ||
4,748✔
567
        (std::get_if<int8_t>(&_value) && std::get_if<int8_t>(&rhs._value)) ||
4,622✔
568
        (std::get_if<uint16_t>(&_value) && std::get_if<uint16_t>(&rhs._value)) ||
4,622✔
569
        (std::get_if<int16_t>(&_value) && std::get_if<int16_t>(&rhs._value)) ||
4,578✔
570
        (std::get_if<uint32_t>(&_value) && std::get_if<uint32_t>(&rhs._value)) ||
4,578✔
571
        (std::get_if<int32_t>(&_value) && std::get_if<int32_t>(&rhs._value)) ||
1,247✔
572
        (std::get_if<uint64_t>(&_value) && std::get_if<uint64_t>(&rhs._value)) ||
1,070✔
573
        (std::get_if<int64_t>(&_value) && std::get_if<int64_t>(&rhs._value)) ||
1,070✔
574
        (std::get_if<float>(&_value) && std::get_if<float>(&rhs._value)) ||
1,070✔
575
        (std::get_if<double>(&_value) && std::get_if<double>(&rhs._value)) ||
4,771✔
576
        (std::get_if<std::string>(&_value) && std::get_if<std::string>(&rhs._value))) {
23✔
577
        return true;
2,370✔
578
    } else {
579
        LogWarn() << "Comparison type mismatch between " << typestr() << " and " << rhs.typestr();
4✔
580
        return false;
4✔
581
    }
582
}
583

584
bool ParamValue::operator==(const std::string& value_str) const
1,332✔
585
{
586
    // LogDebug() << "Compare " << value_str() << " and " << rhs.value_str();
587
    if (std::get_if<uint8_t>(&_value)) {
1,332✔
588
        return std::get<uint8_t>(_value) == std::stoi(value_str);
50✔
589
    } else if (std::get_if<int8_t>(&_value)) {
1,282✔
590
        return std::get<int8_t>(_value) == std::stoi(value_str);
×
591
    } else if (std::get_if<uint16_t>(&_value)) {
1,282✔
592
        return std::get<uint16_t>(_value) == std::stoi(value_str);
×
593
    } else if (std::get_if<int16_t>(&_value)) {
1,282✔
594
        return std::get<int16_t>(_value) == std::stoi(value_str);
×
595
    } else if (std::get_if<uint32_t>(&_value)) {
1,282✔
596
        return std::get<uint32_t>(_value) == std::stoul(value_str);
781✔
597
    } else if (std::get_if<int32_t>(&_value)) {
501✔
598
        return std::get<int32_t>(_value) == std::stol(value_str);
72✔
599
    } else if (std::get_if<uint64_t>(&_value)) {
429✔
600
        return std::get<uint64_t>(_value) == std::stoull(value_str);
×
601
    } else if (std::get_if<int64_t>(&_value)) {
429✔
602
        return std::get<int64_t>(_value) == std::stoll(value_str);
×
603
    } else if (std::get_if<float>(&_value)) {
429✔
604
        return std::get<float>(_value) == std::stof(value_str);
429✔
605
    } else if (std::get_if<double>(&_value)) {
×
606
        return std::get<double>(_value) == std::stod(value_str);
×
607
    } else {
608
        // This also covers custom_type_t
609
        return false;
×
610
    }
611
}
612

613
std::ostream& operator<<(std::ostream& str, const ParamValue& obj)
96✔
614
{
615
    str << "ParamValue{" << obj.typestr() << ":" << obj.get_string() << "}";
96✔
616
    return str;
96✔
617
}
618

619
[[nodiscard]] std::string ParamValue::typestr() const
104✔
620
{
621
    if (std::get_if<uint8_t>(&_value)) {
104✔
622
        return "uint8_t";
×
623
    } else if (std::get_if<int8_t>(&_value)) {
104✔
624
        return "int8_t";
×
625
    } else if (std::get_if<uint16_t>(&_value)) {
104✔
626
        return "uint16_t";
×
627
    } else if (std::get_if<int16_t>(&_value)) {
104✔
628
        return "int16_t";
×
629
    } else if (std::get_if<uint32_t>(&_value)) {
104✔
630
        return "uint32_t";
13✔
631
    } else if (std::get_if<int32_t>(&_value)) {
91✔
632
        return "int32_t";
19✔
633
    } else if (std::get_if<uint64_t>(&_value)) {
72✔
634
        return "uint64_t";
×
635
    } else if (std::get_if<int64_t>(&_value)) {
72✔
636
        return "int64_t";
×
637
    } else if (std::get_if<float>(&_value)) {
72✔
638
        return "float";
66✔
639
    } else if (std::get_if<double>(&_value)) {
6✔
640
        return "double";
×
641
    } else if (std::get_if<std::string>(&_value)) {
6✔
642
        return "custom";
6✔
643
    }
644
    // FIXME: Added to fix CI error (control reading end of non-void function)
645
    return "unknown";
×
646
}
647

648
void ParamValue::update_value_typesafe(const ParamValue& new_value)
11✔
649
{
650
    assert(this->is_same_type(new_value));
11✔
651
    _value = new_value._value;
11✔
652
}
11✔
653

654
} // namespace mavsdk
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc