rclrb 1.1.0 → 1.2.0

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: fa1e9670651f4221d77ac73b333e0b0302ce7937adfb7616255e6dc21b7b914e
4
- data.tar.gz: 9037924c66ca516eba232aa1df38207c7fac459a0d684e64bc218df914a18249
3
+ metadata.gz: 0dc5c6fa67dfa18627ec77be2ee941d9793d6f0e66897e018444029f1318d036
4
+ data.tar.gz: 1e9422a5b7bad284ef7bc6c8a14b2b0f53bb6ab5331f83ce100bbe2f9601c3c0
5
5
  SHA512:
6
- metadata.gz: 6afc0fa223030929c2665bf5aaf209f226dcad5113a5c0ccb64d501b68f77bd25220dfafa682aade5a8cc9c562a52558b7b03ba1aeebb1c38ae88e065554a846
7
- data.tar.gz: 8e91b4eea09726ed69f6273b7a65b637296dc675785b2353b12f84dad95d8700b8d87e6c15650be94f6262dac2b31143930ec376bd16be72c8bcfe8ee0a1f592
6
+ metadata.gz: 8e00c7559faeb4389105ecef789be4e54acdd2dd472ef8cd6d2105e1e77e7c096d4310c13ac434549c6aaf63e728e4c735e28f4ccd005f905f2cf2b55b408d7c
7
+ data.tar.gz: 726f02ca7a4b692922428322e7e39527427c7832398d2c7ff3fcb3fa01265ef53c42abc55e335c8bce520d1eecf20d3712f5135a3a02cdc0fc596030e0c4bc61
data/lib/rclrb/client.rb CHANGED
@@ -15,6 +15,7 @@ module Rclrb
15
15
  client_ops = CApi.rcl_client_get_default_options()
16
16
  client_ops[:qos] = QoSProfile.get_profile(qos_profile).ros_profile
17
17
  CApi.handle_result CApi.rcl_client_init(@client_handle, node_handle, srv_type.type_support(), @srv_name, client_ops)
18
+ Rclrb.rcl_signal_guard_condition.trigger
18
19
  end
19
20
 
20
21
  rclrb_finalize_with :@client_handle, :@node_handle do |client_handle, node_handle|
@@ -7,6 +7,8 @@ module Rclrb
7
7
  def initialize(*nodes)
8
8
  @nodes = nodes
9
9
  @groups = nodes.map { |x| x.default_callback_group }
10
+ @running = true
11
+ @exitcode = 0
10
12
  end
11
13
  ##
12
14
  # Add a node to the executor
@@ -14,15 +16,21 @@ module Rclrb
14
16
  @nodes.append node
15
17
  @groups.append node.default_callback_group
16
18
  end
19
+ def shutdown(exitcode)
20
+ @exitcode = exitcode
21
+ @running = false
22
+ Rclrb.rcl_signal_guard_condition.trigger
23
+ end
17
24
  ##
18
25
  # Spin continuously untill shutdown was requested
19
26
  def spin()
20
- until Rclrb.rcl_shutdown_requested?
27
+ while @running and not Rclrb.rcl_shutdown_requested?
21
28
  wait_set = WaitSet.new
22
29
  threads = @groups.map { |g| g.spin wait_set }
23
30
  threads.each { |t| t.join }
24
31
  wait_set.wait
25
32
  end
33
+ return @exitcode
26
34
  end
27
35
  end
28
36
  ##
data/lib/rclrb/fields.rb CHANGED
@@ -31,6 +31,9 @@ module Rclrb
31
31
  @array_reader = array_reader
32
32
  @array_writter = array_writter
33
33
  end
34
+ def create_from_dict v
35
+ return v
36
+ end
34
37
  def array_field()
35
38
  @array_field = ArrayField.new(self) unless defined?(@array_field)
36
39
  return @array_field
@@ -71,6 +74,9 @@ module Rclrb
71
74
  def StringField.field_name()
72
75
  return "Rclrb::Fields::StringField"
73
76
  end
77
+ def StringField.create_from_dict v
78
+ return v
79
+ end
74
80
  def StringField.parse_ros_message(data)
75
81
  length = data[:length]
76
82
  return data[:string].get_string(0, length)
@@ -78,14 +84,19 @@ module Rclrb
78
84
  def StringField.parse_ros_message_array(data, length)
79
85
  return Fields.__generic_parse_array(data, length, StringField.ffi_size) { |ptr| StringField.parse_ros_message FFIType.new(ptr) }
80
86
  end
81
- def StringField.fill_ros_message(data, index, value)
82
- st = data[index]
87
+ def StringField.__fill_ros_message(ffi_struct, value)
83
88
  str_pointer = Rclrb.rcl_allocate value.length + 1
84
- st[:string] = str_pointer
89
+ ffi_struct[:string] = str_pointer
85
90
  str_pointer.put_string(0, value)
86
91
  str_pointer.put_uint8(value.length, 0)
87
- st[:length] = value.length
88
- st[:capacity] = value.length + 1
92
+ ffi_struct[:length] = value.length
93
+ ffi_struct[:capacity] = value.length + 1
94
+ end
95
+ def StringField.fill_ros_message(data, index, value)
96
+ StringField.__fill_ros_message(data[index], value)
97
+ end
98
+ def StringField.fill_ros_message_array(array_pointer, value)
99
+ Fields.__generic_fill_ros_message_array(array_pointer, value, StringField.ffi_size) { |ptr, value| StringField.__fill_ros_message(ffi_type.new(ptr), value) }
89
100
  end
90
101
  def StringField.destroy_ros_message(data)
91
102
  if data.kind_of? FFIType
@@ -118,15 +129,24 @@ module Rclrb
118
129
  def TimeField.field_name()
119
130
  return "Rclrb::Fields::TimeField"
120
131
  end
132
+ def TimeField.create_from_dict v
133
+ return Time.from_sec_nsec v['sec'], v['nsec']
134
+ end
121
135
  def TimeField.parse_ros_message(data)
122
136
  return Time.from_sec_nsec data[:sec], data[:nsec]
123
137
  end
124
- def TimeField.fill_ros_message(data, index, value)
125
- st = data[index]
138
+ def TimeField.__fill_ros_message(ffi_struct, value)
126
139
  s, ns = value.to_sec_nsec
127
- st[:sec] = s
128
- st[:nsec] = ns
140
+ ffi_struct[:sec] = s
141
+ ffi_struct[:nsec] = ns
142
+ end
143
+ def TimeField.fill_ros_message(data, index, value)
144
+ TimeField.__fill_ros_message(data[index], value)
129
145
  end
146
+ def TimeField.fill_ros_message_array(array_pointer, value)
147
+ Fields.__generic_fill_ros_message_array(array_pointer, value, TimeField.ffi_size) { |ptr, value| TimeField.__fill_ros_message(ffi_type.new(ptr), value) }
148
+ end
149
+
130
150
  def TimeField.destroy_ros_message(data)
131
151
  end
132
152
  def TimeField.array_field()
@@ -156,6 +176,10 @@ module Rclrb
156
176
  def field_name()
157
177
  return "#{@field.field_name}.array_field()"
158
178
  end
179
+ def create_from_dict v
180
+ raise RclError.new "Expected Array got '#{v}' of type '#{v.class}'" unless v.is_a? Array
181
+ return v.map { |x| @field.create_from_dict x }
182
+ end
159
183
  def parse_ros_message(data)
160
184
  return @field.parse_ros_message_array data[:array], data[:length]
161
185
  end
data/lib/rclrb/init.rb CHANGED
@@ -19,6 +19,23 @@ module Rclrb
19
19
  # Call init
20
20
  CApi.handle_result(CApi.rcl_init(arguments.length, p_values, @@initOptions, @@context))
21
21
 
22
+ # Remove from arguments the ros arguments
23
+ idx = 0
24
+ removing = false
25
+ while idx < arguments.length
26
+ if removing
27
+ if arguments[idx] == "--"
28
+ arguments.delete_at idx
29
+ break
30
+ end
31
+ arguments.delete_at idx
32
+ elsif arguments[idx] == "--ros-args"
33
+ removing = true
34
+ else
35
+ idx += 1
36
+ end
37
+ end
38
+
22
39
  # Guard condition to shutdown execution when shutdown is called
23
40
  @@signal_guard_condition = GuardCondition.new
24
41
  @@shutdown_requested = false
@@ -112,8 +112,17 @@ module Rclrb
112
112
  @<%= field[:name] %> = <%= field[:field_init_value] %>
113
113
  <% end %>
114
114
  end
115
+ def #{klass_name}.create_from_dict(dict)
116
+ v = #{klass_name}.new
117
+ <% mdef[:fields][#{index}].each do |field| %>
118
+ if dict.include? '<%= field[:name] %>'
119
+ v.<%= field[:name] %> = <%= field[:field_def_name] %>.create_from_dict(dict['<%= field[:name] %>'])
120
+ end
121
+ <% end %>
122
+ return v
123
+ end
115
124
  class FFIType < FFI::Struct
116
- layout <%= mdef[:fields][#{index}].map { |f| ":" + f[:name] + ", " + f[:field_def_name] + ".ffi_type" }.join(" ,") %>
125
+ layout <%= mdef[:fields][#{index}].map { |f| ":" + f[:name] + ", " + f[:field_def_name] + ".ffi_type" }.join(" ,") %><% if(mdef[:fields][#{index}].empty?) %> :__dummy__, :int <% end %>
117
126
  end
118
127
 
119
128
  def #{klass_name}.get_ffi_struct(data)
data/lib/rclrb/service.rb CHANGED
@@ -16,6 +16,7 @@ module Rclrb
16
16
  service_ops = CApi.rcl_service_get_default_options()
17
17
  service_ops[:qos] = QoSProfile.get_profile(qos_profile).ros_profile
18
18
  CApi.handle_result CApi.rcl_service_init(@service_handle, node_handle, srv_type.type_support(), @srv_name, service_ops)
19
+ Rclrb.rcl_signal_guard_condition.trigger
19
20
  end
20
21
 
21
22
  rclrb_finalize_with :@service_handle, :@node_handle do |service_handle, node_handle|
@@ -17,6 +17,7 @@ module Rclrb
17
17
  subscription_ops = CApi.rcl_subscription_get_default_options()
18
18
  subscription_ops[:qos] = QoSProfile.get_profile(qos_profile).ros_profile
19
19
  CApi.handle_result CApi.rcl_subscription_init(@subscription_handle, node_handle, msg_type.type_support(), @topic, subscription_ops)
20
+ Rclrb.rcl_signal_guard_condition.trigger
20
21
  end
21
22
  rclrb_finalize_with :@subscription_handle, :@node_handle do |subscription_handle, node_handle|
22
23
  CApi.handle_result CApi.rcl_subscription_fini(subscription_handle, node_handle)
data/lib/rclrb/timer.rb CHANGED
@@ -13,6 +13,7 @@ module Rclrb
13
13
  callback_group.add self
14
14
 
15
15
  CApi.handle_result(CApi.rcl_timer_init(handle, clock.handle, Rclrb.rcl_context, timer_period_sec*1e9, @callback_proc, Rclrb.rcl_allocator))
16
+ Rclrb.rcl_signal_guard_condition.trigger
16
17
  end
17
18
 
18
19
  rclrb_finalize_with :@timer_handle, :@node_handle do |timer_handle, node_handle|
data/lib/rclrb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rclrb
2
- VERSION="1.1.0"
2
+ VERSION="1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rclrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyrille Berger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-14 00:00:00.000000000 Z
11
+ date: 2024-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi