Skip to content

Commit 5d1fb9e

Browse files
author
Viacheslav Kalenikov
committed
OpcUaDataValue reworking
1 parent 0006d0d commit 5d1fb9e

6 files changed

Lines changed: 215 additions & 138 deletions

File tree

shared/libraries/opcua/opcuashared/include/opcuashared/opcuadatavalue.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class OpcUaDataValue : public OpcUaObject<UA_DataValue>
3333
const UA_DataValue& getDataValue() const;
3434

3535
bool hasValue() const;
36-
OpcUaVariant getValue() const;
3736

3837
UA_StatusCode getStatusCode() const;
3938

@@ -45,8 +44,32 @@ class OpcUaDataValue : public OpcUaObject<UA_DataValue>
4544

4645
bool isStatusOK() const;
4746

48-
protected:
47+
bool isInteger() const;
48+
bool isString() const;
49+
bool isDouble() const;
50+
bool isNull() const;
51+
bool isReal() const;
52+
bool isNumber() const;
4953

54+
std::string toString() const;
55+
int64_t toInteger() const;
56+
57+
template <typename T>
58+
inline T readScalar() const
59+
{
60+
return VariantUtils::ReadScalar<T>(this->value.value);
61+
}
62+
63+
template <typename T, typename UATYPE = TypeToUaDataType<T>>
64+
void setScalar(const T& value)
65+
{
66+
static_assert(UATYPE::DataType != nullptr, "Implement specialization of TypeToUaDataType");
67+
68+
this->clear();
69+
70+
const auto status = UA_Variant_setScalarCopy(&(this->value.value), &value, UATYPE::DataType);
71+
CheckStatusCodeException(status);
72+
}
5073
};
5174

5275
END_NAMESPACE_OPENDAQ_OPCUA

shared/libraries/opcua/opcuashared/include/opcuashared/opcuavariant.h

Lines changed: 13 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
#pragma once
1818

19-
#include "opcuacommon.h"
2019
#include <opcuashared/opcuanodeid.h>
2120

2221
BEGIN_NAMESPACE_OPENDAQ_OPCUA
@@ -26,15 +25,17 @@ using OpcUaVariantPtr = std::shared_ptr<OpcUaVariant>;
2625

2726
namespace VariantUtils
2827
{
29-
inline bool IsScalar(const UA_Variant& value)
30-
{
31-
return UA_Variant_isScalar(&value);
32-
}
33-
34-
inline bool IsVector(const UA_Variant& value)
35-
{
36-
return !IsScalar(value);
37-
}
28+
bool IsScalar(const UA_Variant& value);
29+
bool IsVector(const UA_Variant& value);
30+
bool IsInteger(const UA_Variant& value);
31+
bool isReal(const UA_Variant& value);
32+
bool isNull(const UA_Variant& value);
33+
34+
std::string ToString(const UA_Variant& value);
35+
int64_t ToNumber(const UA_Variant& value);
36+
OpcUaNodeId ToNodeId(const UA_Variant& value);
37+
void ToInt32Variant(OpcUaVariant& variant);
38+
void ToInt64Variant(OpcUaVariant& variant);
3839

3940
template <typename T>
4041
inline bool IsType(const UA_Variant& value)
@@ -69,47 +70,6 @@ namespace VariantUtils
6970
throw std::runtime_error("Variant does not contain a scalar of specified return type");
7071
return *static_cast<T*>(value.data);
7172
}
72-
73-
inline std::string ToString(const UA_Variant& value)
74-
{
75-
return utils::ToStdString(ReadScalar<UA_String>(value));
76-
}
77-
78-
inline int64_t ToNumber(const UA_Variant& value)
79-
{
80-
switch (value.type->typeKind)
81-
{
82-
case UA_TYPES_SBYTE:
83-
return ReadScalar<UA_SByte>(value);
84-
case UA_TYPES_BYTE:
85-
return ReadScalar<UA_Byte>(value);
86-
case UA_TYPES_INT16:
87-
return ReadScalar<UA_Int16>(value);
88-
case UA_TYPES_UINT16:
89-
return ReadScalar<UA_UInt16>(value);
90-
case UA_TYPES_INT32:
91-
case UA_TYPES_ENUMERATION:
92-
return ReadScalar<UA_Int32>(value);
93-
case UA_TYPES_UINT32:
94-
return ReadScalar<UA_UInt32>(value);
95-
case UA_TYPES_INT64:
96-
return ReadScalar<UA_Int64>(value);
97-
case UA_TYPES_UINT64:
98-
return ReadScalar<UA_UInt64>(value);
99-
100-
default:
101-
throw std::runtime_error("Type not supported!");
102-
}
103-
}
104-
105-
inline OpcUaNodeId ToNodeId(const UA_Variant& value)
106-
{
107-
UA_NodeId nodeId = ReadScalar<UA_NodeId>(value);
108-
return OpcUaNodeId(nodeId);
109-
}
110-
111-
void ToInt32Variant(OpcUaVariant& variant);
112-
void ToInt64Variant(OpcUaVariant& variant);
11373
}
11474

11575
class OpcUaVariant : public OpcUaObject<UA_Variant>
@@ -170,24 +130,15 @@ class OpcUaVariant : public OpcUaObject<UA_Variant>
170130
bool isNull() const;
171131
bool isReal() const;
172132
bool isNumber() const;
133+
bool isScalar() const;
134+
bool isVector() const;
173135

174136
std::string toString() const;
175137
int64_t toInteger() const;
176138
double toDouble() const;
177139
float toFloat() const;
178140
bool toBool() const;
179141
OpcUaNodeId toNodeId() const;
180-
181-
inline bool isScalar() const
182-
{
183-
return VariantUtils::IsScalar(value);
184-
}
185-
inline bool isVector() const
186-
{
187-
return VariantUtils::IsVector(value);
188-
}
189-
190-
static bool IsInteger(const UA_Variant& value);
191142
};
192143

193144
class OpcUaVariableConversionError : public OpcUaException

shared/libraries/opcua/opcuashared/src/opcuadatavalue.cpp

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@
22

33
BEGIN_NAMESPACE_OPENDAQ_OPCUA
44

5-
OpcUaVariant OpcUaDataValue::getValue() const
6-
{
7-
return OpcUaVariant(OpcUaObject<UA_DataValue>::getValue().value, true);
8-
}
9-
105
UA_StatusCode OpcUaDataValue::getStatusCode() const
116
{
127
if (!getDataValue().hasStatus)
@@ -58,4 +53,44 @@ uint64_t OpcUaDataValue::toUnixTimeUs(UA_DateTime date)
5853
return static_cast<uint64_t>((date - UA_DATETIME_UNIX_EPOCH) / UA_DATETIME_USEC);
5954
}
6055

56+
bool OpcUaDataValue::isInteger() const
57+
{
58+
return VariantUtils::IsInteger(this->value.value);
59+
}
60+
61+
bool OpcUaDataValue::isString() const
62+
{
63+
return VariantUtils::HasScalarType<UA_String>(value.value) ||
64+
VariantUtils::HasScalarType<UA_LocalizedText>(value.value);
65+
}
66+
67+
bool OpcUaDataValue::isDouble() const
68+
{
69+
return VariantUtils::HasScalarType<UA_Double>(value.value);
70+
}
71+
72+
bool OpcUaDataValue::isNull() const
73+
{
74+
return VariantUtils::isNull(value.value);
75+
}
76+
77+
bool OpcUaDataValue::isReal() const
78+
{
79+
return VariantUtils::isReal(value.value);
80+
}
81+
82+
bool OpcUaDataValue::isNumber() const
83+
{
84+
return isInteger() || isReal();
85+
}
86+
87+
std::string OpcUaDataValue::toString() const
88+
{
89+
return VariantUtils::ToString(value.value);
90+
}
91+
92+
int64_t OpcUaDataValue::toInteger() const
93+
{
94+
return VariantUtils::ToNumber(value.value);
95+
}
6196
END_NAMESPACE_OPENDAQ_OPCUA

0 commit comments

Comments
 (0)