Bläddra i källkod

add InfoBits Overflow

StalderT 7 år sedan
förälder
incheckning
c51f5b857c
2 ändrade filer med 11 tillägg och 2 borttagningar
  1. 4 0
      include/ua_constants.h
  2. 7 2
      src/server/ua_subscription_datachange.c

+ 4 - 0
include/ua_constants.h

@@ -332,6 +332,10 @@ typedef enum {
 #define UA_STATUSCODE_BADSYNTAXERROR 0x80b60000 // A value had an invalid syntax.
 #define UA_STATUSCODE_BADMAXCONNECTIONSREACHED 0x80b70000 // The operation could not be finished because all available connections are in use.
 
+/* These StatusCodes are manually generated. */
+#define UA_STATUSCODE_INFOTYPE_DATAVALUE 0x00000400
+#define UA_STATUSCODE_INFOBITS_OVERFLOW 0x00000080
+
 /**
  * Namespace Zero NodeIds
  * ----------------------

+ 7 - 2
src/server/ua_subscription_datachange.c

@@ -48,7 +48,7 @@ MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
 }
 
 static void
-ensureSpaceInMonitoredItemQueue(UA_MonitoredItem *mon) {
+ensureSpaceInMonitoredItemQueue(UA_MonitoredItem *mon, MonitoredItem_queuedValue *newQueueItem) {
     /* Enough space, nothing to do here */
     if(mon->currentQueueSize < mon->maxQueueSize)
         return;
@@ -66,6 +66,11 @@ ensureSpaceInMonitoredItemQueue(UA_MonitoredItem *mon) {
     UA_DataValue_deleteMembers(&queueItem->value);
     UA_free(queueItem);
     --mon->currentQueueSize;
+
+    if(mon->maxQueueSize > 1){
+        newQueueItem->value.hasStatus = true;
+        newQueueItem->value.status = UA_STATUSCODE_INFOTYPE_DATAVALUE | UA_STATUSCODE_INFOBITS_OVERFLOW;
+    }
 }
 
 /* Errors are returned as no change detected */
@@ -196,7 +201,7 @@ sampleCallbackWithValue(UA_Server *server, UA_Subscription *sub,
     monitoredItem->lastSampledValue = *valueEncoding;
 
     /* Add the sample to the queue for publication */
-    ensureSpaceInMonitoredItemQueue(monitoredItem);
+    ensureSpaceInMonitoredItemQueue(monitoredItem, newQueueItem);
     TAILQ_INSERT_TAIL(&monitoredItem->queue, newQueueItem, listEntry);
     ++monitoredItem->currentQueueSize;
     return true;;