Selaa lähdekoodia

Additional logic of setting monitoring mode following specification

ChaJiWon 7 vuotta sitten
vanhempi
commit
23bc30580a
1 muutettua tiedostoa jossa 16 lisäystä ja 2 poistoa
  1. 16 2
      src/server/ua_services_subscription.c

+ 16 - 2
src/server/ua_services_subscription.c

@@ -394,10 +394,24 @@ Operation_SetMonitoringMode(UA_Server *server, UA_Session *session,
         return;
 
     mon->monitoringMode = op_monitoringMode;
-    if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING)
+    if(mon->monitoringMode == UA_MONITORINGMODE_REPORTING) {
         MonitoredItem_registerSampleCallback(server, mon);
-    else
+    } else if (mon->monitoringMode == UA_MONITORINGMODE_DISABLED) {
+        /*  Setting the mode to DISABLED 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_free(val);
+		}
+		mon->currentQueueSize = 0;
+
+		/* initialize lastSampledValue */
+		mon->lastSampledValue.data = NULL;
+		mon->lastSampledValue.length = 0;
+
         MonitoredItem_unregisterSampleCallback(server, mon);
+    }
 }
 
 void Service_SetMonitoringMode(UA_Server *server, UA_Session *session,