Prechádzať zdrojové kódy

Merge pull request #1614 from StalderT/fix1522

fix #1522
Stefan Profanter 7 rokov pred
rodič
commit
cbdbe13e9f

+ 10 - 3
src/server/ua_services_subscription.c

@@ -394,9 +394,15 @@ Operation_SetMonitoringMode(UA_Server *server, UA_Session *session,
         *result = UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
         return;
     }
+
+    if(mon->monitoredItemType != UA_MONITOREDITEMTYPE_CHANGENOTIFY) {
+        *result = UA_STATUSCODE_BADNOTIMPLEMENTED;
+        return;
+    }
   
     /* check monitoringMode is valid or not */
     if(smc->monitoringMode > UA_MONITORINGMODE_REPORTING) {
+        *result = UA_STATUSCODE_BADMONITORINGMODEINVALID;
         return;
     }
 
@@ -406,12 +412,13 @@ Operation_SetMonitoringMode(UA_Server *server, UA_Session *session,
     mon->monitoringMode = smc->monitoringMode;
     if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) {
         MonitoredItem_registerSampleCallback(server, mon);
-    } else if (mon->monitoringMode == UA_MONITORINGMODE_DISABLED) {
-        /*  Setting the mode to DISABLED causes all queued Notifications to be delete */
+    } else {
+        // TODO correctly implement SAMPLING
+        /*  Setting the mode to DISABLED or SAMPLING causes all queued Notifications to be delete */
         MonitoredItem_queuedValue *val, *val_tmp;
         TAILQ_FOREACH_SAFE(val, &mon->queue, listEntry, val_tmp) {
             TAILQ_REMOVE(&mon->queue, val, listEntry);
-            UA_DataValue_deleteMembers(&val->value);
+            UA_DataValue_deleteMembers(&val->data.value);
             UA_free(val);
         }
         mon->currentQueueSize = 0;

+ 2 - 0
src/server/ua_subscription_datachange.c

@@ -296,6 +296,8 @@ UA_MonitoredItem_SampleCallback(UA_Server *server,
 
 UA_StatusCode
 MonitoredItem_registerSampleCallback(UA_Server *server, UA_MonitoredItem *mon) {
+    if(mon->sampleCallbackIsRegistered)
+        return UA_STATUSCODE_GOOD;
     UA_StatusCode retval =
         UA_Server_addRepeatedCallback(server, (UA_ServerCallback)UA_MonitoredItem_SampleCallback,
                                       mon, (UA_UInt32)mon->samplingInterval, &mon->sampleCallbackId);