opcua 0.25 → 0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f86b954296eb2837114b76e0a32dc36cabfa922dfa30bdfc9b79e188fff0777e
4
- data.tar.gz: c504ae5111b2422237dd7890f68739555338b46363b3158dc84b6e91f6052d2e
3
+ metadata.gz: e0bd449baa58c495096569ded2e6a50df7e0554ff273b0c853ae8302dc33e544
4
+ data.tar.gz: b6d8ee15542d9be07673ea0522c88f19e0309261ff454cf47f4f1d3b8b8fc927
5
5
  SHA512:
6
- metadata.gz: a559fc42fa3809c643eb0d62ac5a345418118da336d38a6867fd3dbe7550eea5d33d32a1ded00cc2c08bee62fe17ccaca8ad1c500c800930f18bc208b0e94229
7
- data.tar.gz: a23f8d80d7075ddbdca95f6f8fbd93e0f51e0a26136720a295073cf45e02cbf1adef2d205fcb131cd1de4ba02ea2db7446762c4c2ca1a66463354b87df7cfbdd
6
+ metadata.gz: 880f9af425e78f1dfd71e30383b4133201e1af01bd23de16c96a18e5ca0e75d0696b856d3453d8ea75fce4578f2574b823645b0ca39671c0fb626855e9dbc159
7
+ data.tar.gz: f695ee96bdfe1c19a632698b25171e08142b425cd1eeca2f10cb1f72fed7b58cc996bddedf4f833f072b2016696772b37c87a6def87f3ddef7549724321ab813
data/README.md CHANGED
@@ -50,6 +50,8 @@ sudo make install
50
50
  gem install opcua
51
51
  ```
52
52
 
53
+ If you get errors during compilation, please file an issue in github. Maybe the API open62541 API changed (constant improvements are happening).
54
+
53
55
  If the installation works correctly, but examples are still complaining about missing lib62541.so, try this:
54
56
 
55
57
  ```sh
@@ -9,8 +9,14 @@ client = OPCUA::Client.new("opc.tcp://localhost:4840")
9
9
  client.subscription_interval = 100 # default 500
10
10
 
11
11
  node = client.get 2, '/KalimatC34/Tools/Tool1/ToolNumber' # get node from nodeid
12
+ n2 = client.get 2, '/KalimatC34/Tools/Tool2/ToolNumber' # get node from nodeid
13
+ p node.unsubscribe
12
14
  node.on_change do |value,timestamp|
13
15
  p value
16
+ if value == 2
17
+ p 'unsub'
18
+ p node.unsubscribe
19
+ end
14
20
  end
15
21
 
16
22
  while true
@@ -33,6 +33,7 @@ static node_struct * node_alloc(client_struct *client, UA_NodeId nodeid) { //{{{
33
33
  ns->id = nodeid;
34
34
  ns->on_change = Qnil;
35
35
  ns->waiting = 0;
36
+ ns->monId = 0;
36
37
 
37
38
  return ns;
38
39
  } //}}}
@@ -99,7 +100,6 @@ static VALUE node_on_change(VALUE self) { //{{{
99
100
  rb_gc_register_address(&ns->on_change);
100
101
 
101
102
  rb_ary_push(ns->master->subs,self);
102
- ns->master->subs_changed = true;
103
103
 
104
104
  return self;
105
105
  } //}}}
@@ -184,7 +184,7 @@ static VALUE node_on_value_change(VALUE self) { // {{{
184
184
  /* -- */
185
185
  static void client_free(client_struct *pss) { //{{{
186
186
  if (pss != NULL) {
187
- if (!pss->firstrun) {
187
+ if (pss->subrun) {
188
188
  // do we need to delete the individual monResponse (#UA_MonitoredItemCreateResult_clear)?
189
189
  UA_Client_Subscriptions_deleteSingle(pss->master,pss->subscription_response.subscriptionId);
190
190
  }
@@ -201,11 +201,10 @@ static VALUE client_alloc(VALUE self) { //{{{
201
201
 
202
202
  pss->master = UA_Client_new();
203
203
  pss->config = UA_Client_getConfig(pss->master);
204
- pss->firstrun = true;
204
+ pss->subrun = false;
205
205
  pss->started = true;
206
206
  pss->debug = true;
207
207
  pss->subs = rb_ary_new();
208
- pss->subs_changed = false;
209
208
  pss->subscription_interval = 500;
210
209
  pss->default_ns = 2;
211
210
 
@@ -491,6 +490,20 @@ static VALUE node_to_s(VALUE self) { //{{{
491
490
  }
492
491
  return ret;
493
492
  } //}}}
493
+ static VALUE unsubscribe(VALUE self) { //{{{
494
+ node_struct *ns;
495
+
496
+ Data_Get_Struct(self, node_struct, ns);
497
+
498
+ if (ns->master->subrun && ns->monId > 0) {
499
+ UA_Client_MonitoredItems_deleteSingle(ns->master->master, ns->master->subscription_response.subscriptionId, ns->monId);
500
+ ns->monId = 0;
501
+ rb_ary_delete(ns->master->subs, self);
502
+ return Qtrue;
503
+ } else {
504
+ return Qfalse;
505
+ }
506
+ } //}}}
494
507
 
495
508
  static VALUE node_call(int argc, VALUE* argv, VALUE self) { //{{{
496
509
  node_struct *ns;
@@ -553,7 +566,7 @@ static VALUE node_call(int argc, VALUE* argv, VALUE self) { //{{{
553
566
  }
554
567
  } //}}}
555
568
 
556
- static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value) { //{{{
569
+ static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subContext, UA_UInt32 monId, void *monContext, UA_DataValue *value) { //{{{
557
570
  VALUE val = (VALUE)monContext;
558
571
 
559
572
  if (NIL_P(val) || TYPE(val) != T_NIL) {
@@ -573,7 +586,7 @@ static void client_run_handler(UA_Client *client, UA_UInt32 subId, void *subCon
573
586
  rb_proc_call(val,args);
574
587
  }
575
588
  } //}}}
576
- static void client_run_iterate(VALUE key) { //{{{
589
+ static void client_run_iterate(VALUE key) { //{{{
577
590
  node_struct *ns;
578
591
  Data_Get_Struct(key, node_struct, ns);
579
592
 
@@ -583,26 +596,28 @@ static void client_run_iterate(VALUE key) { //{{{
583
596
  UA_Client_MonitoredItems_createDataChange(ns->master->master, ns->master->subscription_response.subscriptionId,
584
597
  UA_TIMESTAMPSTORETURN_BOTH,
585
598
  monRequest, (void *)ns->on_change, client_run_handler, NULL);
599
+ ns->monId = monResponse.monitoredItemId;
586
600
 
587
601
  if(monResponse.statusCode != UA_STATUSCODE_GOOD) {
588
602
  rb_raise(rb_eRuntimeError, "Monitoring item failed: %s\n", UA_StatusCode_name(monResponse.statusCode));
589
603
  }
604
+ UA_MonitoredItemCreateResult_clear(&monResponse);
605
+ UA_MonitoredItemCreateRequest_clear(&monRequest);
590
606
  } //}}}
591
607
  static VALUE client_run(VALUE self) { //{{{
592
608
  client_struct *pss;
593
609
  Data_Get_Struct(self, client_struct, pss);
594
610
  if (!pss->started) rb_raise(rb_eRuntimeError, "Client disconnected.");
595
611
 
596
- if (pss->firstrun) {
597
- pss->firstrun = false;
598
- pss->subs_changed = false;
612
+ if (!pss->subrun) {
613
+ pss->subrun = true;
599
614
  pss->subscription_response = UA_Client_Subscriptions_create(pss->master, pss->subscription_request, NULL, NULL, NULL);
600
615
  if (pss->subscription_response.responseHeader.serviceResult != UA_STATUSCODE_GOOD)
601
616
  rb_raise(rb_eRuntimeError, "Subscription could not be created.");
602
-
603
- for (int i = 0; i < RARRAY_LEN(pss->subs); i++) {
604
- client_run_iterate(rb_ary_entry(pss->subs,i));
605
- }
617
+ }
618
+ while (RARRAY_LEN(pss->subs)>0) {
619
+ VALUE aentry = rb_ary_pop(pss->subs);
620
+ client_run_iterate(aentry);
606
621
  }
607
622
  UA_Client_run_iterate(pss->master, 100);
608
623
 
@@ -613,7 +628,7 @@ static VALUE client_disconnect(VALUE self) { //{{{
613
628
  Data_Get_Struct(self, client_struct, pss);
614
629
  if (!pss->started) rb_raise(rb_eRuntimeError, "Client disconnected.");
615
630
 
616
- if (!pss->firstrun) {
631
+ if (pss->subrun) {
617
632
  // do we need to delete the individual monResponse (#UA_MonitoredItemCreateResult_clear)?
618
633
  UA_Client_Subscriptions_deleteSingle(pss->master,pss->subscription_response.subscriptionId);
619
634
  }
@@ -648,6 +663,7 @@ void Init_client(void) {
648
663
 
649
664
  rb_define_method(cNode, "to_s", node_to_s, 0);
650
665
  rb_define_method(cNode, "id", node_id, 0);
666
+ rb_define_method(cNode, "unsubscribe", unsubscribe, 0);
651
667
 
652
668
  rb_define_method(cMethodNode, "call", node_call, -1);
653
669
 
@@ -11,11 +11,10 @@ typedef struct client_struct {
11
11
  UA_CreateSubscriptionResponse subscription_response;
12
12
 
13
13
  UA_UInt32 subscription_interval;
14
- bool firstrun;
14
+ bool subrun;
15
15
  bool started;
16
16
  bool debug;
17
17
  VALUE subs;
18
- bool subs_changed;
19
18
  UA_UInt16 default_ns;
20
19
  } client_struct;
21
20
 
@@ -23,5 +22,6 @@ typedef struct node_struct {
23
22
  client_struct *master;
24
23
  VALUE on_change;
25
24
  UA_NodeId id;
25
+ UA_UInt32 monId;
26
26
  int waiting;
27
27
  } node_struct;
@@ -39,7 +39,6 @@ bool server_node_get_reference(UA_Server *server, UA_NodeId parent, UA_NodeId *r
39
39
  // qn.name.data
40
40
  // );
41
41
 
42
- UA_BrowseResult_deleteMembers(&bRes);
43
42
  UA_BrowseResult_clear(&bRes);
44
43
  return true;
45
44
  }
@@ -63,13 +62,11 @@ bool server_node_get_reference_by_name(UA_Server *server, UA_NodeId parent, UA_Q
63
62
  if (UA_QualifiedName_equal(&qn,&name)) {
64
63
  UA_NodeId_copy(&ref->nodeId.nodeId,result);
65
64
 
66
- UA_BrowseResult_deleteMembers(&bRes);
67
65
  UA_BrowseResult_clear(&bRes);
68
66
  return true;
69
67
  }
70
68
  }
71
69
 
72
- UA_BrowseResult_deleteMembers(&bRes);
73
70
  UA_BrowseResult_clear(&bRes);
74
71
  return false;
75
72
  }
@@ -100,7 +97,6 @@ bool client_node_get_reference_by_name(UA_Client *client, UA_NodeId parent, UA_Q
100
97
  }
101
98
  }
102
99
 
103
- UA_BrowseResponse_deleteMembers(&bResp);
104
100
  UA_BrowseResponse_clear(&bResp);
105
101
  return success;
106
102
  }
@@ -126,7 +122,6 @@ bool client_node_get_reference_by_type(UA_Client *client, UA_NodeId parent, UA_N
126
122
  }
127
123
  }
128
124
 
129
- UA_BrowseResponse_deleteMembers(&bResp);
130
125
  UA_BrowseResponse_clear(&bResp);
131
126
  return success;
132
127
  }
@@ -164,7 +159,6 @@ bool client_node_list_references(UA_Client *client, UA_NodeId parent, bool inver
164
159
 
165
160
  }
166
161
  }
167
- UA_BrowseResponse_deleteMembers(&bResp);
168
162
  UA_BrowseResponse_clear(&bResp);
169
163
  return false;
170
164
  }
@@ -846,7 +846,7 @@ static VALUE node_value_set(VALUE self, VALUE value) { //{{{
846
846
  }
847
847
 
848
848
  UA_Server_writeValue(ns->master->master, ns->id, variant);
849
- UA_Variant_deleteMembers(&variant);
849
+ UA_Variant_clear(&variant);
850
850
  }
851
851
  return self;
852
852
  } //}}}
data/opcua.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "opcua"
3
- s.version = "0.25"
3
+ s.version = "0.26"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "Preliminary release of opcua (open62541) ruby bindings. C performance, Ruby elegance, simplicity, and productivity."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opcua
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.25'
4
+ version: '0.26'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: tools
12
12
  cert_chain: []
13
- date: 2021-01-27 00:00:00.000000000 Z
13
+ date: 2021-02-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: daemonite