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

OpenLightingProject / ola / 24609073669

18 Apr 2026 04:36PM UTC coverage: 44.864% (-0.9%) from 45.72%
24609073669

push

github

web-flow
Merge pull request #2043 from peternewman/nortle-ftdi

Revert some stuff via 146cf26 which accidentally snuck into #1999 by mistake

8554 of 19846 branches covered (43.1%)

22105 of 49271 relevant lines covered (44.86%)

48.53 hits per line

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

1.17
/common/rdm/RDMHelper.cpp
1
/*
2
 * This library is free software; you can redistribute it and/or
3
 * modify it under the terms of the GNU Lesser General Public
4
 * License as published by the Free Software Foundation; either
5
 * version 2.1 of the License, or (at your option) any later version.
6
 *
7
 * This library is distributed in the hope that it will be useful,
8
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10
 * Lesser General Public License for more details.
11
 *
12
 * You should have received a copy of the GNU Lesser General Public
13
 * License along with this library; if not, write to the Free Software
14
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
 *
16
 * RDMHelper.cpp
17
 * Various misc RDM functions.
18
 * Copyright (C) 2010 Simon Newton
19
 *
20
 * At some point we may want to localize this file.
21
 */
22

23
#include <sstream>
24
#include <string>
25
#include <vector>
26
#include "ola/rdm/RDMHelper.h"
27
#include "ola/StringUtils.h"
28

29
namespace ola {
30
namespace rdm {
31

32
using std::ostringstream;
33
using std::string;
34
using std::vector;
35

36

37
/**
38
 * Convert a RDMStatusCode to a string
39
 */
40
string StatusCodeToString(RDMStatusCode status) {
×
41
  switch (status) {
×
42
    case RDM_COMPLETED_OK:
×
43
      return "Completed Ok";
×
44
    case RDM_WAS_BROADCAST:
×
45
      return "Request was broadcast";
×
46
    case RDM_FAILED_TO_SEND:
×
47
      return "Failed to send request";
×
48
    case RDM_TIMEOUT:
×
49
      return "Response Timeout";
×
50
    case RDM_INVALID_RESPONSE:
×
51
      return "Invalid Response";
×
52
    case RDM_UNKNOWN_UID:
×
53
      return "The RDM device could not be found";
×
54
    case RDM_CHECKSUM_INCORRECT:
×
55
      return "Incorrect checksum";
×
56
    case RDM_TRANSACTION_MISMATCH:
×
57
      return "Transaction number mismatch";
×
58
    case RDM_SUB_DEVICE_MISMATCH:
×
59
      return "Sub device mismatch";
×
60
    case RDM_SRC_UID_MISMATCH:
×
61
      return "Source UID in response doesn't match";
×
62
    case RDM_DEST_UID_MISMATCH:
×
63
      return "Destination UID in response doesn't match";
×
64
    case RDM_WRONG_SUB_START_CODE:
×
65
      return "Incorrect sub start code";
×
66
    case RDM_PACKET_TOO_SHORT:
×
67
      return "RDM response was smaller than the minimum size";
×
68
    case RDM_PACKET_LENGTH_MISMATCH:
×
69
      return "The length field of packet didn't match length received";
×
70
    case RDM_PARAM_LENGTH_MISMATCH:
×
71
      return "The parameter length exceeds the remaining packet size";
×
72
    case RDM_INVALID_COMMAND_CLASS:
×
73
      return "The command class was not one of GET_RESPONSE or SET_RESPONSE";
×
74
    case RDM_COMMAND_CLASS_MISMATCH:
×
75
      return "The command class didn't match the request";
×
76
    case RDM_INVALID_RESPONSE_TYPE:
×
77
      return "The response type was not ACK, ACK_OVERFLOW, ACK_TIMER or NACK";
×
78
    case RDM_PLUGIN_DISCOVERY_NOT_SUPPORTED:
×
79
      return "The output plugin does not support DISCOVERY commands";
×
80
    case RDM_DUB_RESPONSE:
×
81
      return "DUB response";
×
82
    default:
×
83
      return "Unknown";
×
84
  }
85
}
86

87

88
/**
89
 * Convert a uint8_t representing a data type to a human-readable string.
90
 * @param type the data type value
91
 */
92
string DataTypeToString(uint8_t type) {
×
93
  switch (type) {
×
94
    case DS_NOT_DEFINED:
×
95
      return "Not defined";
×
96
    case DS_BIT_FIELD:
×
97
      return "Bit field";
×
98
    case DS_ASCII:
×
99
      return "ASCII";
×
100
    case DS_UNSIGNED_BYTE:
×
101
      return "uint8";
×
102
    case DS_SIGNED_BYTE:
×
103
      return "int8";
×
104
    case DS_UNSIGNED_WORD:
×
105
      return "uint16";
×
106
    case DS_SIGNED_WORD:
×
107
      return "int16";
×
108
    case DS_UNSIGNED_DWORD:
×
109
      return "uint32";
×
110
    case DS_SIGNED_DWORD:
×
111
      return "int32";
×
112
    case DS_UINT64:
×
113
      return "uint64";
×
114
    case DS_INT64:
×
115
      return "int64";
×
116
    case DS_GROUP:
×
117
      return "Group";
×
118
    case DS_UID:
×
119
      return "UID";
×
120
    case DS_BOOLEAN:
×
121
      return "Boolean";
×
122
    case DS_URL:
×
123
      return "URL";
×
124
    case DS_MAC:
×
125
      return "MAC";
×
126
    case DS_IPV4:
×
127
      return "IPv4";
×
128
    case DS_IPV6:
×
129
      return "IPv6";
×
130
    case DS_ENUMERATION:
×
131
      return "Enumeration";
×
132
    default:
×
133
      ostringstream str;
×
134
      str << "Unknown, was " << static_cast<int>(type);
×
135
      return str.str();
×
136
  }
137
}
138

139

140
/**
141
 * Convert a uint8_t representing a lamp mode to a human-readable string.
142
 * @param lamp_mode the lamp mode value
143
 */
144
string LampModeToString(uint8_t lamp_mode) {
×
145
  switch (lamp_mode) {
×
146
    case LAMP_ON_MODE_OFF:
×
147
      return "Off";
×
148
    case LAMP_ON_MODE_DMX:
×
149
      return "DMX";
×
150
    case LAMP_ON_MODE_ON:
×
151
      return "On";
×
152
    case LAMP_ON_MODE_ON_AFTER_CAL:
×
153
      return "On after calibration";
×
154
    default:
×
155
      ostringstream str;
×
156
      str << "Unknown, was " << static_cast<int>(lamp_mode);
×
157
      return str.str();
×
158
  }
159
}
160

161

162
/**
163
 * Convert a uint8_t representing a lamp state to a human-readable string.
164
 * @param lamp_state the lamp state value
165
 */
166
string LampStateToString(uint8_t lamp_state) {
×
167
  switch (lamp_state) {
×
168
    case LAMP_OFF:
×
169
      return "Off";
×
170
    case LAMP_ON:
×
171
      return "On";
×
172
    case LAMP_STRIKE:
×
173
      return "Strike";
×
174
    case LAMP_STANDBY:
×
175
      return "Standby";
×
176
    case LAMP_NOT_PRESENT:
×
177
      return "Lamp not present";
×
178
    case LAMP_ERROR:
×
179
      return "Error";
×
180
    default:
×
181
      ostringstream str;
×
182
      str << "Unknown, was " << static_cast<int>(lamp_state);
×
183
      return str.str();
×
184
  }
185
}
186

187

188
/**
189
 * Convert a uint16_t representing a nack reason to a human-readable string.
190
 * @param reason the nack reason value
191
 */
192
string NackReasonToString(uint16_t reason) {
×
193
  switch (reason) {
×
194
    case NR_UNKNOWN_PID:
×
195
      return "Unknown PID";
×
196
    case NR_FORMAT_ERROR:
×
197
      return "Format error";
×
198
    case NR_HARDWARE_FAULT:
×
199
      return "Hardware fault";
×
200
    case NR_PROXY_REJECT:
×
201
      return "Proxy reject";
×
202
    case NR_WRITE_PROTECT:
×
203
      return "Write protect";
×
204
    case NR_UNSUPPORTED_COMMAND_CLASS:
×
205
      return "Unsupported command class";
×
206
    case NR_DATA_OUT_OF_RANGE:
×
207
      return "Data out of range";
×
208
    case NR_BUFFER_FULL:
×
209
      return "Buffer full";
×
210
    case NR_PACKET_SIZE_UNSUPPORTED:
×
211
      return "Packet size unsupported";
×
212
    case NR_SUB_DEVICE_OUT_OF_RANGE:
×
213
      return "Sub device out of range";
×
214
    case NR_PROXY_BUFFER_FULL:
×
215
      return "Proxy buffer full";
×
216
    case NR_ACTION_NOT_SUPPORTED:
×
217
      return "Action not supported";
×
218
    case NR_ENDPOINT_NUMBER_INVALID:
×
219
      return "Endpoint number invalid";
×
220
    case NR_INVALID_ENDPOINT_MODE:
×
221
      return "Invalid endpoint mode";
×
222
    case NR_UNKNOWN_UID:
×
223
      return "Unknown UID";
×
224
    case NR_UNKNOWN_SCOPE:
×
225
      return "Unknown scope";
×
226
    case NR_INVALID_STATIC_CONFIG_TYPE:
×
227
      return "Invalid static config type";
×
228
    case NR_INVALID_IPV4_ADDRESS:
×
229
      return "Invalid IPv4 address";
×
230
    case NR_INVALID_IPV6_ADDRESS:
×
231
      return "Invalid IPv6 address";
×
232
    case NR_INVALID_PORT:
×
233
      return "Invalid port";
×
234
    case NR_DEVICE_ABSENT:
×
235
      return "Device absent";
×
236
    case NR_SENSOR_OUT_OF_RANGE:
×
237
      return "Sensor out of range";
×
238
    case NR_SENSOR_FAULT:
×
239
      return "Sensor faulty";
×
240
    case NR_PACKING_NOT_SUPPORTED:
×
241
      return "Packing not supported";
×
242
    case NR_ERROR_IN_PACKED_LIST_TRANSACTION:
×
243
      return "Error actioning packed list";
×
244
    case NR_PROXY_DROP:
×
245
      return "Proxy drop";
×
246
    case NR_ALL_CALL_SET_FAIL:
×
247
      return "Set all sub devices failed";
×
248
    default:
×
249
      ostringstream str;
×
250
      str << "Unknown, was " << reason;
×
251
      return str.str();
×
252
  }
253
}
254

255

256
/**
257
 * Convert a uint8_t representing a power state to a human-readable string.
258
 * @param power_state the power state value
259
 */
260
string PowerStateToString(uint8_t power_state) {
×
261
  switch (power_state) {
×
262
    case POWER_STATE_FULL_OFF:
×
263
      return "Full Off";
×
264
    case POWER_STATE_SHUTDOWN:
×
265
      return "Shutdown";
×
266
    case POWER_STATE_STANDBY:
×
267
      return "Standby";
×
268
    case POWER_STATE_NORMAL:
×
269
      return "Normal";
×
270
    default:
×
271
      ostringstream str;
×
272
      str << "Unknown, was " << static_cast<int>(power_state);
×
273
      return str.str();
×
274
  }
275
}
276

277

278
/**
279
 * Safely convert a uint8_t to a rdm_power_state
280
 */
281
bool UIntToPowerState(uint8_t state, rdm_power_state *power_state) {
×
282
  switch (state) {
×
283
    case POWER_STATE_FULL_OFF:
×
284
      *power_state = POWER_STATE_FULL_OFF;
×
285
      return true;
×
286
    case POWER_STATE_SHUTDOWN:
×
287
      *power_state = POWER_STATE_SHUTDOWN;
×
288
      return true;
×
289
    case POWER_STATE_STANDBY:
×
290
      *power_state = POWER_STATE_STANDBY;
×
291
      return true;
×
292
    case POWER_STATE_NORMAL:
×
293
      *power_state = POWER_STATE_NORMAL;
×
294
      return true;
×
295
    default:
296
      return false;
297
  }
298
}
299

300

301
/**
302
 * Convert a uint8 representing a prefix to a human-readable string.
303
 * @param prefix the prefix value
304
 */
305
string PrefixToString(uint8_t prefix) {
×
306
  switch (prefix) {
×
307
    case PREFIX_NONE:
×
308
      return "";
×
309
    case PREFIX_DECI:
×
310
      return "Deci";
×
311
    case PREFIX_CENTI:
×
312
      return "Centi";
×
313
    case PREFIX_MILLI:
×
314
      return "Milli";
×
315
    case PREFIX_MICRO:
×
316
      return "Micro";
×
317
    case PREFIX_NANO:
×
318
      return "Nano";
×
319
    case PREFIX_PICO:
×
320
      return "Pico";
×
321
    case PREFIX_FEMTO:
×
322
      return "Femto";
×
323
    case PREFIX_ATTO:
×
324
      return "Atto";
×
325
    case PREFIX_ZEPTO:
×
326
      return "Zepto";
×
327
    case PREFIX_YOCTO:
×
328
      return "Yocto";
×
329
    case PREFIX_DECA:
×
330
      return "Deca";
×
331
    case PREFIX_HECTO:
×
332
      return "Hecto";
×
333
    case PREFIX_KILO:
×
334
      return "Kilo";
×
335
    case PREFIX_MEGA:
×
336
      return "Mega";
×
337
    case PREFIX_GIGA:
×
338
      return "Giga";
×
339
    case PREFIX_TERA:
×
340
      return "Tera";
×
341
    case PREFIX_PETA:
×
342
      return "Peta";
×
343
    case PREFIX_EXA:
×
344
      return "Exa";
×
345
    case PREFIX_ZETTA:
×
346
      return "Zetta";
×
347
    case PREFIX_YOTTA:
×
348
      return "Yotta";
×
349
    default:
×
350
      ostringstream str;
×
351
      str << "Unknown, was " << static_cast<int>(prefix);
×
352
      return str.str();
×
353
  }
354
}
355

356

357
/**
358
 * Convert a uint16_t representing a product category to a human-readable
359
 *   string.
360
 * @param category the product category value
361
 */
362
string ProductCategoryToString(uint16_t category) {
×
363
  switch (category) {
×
364
    case PRODUCT_CATEGORY_NOT_DECLARED:
×
365
      return "Not declared";
×
366
    case PRODUCT_CATEGORY_FIXTURE:
×
367
      return "Fixture";
×
368
    case PRODUCT_CATEGORY_FIXTURE_FIXED:
×
369
      return "Fixed fixture";
×
370
    case PRODUCT_CATEGORY_FIXTURE_MOVING_YOKE:
×
371
      return "Moving yoke fixture";
×
372
    case PRODUCT_CATEGORY_FIXTURE_MOVING_MIRROR:
×
373
      return "Moving mirror fixture";
×
374
    case PRODUCT_CATEGORY_FIXTURE_OTHER:
×
375
      return "Fixture other";
×
376
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY:
×
377
      return "Fixture accessory";
×
378
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_COLOR:
×
379
      return "Fixture accessory color";
×
380
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_YOKE:
×
381
      return "Fixture accessory yoke";
×
382
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_MIRROR:
×
383
      return "Fixture accessory mirror";
×
384
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_EFFECT:
×
385
      return "Fixture accessory effect";
×
386
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_BEAM:
×
387
      return "Fixture accessory beam";
×
388
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_OTHER:
×
389
      return "Fixture accessory other";
×
390
    case PRODUCT_CATEGORY_PROJECTOR:
×
391
      return "Projector";
×
392
    case PRODUCT_CATEGORY_PROJECTOR_FIXED:
×
393
      return "Projector fixed";
×
394
    case PRODUCT_CATEGORY_PROJECTOR_MOVING_YOKE:
×
395
      return "Projector moving yoke";
×
396
    case PRODUCT_CATEGORY_PROJECTOR_MOVING_MIRROR:
×
397
      return "Projector moving mirror";
×
398
    case PRODUCT_CATEGORY_PROJECTOR_OTHER:
×
399
      return "Projector other";
×
400
    case PRODUCT_CATEGORY_ATMOSPHERIC:
×
401
      return "Atmospheric";
×
402
    case PRODUCT_CATEGORY_ATMOSPHERIC_EFFECT:
×
403
      return "Atmospheric effect";
×
404
    case PRODUCT_CATEGORY_ATMOSPHERIC_PYRO:
×
405
      return "Atmospheric pyro";
×
406
    case PRODUCT_CATEGORY_ATMOSPHERIC_OTHER:
×
407
      return "Atmospheric other";
×
408
    case PRODUCT_CATEGORY_DIMMER:
×
409
      return "Dimmer";
×
410
    case PRODUCT_CATEGORY_DIMMER_AC_INCANDESCENT:
×
411
      return "Dimmer AC incandescent";
×
412
    case PRODUCT_CATEGORY_DIMMER_AC_FLUORESCENT:
×
413
      return "Dimmer AC fluorescent";
×
414
    case PRODUCT_CATEGORY_DIMMER_AC_COLDCATHODE:
×
415
      return "Dimmer AC cold cathode";
×
416
    case PRODUCT_CATEGORY_DIMMER_AC_NONDIM:
×
417
      return "Dimmer AC no dim";
×
418
    case PRODUCT_CATEGORY_DIMMER_AC_ELV:
×
419
      return "Dimmer AC ELV";
×
420
    case PRODUCT_CATEGORY_DIMMER_AC_OTHER:
×
421
      return "Dimmer AC other";
×
422
    case PRODUCT_CATEGORY_DIMMER_DC_LEVEL:
×
423
      return "Dimmer DC level";
×
424
    case PRODUCT_CATEGORY_DIMMER_DC_PWM:
×
425
      return "Dimmer DC PWM";
×
426
    case PRODUCT_CATEGORY_DIMMER_CS_LED:
×
427
      return "Dimmer DC LED";
×
428
    case PRODUCT_CATEGORY_DIMMER_OTHER:
×
429
      return "Dimmer other";
×
430
    case PRODUCT_CATEGORY_POWER:
×
431
      return "Power";
×
432
    case PRODUCT_CATEGORY_POWER_CONTROL:
×
433
      return "Power control";
×
434
    case PRODUCT_CATEGORY_POWER_SOURCE:
×
435
      return "Power source";
×
436
    case PRODUCT_CATEGORY_POWER_OTHER:
×
437
      return "Power other";
×
438
    case PRODUCT_CATEGORY_SCENIC:
×
439
      return "Scenic";
×
440
    case PRODUCT_CATEGORY_SCENIC_DRIVE:
×
441
      return "Scenic drive";
×
442
    case PRODUCT_CATEGORY_SCENIC_OTHER:
×
443
      return "Scenic other";
×
444
    case PRODUCT_CATEGORY_DATA:
×
445
      return "Data";
×
446
    case PRODUCT_CATEGORY_DATA_DISTRIBUTION:
×
447
      return "Data distribution";
×
448
    case PRODUCT_CATEGORY_DATA_CONVERSION:
×
449
      return "Data conversion";
×
450
    case PRODUCT_CATEGORY_DATA_OTHER:
×
451
      return "Data other";
×
452
    case PRODUCT_CATEGORY_AV:
×
453
      return "A/V";
×
454
    case PRODUCT_CATEGORY_AV_AUDIO:
×
455
      return "A/V audio";
×
456
    case PRODUCT_CATEGORY_AV_VIDEO:
×
457
      return "A/V video";
×
458
    case PRODUCT_CATEGORY_AV_OTHER:
×
459
      return "AV other";
×
460
    case PRODUCT_CATEGORY_MONITOR:
×
461
      return "Monitor";
×
462
    case PRODUCT_CATEGORY_MONITOR_ACLINEPOWER:
×
463
      return "AC line power monitor";
×
464
    case PRODUCT_CATEGORY_MONITOR_DCPOWER:
×
465
      return "DC power monitor";
×
466
    case PRODUCT_CATEGORY_MONITOR_ENVIRONMENTAL:
×
467
      return "Environmental monitor";
×
468
    case PRODUCT_CATEGORY_MONITOR_OTHER:
×
469
      return "Other monitor";
×
470
    case PRODUCT_CATEGORY_CONTROL:
×
471
      return "Control";
×
472
    case PRODUCT_CATEGORY_CONTROL_CONTROLLER:
×
473
      return "Controller";
×
474
    case PRODUCT_CATEGORY_CONTROL_BACKUPDEVICE:
×
475
      return "Backup device";
×
476
    case PRODUCT_CATEGORY_CONTROL_OTHER:
×
477
      return "Other control";
×
478
    case PRODUCT_CATEGORY_TEST:
×
479
      return "Test";
×
480
    case PRODUCT_CATEGORY_TEST_EQUIPMENT:
×
481
      return "Test equipment";
×
482
    case PRODUCT_CATEGORY_TEST_EQUIPMENT_OTHER:
×
483
      return "Test equipment other";
×
484
    case PRODUCT_CATEGORY_OTHER:
×
485
      return "Other";
×
486
    default:
×
487
      ostringstream str;
×
488
      str << "Unknown, was " << static_cast<int>(category);
×
489
      return str.str();
×
490
  }
491
}
492

493

494
/**
495
 * Convert a uint16_t representing a product detail to a human-readable string.
496
 * @param detail the product detail value.
497
 */
498
string ProductDetailToString(uint16_t detail) {
×
499
  switch (detail) {
×
500
    case PRODUCT_DETAIL_NOT_DECLARED:
×
501
      return "Not declared";
×
502
    case PRODUCT_DETAIL_ARC:
×
503
      return "Arc Lamp";
×
504
    case PRODUCT_DETAIL_METAL_HALIDE:
×
505
      return "Metal Halide Lamp";
×
506
    case PRODUCT_DETAIL_INCANDESCENT:
×
507
      return "Incandescent Lamp";
×
508
    case PRODUCT_DETAIL_LED:
×
509
      return "LED";
×
510
    case PRODUCT_DETAIL_FLUORESCENT:
×
511
      return "Fluorescent";
×
512
    case PRODUCT_DETAIL_COLDCATHODE:
×
513
      return "Cold Cathode";
×
514
    case PRODUCT_DETAIL_ELECTROLUMINESCENT:
×
515
      return "Electro-luminescent";
×
516
    case PRODUCT_DETAIL_LASER:
×
517
      return "Laser";
×
518
    case PRODUCT_DETAIL_FLASHTUBE:
×
519
      return "Flash Tube";
×
520
    case PRODUCT_DETAIL_COLORSCROLLER:
×
521
      return "Color Scroller";
×
522
    case PRODUCT_DETAIL_COLORWHEEL:
×
523
      return "Color Wheel";
×
524
    case PRODUCT_DETAIL_COLORCHANGE:
×
525
      return "Color Changer (Semaphore or other type)";
×
526
    case PRODUCT_DETAIL_IRIS_DOUSER:
×
527
      return "Iris";
×
528
    case PRODUCT_DETAIL_DIMMING_SHUTTER:
×
529
      return "Dimming Shuttle";
×
530
    case PRODUCT_DETAIL_PROFILE_SHUTTER:
×
531
      return "Profile Shuttle";
×
532
    case PRODUCT_DETAIL_BARNDOOR_SHUTTER:
×
533
      return "Barndoor Shuttle";
×
534
    case PRODUCT_DETAIL_EFFECTS_DISC:
×
535
      return "Effects Disc";
×
536
    case PRODUCT_DETAIL_GOBO_ROTATOR:
×
537
      return "Gobo Rotator";
×
538
    case PRODUCT_DETAIL_VIDEO:
×
539
      return "Video";
×
540
    case PRODUCT_DETAIL_SLIDE:
×
541
      return "Slide";
×
542
    case PRODUCT_DETAIL_FILM:
×
543
      return "Film";
×
544
    case PRODUCT_DETAIL_OILWHEEL:
×
545
      return "Oil Wheel";
×
546
    case PRODUCT_DETAIL_LCDGATE:
×
547
      return "LCD Gate";
×
548
    case PRODUCT_DETAIL_FOGGER_GLYCOL:
×
549
      return "Fogger, Glycol";
×
550
    case PRODUCT_DETAIL_FOGGER_MINERALOIL:
×
551
      return "Fogger, Mineral Oil";
×
552
    case PRODUCT_DETAIL_FOGGER_WATER:
×
553
      return "Fogger, Water";
×
554
    case PRODUCT_DETAIL_CO2:
×
555
      return "Dry Ice/ Carbon Dioxide Device";
×
556
    case PRODUCT_DETAIL_LN2:
×
557
      return "Nitrogen based";
×
558
    case PRODUCT_DETAIL_BUBBLE:
×
559
      return "Bubble or Foam Machine";
×
560
    case PRODUCT_DETAIL_FLAME_PROPANE:
×
561
      return "Propane Flame";
×
562
    case PRODUCT_DETAIL_FLAME_OTHER:
×
563
      return "Other Flame";
×
564
    case PRODUCT_DETAIL_OLEFACTORY_STIMULATOR:
×
565
      return "Scents";
×
566
    case PRODUCT_DETAIL_SNOW:
×
567
      return "Snow Machine";
×
568
    case PRODUCT_DETAIL_WATER_JET:
×
569
      return "Water Jet";
×
570
    case PRODUCT_DETAIL_WIND:
×
571
      return "Wind Machine";
×
572
    case PRODUCT_DETAIL_CONFETTI:
×
573
      return "Confetti Machine";
×
574
    case PRODUCT_DETAIL_HAZARD:
×
575
      return "Hazard (Any form of pyrotechnic control or device.)";
×
576
    case PRODUCT_DETAIL_PHASE_CONTROL:
×
577
      return "Phase Control";
×
578
    case PRODUCT_DETAIL_REVERSE_PHASE_CONTROL:
×
579
      return "Phase Angle";
×
580
    case PRODUCT_DETAIL_SINE:
×
581
      return "Sine";
×
582
    case PRODUCT_DETAIL_PWM:
×
583
      return "PWM";
×
584
    case PRODUCT_DETAIL_DC:
×
585
      return "DC";
×
586
    case PRODUCT_DETAIL_HFBALLAST:
×
587
      return "HF Ballast";
×
588
    case PRODUCT_DETAIL_HFHV_NEONBALLAST:
×
589
      return "HFHV Neon/Argon";
×
590
    case PRODUCT_DETAIL_HFHV_EL:
×
591
      return "HFHV Electroluminscent";
×
592
    case PRODUCT_DETAIL_MHR_BALLAST:
×
593
      return "Metal Halide Ballast";
×
594
    case PRODUCT_DETAIL_BITANGLE_MODULATION:
×
595
      return "Bit Angle Modulation";
×
596
    case PRODUCT_DETAIL_FREQUENCY_MODULATION:
×
597
      return "Frequency Modulation";
×
598
    case PRODUCT_DETAIL_HIGHFREQUENCY_12V:
×
599
      return "High Frequency 12V";
×
600
    case PRODUCT_DETAIL_RELAY_MECHANICAL:
×
601
      return "Mechanical Relay";
×
602
    case PRODUCT_DETAIL_RELAY_ELECTRONIC:
×
603
      return "Electronic Relay";
×
604
    case PRODUCT_DETAIL_SWITCH_ELECTRONIC:
×
605
      return "Electronic Switch";
×
606
    case PRODUCT_DETAIL_CONTACTOR:
×
607
      return "Contactor";
×
608
    case PRODUCT_DETAIL_MIRRORBALL_ROTATOR:
×
609
      return "Mirror Ball Rotator";
×
610
    case PRODUCT_DETAIL_OTHER_ROTATOR:
×
611
      return "Other Rotator";
×
612
    case PRODUCT_DETAIL_KABUKI_DROP:
×
613
      return "Kabuki Drop";
×
614
    case PRODUCT_DETAIL_CURTAIN:
×
615
      return "Curtain";
×
616
    case PRODUCT_DETAIL_LINESET:
×
617
      return "Line Set";
×
618
    case PRODUCT_DETAIL_MOTOR_CONTROL:
×
619
      return "Motor Control";
×
620
    case PRODUCT_DETAIL_DAMPER_CONTROL:
×
621
      return "Damper Control";
×
622
    case PRODUCT_DETAIL_SPLITTER:
×
623
      return "Splitter";
×
624
    case PRODUCT_DETAIL_ETHERNET_NODE:
×
625
      return "Ethernet Node";
×
626
    case PRODUCT_DETAIL_MERGE:
×
627
      return "DMX512 Merger";
×
628
    case PRODUCT_DETAIL_DATAPATCH:
×
629
      return "Data Patch";
×
630
    case PRODUCT_DETAIL_WIRELESS_LINK:
×
631
      return "Wireless link";
×
632
    case PRODUCT_DETAIL_PROTOCOL_CONVERTER:
×
633
      return "Protocol Converter";
×
634
    case PRODUCT_DETAIL_ANALOG_DEMULTIPLEX:
×
635
      return "DMX512 to DC Voltage";
×
636
    case PRODUCT_DETAIL_ANALOG_MULTIPLEX:
×
637
      return "DC Voltage to DMX512";
×
638
    case PRODUCT_DETAIL_SWITCH_PANEL:
×
639
      return "Switch Panel";
×
640
    case PRODUCT_DETAIL_ROUTER:
×
641
      return "Router";
×
642
    case PRODUCT_DETAIL_FADER:
×
643
      return "Fader, Single Channel";
×
644
    case PRODUCT_DETAIL_MIXER:
×
645
      return "Mixer, Multi Channel";
×
646
    case PRODUCT_DETAIL_CHANGEOVER_MANUAL:
×
647
      return "Manual Changeover";
×
648
    case PRODUCT_DETAIL_CHANGEOVER_AUTO:
×
649
      return "Auto Changeover";
×
650
    case PRODUCT_DETAIL_TEST:
×
651
      return "Test Device";
×
652
    case PRODUCT_DETAIL_GFI_RCD:
×
653
      return "GFI / RCD Device";
×
654
    case PRODUCT_DETAIL_BATTERY:
×
655
      return "Battery";
×
656
    case PRODUCT_DETAIL_CONTROLLABLE_BREAKER:
×
657
      return "Controllable Breaker";
×
658
    case PRODUCT_DETAIL_INPUT_DEVICE:
×
659
      return "Input Device";
×
660
    case PRODUCT_DETAIL_SENSOR_INPUT:
×
661
      return "Sensor Input";
×
662
    case PRODUCT_DETAIL_OTHER:
×
663
      return "Other Device";
×
664
    default:
×
665
      ostringstream str;
×
666
      str << "Unknown, was " << detail;
×
667
      return str.str();
×
668
  }
669
}
670

671

672
/**
673
 * Convert a uint8_t representing a reset device to a human-readable string.
674
 * @param reset_device the reset device value
675
 */
676
string ResetDeviceToString(uint8_t reset_device) {
×
677
  switch (reset_device) {
×
678
    case RESET_WARM:
×
679
      return "Warm";
×
680
    case RESET_COLD:
×
681
      return "Cold";
×
682
    default:
×
683
      ostringstream str;
×
684
      str << "Unknown, was " << static_cast<int>(reset_device);
×
685
      return str.str();
×
686
  }
687
}
688

689

690
/**
691
 * Safely convert a uint8_t to a rdm_reset_device_mode
692
 */
693
bool UIntToResetDevice(uint8_t state, rdm_reset_device_mode *reset_device) {
×
694
  switch (state) {
×
695
    case RESET_WARM:
×
696
      *reset_device = RESET_WARM;
×
697
      return true;
×
698
    case RESET_COLD:
×
699
      *reset_device = RESET_COLD;
×
700
      return true;
×
701
    default:
702
      return false;
703
  }
704
}
705

706

707
/**
708
 * Convert a uint8_t representing a sensor type to a human-readable string.
709
 * @param type the sensor type value
710
 */
711
string SensorTypeToString(uint8_t type) {
×
712
  switch (type) {
×
713
    case SENSOR_TEMPERATURE:
×
714
      return "Temperature";
×
715
    case SENSOR_VOLTAGE:
×
716
      return "Voltage";
×
717
    case SENSOR_CURRENT:
×
718
      return "Current";
×
719
    case SENSOR_FREQUENCY:
×
720
      return "Frequency";
×
721
    case SENSOR_RESISTANCE:
×
722
      return "Resistance";
×
723
    case SENSOR_POWER:
×
724
      return "Power";
×
725
    case SENSOR_MASS:
×
726
      return "Mass";
×
727
    case SENSOR_LENGTH:
×
728
      return "Length";
×
729
    case SENSOR_AREA:
×
730
      return "Area";
×
731
    case SENSOR_VOLUME:
×
732
      return "Volume";
×
733
    case SENSOR_DENSITY:
×
734
      return "Density";
×
735
    case SENSOR_VELOCITY:
×
736
      return "Velocity";
×
737
    case SENSOR_ACCELERATION:
×
738
      return "Acceleration";
×
739
    case SENSOR_FORCE:
×
740
      return "Force";
×
741
    case SENSOR_ENERGY:
×
742
      return "Energy";
×
743
    case SENSOR_PRESSURE:
×
744
      return "Pressure";
×
745
    case SENSOR_TIME:
×
746
      return "Time";
×
747
    case SENSOR_ANGLE:
×
748
      return "Angle";
×
749
    case SENSOR_POSITION_X:
×
750
      return "Position X";
×
751
    case SENSOR_POSITION_Y:
×
752
      return "Position Y";
×
753
    case SENSOR_POSITION_Z:
×
754
      return "Position Z";
×
755
    case SENSOR_ANGULAR_VELOCITY:
×
756
      return "Angular velocity";
×
757
    case SENSOR_LUMINOUS_INTENSITY:
×
758
      return "Luminous intensity";
×
759
    case SENSOR_LUMINOUS_FLUX:
×
760
      return "Luminous flux";
×
761
    case SENSOR_ILLUMINANCE:
×
762
      return "Illuminance";
×
763
    case SENSOR_CHROMINANCE_RED:
×
764
      return "Chrominance red";
×
765
    case SENSOR_CHROMINANCE_GREEN:
×
766
      return "Chrominance green";
×
767
    case SENSOR_CHROMINANCE_BLUE:
×
768
      return "Chrominance blue";
×
769
    case SENSOR_CONTACTS:
×
770
      return "Contacts";
×
771
    case SENSOR_MEMORY:
×
772
      return "Memory";
×
773
    case SENSOR_ITEMS:
×
774
      return "Items";
×
775
    case SENSOR_HUMIDITY:
×
776
      return "Humidity";
×
777
    case SENSOR_COUNTER_16BIT:
×
778
      return "16 bit counter";
×
779
    case SENSOR_CPU_LOAD:
×
780
      return "CPU load";
×
781
    case SENSOR_BANDWIDTH:
×
782
      return "Bandwidth";
×
783
    case SENSOR_CONCENTRATION:
×
784
      return "Concentration";
×
785
    case SENSOR_SOUND_PRESSURE_LEVEL:
×
786
      return "Sound pressure level";
×
787
    case SENSOR_SOLID_ANGLE:
×
788
      return "Solid angle";
×
789
    case SENSOR_LOG_RATIO:
×
790
      return "Log ratio";
×
791
    case SENSOR_LOG_RATIO_VOLTS:
×
792
      return "Log ratio volts";
×
793
    case SENSOR_LOG_RATIO_WATTS:
×
794
      return "Log ratio watts";
×
795
    case SENSOR_OTHER:
×
796
      return "Other";
×
797
    default:
×
798
      ostringstream str;
×
799
      str << "Unknown, was " << static_cast<int>(type);
×
800
      return str.str();
×
801
  }
802
}
803

804

805
/**
806
 * Convert a uint8_t representing a sensor's recording support to a
807
 * human-readable string.
808
 * @param supports_recording the sensor recording support bitmask
809
 */
810
string SensorSupportsRecordingToString(uint8_t supports_recording) {
×
811
  vector<string> recording_support;
×
812
  if (supports_recording & SENSOR_RECORDED_VALUE) {
×
813
    recording_support.push_back("Recorded Value");
×
814
  }
815
  if (supports_recording & SENSOR_RECORDED_RANGE_VALUES) {
×
816
    recording_support.push_back("Lowest/Highest Detected Values");
×
817
  }
818
  return StringJoin(", ", recording_support);
×
819
}
×
820

821

822
/**
823
 * Convert a uint16_t representing a slot type to a human-readable string.
824
 * @param slot_type the type of the slot.
825
 * @param slot_label the label for the slot.
826
 */
827
string SlotInfoToString(uint8_t slot_type, uint16_t slot_label) {
×
828
  if (slot_type == ST_PRIMARY) {
×
829
    switch (slot_label) {
×
830
      case SD_INTENSITY:
×
831
        return "Primary, intensity";
×
832
      case SD_INTENSITY_MASTER:
×
833
        return "Primary, intensity master";
×
834
      case SD_PAN:
×
835
        return "Primary, pan";
×
836
      case SD_TILT:
×
837
        return "Primary, tilt";
×
838
      case SD_COLOR_WHEEL:
×
839
        return "Primary, color wheel";
×
840
      case SD_COLOR_SUB_CYAN:
×
841
        return "Primary, subtractive cyan";
×
842
      case SD_COLOR_SUB_YELLOW:
×
843
        return "Primary, subtractive yellow";
×
844
      case SD_COLOR_SUB_MAGENTA:
×
845
        return "Primary, subtractive magenta";
×
846
      case SD_COLOR_ADD_RED:
×
847
        return "Primary, additive red";
×
848
      case SD_COLOR_ADD_GREEN:
×
849
        return "Primary, additive green";
×
850
      case SD_COLOR_ADD_BLUE:
×
851
        return "Primary, additive blue";
×
852
      case SD_COLOR_CORRECTION:
×
853
        return "Primary, color correction";
×
854
      case SD_COLOR_SCROLL:
×
855
        return "Primary, scroll";
×
856
      case SD_COLOR_ADD_LIME:
×
857
        return "Primary, additive lime";
×
858
      case SD_COLOR_ADD_INDIGO:
×
859
        return "Primary, additive indigo";
×
860
      case SD_COLOR_ADD_CYAN:
×
861
        return "Primary, additive cyan";
×
862
      case SD_COLOR_ADD_DEEP_RED:
×
863
        return "Primary, additive deep red";
×
864
      case SD_COLOR_ADD_DEEP_BLUE:
×
865
        return "Primary, additive deep blue";
×
866
      case SD_COLOR_ADD_NATURAL_WHITE:
×
867
        return "Primary, additive natural white";
×
868
      case SD_COLOR_SEMAPHORE:
×
869
        return "Primary, color semaphore";
×
870
      case SD_COLOR_ADD_AMBER:
×
871
        return "Primary, additive amber";
×
872
      case SD_COLOR_ADD_WHITE:
×
873
        return "Primary, additive white";
×
874
      case SD_COLOR_ADD_WARM_WHITE:
×
875
        return "Primary, additive warm white";
×
876
      case SD_COLOR_ADD_COOL_WHITE:
×
877
        return "Primary, additive cool white";
×
878
      case SD_COLOR_SUB_UV:
×
879
        return "Primary, subtractive UV";
×
880
      case SD_COLOR_HUE:
×
881
        return "Primary, hue";
×
882
      case SD_COLOR_SATURATION:
×
883
        return "Primary, saturation";
×
884
      case SD_COLOR_ADD_UV:
×
885
        return "Primary, additive UV";
×
886
      case SD_CIE_X:
×
887
        return "Primary, CIE X color coordinate";
×
888
      case SD_CIE_Y:
×
889
        return "Primary, CIE Y color coordinate";
×
890
      case SD_MAGENTA_GREEN_CORRECTION:
×
891
        return "Primary, CCT magenta-green adjustment";
×
892
      case SD_STATIC_GOBO_WHEEL:
×
893
        return "Primary, static gobo wheel";
×
894
      case SD_ROTO_GOBO_WHEEL:
×
895
        return "Primary, gobo wheel";
×
896
      case SD_PRISM_WHEEL:
×
897
        return "Primary, prism wheel";
×
898
      case SD_EFFECTS_WHEEL:
×
899
        return "Primary, effects wheel";
×
900
      case SD_BEAM_SIZE_IRIS:
×
901
        return "Primary, iris size";
×
902
      case SD_EDGE:
×
903
        return "Primary, edge";
×
904
      case SD_FROST:
×
905
        return "Primary, frost";
×
906
      case SD_STROBE:
×
907
        return "Primary, strobe";
×
908
      case SD_ZOOM:
×
909
        return "Primary, zoom";
×
910
      case SD_FRAMING_SHUTTER:
×
911
        return "Primary, framing shutter";
×
912
      case SD_SHUTTER_ROTATE:
×
913
        return "Primary, shuttle rotate";
×
914
      case SD_DOUSER:
×
915
        return "Primary, douser";
×
916
      case SD_BARN_DOOR:
×
917
        return "Primary, barn door";
×
918
      case SD_LAMP_CONTROL:
×
919
        return "Primary, lamp control";
×
920
      case SD_FIXTURE_CONTROL:
×
921
        return "Primary, fixture control";
×
922
      case SD_FIXTURE_SPEED:
×
923
        return "Primary, fixture speed";
×
924
      case SD_MACRO:
×
925
        return "Primary, macro";
×
926
      case SD_POWER_CONTROL:
×
927
        return "Primary, relay or power control";
×
928
      case SD_FAN_CONTROL:
×
929
        return "Primary, fan control";
×
930
      case SD_HEATER_CONTROL:
×
931
        return "Primary, heater control";
×
932
      case SD_FOUNTAIN_CONTROL:
×
933
        return "Primary, fountain water pump control";
×
934
      case SD_UNDEFINED:
×
935
        return "Primary, undefined";
×
936
      default:
×
937
        ostringstream str;
×
938
        str << "Primary, unknown, was " << slot_label;
×
939
        return str.str();
×
940
    }
941
  } else {
942
    ostringstream str;
×
943
    str << "Secondary, ";
×
944
    switch (slot_type) {
×
945
      case ST_SEC_FINE:
×
946
        str << "fine control for slot " << slot_label;
×
947
        break;
948
      case ST_SEC_TIMING:
×
949
        str << "timing control for slot " << slot_label;
×
950
        break;
951
      case ST_SEC_SPEED:
×
952
        str << "speed control for slot " << slot_label;
×
953
        break;
954
      case ST_SEC_CONTROL:
×
955
        str << "mode control for slot " << slot_label;
×
956
        break;
957
      case ST_SEC_INDEX:
×
958
        str << "index control for slot " << slot_label;
×
959
        break;
960
      case ST_SEC_ROTATION:
×
961
        str << "rotation speed control for slot " << slot_label;
×
962
        break;
963
      case ST_SEC_INDEX_ROTATE:
×
964
        str << "rotation index control for slot " << slot_label;
×
965
        break;
966
      case ST_SEC_UNDEFINED:
×
967
        str << "undefined for slot " << slot_label;
×
968
        break;
969
      default:
×
970
        str << "unknown, was type " << static_cast<int>(slot_type)
×
971
            << ", for slot " << slot_label;
×
972
    }
973
    return str.str();
×
974
  }
×
975
}
976

977

978
/**
979
 * Convert a uint16_t representing a status message to a human-readable string.
980
 * @param message_id the status message value
981
 * @param data1 the first data value for the message
982
 * @param data2 the second data value for the message
983
 */
984
string StatusMessageIdToString(uint16_t message_id,
3✔
985
                               int16_t data1,
986
                               int16_t data2) {
987
  ostringstream str;
3✔
988
  switch (message_id) {
3✔
989
    case STS_CAL_FAIL:
1✔
990
      str << "Slot " << data1 << " failed calibration";
1✔
991
      break;
992
    case STS_SENS_NOT_FOUND:
×
993
      str << "Sensor " << data1 << " not found";
×
994
      break;
995
    case STS_SENS_ALWAYS_ON:
×
996
      str << "Sensor " << data1 << " always on";
×
997
      break;
998
    case STS_FEEDBACK_ERROR:
×
999
      str << "Slot " << data1 << " feedback error";
×
1000
      break;
1001
    case STS_INDEX_ERROR:
×
1002
      str << "Slot " << data1 << " index circuit error";
×
1003
      break;
1004
    case STS_LAMP_DOUSED:
×
1005
      str << "Lamp doused";
×
1006
      break;
1007
    case STS_LAMP_STRIKE:
×
1008
      str<< "Lamp failed to strike";
×
1009
      break;
1010
    case STS_LAMP_ACCESS_OPEN:
×
1011
      str << "Lamp access open";
×
1012
      break;
1013
    case STS_LAMP_ALWAYS_ON:
×
1014
      str << "Lamp on without command";
×
1015
      break;
1016
    case STS_OVERTEMP:
×
1017
      str << "Sensor " << data1 << " over temp at " << data2 << " degrees C";
×
1018
      break;
1019
    case STS_UNDERTEMP:
×
1020
      str << "Sensor " << data1 << " under temp at " << data2 << " degrees C";
×
1021
      break;
1022
    case STS_SENS_OUT_RANGE:
×
1023
      str << "Sensor " << data1 << " out of range";
×
1024
      break;
1025
    case STS_OVERVOLTAGE_PHASE:
×
1026
      str << "Phase " << data1 << " over voltage at " << data2 << "V";
×
1027
      break;
1028
    case STS_UNDERVOLTAGE_PHASE:
×
1029
      str << "Phase " << data1 << " under voltage at " << data2 << "V";
×
1030
      break;
1031
    case STS_OVERCURRENT:
×
1032
      str << "Phase " << data1 << " over current at " << data2 << "V";
×
1033
      break;
1034
    case STS_UNDERCURRENT:
×
1035
      str << "Phase " << data1 << " under current at " << data2 << "V";
×
1036
      break;
1037
    case STS_PHASE:
×
1038
      str << "Phase " << data1 << " is at " << data2 << " degrees";
×
1039
      break;
1040
    case STS_PHASE_ERROR:
×
1041
      str << "Phase " << data1 << " error";
×
1042
      break;
1043
    case STS_AMPS:
×
1044
      str << data1 <<  " Amps";
×
1045
      break;
1046
    case STS_VOLTS:
×
1047
      str << data1 <<  " Volts";
×
1048
      break;
1049
    case STS_DIMSLOT_OCCUPIED:
×
1050
      str << "No Dimmer";
×
1051
      break;
1052
    case STS_BREAKER_TRIP:
×
1053
      str <<  "Tripped Breaker";
×
1054
      break;
1055
    case STS_WATTS:
×
1056
      str << data1 <<  " Watts";
×
1057
      break;
1058
    case STS_DIM_FAILURE:
×
1059
      str << "Dimmer Failure";
×
1060
      break;
1061
    case STS_DIM_PANIC:
×
1062
      str << "Dimmer panic mode";
×
1063
      break;
1064
    case STS_LOAD_FAILURE:
×
1065
      str << "Lamp or cable failure";
×
1066
      break;
1067
    case STS_READY:
×
1068
      str << "Slot " << data1 << " ready";
×
1069
      break;
1070
    case STS_NOT_READY:
×
1071
      str << "Slot " << data1 << " not ready";
×
1072
      break;
1073
    case STS_LOW_FLUID:
×
1074
      str << "Slot " << data1 << " low fluid";
×
1075
      break;
1076
    case STS_EEPROM_ERROR:
×
1077
      str << "EEPROM error";
×
1078
      break;
1079
    case STS_RAM_ERROR:
×
1080
      str << "RAM error";
×
1081
      break;
1082
    case STS_FPGA_ERROR:
×
1083
      str << "FPGA programming error";
×
1084
      break;
1085
    case STS_PROXY_BROADCAST_DROPPED:
2✔
1086
      // This is technically against the standard, which in 10.3.2.4 says "Each
1087
      // Data Value shall be a signed integer." but I'm sure it's what was
1088
      // intended. The same thing is technically true with the slots too.
1089
      str << "Proxy Drop: PID "
2✔
1090
          << strings::ToHex(reinterpret_cast<uint16_t&>(data1)) << " at TN "
2✔
1091
          << data2;
2✔
1092
      break;
2✔
1093
    case STS_ASC_RXOK:
×
1094
      str << "DMX ASC " << strings::ToHex(reinterpret_cast<uint16_t&>(data1))
×
1095
          << " received OK";
×
1096
      break;
×
1097
    case STS_ASC_DROPPED:
×
1098
      str << "DMX ASC " << strings::ToHex(reinterpret_cast<uint16_t&>(data1))
×
1099
          << " now dropped";
×
1100
      break;
×
1101
    case STS_DMXNSCNONE:
×
1102
      str << "DMX NSC never received";
×
1103
      break;
1104
    case STS_DMXNSCLOSS:
×
1105
      str << "DMX NSC received, now dropped";
×
1106
      break;
1107
    case STS_DMXNSCERROR:
×
1108
      str << "DMX NSC timing or packet error";
×
1109
      break;
1110
    case STS_DMXNSC_OK:
×
1111
      str << "DMX NSC received OK";
×
1112
      break;
1113
    default:
×
1114
      str << "Unknown, was status message " << message_id << " with data value"
×
1115
             " 1 " << data1 << " and data value 2 " << data2;
×
1116
      break;
1117
  }
1118
  return str.str();
6✔
1119
}
3✔
1120

1121

1122
/**
1123
 * Convert a uint8_t representing a status type to a human-readable string.
1124
 * @param status_type the status type value
1125
 */
1126
string StatusTypeToString(uint8_t status_type) {
×
1127
  switch (status_type) {
×
1128
    case STATUS_NONE:
×
1129
      return "None";
×
1130
    case STATUS_GET_LAST_MESSAGE:
×
1131
      return "Get last messages";
×
1132
    case STATUS_ADVISORY:
×
1133
      return "Advisory";
×
1134
    case STATUS_WARNING:
×
1135
      return "Warning";
×
1136
    case STATUS_ERROR:
×
1137
      return "Error";
×
1138
    case STATUS_ADVISORY_CLEARED:
×
1139
      return "Advisory cleared";
×
1140
    case STATUS_WARNING_CLEARED:
×
1141
      return "Warning cleared";
×
1142
    case STATUS_ERROR_CLEARED:
×
1143
      return "Error cleared";
×
1144
    default:
×
1145
      ostringstream str;
×
1146
      str << "Unknown, was " << static_cast<int>(status_type);
×
1147
      return str.str();
×
1148
  }
1149
}
1150

1151

1152

1153
/**
1154
 * Convert a uint8_t representing a unit to a human-readable string.
1155
 * @param unit the unit value
1156
 */
1157
string UnitToString(uint8_t unit) {
×
1158
  switch (unit) {
×
1159
    case UNITS_NONE:
×
1160
      return "";
×
1161
    case UNITS_CENTIGRADE:
×
1162
      return "degrees C";
×
1163
    case UNITS_VOLTS_DC:
×
1164
      return "Volts (DC)";
×
1165
    case UNITS_VOLTS_AC_PEAK:
×
1166
      return "Volts (AC Peak)";
×
1167
    case UNITS_VOLTS_AC_RMS:
×
1168
      return "Volts (AC RMS)";
×
1169
    case UNITS_AMPERE_DC:
×
1170
      return "Amps (DC)";
×
1171
    case UNITS_AMPERE_AC_PEAK:
×
1172
      return "Amps (AC Peak)";
×
1173
    case UNITS_AMPERE_AC_RMS:
×
1174
      return "Amps (AC RMS)";
×
1175
    case UNITS_HERTZ:
×
1176
      return "Hz";
×
1177
    case UNITS_OHM:
×
1178
      return "ohms";
×
1179
    case UNITS_WATT:
×
1180
      return "W";
×
1181
    case UNITS_KILOGRAM:
×
1182
      return "kg";
×
1183
    case UNITS_METERS:
×
1184
      return "m";
×
1185
    case UNITS_METERS_SQUARED:
×
1186
      return "m^2";
×
1187
    case UNITS_METERS_CUBED:
×
1188
      return "m^3";
×
1189
    case UNITS_KILOGRAMMES_PER_METER_CUBED:
×
1190
      return "kg/m^3";
×
1191
    case UNITS_METERS_PER_SECOND:
×
1192
      return "m/s";
×
1193
    case UNITS_METERS_PER_SECOND_SQUARED:
×
1194
      return "m/s^2";
×
1195
    case UNITS_NEWTON:
×
1196
      return "newton";
×
1197
    case UNITS_JOULE:
×
1198
      return "joule";
×
1199
    case UNITS_PASCAL:
×
1200
      return "pascal";
×
1201
    case UNITS_SECOND:
×
1202
      return "second";
×
1203
    case UNITS_DEGREE:
×
1204
      return "degree";
×
1205
    case UNITS_STERADIAN:
×
1206
      return "steradian";
×
1207
    case UNITS_CANDELA:
×
1208
      return "candela";
×
1209
    case UNITS_LUMEN:
×
1210
      return "lumen";
×
1211
    case UNITS_LUX:
×
1212
      return "lux";
×
1213
    case UNITS_IRE:
×
1214
      return "ire";
×
1215
    case UNITS_BYTE:
×
1216
      return "bytes";
×
1217
    case UNITS_DECIBEL:
×
1218
      return "dB";
×
1219
    case UNITS_DECIBEL_VOLT:
×
1220
      return "dB(V)";
×
1221
    case UNITS_DECIBEL_WATT:
×
1222
      return "dB(W)";
×
1223
    case UNITS_DECIBEL_METER:
×
1224
      return "dB meter";
×
1225
    case UNITS_PERCENT:
×
1226
      return "%";
×
1227
    case UNITS_MOLES_PER_METER_CUBED:
×
1228
      return "mol/m^3";
×
1229
    case UNITS_RPM:
×
1230
      return "RPM";
×
1231
    case UNITS_BYTE_PER_SECOND:
×
1232
      return "Bps";
×
1233
    default:
×
1234
      ostringstream str;
×
1235
      str << "Unknown, was " << static_cast<int>(unit);
×
1236
      return str.str();
×
1237
  }
1238
}
1239

1240

1241
/**
1242
 * Convert a uint8_t representing a shipping lock state to a human-readable string.
1243
 * @param shipping_lock_state the shipping lock state value
1244
 */
1245
string ShippingLockStateToString(uint8_t shipping_lock_state) {
×
1246
  switch (shipping_lock_state) {
×
1247
    case SHIPPING_LOCK_STATE_UNLOCKED:
×
1248
      return "Unlocked";
×
1249
    case SHIPPING_LOCK_STATE_LOCKED:
×
1250
      return "Locked";
×
1251
    case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
×
1252
      return "Partially locked";
×
1253
    default:
×
1254
      ostringstream str;
×
1255
      str << "Unknown, was " << static_cast<int>(shipping_lock_state);
×
1256
      return str.str();
×
1257
  }
1258
}
1259

1260

1261
/**
1262
 * Safely convert a uint8_t to a rdm_shipping_lock_state
1263
 */
1264
bool UIntToShippingLockState(uint8_t state, rdm_shipping_lock_state *shipping_lock_state) {
×
1265
  switch (state) {
×
1266
    case SHIPPING_LOCK_STATE_UNLOCKED:
×
1267
      *shipping_lock_state = SHIPPING_LOCK_STATE_UNLOCKED;
×
1268
      return true;
×
1269
    case SHIPPING_LOCK_STATE_LOCKED:
×
1270
      *shipping_lock_state = SHIPPING_LOCK_STATE_LOCKED;
×
1271
      return true;
×
1272
    case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
×
1273
      *shipping_lock_state = SHIPPING_LOCK_STATE_PARTIALLY_LOCKED;
×
1274
      return true;
×
1275
    default:
1276
      return false;
1277
  }
1278
}
1279
}  // namespace rdm
1280
}  // namespace  ola
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

© 2026 Coveralls, Inc