Browse Source

Handle nan in requested publishing and sampling intervals

Julius Pfrommer 8 years ago
parent
commit
b000d7aeff
3 changed files with 32 additions and 18 deletions
  1. 14 8
      include/ua_server.h
  2. 6 6
      plugins/ua_config_standard.c
  3. 12 4
      src/server/ua_services_subscription.c

+ 14 - 8
include/ua_server.h

@@ -84,10 +84,14 @@ typedef struct {
 } UA_UsernamePasswordLogin;
 
 typedef struct {
-    UA_UInt32 current;
     UA_UInt32 min;
     UA_UInt32 max;
-} UA_BoundedUInt32;
+} UA_UInt32Range;
+
+typedef struct {
+	UA_Double min;
+	UA_Double max;
+} UA_DoubleRange;
 
 typedef struct {
     UA_UInt16 nThreads; // only if multithreading is enabled
@@ -108,12 +112,14 @@ typedef struct {
     UA_UsernamePasswordLogin* usernamePasswordLogins;
 
     /* Limits for subscription settings */
-    UA_BoundedUInt32 publishingIntervalLimits;
-    UA_BoundedUInt32 lifeTimeCountLimits;
-    UA_BoundedUInt32 keepAliveCountLimits;
-    UA_BoundedUInt32 notificationsPerPublishLimits;
-    UA_BoundedUInt32 samplingIntervalLimits;
-    UA_BoundedUInt32 queueSizeLimits;
+	UA_DoubleRange publishingIntervalLimits;
+	UA_UInt32Range lifeTimeCountLimits;
+	UA_UInt32Range keepAliveCountLimits;
+	UA_UInt32Range notificationsPerPublishLimits;
+
+	/* Limits for monitoreditem settings */
+    UA_DoubleRange samplingIntervalLimits;
+	UA_UInt32Range queueSizeLimits;
 } UA_ServerConfig;
 
 /**

+ 6 - 6
plugins/ua_config_standard.c

@@ -44,12 +44,12 @@ const UA_ServerConfig UA_ServerConfig_standard = {
     .usernamePasswordLogins = usernamePasswords,
     .usernamePasswordLoginsSize = 2,
     
-    .publishingIntervalLimits = { .max = 10000, .min = 100, .current = 0 },
-    .lifeTimeCountLimits = { .max = 15000, .min = 1, .current = 0 },
-    .keepAliveCountLimits = { .max = 100, .min = 1, .current = 0 },
-    .notificationsPerPublishLimits = { .max = 1000, .min = 1, .current = 0 },
-    .samplingIntervalLimits = { .max = 1000, .min = 50, .current = 0 },
-    .queueSizeLimits = { .max = 100, .min = 1, .current = 0 }
+	.publishingIntervalLimits = { .min = 100.0, .max = 3600.0 * 1000.0 },
+    .lifeTimeCountLimits = { .max = 15000, .min = 1 },
+    .keepAliveCountLimits = { .max = 100, .min = 1 },
+    .notificationsPerPublishLimits = { .max = 1000, .min = 1 },
+	.samplingIntervalLimits = { .min = 50.0, .max = 24.0 * 3600.0 * 1000.0 },
+    .queueSizeLimits = { .max = 100, .min = 1 }
 };
 
 const UA_EXPORT UA_ClientConfig UA_ClientConfig_standard = {

+ 12 - 4
src/server/ua_services_subscription.c

@@ -15,8 +15,12 @@ setSubscriptionSettings(UA_Server *server, UA_Subscription *subscription,
                         UA_UInt32 requestedMaxKeepAliveCount,
                         UA_UInt32 maxNotificationsPerPublish, UA_Byte priority) {
     Subscription_unregisterPublishJob(server, subscription);
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.publishingIntervalLimits,
-                               requestedPublishingInterval, subscription->publishingInterval);
+	subscription->publishingInterval = requestedPublishingInterval;
+	UA_BOUNDEDVALUE_SETWBOUNDS(server->config.publishingIntervalLimits,
+		requestedPublishingInterval, subscription->publishingInterval);
+	/* check for nan*/
+	if(requestedPublishingInterval != requestedPublishingInterval)
+		subscription->publishingInterval = server->config.publishingIntervalLimits.min;
     UA_BOUNDEDVALUE_SETWBOUNDS(server->config.keepAliveCountLimits,
                                requestedMaxKeepAliveCount, subscription->maxKeepAliveCount);
     UA_BOUNDEDVALUE_SETWBOUNDS(server->config.lifeTimeCountLimits,
@@ -99,8 +103,12 @@ setMonitoredItemSettings(UA_Server *server, UA_MonitoredItem *mon,
     MonitoredItem_unregisterSampleJob(server, mon);
     mon->monitoringMode = monitoringMode;
     mon->clientHandle = clientHandle;
-    UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits,
-                               samplingInterval, mon->samplingInterval);
+	mon->samplingInterval = samplingInterval;
+	UA_BOUNDEDVALUE_SETWBOUNDS(server->config.samplingIntervalLimits,
+		samplingInterval, mon->samplingInterval);
+	/* Test for nan */
+	if(samplingInterval != samplingInterval)
+		mon->samplingInterval = server->config.samplingIntervalLimits.min;
     UA_BOUNDEDVALUE_SETWBOUNDS(server->config.queueSizeLimits,
                                queueSize, mon->maxQueueSize);
     mon->discardOldest = discardOldest;