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

mavlink / MAVSDK / 5126554599

pending completion
5126554599

push

github

web-flow
Merge pull request #2048 from mavlink/pr-camera-xml-fixes

Camera definition: accept bool type in xml

51 of 51 new or added lines in 4 files covered. (100.0%)

7718 of 24884 relevant lines covered (31.02%)

20.6 hits per line

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

42.07
/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(
22✔
198
    const mavlink_param_ext_value_t& mavlink_ext_value)
199
{
200
    switch (mavlink_ext_value.param_type) {
22✔
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: {
6✔
227
            int32_t temp;
6✔
228
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
6✔
229
            _value = temp;
6✔
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: {
6✔
242
            float temp;
6✔
243
            memcpy(&temp, &mavlink_ext_value.param_value[0], sizeof(temp));
6✔
244
            _value = temp;
6✔
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: {
10✔
252
            std::size_t len = strnlen(mavlink_ext_value.param_value, 128);
10✔
253
            _value =
10✔
254
                std::string(mavlink_ext_value.param_value, mavlink_ext_value.param_value + len);
10✔
255
        } break;
10✔
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;
22✔
263
}
264

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

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

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

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

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

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

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

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

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

498
void ParamValue::set_float(float new_value)
2✔
499
{
500
    _value = new_value;
2✔
501
}
2✔
502

503
void ParamValue::set_custom(const std::string& new_value)
2✔
504
{
505
    _value = new_value;
2✔
506
}
2✔
507

508
[[nodiscard]] std::optional<float> ParamValue::get_float() const
×
509
{
510
    if (std::get_if<float>(&_value)) {
×
511
        return std::get<float>(_value);
×
512
    } else {
513
        LogErr() << "Not float type";
×
514
        return {};
×
515
    }
516
}
517

518
[[nodiscard]] std::optional<std::string> ParamValue::get_custom() const
×
519
{
520
    if (std::get_if<std::string>(&_value)) {
×
521
        return std::get<std::string>(_value);
×
522
    } else {
523
        LogErr() << "Not custom type";
×
524
        return {};
×
525
    }
526
}
527

528
std::array<char, 128> ParamValue::get_128_bytes() const
30✔
529
{
530
    std::array<char, 128> bytes{};
30✔
531

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

561
    return bytes;
30✔
562
}
563

564
[[nodiscard]] std::string ParamValue::get_string() const
96✔
565
{
566
    return std::visit([](auto value) { return to_string(value); }, _value);
96✔
567
}
568

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

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

618
std::ostream& operator<<(std::ostream& str, const ParamValue& obj)
96✔
619
{
620
    str << "ParamValue{" << obj.typestr() << ":" << obj.get_string() << "}";
96✔
621
    return str;
96✔
622
}
623

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

653
void ParamValue::update_value_typesafe(const ParamValue& new_value)
11✔
654
{
655
    assert(this->is_same_type(new_value));
11✔
656
    _value = new_value._value;
11✔
657
}
11✔
658

659
} // 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