NanoOcp
Minimal AES70 / OCP.1 TCP client/server library for d&b Soundscape devices
Loading...
Searching...
No Matches
Ocp1DataTypes.cpp
Go to the documentation of this file.
1/* Copyright (c) 2024, Bernardo Escalona
2 *
3 * This file is part of NanoOcp <https://github.com/ChristianAhrens/NanoOcp>
4 *
5 * This library is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License version 3.0 as published
7 * by the Free Software Foundation.
8 *
9 * This library is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 * details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19#ifdef JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED
20 #include <juce_core/juce_core.h>
21#else
22 #include <JuceHeader.h>
23#endif
24
25
26#include "Ocp1DataTypes.h"
27
28namespace NanoOcp1
29{
30
31static constexpr std::uint8_t uint8_8(8);
32static constexpr std::uint8_t uint8_16(16);
33static constexpr std::uint8_t uint8_24(24);
34static constexpr std::uint8_t uint8_32(32);
35static constexpr std::uint8_t uint8_40(40);
36static constexpr std::uint8_t uint8_48(48);
37static constexpr std::uint8_t uint8_56(56);
38
39bool DataToBool(const ByteVector& parameterData, bool* pOk)
40{
41 bool ret(false);
42 bool ok = parameterData.size() == 1;
43
44 if (ok)
45 {
46 ret = (bool)(parameterData[0] == static_cast<std::uint8_t>(1));
47 }
48
49 if (pOk != nullptr)
50 {
51 *pOk = ok;
52 }
53
54 return ret;
55}
56
57ByteVector DataFromBool(bool boolValue)
58{
59 return ByteVector{ boolValue ? static_cast<std::uint8_t>(1) : static_cast<std::uint8_t>(0) };
60}
61
62std::int32_t DataToInt32(const ByteVector& parameterData, bool* pOk)
63{
64 std::int32_t ret(0);
65
66 // HACK: Use >= and not == to easily deal with responses sometimes including min and max values.
67 bool ok = (parameterData.size() >= sizeof(std::int32_t)); // 4 bytes expected.
68 if (ok)
69 {
70 ret = (((parameterData[0] << uint8_24) & 0xff000000) +
71 ((parameterData[1] << uint8_16) & 0x00ff0000) +
72 ((parameterData[2] << uint8_8) & 0x0000ff00) + parameterData[3]);
73 }
74
75 if (pOk != nullptr)
76 {
77 *pOk = ok;
78 }
79
80 return ret;
81}
82
83ByteVector DataFromInt32(std::int32_t intValue)
84{
85 ByteVector ret;
86 ret.reserve(4);
87
88 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
89 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
90 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
91 ret.push_back(static_cast<std::uint8_t>(intValue));
92
93 return ret;
94}
95
96std::uint8_t DataToUint8(const ByteVector& parameterData, bool* pOk)
97{
98 std::uint8_t ret(0);
99 bool ok = (parameterData.size() >= sizeof(std::uint8_t));
100 if (ok)
101 {
102 ret = parameterData[0];
103 }
104
105 if (pOk != nullptr)
106 {
107 *pOk = ok;
108 }
109
110 return ret;
111}
112
113ByteVector DataFromUint8(std::uint8_t value)
114{
115 ByteVector ret;
116 ret.push_back(value);
117
118 return ret;
119}
120
121
122std::uint16_t DataToUint16(const ByteVector& parameterData, bool* pOk)
123{
124 std::uint16_t ret(0);
125 bool ok = (parameterData.size() >= sizeof(std::uint16_t));
126 if (ok)
127 {
128 for (size_t i = 0; i < sizeof(std::uint16_t); i++)
129 {
130 ret = ((ret << static_cast<std::uint16_t>(8)) & 0xff00) + parameterData[i];
131 }
132 }
133
134 if (pOk != nullptr)
135 {
136 *pOk = ok;
137 }
138
139 return ret;
140}
141
142ByteVector DataFromUint16(std::uint16_t value)
143{
144 ByteVector ret;
145 ret.push_back(static_cast<std::uint8_t>(value >> 8));
146 ret.push_back(static_cast<std::uint8_t>(value));
147
148 return ret;
149}
150
151std::uint32_t DataToUint32(const ByteVector& parameterData, bool* pOk)
152{
153 std::uint32_t ret(0);
154
155 bool ok = (parameterData.size() >= sizeof(std::uint32_t)); // 4 bytes expected.
156 if (ok)
157 {
158 ret = (((parameterData[0] << uint8_24) & 0xff000000) +
159 ((parameterData[1] << uint8_16) & 0x00ff0000) +
160 ((parameterData[2] << uint8_8) & 0x0000ff00) + parameterData[3]);
161 }
162
163 if (pOk != nullptr)
164 {
165 *pOk = ok;
166 }
167
168 return ret;
169}
170
171ByteVector DataFromUint32(std::uint32_t intValue)
172{
173 ByteVector ret;
174 ret.reserve(4);
175
176 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
177 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
178 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
179 ret.push_back(static_cast<std::uint8_t>(intValue));
180
181 return ret;
182}
183
184std::uint64_t DataToUint64(const ByteVector& parameterData, bool* pOk)
185{
186 std::uint64_t ret(0);
187
188 bool ok = (parameterData.size() >= sizeof(std::uint64_t)); // 8 bytes expected.
189 if (ok)
190 {
191 std::uint64_t tmp;
192 memcpy(&tmp, parameterData.data(), sizeof(juce::uint64));
193 ret = juce::ByteOrder::swapIfLittleEndian<juce::uint64>(tmp);
194 }
195
196 if (pOk != nullptr)
197 {
198 *pOk = ok;
199 }
200
201 return ret;
202}
203
204ByteVector DataFromUint64(std::uint64_t intValue)
205{
206 return ByteVector
207 ({
208 static_cast<std::uint8_t>(intValue >> 56),
209 static_cast<std::uint8_t>(intValue >> 48),
210 static_cast<std::uint8_t>(intValue >> 40),
211 static_cast<std::uint8_t>(intValue >> 32),
212 static_cast<std::uint8_t>(intValue >> 24),
213 static_cast<std::uint8_t>(intValue >> 16),
214 static_cast<std::uint8_t>(intValue >> 8),
215 static_cast<std::uint8_t>(intValue),
216 });
217}
218
219std::string DataToString(const ByteVector& parameterData, bool* pOk)
220{
221 std::string ret;
222
223 bool ok = parameterData.size() >= 2; // At least 2 bytes for the string length
224 if (ok)
225 ret = std::string(parameterData.begin() + 2, parameterData.end());
226
227 if (pOk != nullptr)
228 {
229 *pOk = ok;
230 }
231
232 return ret;
233}
234
235ByteVector DataFromString(const std::string& string)
236{
237 ByteVector ret;
238
239 const char* pStringData = string.c_str();
240 std::size_t stringLength = string.length();
241
242 ret.reserve(stringLength + static_cast<std::size_t>(2));
243 ret.push_back(static_cast<std::uint8_t>(stringLength >> static_cast<std::size_t>(8)));
244 ret.push_back(static_cast<std::uint8_t>(stringLength));
245 for (int i = 0; i < stringLength; i++)
246 {
247 ret.push_back(static_cast<std::uint8_t>(pStringData[i]));
248 }
249
250 return ret;
251}
252
253std::float_t DataToFloat(const ByteVector& parameterData, bool* pOk)
254{
255 std::float_t ret(0);
256
257 bool ok = (parameterData.size() >= sizeof(std::float_t)); // 4 bytes expected.
258 ok = ok && (sizeof(int) == sizeof(std::float_t)); // Required for pointer cast to work
259 if (ok)
260 {
261 int intValue = (((parameterData[0] << uint8_24) & 0xff000000) +
262 ((parameterData[1] << uint8_16) & 0x00ff0000) +
263 ((parameterData[2] << uint8_8) & 0x0000ff00) + parameterData[3]);
264 ret = *(std::float_t*)&intValue;
265 }
266
267 if (pOk != nullptr)
268 {
269 *pOk = ok;
270 }
271
272 return ret;
273}
274
275ByteVector DataFromFloat(std::float_t floatValue)
276{
277 ByteVector ret;
278 ret.reserve(4);
279
280 jassert(sizeof(std::uint32_t) == sizeof(std::float_t)); // Required for pointer cast to work
281 std::uint32_t intValue = *(std::uint32_t*)&floatValue;
282
283 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
284 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
285 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
286 ret.push_back(static_cast<std::uint8_t>(intValue));
287
288 return ret;
289}
290
291std::double_t DataToDouble(const ByteVector& parameterData, bool* pOk)
292{
293 std::double_t ret(0);
294
295 bool ok = (parameterData.size() >= sizeof(std::double_t)); // 8 bytes expected.
296 ok = ok && (sizeof(std::uint64_t) == sizeof(std::double_t)); // Required for pointer cast to work
297 if (ok)
298 {
299 std::uint64_t intValue = (((static_cast<std::uint64_t>(parameterData[0]) << uint8_56) & 0xff00000000000000ULL) +
300 ((static_cast<std::uint64_t>(parameterData[1]) << uint8_48) & 0x00ff000000000000ULL) +
301 ((static_cast<std::uint64_t>(parameterData[2]) << uint8_40) & 0x0000ff0000000000ULL) +
302 ((static_cast<std::uint64_t>(parameterData[3]) << uint8_32) & 0x000000ff00000000ULL) +
303 ((static_cast<std::uint64_t>(parameterData[4]) << uint8_24) & 0x00000000ff000000ULL) +
304 ((static_cast<std::uint64_t>(parameterData[5]) << uint8_16) & 0x0000000000ff0000ULL) +
305 ((static_cast<std::uint64_t>(parameterData[6]) << uint8_8) & 0x000000000000ff00ULL) +
306 parameterData[7]);
307 ret = *(std::double_t*)&intValue;
308 }
309
310 if (pOk != nullptr)
311 {
312 *pOk = ok;
313 }
314
315 return ret;
316}
317
318ByteVector DataFromDouble(std::double_t doubleValue)
319{
320 jassert(sizeof(std::uint64_t) == sizeof(std::double_t)); // Required for pointer cast to work
321 std::uint64_t intValue = *(std::uint64_t*)&doubleValue;
322
323 return ByteVector
324 ({
325 static_cast<std::uint8_t>(intValue >> 56),
326 static_cast<std::uint8_t>(intValue >> 48),
327 static_cast<std::uint8_t>(intValue >> 40),
328 static_cast<std::uint8_t>(intValue >> 32),
329 static_cast<std::uint8_t>(intValue >> 24),
330 static_cast<std::uint8_t>(intValue >> 16),
331 static_cast<std::uint8_t>(intValue >> 8),
332 static_cast<std::uint8_t>(intValue),
333 });
334}
335
336ByteVector DataFromPosition(std::float_t x, std::float_t y, std::float_t z)
337{
338 jassert(sizeof(std::uint32_t) == sizeof(std::float_t)); // Required for pointer cast below
339 std::uint32_t xInt = *(std::uint32_t*)&x;
340 std::uint32_t yInt = *(std::uint32_t*)&y;
341 std::uint32_t zInt = *(std::uint32_t*)&z;
342
343 ByteVector ret
344 ({
345 static_cast<std::uint8_t>(xInt >> 24),
346 static_cast<std::uint8_t>(xInt >> 16),
347 static_cast<std::uint8_t>(xInt >> 8),
348 static_cast<std::uint8_t>(xInt),
349 static_cast<std::uint8_t>(yInt >> 24),
350 static_cast<std::uint8_t>(yInt >> 16),
351 static_cast<std::uint8_t>(yInt >> 8),
352 static_cast<std::uint8_t>(yInt),
353 static_cast<std::uint8_t>(zInt >> 24),
354 static_cast<std::uint8_t>(zInt >> 16),
355 static_cast<std::uint8_t>(zInt >> 8),
356 static_cast<std::uint8_t>(zInt),
357 });
358
359 return ret;
360}
361
362ByteVector DataFromPositionAndRotation(std::float_t x, std::float_t y, std::float_t z, std::float_t hor, std::float_t vert, std::float_t rot)
363{
364 return DataFromAimingAndPosition(hor, vert, rot, x, y, z);
365}
366
367ByteVector DataFromAimingAndPosition(std::float_t hor, std::float_t vert, std::float_t rot, std::float_t x, std::float_t y, std::float_t z)
368{
369 ByteVector ret;
370 ret.reserve(6 * 4);
371
372 jassert(sizeof(std::uint32_t) == sizeof(std::float_t)); // Required for pointer cast to work
373
374 std::uint32_t intValue = *(std::uint32_t*)&hor;
375 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
376 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
377 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
378 ret.push_back(static_cast<std::uint8_t>(intValue));
379
380 intValue = *(std::uint32_t*)&vert;
381 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
382 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
383 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
384 ret.push_back(static_cast<std::uint8_t>(intValue));
385
386 intValue = *(std::uint32_t*)&rot;
387 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
388 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
389 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
390 ret.push_back(static_cast<std::uint8_t>(intValue));
391
392 intValue = *(std::uint32_t*)&x;
393 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
394 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
395 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
396 ret.push_back(static_cast<std::uint8_t>(intValue));
397
398 intValue = *(std::uint32_t*)&y;
399 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
400 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
401 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
402 ret.push_back(static_cast<std::uint8_t>(intValue));
403
404 intValue = *(std::uint32_t*)&z;
405 ret.push_back(static_cast<std::uint8_t>(intValue >> 24));
406 ret.push_back(static_cast<std::uint8_t>(intValue >> 16));
407 ret.push_back(static_cast<std::uint8_t>(intValue >> 8));
408 ret.push_back(static_cast<std::uint8_t>(intValue));
409
410 return ret;
411}
412
413ByteVector DataFromOnoForSubscription(std::uint32_t ono, bool add)
414{
415 ByteVector ret;
416 ret.reserve(add ? 25 : 16);
417
418 ret.push_back(static_cast<std::uint8_t>(ono >> 24)); // Emitter ONo
419 ret.push_back(static_cast<std::uint8_t>(ono >> 16));
420 ret.push_back(static_cast<std::uint8_t>(ono >> 8));
421 ret.push_back(static_cast<std::uint8_t>(ono));
422 ret.push_back(static_cast<std::uint8_t>(0x00)); // EventID def level: OcaRoot
423 ret.push_back(static_cast<std::uint8_t>(0x01));
424 ret.push_back(static_cast<std::uint8_t>(0x00)); // EventID idx: PropertyChanged
425 ret.push_back(static_cast<std::uint8_t>(0x01));
426
427 ret.push_back(static_cast<std::uint8_t>(ono >> 24)); // Subscriber ONo
428 ret.push_back(static_cast<std::uint8_t>(ono >> 16));
429 ret.push_back(static_cast<std::uint8_t>(ono >> 8));
430 ret.push_back(static_cast<std::uint8_t>(ono));
431 ret.push_back(static_cast<std::uint8_t>(0x00)); // Method def level: OcaSubscriptionManager
432 ret.push_back(static_cast<std::uint8_t>(0x03));
433 ret.push_back(static_cast<std::uint8_t>(0x00)); // Method idx: AddSubscription
434 ret.push_back(static_cast<std::uint8_t>(0x01));
435
436 if (!add)
437 return ret;
438
439 ret.push_back(static_cast<std::uint8_t>(0x00)); // Context size: 0
440 ret.push_back(static_cast<std::uint8_t>(0x00));
441 ret.push_back(static_cast<std::uint8_t>(0x01)); // Delivery mode: Reliable
442
443 ret.push_back(static_cast<std::uint8_t>(0x00)); // Destination info length: always 4
444 ret.push_back(static_cast<std::uint8_t>(0x04));
445 ret.push_back(static_cast<std::uint8_t>(0x00)); // Destination info (4 empty bytes)
446 ret.push_back(static_cast<std::uint8_t>(0x00));
447 ret.push_back(static_cast<std::uint8_t>(0x00));
448 ret.push_back(static_cast<std::uint8_t>(0x00));
449
450 return ret;
451}
452
453std::string StatusToString(std::uint8_t status)
454{
455 std::string result;
456
457 switch (status)
458 {
459 case 0: // OCASTATUS_OK:
460 result = std::string("OK");
461 break;
462 case 1: // OCASTATUS_PROTOCOL_VERSION_ERROR:
463 result = std::string("ProtocolVersionError");
464 break;
465 case 2: // OCASTATUS_DEVICE_ERROR:
466 result = std::string("DeviceError");
467 break;
468 case 3: // OCASTATUS_LOCKED:
469 result = std::string("Locked");
470 break;
471 case 4: // OCASTATUS_BAD_FORMAT:
472 result = std::string("BadFormat");
473 break;
474 case 5: // OCASTATUS_BAD_ONO:
475 result = std::string("BadONo");
476 break;
477 case 6: // OCASTATUS_PARAMETER_ERROR:
478 result = std::string("ParameterError");
479 break;
480 case 7: // OCASTATUS_PARAMETER_OUT_OF_RANGE:
481 result = std::string("ParameterOutOfRange");
482 break;
483 case 8: // OCASTATUS_NOT_IMPLEMENTED:
484 result = std::string("NotImplemented");
485 break;
486 case 9: // OCASTATUS_INVALID_REQUEST:
487 result = std::string("InvalidRequest");
488 break;
489 case 10: // OCASTATUS_PROCESSING_FAILED:
490 result = std::string("ProcessingFailed");
491 break;
492 case 11: // OCASTATUS_BAD_METHOD:
493 result = std::string("BadMethod");
494 break;
495 case 12: // OCASTATUS_PARTIALLY_SUCCEEDED:
496 result = std::string("PartiallySucceeded");
497 break;
498 case 13: // OCASTATUS_TIMEOUT:
499 result = std::string("Timeout");
500 break;
501 case 14: // OCASTATUS_BUFFER_OVERFLOW:
502 result = std::string("BufferOverflow");
503 break;
504 case 15: // OCASTATUS_PERMISSION_DENIED:
505 result = std::string("PermissionDenied");
506 break;
507 default:
508 result = std::to_string(status);
509 break;
510 }
511
512 return result;
513}
514
515std::string DataTypeToString(int dataType)
516{
517 std::string result;
518
519 switch (dataType)
520 {
522 result = std::string("Boolean");
523 break;
525 result = std::string("Int8");
526 break;
528 result = std::string("Int16");
529 break;
531 result = std::string("Int32");
532 break;
534 result = std::string("Int64");
535 break;
537 result = std::string("UInt8");
538 break;
540 result = std::string("UInt16");
541 break;
543 result = std::string("UInt32");
544 break;
546 result = std::string("UInt64");
547 break;
549 result = std::string("Float32");
550 break;
552 result = std::string("Float64");
553 break;
555 result = std::string("String");
556 break;
558 result = std::string("BitString");
559 break;
561 result = std::string("Blob");
562 break;
564 result = std::string("BlobFixedLength");
565 break;
567 result = std::string("Position (d&b)");
568 break;
570 result = std::string("Custom");
571 break;
572 default:
573 break;
574 }
575
576 return result;
577}
578
579std::string HandleToString(std::uint32_t handle)
580{
581 std::string result;
582
583 switch (handle)
584 {
585 case 0: // OCA_INVALID_SESSIONID
586 result = std::string("InvalidSessionID");
587 break;
588 case 1: // OCA_LOCAL_SESSIONID
589 result = std::string("LocalSessionID");
590 break;
591 default:
592 result = std::to_string(handle);
593 break;
594 }
595
596 return result;
597}
598
599std::uint32_t ReadUint32(const char* buffer)
600{
601 return (((static_cast<std::uint8_t>(buffer[0]) << uint8_24) & 0xff000000) +
602 ((static_cast<std::uint8_t>(buffer[1]) << uint8_16) & 0x00ff0000) +
603 ((static_cast<std::uint8_t>(buffer[2]) << uint8_8) & 0x0000ff00) +
604 static_cast<std::uint8_t>(buffer[3]));
605}
606
607std::uint32_t ReadUint32(const std::uint8_t* buffer)
608{
609 return (((buffer[0] << uint8_24) & 0xff000000) +
610 ((buffer[1] << uint8_16) & 0x00ff0000) +
611 ((buffer[2] << uint8_8) & 0x0000ff00) +
612 buffer[3]);
613}
614
615std::uint16_t ReadUint16(const char* buffer)
616{
617 return (((static_cast<std::uint8_t>(buffer[0]) << uint8_8) & 0xff00) +
618 static_cast<std::uint8_t>(buffer[1]));
619}
620
621std::uint16_t ReadUint16(const std::uint8_t* buffer)
622{
623 return (((buffer[0] << uint8_8) & 0xff00) +
624 buffer[1]);
625}
626
627std::uint32_t GetONo(std::uint32_t type, std::uint32_t record, std::uint32_t channel, std::uint32_t boxAndObjectNumber)
628{
629 return (std::uint32_t((type) & 0xF) << 28)
630 | (std::uint32_t((record) & 0xFF) << 20)
631 | (std::uint32_t((channel) & 0x1F) << 15)
632 | (std::uint32_t(boxAndObjectNumber) & 0x7FFF);
633}
634
635std::uint32_t GetONoTy2(std::uint32_t type, std::uint32_t record, std::uint32_t channel, std::uint32_t boxNumber, std::uint32_t objectNumber)
636{
637 return (std::uint32_t((type) & 0xF) << 28)
638 | (std::uint32_t((record) & 0xFF) << 20)
639 | (std::uint32_t((channel) & 0xFF) << 12)
640 | (std::uint32_t((boxNumber) & 0x1F) << 7)
641 | (std::uint32_t((objectNumber) & 0x7F));
642}
643
644}
Minimal AES70 / OCP.1 TCP client/server library built on JUCE.
Definition NanoOcp1.cpp:23
std::int32_t DataToInt32(const ByteVector &parameterData, bool *pOk)
ByteVector DataFromOnoForSubscription(std::uint32_t ono, bool add)
std::string HandleToString(std::uint32_t handle)
ByteVector DataFromAimingAndPosition(std::float_t hor, std::float_t vert, std::float_t rot, std::float_t x, std::float_t y, std::float_t z)
std::uint32_t GetONo(std::uint32_t type, std::uint32_t record, std::uint32_t channel, std::uint32_t boxAndObjectNumber)
std::string DataToString(const ByteVector &parameterData, bool *pOk)
std::vector< std::uint8_t > ByteVector
Binary buffer type used throughout NanoOcp for all serialized OCP.1 data.
std::float_t DataToFloat(const ByteVector &parameterData, bool *pOk)
@ OCP1DATATYPE_BOOLEAN
Single byte: 0 = false, non-zero = true.
@ OCP1DATATYPE_CUSTOM
User-defined / vendor-specific type.
@ OCP1DATATYPE_FLOAT64
IEEE 754 double-precision float, big-endian (8 bytes).
@ OCP1DATATYPE_DB_POSITION
d&b-specific 3D position blob (3 × float32); used by deprecated position agent.
@ OCP1DATATYPE_INT16
Signed 16-bit integer, big-endian.
@ OCP1DATATYPE_STRING
OCA string: 2-byte big-endian length prefix followed by UTF-8 bytes.
@ OCP1DATATYPE_UINT16
Unsigned 16-bit integer, big-endian.
@ OCP1DATATYPE_INT8
Signed 8-bit integer.
@ OCP1DATATYPE_UINT64
Unsigned 64-bit integer, big-endian.
@ OCP1DATATYPE_UINT32
Unsigned 32-bit integer, big-endian.
@ OCP1DATATYPE_FLOAT32
IEEE 754 single-precision float, big-endian (4 bytes).
@ OCP1DATATYPE_BLOB
Variable-length binary blob; layout is property-specific.
@ OCP1DATATYPE_BLOB_FIXED_LEN
Fixed-length binary blob; size determined by the property definition.
@ OCP1DATATYPE_UINT8
Unsigned 8-bit integer.
@ OCP1DATATYPE_INT64
Signed 64-bit integer, big-endian.
@ OCP1DATATYPE_BIT_STRING
Packed bit string.
@ OCP1DATATYPE_INT32
Signed 32-bit integer, big-endian.
ByteVector DataFromUint64(std::uint64_t intValue)
ByteVector DataFromUint32(std::uint32_t intValue)
static constexpr std::uint8_t uint8_24(24)
ByteVector DataFromFloat(std::float_t floatValue)
static constexpr std::uint8_t uint8_48(48)
ByteVector DataFromBool(bool boolValue)
Convenience helper method to convert a bool into a byte vector.
std::uint8_t DataToUint8(const ByteVector &parameterData, bool *pOk)
std::uint32_t DataToUint32(const ByteVector &parameterData, bool *pOk)
ByteVector DataFromUint16(std::uint16_t value)
std::uint16_t DataToUint16(const ByteVector &parameterData, bool *pOk)
ByteVector DataFromString(const std::string &string)
ByteVector DataFromPositionAndRotation(std::float_t x, std::float_t y, std::float_t z, std::float_t hor, std::float_t vert, std::float_t rot)
static constexpr std::uint8_t uint8_16(16)
ByteVector DataFromDouble(std::double_t doubleValue)
ByteVector DataFromUint8(std::uint8_t value)
static constexpr std::uint8_t uint8_8(8)
std::string DataTypeToString(int dataType)
std::uint32_t ReadUint32(const char *buffer)
ByteVector DataFromInt32(std::int32_t intValue)
std::uint16_t ReadUint16(const char *buffer)
std::double_t DataToDouble(const ByteVector &parameterData, bool *pOk)
static constexpr std::uint8_t uint8_56(56)
std::uint32_t GetONoTy2(std::uint32_t type, std::uint32_t record, std::uint32_t channel, std::uint32_t boxNumber, std::uint32_t objectNumber)
static constexpr std::uint8_t uint8_40(40)
std::string StatusToString(std::uint8_t status)
ByteVector DataFromPosition(std::float_t x, std::float_t y, std::float_t z)
std::uint64_t DataToUint64(const ByteVector &parameterData, bool *pOk)
bool DataToBool(const ByteVector &parameterData, bool *pOk)
Convenience helper method to convert a byte vector into a bool.
static constexpr std::uint8_t uint8_32(32)