Browse Source

use the indexRange, check the encoding, use the timestampstoreturn flag

Julius Pfrommer 8 years ago
parent
commit
0441355fbc

+ 1 - 1
src/server/ua_services_attribute.c

@@ -203,7 +203,7 @@ void Service_Read_single(UA_Server *server, UA_Session *session, const UA_Timest
                          const UA_ReadValueId *id, UA_DataValue *v) {
 	if(id->dataEncoding.name.length > 0 && !UA_String_equal(&binEncoding, &id->dataEncoding.name)) {
            v->hasStatus = true;
-           v->status = UA_STATUSCODE_BADDATAENCODINGINVALID;
+           v->status = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
            return;
 	}
 

+ 14 - 0
src/server/ua_services_subscription.c

@@ -120,15 +120,26 @@ setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
     MonitoredItem_registerSampleJob(server, mon);
 }
 
+static const UA_String binEncoding = {sizeof("DefaultBinary")-1, (UA_Byte*)"DefaultBinary"};
 static void
 Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_Subscription *sub,
+                                    const UA_TimestampsToReturn timestampsToReturn,
                                     const UA_MonitoredItemCreateRequest *request,
                                     UA_MonitoredItemCreateResult *result) {
+    /* Check if the target exists */
     const UA_Node *target = UA_NodeStore_get(server->nodestore, &request->itemToMonitor.nodeId);
     if(!target) {
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         return;
     }
+    // TODO: Check if the target node type has the requested attribute
+
+    /* Check if the encoding is supported */
+	if(request->itemToMonitor.dataEncoding.name.length > 0 &&
+       !UA_String_equal(&binEncoding, &request->itemToMonitor.dataEncoding.name)) {
+        result->statusCode = UA_STATUSCODE_BADDATAENCODINGUNSUPPORTED;
+        return;
+    }
 
     UA_MonitoredItem *newMon = UA_MonitoredItem_new();
     if(!newMon) {
@@ -146,12 +157,14 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
     newMon->subscription = sub;
     newMon->attributeID = request->itemToMonitor.attributeId;
     newMon->itemId = UA_Session_getUniqueSubscriptionID(session);
+    newMon->timestampsToReturn = timestampsToReturn;
     setMonitoredItemSettings(server, newMon, MONITOREDITEM_TYPE_CHANGENOTIFY,
                              request->requestedParameters.clientHandle,
                              request->requestedParameters.samplingInterval,
                              request->requestedParameters.queueSize,
                              request->requestedParameters.discardOldest);
 
+    UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange);
     result->revisedSamplingInterval = newMon->samplingInterval;
     result->revisedQueueSize = newMon->maxQueueSize;
     result->monitoredItemId = newMon->itemId;
@@ -184,6 +197,7 @@ Service_CreateMonitoredItems(UA_Server *server, UA_Session *session,
 
     for(size_t i = 0; i < request->itemsToCreateSize; i++)
         Service_CreateMonitoredItems_single(server, session, sub,
+                                            request->timestampsToReturn,
                                             &request->itemsToCreate[i],
                                             &response->results[i]);
 }

+ 4 - 0
src/server/ua_subscription.c

@@ -13,6 +13,8 @@ UA_MonitoredItem * UA_MonitoredItem_new() {
     new->currentQueueSize = 0;
     new->maxQueueSize = 0;
     new->monitoredItemType = MONITOREDITEM_TYPE_CHANGENOTIFY; // TODO: This is currently hardcoded;
+    new->timestampsToReturn = UA_TIMESTAMPSTORETURN_SOURCE;
+    UA_String_init(&new->indexRange);
     TAILQ_INIT(&new->queue);
     UA_NodeId_init(&new->monitoredNodeId);
     new->lastSampledValue = UA_BYTESTRING_NULL;
@@ -32,6 +34,7 @@ void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
     }
     monitoredItem->currentQueueSize = 0;
     LIST_REMOVE(monitoredItem, listEntry);
+    UA_String_deleteMembers(&monitoredItem->indexRange);
     UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue);
     UA_NodeId_deleteMembers(&monitoredItem->monitoredNodeId);
     UA_free(monitoredItem);
@@ -60,6 +63,7 @@ static void SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
     UA_ReadValueId_init(&rvid);
     rvid.nodeId = monitoredItem->monitoredNodeId;
     rvid.attributeId = monitoredItem->attributeID;
+    rvid.indexRange = monitoredItem->indexRange;
     UA_Subscription *sub = monitoredItem->subscription;
     Service_Read_single(server, sub->session, monitoredItem->timestampsToReturn, &rvid, &newvalue->value);
 

+ 1 - 1
src/server/ua_subscription.h

@@ -39,7 +39,7 @@ typedef struct UA_MonitoredItem {
     UA_UInt32 currentQueueSize;
     UA_UInt32 maxQueueSize;
     UA_Boolean discardOldest;
-    // TODO: indexRange is ignored; array values default to element 0
+    UA_String indexRange;
     // TODO: dataEncoding is hardcoded to UA binary
 
     /* Sample Job */