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

OpenLightingProject / ola / 13752417558

09 Mar 2025 08:54PM UTC coverage: 45.742% (-0.02%) from 45.763%
13752417558

Pull #1996

github

web-flow
Merge 92b0cd4fb into 4690c7ec9
Pull Request #1996: Add some E1.37-5 PIDs and accompanying RDM tests

7823 of 17999 branches covered (43.46%)

59 of 151 new or added lines in 7 files covered. (39.07%)

1 existing line in 1 file now uncovered.

22403 of 48977 relevant lines covered (45.74%)

55.83 hits per line

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

1.28
/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
    default:
×
113
      ostringstream str;
×
114
      str << "Unknown, was " << static_cast<int>(type);
×
115
      return str.str();
×
116
  }
117
}
118

119

120
/**
121
 * Convert a uint8_t representing a lamp mode to a human-readable string.
122
 * @param lamp_mode the lamp mode value
123
 */
124
string LampModeToString(uint8_t lamp_mode) {
×
125
  switch (lamp_mode) {
×
126
    case LAMP_ON_MODE_OFF:
×
127
      return "Off";
×
128
    case LAMP_ON_MODE_DMX:
×
129
      return "DMX";
×
130
    case LAMP_ON_MODE_ON:
×
131
      return "On";
×
132
    case LAMP_ON_MODE_ON_AFTER_CAL:
×
133
      return "On after calibration";
×
134
    default:
×
135
      ostringstream str;
×
136
      str << "Unknown, was " << static_cast<int>(lamp_mode);
×
137
      return str.str();
×
138
  }
139
}
140

141

142
/**
143
 * Convert a uint8_t representing a lamp state to a human-readable string.
144
 * @param lamp_state the lamp state value
145
 */
146
string LampStateToString(uint8_t lamp_state) {
×
147
  switch (lamp_state) {
×
148
    case LAMP_OFF:
×
149
      return "Off";
×
150
    case LAMP_ON:
×
151
      return "On";
×
152
    case LAMP_STRIKE:
×
153
      return "Strike";
×
154
    case LAMP_STANDBY:
×
155
      return "Standby";
×
156
    case LAMP_NOT_PRESENT:
×
157
      return "Lamp not present";
×
158
    case LAMP_ERROR:
×
159
      return "Error";
×
160
    default:
×
161
      ostringstream str;
×
162
      str << "Unknown, was " << static_cast<int>(lamp_state);
×
163
      return str.str();
×
164
  }
165
}
166

167

168
/**
169
 * Convert a uint16_t representing a nack reason to a human-readable string.
170
 * @param reason the nack reason value
171
 */
172
string NackReasonToString(uint16_t reason) {
×
173
  switch (reason) {
×
174
    case NR_UNKNOWN_PID:
×
175
      return "Unknown PID";
×
176
    case NR_FORMAT_ERROR:
×
177
      return "Format error";
×
178
    case NR_HARDWARE_FAULT:
×
179
      return "Hardware fault";
×
180
    case NR_PROXY_REJECT:
×
181
      return "Proxy reject";
×
182
    case NR_WRITE_PROTECT:
×
183
      return "Write protect";
×
184
    case NR_UNSUPPORTED_COMMAND_CLASS:
×
185
      return "Unsupported command class";
×
186
    case NR_DATA_OUT_OF_RANGE:
×
187
      return "Data out of range";
×
188
    case NR_BUFFER_FULL:
×
189
      return "Buffer full";
×
190
    case NR_PACKET_SIZE_UNSUPPORTED:
×
191
      return "Packet size unsupported";
×
192
    case NR_SUB_DEVICE_OUT_OF_RANGE:
×
193
      return "Sub device out of range";
×
194
    case NR_PROXY_BUFFER_FULL:
×
195
      return "Proxy buffer full";
×
196
    case NR_ACTION_NOT_SUPPORTED:
×
197
      return "Action not supported";
×
198
    case NR_ENDPOINT_NUMBER_INVALID:
×
199
      return "Endpoint number invalid";
×
200
    case NR_INVALID_ENDPOINT_MODE:
×
201
      return "Invalid endpoint mode";
×
202
    case NR_UNKNOWN_UID:
×
203
      return "Unknown UID";
×
204
    case NR_UNKNOWN_SCOPE:
×
205
      return "Unknown scope";
×
206
    case NR_INVALID_STATIC_CONFIG_TYPE:
×
207
      return "Invalid static config type";
×
208
    case NR_INVALID_IPV4_ADDRESS:
×
209
      return "Invalid IPv4 address";
×
210
    case NR_INVALID_IPV6_ADDRESS:
×
211
      return "Invalid IPv6 address";
×
212
    case NR_INVALID_PORT:
×
213
      return "Invalid port";
×
214
    default:
×
215
      ostringstream str;
×
216
      str << "Unknown, was " << reason;
×
217
      return str.str();
×
218
  }
219
}
220

221

222
/**
223
 * Convert a uint8_t representing a power state to a human-readable string.
224
 * @param power_state the power state value
225
 */
226
string PowerStateToString(uint8_t power_state) {
×
227
  switch (power_state) {
×
228
    case POWER_STATE_FULL_OFF:
×
229
      return "Full Off";
×
230
    case POWER_STATE_SHUTDOWN:
×
231
      return "Shutdown";
×
232
    case POWER_STATE_STANDBY:
×
233
      return "Standby";
×
234
    case POWER_STATE_NORMAL:
×
235
      return "Normal";
×
236
    default:
×
237
      ostringstream str;
×
238
      str << "Unknown, was " << static_cast<int>(power_state);
×
239
      return str.str();
×
240
  }
241
}
242

243

244
/**
245
 * Safely convert a uint8_t to a rdm_power_state
246
 */
247
bool UIntToPowerState(uint8_t state, rdm_power_state *power_state) {
×
248
  switch (state) {
×
249
    case POWER_STATE_FULL_OFF:
×
250
      *power_state = POWER_STATE_FULL_OFF;
×
251
      return true;
×
252
    case POWER_STATE_SHUTDOWN:
×
253
      *power_state = POWER_STATE_SHUTDOWN;
×
254
      return true;
×
255
    case POWER_STATE_STANDBY:
×
256
      *power_state = POWER_STATE_STANDBY;
×
257
      return true;
×
258
    case POWER_STATE_NORMAL:
×
259
      *power_state = POWER_STATE_NORMAL;
×
260
      return true;
×
261
    default:
262
      return false;
263
  }
264
}
265

266

267
/**
268
 * Convert a uint8 representing a prefix to a human-readable string.
269
 * @param prefix the prefix value
270
 */
271
string PrefixToString(uint8_t prefix) {
×
272
  switch (prefix) {
×
273
    case PREFIX_NONE:
×
274
      return "";
×
275
    case PREFIX_DECI:
×
276
      return "Deci";
×
277
    case PREFIX_CENTI:
×
278
      return "Centi";
×
279
    case PREFIX_MILLI:
×
280
      return "Milli";
×
281
    case PREFIX_MICRO:
×
282
      return "Micro";
×
283
    case PREFIX_NANO:
×
284
      return "Nano";
×
285
    case PREFIX_PICO:
×
286
      return "Pico";
×
287
    case PREFIX_FEMTO:
×
288
      return "Femto";
×
289
    case PREFIX_ATTO:
×
290
      return "Atto";
×
291
    case PREFIX_ZEPTO:
×
292
      return "Zepto";
×
293
    case PREFIX_YOCTO:
×
294
      return "Yocto";
×
295
    case PREFIX_DECA:
×
296
      return "Deca";
×
297
    case PREFIX_HECTO:
×
298
      return "Hecto";
×
299
    case PREFIX_KILO:
×
300
      return "Kilo";
×
301
    case PREFIX_MEGA:
×
302
      return "Mega";
×
303
    case PREFIX_GIGA:
×
304
      return "Giga";
×
305
    case PREFIX_TERA:
×
306
      return "Tera";
×
307
    case PREFIX_PETA:
×
308
      return "Peta";
×
309
    case PREFIX_EXA:
×
310
      return "Exa";
×
311
    case PREFIX_ZETTA:
×
312
      return "Zetta";
×
313
    case PREFIX_YOTTA:
×
314
      return "Yotta";
×
315
    default:
×
316
      ostringstream str;
×
317
      str << "Unknown, was " << static_cast<int>(prefix);
×
318
      return str.str();
×
319
  }
320
}
321

322

323
/**
324
 * Convert a uint16_t representing a product category to a human-readable
325
 *   string.
326
 * @param category the product category value
327
 */
328
string ProductCategoryToString(uint16_t category) {
×
329
  switch (category) {
×
330
    case PRODUCT_CATEGORY_NOT_DECLARED:
×
331
      return "Not declared";
×
332
    case PRODUCT_CATEGORY_FIXTURE:
×
333
      return "Fixture";
×
334
    case PRODUCT_CATEGORY_FIXTURE_FIXED:
×
335
      return "Fixed fixture";
×
336
    case PRODUCT_CATEGORY_FIXTURE_MOVING_YOKE:
×
337
      return "Moving yoke fixture";
×
338
    case PRODUCT_CATEGORY_FIXTURE_MOVING_MIRROR:
×
339
      return "Moving mirror fixture";
×
340
    case PRODUCT_CATEGORY_FIXTURE_OTHER:
×
341
      return "Fixture other";
×
342
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY:
×
343
      return "Fixture accessory";
×
344
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_COLOR:
×
345
      return "Fixture accessory color";
×
346
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_YOKE:
×
347
      return "Fixture accessory yoke";
×
348
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_MIRROR:
×
349
      return "Fixture accessory mirror";
×
350
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_EFFECT:
×
351
      return "Fixture accessory effect";
×
352
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_BEAM:
×
353
      return "Fixture accessory beam";
×
354
    case PRODUCT_CATEGORY_FIXTURE_ACCESSORY_OTHER:
×
355
      return "Fixture accessory other";
×
356
    case PRODUCT_CATEGORY_PROJECTOR:
×
357
      return "Projector";
×
358
    case PRODUCT_CATEGORY_PROJECTOR_FIXED:
×
359
      return "Projector fixed";
×
360
    case PRODUCT_CATEGORY_PROJECTOR_MOVING_YOKE:
×
361
      return "Projector moving yoke";
×
362
    case PRODUCT_CATEGORY_PROJECTOR_MOVING_MIRROR:
×
363
      return "Projector moving mirror";
×
364
    case PRODUCT_CATEGORY_PROJECTOR_OTHER:
×
365
      return "Projector other";
×
366
    case PRODUCT_CATEGORY_ATMOSPHERIC:
×
367
      return "Atmospheric";
×
368
    case PRODUCT_CATEGORY_ATMOSPHERIC_EFFECT:
×
369
      return "Atmospheric effect";
×
370
    case PRODUCT_CATEGORY_ATMOSPHERIC_PYRO:
×
371
      return "Atmospheric pyro";
×
372
    case PRODUCT_CATEGORY_ATMOSPHERIC_OTHER:
×
373
      return "Atmospheric other";
×
374
    case PRODUCT_CATEGORY_DIMMER:
×
375
      return "Dimmer";
×
376
    case PRODUCT_CATEGORY_DIMMER_AC_INCANDESCENT:
×
377
      return "Dimmer AC incandescent";
×
378
    case PRODUCT_CATEGORY_DIMMER_AC_FLUORESCENT:
×
379
      return "Dimmer AC fluorescent";
×
380
    case PRODUCT_CATEGORY_DIMMER_AC_COLDCATHODE:
×
381
      return "Dimmer AC cold cathode";
×
382
    case PRODUCT_CATEGORY_DIMMER_AC_NONDIM:
×
383
      return "Dimmer AC no dim";
×
384
    case PRODUCT_CATEGORY_DIMMER_AC_ELV:
×
385
      return "Dimmer AC ELV";
×
386
    case PRODUCT_CATEGORY_DIMMER_AC_OTHER:
×
387
      return "Dimmer AC other";
×
388
    case PRODUCT_CATEGORY_DIMMER_DC_LEVEL:
×
389
      return "Dimmer DC level";
×
390
    case PRODUCT_CATEGORY_DIMMER_DC_PWM:
×
391
      return "Dimmer DC PWM";
×
392
    case PRODUCT_CATEGORY_DIMMER_CS_LED:
×
393
      return "Dimmer DC LED";
×
394
    case PRODUCT_CATEGORY_DIMMER_OTHER:
×
395
      return "Dimmer other";
×
396
    case PRODUCT_CATEGORY_POWER:
×
397
      return "Power";
×
398
    case PRODUCT_CATEGORY_POWER_CONTROL:
×
399
      return "Power control";
×
400
    case PRODUCT_CATEGORY_POWER_SOURCE:
×
401
      return "Power source";
×
402
    case PRODUCT_CATEGORY_POWER_OTHER:
×
403
      return "Power other";
×
404
    case PRODUCT_CATEGORY_SCENIC:
×
405
      return "Scenic";
×
406
    case PRODUCT_CATEGORY_SCENIC_DRIVE:
×
407
      return "Scenic drive";
×
408
    case PRODUCT_CATEGORY_SCENIC_OTHER:
×
409
      return "Scenic other";
×
410
    case PRODUCT_CATEGORY_DATA:
×
411
      return "Data";
×
412
    case PRODUCT_CATEGORY_DATA_DISTRIBUTION:
×
413
      return "Data distribution";
×
414
    case PRODUCT_CATEGORY_DATA_CONVERSION:
×
415
      return "Data conversion";
×
416
    case PRODUCT_CATEGORY_DATA_OTHER:
×
417
      return "Data other";
×
418
    case PRODUCT_CATEGORY_AV:
×
419
      return "A/V";
×
420
    case PRODUCT_CATEGORY_AV_AUDIO:
×
421
      return "A/V audio";
×
422
    case PRODUCT_CATEGORY_AV_VIDEO:
×
423
      return "A/V video";
×
424
    case PRODUCT_CATEGORY_AV_OTHER:
×
425
      return "AV other";
×
426
    case PRODUCT_CATEGORY_MONITOR:
×
427
      return "Monitor";
×
428
    case PRODUCT_CATEGORY_MONITOR_ACLINEPOWER:
×
429
      return "AC line power monitor";
×
430
    case PRODUCT_CATEGORY_MONITOR_DCPOWER:
×
431
      return "DC power monitor";
×
432
    case PRODUCT_CATEGORY_MONITOR_ENVIRONMENTAL:
×
433
      return "Environmental monitor";
×
434
    case PRODUCT_CATEGORY_MONITOR_OTHER:
×
435
      return "Other monitor";
×
436
    case PRODUCT_CATEGORY_CONTROL:
×
437
      return "Control";
×
438
    case PRODUCT_CATEGORY_CONTROL_CONTROLLER:
×
439
      return "Controller";
×
440
    case PRODUCT_CATEGORY_CONTROL_BACKUPDEVICE:
×
441
      return "Backup device";
×
442
    case PRODUCT_CATEGORY_CONTROL_OTHER:
×
443
      return "Other control";
×
444
    case PRODUCT_CATEGORY_TEST:
×
445
      return "Test";
×
446
    case PRODUCT_CATEGORY_TEST_EQUIPMENT:
×
447
      return "Test equipment";
×
448
    case PRODUCT_CATEGORY_TEST_EQUIPMENT_OTHER:
×
449
      return "Test equipment other";
×
450
    case PRODUCT_CATEGORY_OTHER:
×
451
      return "Other";
×
452
    default:
×
453
      ostringstream str;
×
454
      str << "Unknown, was " << static_cast<int>(category);
×
455
      return str.str();
×
456
  }
457
}
458

459

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

633

634
/**
635
 * Convert a uint8_t representing a reset device to a human-readable string.
636
 * @param reset_device the reset device value
637
 */
638
string ResetDeviceToString(uint8_t reset_device) {
×
639
  switch (reset_device) {
×
640
    case RESET_WARM:
×
641
      return "Warm";
×
642
    case RESET_COLD:
×
643
      return "Cold";
×
644
    default:
×
645
      ostringstream str;
×
646
      str << "Unknown, was " << static_cast<int>(reset_device);
×
647
      return str.str();
×
648
  }
649
}
650

651

652
/**
653
 * Safely convert a uint8_t to a rdm_reset_device_mode
654
 */
655
bool UIntToResetDevice(uint8_t state, rdm_reset_device_mode *reset_device) {
×
656
  switch (state) {
×
657
    case RESET_WARM:
×
658
      *reset_device = RESET_WARM;
×
659
      return true;
×
660
    case RESET_COLD:
×
661
      *reset_device = RESET_COLD;
×
662
      return true;
×
663
    default:
664
      return false;
665
  }
666
}
667

668

669
/**
670
 * Convert a uint8_t representing a sensor type to a human-readable string.
671
 * @param type the sensor type value
672
 */
673
string SensorTypeToString(uint8_t type) {
×
674
  switch (type) {
×
675
    case SENSOR_TEMPERATURE:
×
676
      return "Temperature";
×
677
    case SENSOR_VOLTAGE:
×
678
      return "Voltage";
×
679
    case SENSOR_CURRENT:
×
680
      return "Current";
×
681
    case SENSOR_FREQUENCY:
×
682
      return "Frequency";
×
683
    case SENSOR_RESISTANCE:
×
684
      return "Resistance";
×
685
    case SENSOR_POWER:
×
686
      return "Power";
×
687
    case SENSOR_MASS:
×
688
      return "Mass";
×
689
    case SENSOR_LENGTH:
×
690
      return "Length";
×
691
    case SENSOR_AREA:
×
692
      return "Area";
×
693
    case SENSOR_VOLUME:
×
694
      return "Volume";
×
695
    case SENSOR_DENSITY:
×
696
      return "Density";
×
697
    case SENSOR_VELOCITY:
×
698
      return "Velocity";
×
699
    case SENSOR_ACCELERATION:
×
700
      return "Acceleration";
×
701
    case SENSOR_FORCE:
×
702
      return "Force";
×
703
    case SENSOR_ENERGY:
×
704
      return "Energy";
×
705
    case SENSOR_PRESSURE:
×
706
      return "Pressure";
×
707
    case SENSOR_TIME:
×
708
      return "Time";
×
709
    case SENSOR_ANGLE:
×
710
      return "Angle";
×
711
    case SENSOR_POSITION_X:
×
712
      return "Position X";
×
713
    case SENSOR_POSITION_Y:
×
714
      return "Position Y";
×
715
    case SENSOR_POSITION_Z:
×
716
      return "Position Z";
×
717
    case SENSOR_ANGULAR_VELOCITY:
×
718
      return "Angular velocity";
×
719
    case SENSOR_LUMINOUS_INTENSITY:
×
720
      return "Luminous intensity";
×
721
    case SENSOR_LUMINOUS_FLUX:
×
722
      return "Luminous flux";
×
723
    case SENSOR_ILLUMINANCE:
×
724
      return "Illuminance";
×
725
    case SENSOR_CHROMINANCE_RED:
×
726
      return "Chrominance red";
×
727
    case SENSOR_CHROMINANCE_GREEN:
×
728
      return "Chrominance green";
×
729
    case SENSOR_CHROMINANCE_BLUE:
×
730
      return "Chrominance blue";
×
731
    case SENSOR_CONTACTS:
×
732
      return "Contacts";
×
733
    case SENSOR_MEMORY:
×
734
      return "Memory";
×
735
    case SENSOR_ITEMS:
×
736
      return "Items";
×
737
    case SENSOR_HUMIDITY:
×
738
      return "Humidity";
×
739
    case SENSOR_COUNTER_16BIT:
×
740
      return "16 bit counter";
×
741
    case SENSOR_OTHER:
×
742
      return "Other";
×
743
    default:
×
744
      ostringstream str;
×
745
      str << "Unknown, was " << static_cast<int>(type);
×
746
      return str.str();
×
747
  }
748
}
749

750

751
/**
752
 * Convert a uint8_t representing a sensor's recording support to a
753
 * human-readable string.
754
 * @param supports_recording the sensor recording support bitmask
755
 */
756
string SensorSupportsRecordingToString(uint8_t supports_recording) {
×
757
  vector<string> recording_support;
×
758
  if (supports_recording & SENSOR_RECORDED_VALUE) {
×
759
    recording_support.push_back("Recorded Value");
×
760
  }
761
  if (supports_recording & SENSOR_RECORDED_RANGE_VALUES) {
×
762
    recording_support.push_back("Lowest/Highest Detected Values");
×
763
  }
764
  return StringJoin(", ", recording_support);
×
765
}
×
766

767

768
/**
769
 * Convert a uint16_t representing a slot type to a human-readable string.
770
 * @param slot_type the type of the slot.
771
 * @param slot_label the label for the slot.
772
 */
773
string SlotInfoToString(uint8_t slot_type, uint16_t slot_label) {
×
774
  if (slot_type == ST_PRIMARY) {
×
775
    switch (slot_label) {
×
776
      case SD_INTENSITY:
×
777
        return "Primary, intensity";
×
778
      case SD_INTENSITY_MASTER:
×
779
        return "Primary, intensity master";
×
780
      case SD_PAN:
×
781
        return "Primary, pan";
×
782
      case SD_TILT:
×
783
        return "Primary, tilt";
×
784
      case SD_COLOR_WHEEL:
×
785
        return "Primary, color wheel";
×
786
      case SD_COLOR_SUB_CYAN:
×
787
        return "Primary, subtractive cyan";
×
788
      case SD_COLOR_SUB_YELLOW:
×
789
        return "Primary, subtractive yellow";
×
790
      case SD_COLOR_SUB_MAGENTA:
×
791
        return "Primary, subtractive magenta";
×
792
      case SD_COLOR_ADD_RED:
×
793
        return "Primary, additive red";
×
794
      case SD_COLOR_ADD_GREEN:
×
795
        return "Primary, additive green";
×
796
      case SD_COLOR_ADD_BLUE:
×
797
        return "Primary, additive blue";
×
798
      case SD_COLOR_CORRECTION:
×
799
        return "Primary, color correction";
×
800
      case SD_COLOR_SCROLL:
×
801
        return "Primary, scroll";
×
802
      case SD_COLOR_SEMAPHORE:
×
803
        return "Primary, color semaphore";
×
804
      case SD_COLOR_ADD_AMBER:
×
805
        return "Primary, additive amber";
×
806
      case SD_COLOR_ADD_WHITE:
×
807
        return "Primary, additive white";
×
808
      case SD_COLOR_ADD_WARM_WHITE:
×
809
        return "Primary, additive warm white";
×
810
      case SD_COLOR_ADD_COOL_WHITE:
×
811
        return "Primary, additive cool white";
×
812
      case SD_COLOR_SUB_UV:
×
813
        return "Primary, subtractive UV";
×
814
      case SD_COLOR_HUE:
×
815
        return "Primary, hue";
×
816
      case SD_COLOR_SATURATION:
×
817
        return "Primary, saturation";
×
818
      case SD_STATIC_GOBO_WHEEL:
×
819
        return "Primary, static gobo wheel";
×
820
      case SD_ROTO_GOBO_WHEEL:
×
821
        return "Primary, gobo wheel";
×
822
      case SD_PRISM_WHEEL:
×
823
        return "Primary, prism wheel";
×
824
      case SD_EFFECTS_WHEEL:
×
825
        return "Primary, effects wheel";
×
826
      case SD_BEAM_SIZE_IRIS:
×
827
        return "Primary, iris size";
×
828
      case SD_EDGE:
×
829
        return "Primary, edge";
×
830
      case SD_FROST:
×
831
        return "Primary, frost";
×
832
      case SD_STROBE:
×
833
        return "Primary, strobe";
×
834
      case SD_ZOOM:
×
835
        return "Primary, zoom";
×
836
      case SD_FRAMING_SHUTTER:
×
837
        return "Primary, framing shutter";
×
838
      case SD_SHUTTER_ROTATE:
×
839
        return "Primary, shuttle rotate";
×
840
      case SD_DOUSER:
×
841
        return "Primary, douser";
×
842
      case SD_BARN_DOOR:
×
843
        return "Primary, barn door";
×
844
      case SD_LAMP_CONTROL:
×
845
        return "Primary, lamp control";
×
846
      case SD_FIXTURE_CONTROL:
×
847
        return "Primary, fixture control";
×
848
      case SD_FIXTURE_SPEED:
×
849
        return "Primary, fixture speed";
×
850
      case SD_MACRO:
×
851
        return "Primary, macro";
×
852
      case SD_POWER_CONTROL:
×
853
        return "Primary, relay or power control";
×
854
      case SD_FAN_CONTROL:
×
855
        return "Primary, fan control";
×
856
      case SD_HEATER_CONTROL:
×
857
        return "Primary, heater control";
×
858
      case SD_FOUNTAIN_CONTROL:
×
859
        return "Primary, fountain water pump control";
×
860
      case SD_UNDEFINED:
×
861
        return "Primary, undefined";
×
862
      default:
×
863
        ostringstream str;
×
864
        str << "Primary, unknown, was " << slot_label;
×
865
        return str.str();
×
866
    }
867
  } else {
868
    ostringstream str;
×
869
    str << "Secondary, ";
×
870
    switch (slot_type) {
×
871
      case ST_SEC_FINE:
×
872
        str << "fine control for slot " << slot_label;
×
873
        break;
874
      case ST_SEC_TIMING:
×
875
        str << "timing control for slot " << slot_label;
×
876
        break;
877
      case ST_SEC_SPEED:
×
878
        str << "speed control for slot " << slot_label;
×
879
        break;
880
      case ST_SEC_CONTROL:
×
881
        str << "mode control for slot " << slot_label;
×
882
        break;
883
      case ST_SEC_INDEX:
×
884
        str << "index control for slot " << slot_label;
×
885
        break;
886
      case ST_SEC_ROTATION:
×
887
        str << "rotation speed control for slot " << slot_label;
×
888
        break;
889
      case ST_SEC_INDEX_ROTATE:
×
890
        str << "rotation index control for slot " << slot_label;
×
891
        break;
892
      case ST_SEC_UNDEFINED:
×
893
        str << "undefined for slot " << slot_label;
×
894
        break;
895
      default:
×
896
        str << "unknown, was type " << static_cast<int>(slot_type)
×
897
            << ", for slot " << slot_label;
×
898
    }
899
    return str.str();
×
900
  }
×
901
}
902

903

904
/**
905
 * Convert a uint16_t representing a status message to a human-readable string.
906
 * @param message_id the status message value
907
 * @param data1 the first data value for the message
908
 * @param data2 the second data value for the message
909
 */
910
string StatusMessageIdToString(uint16_t message_id,
3✔
911
                               int16_t data1,
912
                               int16_t data2) {
913
  ostringstream str;
3✔
914
  switch (message_id) {
3✔
915
    case STS_CAL_FAIL:
1✔
916
      str << "Slot " << data1 << " failed calibration";
1✔
917
      break;
918
    case STS_SENS_NOT_FOUND:
×
919
      str << "Sensor " << data1 << " not found";
×
920
      break;
921
    case STS_SENS_ALWAYS_ON:
×
922
      str << "Sensor " << data1 << " always on";
×
923
      break;
924
    case STS_FEEDBACK_ERROR:
×
925
      str << "Slot " << data1 << " feedback error";
×
926
      break;
927
    case STS_INDEX_ERROR:
×
928
      str << "Slot " << data1 << " index circuit error";
×
929
      break;
930
    case STS_LAMP_DOUSED:
×
931
      str << "Lamp doused";
×
932
      break;
933
    case STS_LAMP_STRIKE:
×
934
      str<< "Lamp failed to strike";
×
935
      break;
936
    case STS_LAMP_ACCESS_OPEN:
×
937
      str << "Lamp access open";
×
938
      break;
939
    case STS_LAMP_ALWAYS_ON:
×
940
      str << "Lamp on without command";
×
941
      break;
942
    case STS_OVERTEMP:
×
943
      str << "Sensor " << data1 << " over temp at " << data2 << " degrees C";
×
944
      break;
945
    case STS_UNDERTEMP:
×
946
      str << "Sensor " << data1 << " under temp at " << data2 << " degrees C";
×
947
      break;
948
    case STS_SENS_OUT_RANGE:
×
949
      str << "Sensor " << data1 << " out of range";
×
950
      break;
951
    case STS_OVERVOLTAGE_PHASE:
×
952
      str << "Phase " << data1 << " over voltage at " << data2 << "V";
×
953
      break;
954
    case STS_UNDERVOLTAGE_PHASE:
×
955
      str << "Phase " << data1 << " under voltage at " << data2 << "V";
×
956
      break;
957
    case STS_OVERCURRENT:
×
958
      str << "Phase " << data1 << " over current at " << data2 << "V";
×
959
      break;
960
    case STS_UNDERCURRENT:
×
961
      str << "Phase " << data1 << " under current at " << data2 << "V";
×
962
      break;
963
    case STS_PHASE:
×
964
      str << "Phase " << data1 << " is at " << data2 << " degrees";
×
965
      break;
966
    case STS_PHASE_ERROR:
×
967
      str << "Phase " << data1 << " error";
×
968
      break;
969
    case STS_AMPS:
×
970
      str << data1 <<  " Amps";
×
971
      break;
972
    case STS_VOLTS:
×
973
      str << data1 <<  " Volts";
×
974
      break;
975
    case STS_DIMSLOT_OCCUPIED:
×
976
      str << "No Dimmer";
×
977
      break;
978
    case STS_BREAKER_TRIP:
×
979
      str <<  "Tripped Breaker";
×
980
      break;
981
    case STS_WATTS:
×
982
      str << data1 <<  " Watts";
×
983
      break;
984
    case STS_DIM_FAILURE:
×
985
      str << "Dimmer Failure";
×
986
      break;
987
    case STS_DIM_PANIC:
×
988
      str << "Dimmer panic mode";
×
989
      break;
990
    case STS_LOAD_FAILURE:
×
991
      str << "Lamp or cable failure";
×
992
      break;
993
    case STS_READY:
×
994
      str << "Slot " << data1 << " ready";
×
995
      break;
996
    case STS_NOT_READY:
×
997
      str << "Slot " << data1 << " not ready";
×
998
      break;
999
    case STS_LOW_FLUID:
×
1000
      str << "Slot " << data1 << " low fluid";
×
1001
      break;
1002
    case STS_EEPROM_ERROR:
×
1003
      str << "EEPROM error";
×
1004
      break;
1005
    case STS_RAM_ERROR:
×
1006
      str << "RAM error";
×
1007
      break;
1008
    case STS_FPGA_ERROR:
×
1009
      str << "FPGA programming error";
×
1010
      break;
1011
    case STS_PROXY_BROADCAST_DROPPED:
2✔
1012
      // This is technically against the standard, which in 10.3.2.4 says "Each
1013
      // Data Value shall be a signed integer." but I'm sure it's what was
1014
      // intended. The same thing is technically true with the slots too.
1015
      str << "Proxy Drop: PID "
2✔
1016
          << strings::ToHex(reinterpret_cast<uint16_t&>(data1)) << " at TN "
2✔
1017
          << data2;
2✔
1018
      break;
2✔
1019
    case STS_ASC_RXOK:
×
1020
      str << "DMX ASC " << strings::ToHex(reinterpret_cast<uint16_t&>(data1))
×
1021
          << " received OK";
×
1022
      break;
×
1023
    case STS_ASC_DROPPED:
×
1024
      str << "DMX ASC " << strings::ToHex(reinterpret_cast<uint16_t&>(data1))
×
1025
          << " now dropped";
×
1026
      break;
×
1027
    case STS_DMXNSCNONE:
×
1028
      str << "DMX NSC never received";
×
1029
      break;
1030
    case STS_DMXNSCLOSS:
×
1031
      str << "DMX NSC received, now dropped";
×
1032
      break;
1033
    case STS_DMXNSCERROR:
×
1034
      str << "DMX NSC timing or packet error";
×
1035
      break;
1036
    case STS_DMXNSC_OK:
×
1037
      str << "DMX NSC received OK";
×
1038
      break;
1039
    default:
×
1040
      str << "Unknown, was status message " << message_id << " with data value"
×
1041
             " 1 " << data1 << " and data value 2 " << data2;
×
1042
      break;
1043
  }
1044
  return str.str();
6✔
1045
}
3✔
1046

1047

1048
/**
1049
 * Convert a uint8_t representing a status type to a human-readable string.
1050
 * @param status_type the status type value
1051
 */
1052
string StatusTypeToString(uint8_t status_type) {
×
1053
  switch (status_type) {
×
1054
    case STATUS_NONE:
×
1055
      return "None";
×
1056
    case STATUS_GET_LAST_MESSAGE:
×
1057
      return "Get last messages";
×
1058
    case STATUS_ADVISORY:
×
1059
      return "Advisory";
×
1060
    case STATUS_WARNING:
×
1061
      return "Warning";
×
1062
    case STATUS_ERROR:
×
1063
      return "Error";
×
1064
    case STATUS_ADVISORY_CLEARED:
×
1065
      return "Advisory cleared";
×
1066
    case STATUS_WARNING_CLEARED:
×
1067
      return "Warning cleared";
×
1068
    case STATUS_ERROR_CLEARED:
×
1069
      return "Error cleared";
×
1070
    default:
×
1071
      ostringstream str;
×
1072
      str << "Unknown, was " << static_cast<int>(status_type);
×
1073
      return str.str();
×
1074
  }
1075
}
1076

1077

1078

1079
/**
1080
 * Convert a uint8_t representing a unit to a human-readable string.
1081
 * @param unit the unit value
1082
 */
1083
string UnitToString(uint8_t unit) {
×
1084
  switch (unit) {
×
1085
    case UNITS_NONE:
×
1086
      return "";
×
1087
    case UNITS_CENTIGRADE:
×
1088
      return "degrees C";
×
1089
    case UNITS_VOLTS_DC:
×
1090
      return "Volts (DC)";
×
1091
    case UNITS_VOLTS_AC_PEAK:
×
1092
      return "Volts (AC Peak)";
×
1093
    case UNITS_VOLTS_AC_RMS:
×
1094
      return "Volts (AC RMS)";
×
1095
    case UNITS_AMPERE_DC:
×
1096
      return "Amps (DC)";
×
1097
    case UNITS_AMPERE_AC_PEAK:
×
1098
      return "Amps (AC Peak)";
×
1099
    case UNITS_AMPERE_AC_RMS:
×
1100
      return "Amps (AC RMS)";
×
1101
    case UNITS_HERTZ:
×
1102
      return "Hz";
×
1103
    case UNITS_OHM:
×
1104
      return "ohms";
×
1105
    case UNITS_WATT:
×
1106
      return "W";
×
1107
    case UNITS_KILOGRAM:
×
1108
      return "kg";
×
1109
    case UNITS_METERS:
×
1110
      return "m";
×
1111
    case UNITS_METERS_SQUARED:
×
1112
      return "m^2";
×
1113
    case UNITS_METERS_CUBED:
×
1114
      return "m^3";
×
1115
    case UNITS_KILOGRAMMES_PER_METER_CUBED:
×
1116
      return "kg/m^3";
×
1117
    case UNITS_METERS_PER_SECOND:
×
1118
      return "m/s";
×
1119
    case UNITS_METERS_PER_SECOND_SQUARED:
×
1120
      return "m/s^2";
×
1121
    case UNITS_NEWTON:
×
1122
      return "newton";
×
1123
    case UNITS_JOULE:
×
1124
      return "joule";
×
1125
    case UNITS_PASCAL:
×
1126
      return "pascal";
×
1127
    case UNITS_SECOND:
×
1128
      return "second";
×
1129
    case UNITS_DEGREE:
×
1130
      return "degree";
×
1131
    case UNITS_STERADIAN:
×
1132
      return "steradian";
×
1133
    case UNITS_CANDELA:
×
1134
      return "candela";
×
1135
    case UNITS_LUMEN:
×
1136
      return "lumen";
×
1137
    case UNITS_LUX:
×
1138
      return "lux";
×
1139
    case UNITS_IRE:
×
1140
      return "ire";
×
1141
    case UNITS_BYTE:
×
1142
      return "bytes";
×
1143
    default:
×
1144
      ostringstream str;
×
1145
      str << "Unknown, was " << static_cast<int>(unit);
×
1146
      return str.str();
×
1147
  }
1148
}
1149

1150

1151
/**
1152
 * Convert a uint8_t representing a shipping lock state to a human-readable string.
1153
 * @param shipping_lock_state the shipping lock state value
1154
 */
NEW
1155
string ShippingLockStateToString(uint8_t shipping_lock_state) {
×
NEW
1156
  switch (shipping_lock_state) {
×
NEW
1157
    case SHIPPING_LOCK_STATE_UNLOCKED:
×
NEW
1158
      return "Unlocked";
×
NEW
1159
    case SHIPPING_LOCK_STATE_LOCKED:
×
NEW
1160
      return "Locked";
×
NEW
1161
    case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
×
NEW
1162
      return "Partially locked";
×
NEW
1163
    default:
×
NEW
1164
      ostringstream str;
×
NEW
1165
      str << "Unknown, was " << static_cast<int>(shipping_lock_state);
×
NEW
1166
      return str.str();
×
1167
  }
1168
}
1169

1170

1171
/**
1172
 * Safely convert a uint8_t to a rdm_shipping_lock_state
1173
 */
NEW
1174
bool UIntToShippingLockState(uint8_t state, rdm_shipping_lock_state *shipping_lock_state) {
×
NEW
1175
  switch (state) {
×
NEW
1176
    case SHIPPING_LOCK_STATE_UNLOCKED:
×
NEW
1177
      *shipping_lock_state = SHIPPING_LOCK_STATE_UNLOCKED;
×
NEW
1178
      return true;
×
NEW
1179
    case SHIPPING_LOCK_STATE_LOCKED:
×
NEW
1180
      *shipping_lock_state = SHIPPING_LOCK_STATE_LOCKED;
×
NEW
1181
      return true;
×
NEW
1182
    case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
×
NEW
1183
      *shipping_lock_state = SHIPPING_LOCK_STATE_PARTIALLY_LOCKED;
×
NEW
1184
      return true;
×
1185
    default:
1186
      return false;
1187
  }
1188
}
1189
}  // namespace rdm
1190
}  // 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