40 assert(
sizeof(std::uint32_t) ==
sizeof(std::float_t));
41 std::uint32_t xInt = *(std::uint32_t*)&x;
42 std::uint32_t yInt = *(std::uint32_t*)&y;
43 std::uint32_t zInt = *(std::uint32_t*)&z;
47 static_cast<std::uint8_t
>(xInt >> 24),
48 static_cast<std::uint8_t
>(xInt >> 16),
49 static_cast<std::uint8_t
>(xInt >> 8),
50 static_cast<std::uint8_t
>(xInt),
51 static_cast<std::uint8_t
>(yInt >> 24),
52 static_cast<std::uint8_t
>(yInt >> 16),
53 static_cast<std::uint8_t
>(yInt >> 8),
54 static_cast<std::uint8_t
>(yInt),
55 static_cast<std::uint8_t
>(zInt >> 24),
56 static_cast<std::uint8_t
>(zInt >> 16),
57 static_cast<std::uint8_t
>(zInt >> 8),
58 static_cast<std::uint8_t
>(zInt),
95 ok = (data.size() >= 2);
103 ok = (data.size() == 12) ||
104 (data.size() == 24) ||
127 return m_value == other.m_value;
132 return m_value != other.m_value;
137 return (m_value.index() !=
TypeNone);
142 switch (m_value.index())
163 if (pOk !=
nullptr) *pOk =
true;
165 switch (m_value.index())
168 return std::get<bool>(m_value);
170 return (std::get<std::int32_t>(m_value) > std::int32_t(0));
172 return (std::get<std::uint8_t>(m_value) > std::uint8_t(0));
174 return (std::get<std::uint16_t>(m_value) > std::uint16_t(0));
176 return (std::get<std::uint32_t>(m_value) > std::uint32_t(0));
178 return (std::get<std::uint64_t>(m_value) > std::uint64_t(0));
180 return (std::get<std::float_t>(m_value) > std::float_t(0.0f));
182 return (std::get<std::double_t>(m_value) > std::double_t(0.0));
184 return (std::get<std::string>(m_value) ==
"true");
186 return DataToBool(std::get<ByteVector>(m_value), pOk);
192 if (pOk !=
nullptr) *pOk =
false;
199 if (pOk !=
nullptr) *pOk =
true;
201 switch (m_value.index())
204 return std::get<bool>(m_value) ? 1 : 0;
206 return std::get<std::int32_t>(m_value);
208 return static_cast<std::int32_t
>(std::get<std::uint8_t>(m_value));
210 return static_cast<std::int32_t
>(std::get<std::uint16_t>(m_value));
212 return static_cast<std::int32_t
>(std::get<std::uint32_t>(m_value));
214 return static_cast<std::int32_t
>(std::get<std::uint64_t>(m_value));
216 return std::lround(std::get<std::float_t>(m_value));
218 return std::lround(std::get<std::double_t>(m_value));
222 return std::stol(std::get<std::string>(m_value));
229 return DataToInt32(std::get<ByteVector>(m_value), pOk);
235 if (pOk !=
nullptr) *pOk =
false;
237 return std::int32_t(0);
242 if (pOk !=
nullptr) *pOk =
true;
244 switch (m_value.index())
247 return std::get<bool>(m_value) ? std::uint8_t(1) : std::uint8_t(0);
249 return static_cast<std::uint8_t
>(std::get<std::int32_t>(m_value));
251 return std::get<std::uint8_t>(m_value);
253 return static_cast<std::uint8_t
>(std::get<std::uint16_t>(m_value));
255 return static_cast<std::uint8_t
>(std::get<std::uint32_t>(m_value));
257 return static_cast<std::uint8_t
>(std::get<std::uint64_t>(m_value));
259 return static_cast<std::uint8_t
>(std::lround(std::get<std::float_t>(m_value)));
261 return static_cast<std::uint8_t
>(std::lround(std::get<std::double_t>(m_value)));
265 return static_cast<std::uint8_t
>(std::stol(std::get<std::string>(m_value)));
272 return DataToUint8(std::get<ByteVector>(m_value), pOk);
278 if (pOk !=
nullptr) *pOk =
false;
280 return std::uint8_t(0);
285 if (pOk !=
nullptr) *pOk =
true;
287 switch (m_value.index())
290 return std::get<bool>(m_value) ? std::uint16_t(1) : std::uint16_t(0);
292 return static_cast<std::uint16_t
>(std::get<std::int32_t>(m_value));
294 return static_cast<std::uint16_t
>(std::get<std::uint8_t>(m_value));
296 return std::get<std::uint16_t>(m_value);
298 return static_cast<std::uint16_t
>(std::get<std::uint32_t>(m_value));
300 return static_cast<std::uint16_t
>(std::get<std::uint64_t>(m_value));
302 return static_cast<std::uint16_t
>(std::lround(std::get<std::float_t>(m_value)));
304 return static_cast<std::uint16_t
>(std::lround(std::get<std::double_t>(m_value)));
308 return static_cast<std::uint16_t
>(std::stoi(std::get<std::string>(m_value)));
315 return DataToUint16(std::get<ByteVector>(m_value), pOk);
321 if (pOk !=
nullptr) *pOk =
false;
323 return std::uint16_t(0);
328 if (pOk !=
nullptr) *pOk =
true;
330 switch (m_value.index())
333 return std::get<bool>(m_value) ? std::uint32_t(1) : std::uint32_t(0);
335 return static_cast<std::uint32_t
>(std::get<std::int32_t>(m_value));
337 return static_cast<std::uint32_t
>(std::get<std::uint8_t>(m_value));
339 return static_cast<std::uint32_t
>(std::get<std::uint16_t>(m_value));
341 return static_cast<std::uint32_t
>(std::get<std::uint32_t>(m_value));
343 return static_cast<std::uint32_t
>(std::get<std::uint64_t>(m_value));
345 return static_cast<std::uint32_t
>(std::lround(std::get<std::float_t>(m_value)));
347 return static_cast<std::uint32_t
>(std::lround(std::get<std::double_t>(m_value)));
351 return static_cast<std::uint32_t
>(std::stoi(std::get<std::string>(m_value)));
358 return DataToUint32(std::get<ByteVector>(m_value), pOk);
364 if (pOk !=
nullptr) *pOk =
false;
366 return std::uint32_t(0);
371 if (pOk !=
nullptr) *pOk =
true;
373 switch (m_value.index())
376 return std::get<bool>(m_value) ? std::uint64_t(1) : std::uint64_t(0);
378 return static_cast<std::uint64_t
>(std::get<std::int32_t>(m_value));
380 return static_cast<std::uint64_t
>(std::get<std::uint8_t>(m_value));
382 return static_cast<std::uint64_t
>(std::get<std::uint16_t>(m_value));
384 return static_cast<std::uint64_t
>(std::get<std::uint32_t>(m_value));
386 return static_cast<std::uint64_t
>(std::get<std::uint64_t>(m_value));
388 return static_cast<std::uint64_t
>(std::llround(std::get<std::float_t>(m_value)));
390 return static_cast<std::uint64_t
>(std::llround(std::get<std::double_t>(m_value)));
394 return static_cast<std::uint64_t
>(std::stoll(std::get<std::string>(m_value)));
401 return DataToUint64(std::get<ByteVector>(m_value), pOk);
407 if (pOk !=
nullptr) *pOk =
false;
409 return std::uint64_t(0);
414 if (pOk !=
nullptr) *pOk =
true;
416 switch (m_value.index())
419 return std::get<bool>(m_value) ? std::double_t(1.0) : std::double_t(0.0);
421 return static_cast<std::double_t
>(std::get<std::int32_t>(m_value));
423 return static_cast<std::double_t
>(std::get<std::uint8_t>(m_value));
425 return static_cast<std::double_t
>(std::get<std::uint16_t>(m_value));
427 return static_cast<std::double_t
>(std::get<std::uint32_t>(m_value));
429 return static_cast<std::double_t
>(std::get<std::uint64_t>(m_value));
431 return static_cast<std::double_t
>(std::get<std::float_t>(m_value));
433 return std::get<std::double_t>(m_value);
437 return std::stod(std::get<std::string>(m_value));
444 return DataToDouble(std::get<ByteVector>(m_value), pOk);
450 if (pOk !=
nullptr) *pOk =
false;
452 return std::double_t(0.0);
457 if (pOk !=
nullptr) *pOk =
true;
459 switch (m_value.index())
462 return std::get<bool>(m_value) ? std::float_t(1.0f) : std::float_t(0.0f);
464 return static_cast<std::float_t
>(std::get<std::int32_t>(m_value));
466 return static_cast<std::float_t
>(std::get<std::uint8_t>(m_value));
468 return static_cast<std::float_t
>(std::get<std::uint16_t>(m_value));
470 return static_cast<std::float_t
>(std::get<std::uint32_t>(m_value));
472 return static_cast<std::float_t
>(std::get<std::uint64_t>(m_value));
474 return std::get<std::float_t>(m_value);
476 return static_cast<std::float_t
>(std::get<std::double_t>(m_value));
480 return static_cast<std::float_t
>(std::stof(std::get<std::string>(m_value)));
487 return DataToFloat(std::get<ByteVector>(m_value), pOk);
493 if (pOk !=
nullptr) *pOk =
false;
495 return std::float_t(0.0f);
500 if (pOk !=
nullptr) *pOk =
true;
502 switch (m_value.index())
505 return (std::get<bool>(m_value) ?
"true" :
"false");
507 return std::to_string(std::get<std::int32_t>(m_value));
509 return std::to_string(std::get<std::uint8_t>(m_value));
511 return std::to_string(std::get<std::uint16_t>(m_value));
513 return std::to_string(std::get<std::uint32_t>(m_value));
515 return std::to_string(std::get<std::uint64_t>(m_value));
517 return std::to_string(std::get<std::float_t>(m_value));
519 return std::to_string(std::get<std::double_t>(m_value));
521 return std::get<std::string>(m_value);
523 return DataToString(std::get<ByteVector>(m_value), pOk);
529 if (pOk !=
nullptr) *pOk =
false;
531 return std::string{};
536 if (pOk !=
nullptr) *pOk =
true;
538 switch (m_value.index())
559 return std::get<ByteVector>(m_value);
565 if (pOk !=
nullptr) *pOk =
false;
572 if (pOk !=
nullptr) *pOk =
true;
614 if (pOk !=
nullptr) *pOk =
false;
621 std::array<std::float_t, 3> ret{ 0.0f };
631 const auto& data = std::get<ByteVector>(m_value);
632 bool ok = ((data.size() == 12) ||
633 (data.size() == 36));
658 std::stringstream ss;
659 ss << pos[0] <<
", " << pos[1] <<
", " << pos[2];
661 ret = std::string(ss.str());
677 std::array<std::float_t, 6> ret{ 0.0f };
687 const auto& data = std::get<ByteVector>(m_value);
688 bool ok = (data.size() == 24);
722 std::stringstream ss;
723 ss << pos[0] <<
", " << pos[1] <<
", " << pos[2] <<
", " <<
724 pos[3] <<
", " << pos[4] <<
", " << pos[5];
726 ret = std::string(ss.str());
737 std::vector<bool> boolVector;
747 const auto& data = std::get<ByteVector>(m_value);
748 bool ok = (data.size() >= 2);
750 std::uint16_t listSize(0);
754 ok = ok && (data.size() == listSize + 2);
755 if (ok && listSize > 0)
757 boolVector.reserve(listSize);
758 std::size_t readPos(2);
759 while (readPos < data.size() && ok)
761 ByteVector tmpData(data.data() + readPos, data.data() + readPos + 1);
767 ok = ok && (boolVector.size() == listSize);
777 std::vector<std::string> stringVector;
787 const auto& data = std::get<ByteVector>(m_value);
788 bool ok = (data.size() >= 2);
790 std::uint16_t listSize(0);
795 ok = ok && (data.size() >= ((listSize * 2) + 2));
796 if (ok && listSize > 0)
798 stringVector.reserve(
static_cast<size_t>(listSize));
799 std::size_t readPos(2);
800 while (readPos + 2 <= data.size() && ok)
802 ByteVector stringLenData(data.data() + readPos, data.data() + readPos + 2);
806 ok = ok && (readPos + stringLen <= data.size());
809 stringVector.push_back(std::string(data.data() + readPos, data.data() + readPos + stringLen));
810 readPos += stringLen;
815 ok = ok && (stringVector.size() == listSize);
Type-erased OCA parameter value with built-in marshal/unmarshal support.
std::array< std::float_t, 6 > ToAimingAndPosition(bool *pOk=nullptr) const
@ TypeFloat
std::float_t (32-bit IEEE 754)
@ TypeByteVector
std::vector<uint8_t> — used for blobs and multi-float spatial types
@ TypeUInt64
std::uint64_t
@ TypeDouble
std::double_t (64-bit IEEE 754)
@ TypeString
std::string (OCA string: 2-byte length prefix + UTF-8 bytes)
@ TypeNone
Default / unset state (std::monostate). IsValid() returns false.
@ TypeUInt32
std::uint32_t
@ TypeUInt16
std::uint16_t
std::array< std::float_t, 6 > ToPositionAndRotation(bool *pOk=nullptr) const
std::vector< bool > ToBoolVector(bool *pOk=nullptr) const
bool ToBool(bool *pOk=nullptr) const
Returns the value as bool. Numeric types: non-zero = true.
std::float_t ToFloat(bool *pOk=nullptr) const
Returns the value as float_t (32-bit). Conversion from double loses precision.
std::string ToPositionString(bool *pOk=nullptr) const
Ocp1DataType GetDataType() const
std::vector< std::uint8_t > ToByteVector(bool *pOk=nullptr) const
std::double_t ToDouble(bool *pOk=nullptr) const
Returns the value as double_t (64-bit).
std::uint64_t ToUInt64(bool *pOk=nullptr) const
Returns the value as uint64_t.
std::vector< std::uint8_t > ToParamData(Ocp1DataType type=OCP1DATATYPE_NONE, bool *pOk=nullptr) const
std::uint8_t ToUInt8(bool *pOk=nullptr) const
Returns the value as uint8_t. Values outside [0, 255] are clamped/truncated.
bool operator==(const Variant &other) const
Returns true if both Variants hold the same type and value.
std::uint16_t ToUInt16(bool *pOk=nullptr) const
Returns the value as uint16_t.
bool operator!=(const Variant &other) const
Returns true if the Variants differ in type or value.
std::array< std::float_t, 3 > ToPosition(bool *pOk=nullptr) const
std::uint32_t ToUInt32(bool *pOk=nullptr) const
Returns the value as uint32_t.
std::string ToAimingAndPositionString(bool *pOk=nullptr) const
std::int32_t ToInt32(bool *pOk=nullptr) const
Returns the value as int32_t. Numeric widening/narrowing applied as needed.
std::string ToString(bool *pOk=nullptr) const
Returns the value as a std::string. Only succeeds if the internal type is TypeString; numeric types a...
std::vector< std::string > ToStringVector(bool *pOk=nullptr) const
Minimal AES70 / OCP.1 TCP client/server library built on JUCE.
std::int32_t DataToInt32(const ByteVector ¶meterData, bool *pOk)
std::string DataToString(const ByteVector ¶meterData, 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 ¶meterData, bool *pOk)
Ocp1DataType
OCA base data type codes, matching OcaBaseDataType in the AES70 specification.
@ 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_NONE
No type; used as "not set" sentinel.
@ 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)
ByteVector DataFromFloat(std::float_t floatValue)
ByteVector DataFromBool(bool boolValue)
Convenience helper method to convert a bool into a byte vector.
std::uint8_t DataToUint8(const ByteVector ¶meterData, bool *pOk)
std::uint32_t DataToUint32(const ByteVector ¶meterData, bool *pOk)
ByteVector DataFromUint16(std::uint16_t value)
std::uint16_t DataToUint16(const ByteVector ¶meterData, bool *pOk)
ByteVector DataFromString(const std::string &string)
ByteVector DataFromDouble(std::double_t doubleValue)
ByteVector DataFromUint8(std::uint8_t value)
ByteVector DataFromInt32(std::int32_t intValue)
std::double_t DataToDouble(const ByteVector ¶meterData, bool *pOk)
std::uint64_t DataToUint64(const ByteVector ¶meterData, bool *pOk)
bool DataToBool(const ByteVector ¶meterData, bool *pOk)
Convenience helper method to convert a byte vector into a bool.