Skip to content

Commit

Permalink
Refactor setMemberValues to support nested Structs
Browse files Browse the repository at this point in the history
  • Loading branch information
m-meingast authored and azoitl committed Jan 20, 2025
1 parent 313961a commit 6027ab0
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 7 deletions.
5 changes: 3 additions & 2 deletions src/com/opc_ua/opcua_layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,9 @@ EComResponse COPC_UA_Layer::sendData(void *, unsigned int) {

EComResponse COPC_UA_Layer::processInterrupt() {
CCriticalRegion criticalRegion(mRDBufferMutex);
if(mIsObjectNodeStruct) {
COPC_UA_ObjectStruct_Helper::setMemberValues(getCommFB()->getRDs(), mRDBuffer);
if(mIsObjectNodeStruct) {
CIEC_STRUCT& structType = static_cast<CIEC_STRUCT&>(getCommFB()->getRDs()[0]->unwrap());
COPC_UA_ObjectStruct_Helper::setMemberValues(structType, mRDBuffer);
} else {
for(size_t i = 0; i < getCommFB()->getNumRD(); ++i) {
getCommFB()->getRDs()[i]->setValue(*mRDBuffer[i]);
Expand Down
18 changes: 14 additions & 4 deletions src/com/opc_ua/opcua_objectstruct_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,10 +307,20 @@ int COPC_UA_ObjectStruct_Helper::getRDBufferIndexFromNodeId(const UA_NodeId *paN
return -1;
}

void COPC_UA_ObjectStruct_Helper::setMemberValues(CIEC_ANY** paRDs, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer) {
CIEC_STRUCT& structType = static_cast<CIEC_STRUCT&>(paRDs[0]->unwrap());
for(size_t i = 0; i < structType.getStructSize(); i++) {
structType.getMember(i)->setValue(*paRDBuffer[i]);
void COPC_UA_ObjectStruct_Helper::setMemberValues(CIEC_STRUCT &paStructType, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer) {
size_t overallIndex = 0;
setMemberValues(paStructType, paRDBuffer, overallIndex);
}

void COPC_UA_ObjectStruct_Helper::setMemberValues(CIEC_STRUCT &paStructType, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer, size_t &paOverallIndex) {
for(size_t i = 0; i < paStructType.getStructSize(); i++) {
CIEC_ANY *member = paStructType.getMember(i);
if(member->getDataTypeID() == CIEC_ANY::e_STRUCT) {
CIEC_STRUCT &memberStruct = static_cast<CIEC_STRUCT&>(member->unwrap());
setMemberValues(memberStruct, paRDBuffer, paOverallIndex);
} else {
member->setValue(*paRDBuffer[paOverallIndex++]);
}
}
}

Expand Down
11 changes: 10 additions & 1 deletion src/com/opc_ua/opcua_objectstruct_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,16 @@ class COPC_UA_ObjectStruct_Helper {
* @param paRDs the array of data pointers to be sent
* @param paRDBuffer The buffer for the data
*/
static void setMemberValues(CIEC_ANY** paRDs, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer);
static void setMemberValues(CIEC_STRUCT &paStructType, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer);

/**
* Set values of Object Struct members from the RDBuffer
*
* @param paRDs the array of data pointers to be sent
* @param paRDBuffer The buffer for the data
* @param paOverallIndex The overall index, which is needed in case of nested Structs
*/
static void setMemberValues(CIEC_STRUCT &paStructType, const std::vector<std::unique_ptr<CIEC_ANY>>& paRDBuffer, size_t &paOverallIndex);

/**
* Initialize RDBuffer for Object Structs
Expand Down

0 comments on commit 6027ab0

Please sign in to comment.