Parcourir la source

implement setmonitoringmode service

Julius Pfrommer il y a 8 ans
Parent
commit
4bccee85d6

+ 5 - 0
src/server/ua_server_binary.c

@@ -173,6 +173,11 @@ getServicePointers(UA_UInt32 requestTypeId, const UA_DataType **requestType,
         *requestType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSREQUEST];
         *responseType = &UA_TYPES[UA_TYPES_MODIFYMONITOREDITEMSRESPONSE];
         break;
+    case UA_NS0ID_SETMONITORINGMODEREQUEST:
+        *service = (UA_Service)Service_SetMonitoringMode;
+        *requestType = &UA_TYPES[UA_TYPES_SETMONITORINGMODEREQUEST];
+        *responseType = &UA_TYPES[UA_TYPES_SETMONITORINGMODERESPONSE];
+        break;
 #endif
 
 #ifdef UA_ENABLE_METHODCALLS

+ 9 - 4
src/server/ua_services.h

@@ -279,11 +279,16 @@ void Service_DeleteMonitoredItems(UA_Server *server, UA_Session *session,
 void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
                                   const UA_ModifyMonitoredItemsRequest *request,
                                   UA_ModifyMonitoredItemsResponse *response);
-/* Not Implemented: Service_SetMonitoringMode */
+
+/* Used to set the monitoring mode for one or more MonitoredItems of a Subscription. */
+void Service_SetMonitoringMode(UA_Server *server, UA_Session *session,
+                               const UA_SetMonitoringModeRequest *request,
+                               UA_SetMonitoringModeResponse *response);
+
 /* Not Implemented: Service_SetTriggering */
 
 #endif
-                                      
+
 /**
  * Subscription Service Set
  * ------------------------
@@ -304,8 +309,8 @@ void Service_ModifySubscription(UA_Server *server, UA_Session *session,
 
 /* Used to enable sending of Notifications on one or more Subscriptions. */
 void Service_SetPublishingMode(UA_Server *server, UA_Session *session,
-	                           const UA_SetPublishingModeRequest *request,
-	                           UA_SetPublishingModeResponse *response);
+                               const UA_SetPublishingModeRequest *request,
+                               UA_SetPublishingModeResponse *response);
 
 /* Used for two purposes. First, it is used to acknowledge the receipt of
  * NotificationMessages for one or more Subscriptions. Second, it is used to

+ 36 - 3
src/server/ua_services_subscription.c

@@ -125,7 +125,8 @@ setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
     UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits,
                                queueSize, mon->maxQueueSize);
     mon->discardOldest = discardOldest;
-    MonitoredItem_registerSampleJob(server, mon);
+    if(monitoringMode == UA_MONITORINGMODE_REPORTING)
+        MonitoredItem_registerSampleJob(server, mon);
 }
 
 static const UA_String binaryEncoding = {sizeof("Default Binary")-1, (UA_Byte*)"Default Binary"};
@@ -262,11 +263,43 @@ void Service_ModifyMonitoredItems(UA_Server *server, UA_Session *session,
     response->resultsSize = request->itemsToModifySize;
 
     for(size_t i = 0; i < request->itemsToModifySize; i++)
-        Service_ModifyMonitoredItems_single(server, session, sub, &request->itemsToModify[i],
-                                            &response->results[i]);
+        Service_ModifyMonitoredItems_single(server, session, sub, &request->itemsToModify[i], &response->results[i]);
 
 }
 
+void Service_SetMonitoringMode(UA_Server *server, UA_Session *session,
+                               const UA_SetMonitoringModeRequest *request,
+                               UA_SetMonitoringModeResponse *response) {
+    UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing SetMonitoringMode");
+    UA_Subscription *sub = UA_Session_getSubscriptionByID(session, request->subscriptionId);
+    if(!sub) {
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
+        return;
+    }
+
+    if(request->monitoredItemIdsSize == 0) {
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADNOTHINGTODO;
+        return;
+    }
+
+    response->results = UA_Array_new(request->monitoredItemIdsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
+    if(!response->results) {
+        response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
+        return;
+    }
+    response->resultsSize = request->monitoredItemIdsSize;
+
+    for(size_t i = 0; i < response->resultsSize; i++) {
+        UA_MonitoredItem *mon = UA_Subscription_getMonitoredItem(sub, request->monitoredItemIds[i]);
+        if(mon)
+            setMonitoredItemSettings(server, mon, request->monitoringMode, mon->clientHandle,
+                                     mon->samplingInterval, mon->maxQueueSize, mon->discardOldest);
+        else
+            response->results[i] = UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
+    }
+}
+
+
 void
 Service_Publish(UA_Server *server, UA_Session *session,
                 const UA_PublishRequest *request, UA_UInt32 requestId) {

+ 2 - 0
tools/schema/datatypes_minimal.txt

@@ -156,3 +156,5 @@ MonitoredItemModifyRequest
 ModifyMonitoredItemsRequest
 MonitoredItemModifyResult
 ModifyMonitoredItemsResponse
+SetMonitoringModeRequest
+SetMonitoringModeResponse