浏览代码

PubSub: Simplify preparation of NetworkMessages with several DataSetMessages

Julius Pfrommer 6 年之前
父节点
当前提交
9a90b1fcea
共有 1 个文件被更改,包括 27 次插入21 次删除
  1. 27 21
      src/pubsub/ua_pubsub.c

+ 27 - 21
src/pubsub/ua_pubsub.c

@@ -1023,11 +1023,13 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
         return;
     }
 
+    /* How many dsm to encapsulate in one nm */
+    UA_Byte maxDSM = (UA_Byte)writerGroup->config.maxEncapsulatedDataSetMessageCount;
+    if(writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX)
+        maxDSM = UA_BYTE_MAX;
     /* If the maxEncapsulatedDataSetMessageCount is set to 0->1 */
-    writerGroup->config.maxEncapsulatedDataSetMessageCount = (UA_UInt16)
-        (writerGroup->config.maxEncapsulatedDataSetMessageCount == 0 ||
-         writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX
-         ? 1 : writerGroup->config.maxEncapsulatedDataSetMessageCount);
+    if(maxDSM == 0)
+        maxDSM = 1;
 
     /* The binary DataSetMessage sizes are part of the payload. Allocate some
      * stack-memory where to put the current messages. */
@@ -1057,7 +1059,8 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
     UA_DataSetWriter *dsw;
     LIST_FOREACH(dsw, &writerGroup->writers, listEntry) {
         /* Find the dataset */
-        UA_PublishedDataSet *pds = UA_PublishedDataSet_findPDSbyId(server, dsw->connectedDataSet);
+        UA_PublishedDataSet *pds =
+            UA_PublishedDataSet_findPDSbyId(server, dsw->connectedDataSet);
         if(!pds) {
             UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
                          "PubSub Publish: PublishedDataSet not found");
@@ -1073,7 +1076,9 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
             pos = (writerGroup->writersCount - 1) - singleNetworkMessagesCount;
         }
 
-        if(UA_DataSetWriter_generateDataSetMessage(server, &dsmStore[pos], dsw) != UA_STATUSCODE_GOOD) {
+        UA_StatusCode res =
+            UA_DataSetWriter_generateDataSetMessage(server, &dsmStore[pos], dsw);
+        if(res != UA_STATUSCODE_GOOD) {
             UA_LOG_ERROR(&server->config.logger, UA_LOGCATEGORY_SERVER,
                          "PubSub Publish: DataSetMessage creation failed");
             continue;
@@ -1085,10 +1090,10 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
     }
 
     UA_UInt32 networkMessageCount = singleNetworkMessagesCount;
-    if(combinedNetworkMessageCount != 0){
-        combinedNetworkMessageCount = (UA_UInt16) (
-                combinedNetworkMessageCount / writerGroup->config.maxEncapsulatedDataSetMessageCount +
-                (combinedNetworkMessageCount % writerGroup->config.maxEncapsulatedDataSetMessageCount) == 0 ? 0 : 1);
+    if(combinedNetworkMessageCount != 0) {
+        combinedNetworkMessageCount = (UA_UInt16)
+            (combinedNetworkMessageCount / maxDSM +
+             (combinedNetworkMessageCount % maxDSM) == 0 ? 0 : 1);
         networkMessageCount += combinedNetworkMessageCount;
     }
 
@@ -1108,31 +1113,32 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
         nm.networkMessageType = UA_NETWORKMESSAGE_DATASET;
         nm.payloadHeaderEnabled = true;
 
-        //create combined NetworkMessages
         if(i < (networkMessageCount-singleNetworkMessagesCount)){
-            if(combinedNetworkMessageCount - (i * writerGroup->config.maxEncapsulatedDataSetMessageCount)){
-                if(combinedNetworkMessageCount == 1){
+            /* Create combined NetworkMessages */
+            if(combinedNetworkMessageCount - (i * maxDSM)) {
+                if(combinedNetworkMessageCount == 1) {
                     nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) ((writerGroup->writersCount) - singleNetworkMessagesCount);
                     currentDSMPosition = 0;
                 } else {
-                    nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
-                    currentDSMPosition = i * writerGroup->config.maxEncapsulatedDataSetMessageCount;
+                    nm.payloadHeader.dataSetPayloadHeader.count = maxDSM;
+                    currentDSMPosition = i * maxDSM;
                 }
-                //nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
                 nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
                 nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
                 nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
             } else {
-                currentDSMPosition = i * writerGroup->config.maxEncapsulatedDataSetMessageCount;
-                nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) (currentDSMPosition - ((i - 1) * writerGroup->config.maxEncapsulatedDataSetMessageCount)); //attention cast from uint32 to byte
+                currentDSMPosition = i * maxDSM;
+                nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) (currentDSMPosition - ((i - 1) * maxDSM)); //attention cast from uint32 to byte
                 nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
                 nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
                 nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
             }
-        } else {///create single NetworkMessages (1 DSM per NM)
+        } else {
+            /* Create single NetworkMessages (1 DSM per NM) */
             nm.payloadHeader.dataSetPayloadHeader.count = 1;
-            currentDSMPosition = (UA_UInt32) combinedNetworkMessageCount + (i - combinedNetworkMessageCount/writerGroup->config.maxEncapsulatedDataSetMessageCount
-                                                                            + (combinedNetworkMessageCount % writerGroup->config.maxEncapsulatedDataSetMessageCount) == 0 ? 0 : 1);
+            currentDSMPosition = (UA_UInt32)
+                combinedNetworkMessageCount + (i - combinedNetworkMessageCount / maxDSM
+                                               + (combinedNetworkMessageCount % maxDSM) == 0 ? 0 : 1);
             nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
             nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
             nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];