浏览代码

immediately sample new monitoreditem

Julius Pfrommer 8 年之前
父节点
当前提交
f38cd44c51
共有 4 个文件被更改,包括 15 次插入11 次删除
  1. 9 9
      src/server/ua_server_worker.c
  2. 3 0
      src/server/ua_services_subscription.c
  3. 2 2
      src/server/ua_subscription.c
  4. 1 0
      src/server/ua_subscription.h

+ 9 - 9
src/server/ua_server_worker.c

@@ -200,7 +200,7 @@ static UA_StatusCode addRepeatedJob(UA_Server *server, struct AddRepeatedJob * U
     UA_StatusCode retval = UA_STATUSCODE_GOOD;
 
     /* search for matching entry */
-    UA_DateTime firstTime = UA_DateTime_nowMonotonic();
+    UA_DateTime firstTime = UA_DateTime_nowMonotonic() + arw->interval;
     tempTw = LIST_FIRST(&server->repeatedJobs);
     while(tempTw) {
         if(arw->interval == tempTw->interval) {
@@ -310,18 +310,18 @@ static UA_DateTime processRepeatedJobs(UA_Server *server, UA_DateTime current) {
             jobsCopy[i] = tw->jobs[i].job;
         dispatchJobs(server, jobsCopy, tw->jobsSize); // frees the job pointer
 #else
-		size_t size = tw->jobsSize;
+        size_t size = tw->jobsSize;
         for(size_t i = 0; i < size; i++)
             processJobs(server, &tw->jobs[i].job, 1); // does not free the job ptr
 #endif
 
-		/* Elements are removed only here. Check if empty. */
-		if(tw->jobsSize == 0) {
-			LIST_REMOVE(tw, pointers);
-			UA_free(tw);
+        /* Elements are removed only here. Check if empty. */
+        if(tw->jobsSize == 0) {
+            LIST_REMOVE(tw, pointers);
+            UA_free(tw);
             UA_assert(LIST_FIRST(&server->repeatedJobs) != tw); /* Assert for static code checkers */
-			continue;
-		}
+            continue;
+        }
 
         /* Set the time for the next execution */
         tw->nextTime += tw->interval;
@@ -358,7 +358,7 @@ static void removeRepeatedJob(UA_Server *server, UA_Guid *jobId) {
         for(size_t i = 0; i < tw->jobsSize; i++) {
             if(!UA_Guid_equal(jobId, &tw->jobs[i].id))
                 continue;
-			tw->jobsSize--; /* if size == 0, tw is freed during the next processing */
+            tw->jobsSize--; /* if size == 0, tw is freed during the next processing */
             if(tw->jobsSize > 0)
                 tw->jobs[i] = tw->jobs[tw->jobsSize]; // move the last entry to overwrite
             goto finish;

+ 3 - 0
src/server/ua_services_subscription.c

@@ -189,6 +189,9 @@ Service_CreateMonitoredItems_single(UA_Server *server, UA_Session *session, UA_S
                              request->requestedParameters.discardOldest);
     LIST_INSERT_HEAD(&sub->MonitoredItems, newMon, listEntry);
 
+    /* Create the first sample */
+    UA_MoniteredItem_SampleCallback(server, newMon);
+
     /* Prepare the response */
     UA_String_copy(&request->itemToMonitor.indexRange, &newMon->indexRange);
     result->revisedSamplingInterval = newMon->samplingInterval;

+ 2 - 2
src/server/ua_subscription.c

@@ -43,7 +43,7 @@ void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
     UA_free(monitoredItem);
 }
 
-static void SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
+void UA_MoniteredItem_SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
     UA_Subscription *sub = monitoredItem->subscription;
     if(monitoredItem->monitoredItemType != UA_MONITOREDITEMTYPE_CHANGENOTIFY) {
         UA_LOG_DEBUG_SESSION(server->config.logger, sub->session, "MonitoredItem %i | "
@@ -125,7 +125,7 @@ static void SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem) {
 
 UA_StatusCode MonitoredItem_registerSampleJob(UA_Server *server, UA_MonitoredItem *mon) {
     UA_Job job = {.type = UA_JOBTYPE_METHODCALL,
-                  .job.methodCall = {.method = (UA_ServerCallback)SampleCallback, .data = mon} };
+                  .job.methodCall = {.method = (UA_ServerCallback)UA_MoniteredItem_SampleCallback, .data = mon} };
     UA_StatusCode retval = UA_Server_addRepeatedJob(server, job, (UA_UInt32)mon->samplingInterval,
                                                     &mon->sampleJobGuid);
     if(retval == UA_STATUSCODE_GOOD)

+ 1 - 0
src/server/ua_subscription.h

@@ -53,6 +53,7 @@ typedef struct UA_MonitoredItem {
 
 UA_MonitoredItem *UA_MonitoredItem_new(void);
 void MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem);
+void UA_MoniteredItem_SampleCallback(UA_Server *server, UA_MonitoredItem *monitoredItem);
 UA_StatusCode MonitoredItem_registerSampleJob(UA_Server *server, UA_MonitoredItem *mon);
 UA_StatusCode MonitoredItem_unregisterSampleJob(UA_Server *server, UA_MonitoredItem *mon);