Browse Source

Merge pull request #1522 from ChaJiWon/monitoring_mode

Additional logic of setting monitoring mode
Stefan Profanter 7 years ago
parent
commit
c3885fb0ce
1 changed files with 19 additions and 2 deletions
  1. 19 2
      src/server/ua_services_subscription.c

+ 19 - 2
src/server/ua_services_subscription.c

@@ -394,15 +394,32 @@ Operation_SetMonitoringMode(UA_Server *server, UA_Session *session,
         *result = UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
         return;
     }
+  
+    /* check monitoringMode is valid or not */
+    if(smc->monitoringMode > UA_MONITORINGMODE_REPORTING) {
+        return;
+    }
 
     if(mon->monitoringMode == smc->monitoringMode)
         return;
 
     mon->monitoringMode = smc->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 */
+        UA_ByteString_deleteMembers(&mon->lastSampledValue);
         MonitoredItem_unregisterSampleCallback(server, mon);
+    }
 }
 
 void Service_SetMonitoringMode(UA_Server *server, UA_Session *session,