ur-sock 0.1 → 0.2

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: 4d864734b08ba388db84746d04f4fec4357f280011f064b22ffba985b4d7b799
4
- data.tar.gz: 7fe3132f97b38b9cdf422856cebb172dcbe2a5b26c65c98abfb767d5de6ff046
3
+ metadata.gz: 6e73ba1728ec6f9dbe31b47e258eecae23f768436d334563f31c6396c408296d
4
+ data.tar.gz: e32570a81a62e2a8eca025438d0f814352e4f0327782ae0495ae5edc1223481d
5
5
  SHA512:
6
- metadata.gz: b5c2273bc22a68ae3e15b5a2eb57dde5a510529b1992b10c706dd9a732d20b45e99cff04ceef3bb5c3b29b8b4019ed5d1ee21d430450e15da921f4bb7295f4a8
7
- data.tar.gz: 85a81702f09a06e978a38a79853f5f621b283e82d9903f30d523f2f51fc5bd5cceef4a24a7da38f7771bcf20f74a35e75093757cf51ab594492d63bfac77817d
6
+ metadata.gz: f3057def5171a85e2d5ce6a4fa77cfe6c036afd0ee71005e07aeead532c6cb4197480981bbb4e6ca67e2c3d10046bd456761bb2a10b1370057a6e10391411c0c
7
+ data.tar.gz: 6099733c5bedbd6638265e489c10ff037f11983774711107cb5a49174b302106524423833a7bed628a83775ac0b1c195fed5aa2d6aecffa24dde6fdaa7f57eb7
data/lib/conf.rb CHANGED
@@ -8,8 +8,8 @@ module UR
8
8
  @types = {}
9
9
  doc = XML::Smart.open(filename)
10
10
  doc.find('/rtde_config/recipe/@key').each do |key|
11
- @names[key.value] = doc.find("//field/@name").map {|x| x.to_s }
12
- @types[key.value] = doc.find("//field/@type").map {|x| x.to_s }
11
+ @names[key.value] = doc.find("/rtde_config/recipe[@key='#{key}']/field/@name").map {|x| x.to_s }
12
+ @types[key.value] = doc.find("/rtde_config/recipe[@key='#{key}']/field/@type").map {|x| x.to_s }
13
13
  end
14
14
  end
15
15
 
data/lib/serialize.rb CHANGED
@@ -1,185 +1,187 @@
1
- #!/usr/bin/env ruby
2
-
3
- module UR
4
- module Serialize
5
- module ControlHeader
6
- Data = Struct.new(:size, :command)
7
- def self.unpack str
8
- Data.new *str.unpack('S>C')
9
- end
10
- end
11
-
12
- module ControlVersion
13
- Data = Struct.new(:major, :minor, :bugfix, :build)
14
- def self.unpack(str)
15
- Data.new *str.unpack('I>I>I>I>')
16
- end
17
- end
18
-
19
- module ReturnValue
20
- Data = Struct.new :success
21
- def self.unpack(str)
22
- Data.new *str.unpack('C')
23
- end
24
- end
25
-
26
- module Message
27
- Data = Struct.new :level, :message, :source
28
- EXCEPTION_MESSAGE = 0
29
- ERROR_MESSAGE = 1
30
- WARNING_MESSAGE = 2
31
- INFO_MESSAGE = 3
32
-
33
- def self.unpack
34
- msg_length = buf.unpack('C')
35
- msg = buf.unpack('x' + C * msg_length).pack('C*')
36
- src_length = buf.unpack('x' + 'x' * msg_length + 'C')
37
- src = buf.unpack('x' + 'x' * msg_length + 'x' + 'C' * src_length).pack('C*')
38
- lvl = buf.unpack('x' + 'x' * msg_length + 'x' + 'x' * src_length + 'C')
39
- Data.new(level,lvl,msg,src)
40
- end
41
- end
42
-
43
- def self.get_item_size(data_type)
44
- if data_type.start_with? 'VECTOR6'
45
- 6
46
- elsif data_type.start_with? 'VECTOR3'
47
- 3
48
- else
49
- 1
50
- end
51
- end
52
-
53
- def self.unpack_field(data, offset, data_type)
54
- size = self.get_item_size(data_type)
55
- if data_type == 'VECTOR6D' or data_type == 'VECTOR3D'
56
- data[offset...offset+size].map(&:to_f)
57
- elsif data_type == 'VECTOR6UINT32'
58
- data[offset...offset+size].map(&:to_i)
59
- elsif data_type == 'DOUBLE'
60
- data[offset].to_f
61
- elsif data_type == 'UINT32' or data_type == 'UINT64'
62
- data[offset].to_i
63
- elsif data_type == 'VECTOR6INT32'
64
- data[offset...offset+size].map(&:to_i)
65
- elsif data_type == 'INT32' or data_type == 'UINT8'
66
- data[offset].to_i
67
- else
68
- raise TypeError.new('unpack_field: unknown data type: ' + data_type)
69
- end
70
- end
71
- def [](item)
72
- @values[item]
73
- end
74
-
75
- class DataObject
76
- attr_reader :values
77
- attr_accessor :recipe_id
78
-
79
- def initialize
80
- @values = {}
81
- @recipe_id = nil
82
- end
83
-
84
- def [](item)
85
- @values[item]
86
- end
87
- def []=(item,value)
88
- @values[item] = value
89
- end
90
-
91
- def self.unpack(data, names, types)
92
- if names.length != types.length
93
- raise RuntimeError.new('List sizes are not identical.')
94
- end
95
- obj = DataObject.new
96
- offset = 0
97
- obj.recipe_id = data[0]
98
-
99
- #puts "Datat:" + data.to_s
100
-
101
- names.each_with_index do |name,i|
102
- #obj.values[i] = data[1..-1].unpack('x' * offset + types[i])
103
- #puts unpack_field(data[1..-1], offset, types[i])
104
-
105
- obj.values[name] = Serialize.unpack_field(data[1..-1], offset, types[i])
106
- #puts "obj"
107
- #puts obj.values[i]
108
- offset += Serialize::get_item_size(types[i])
109
- end
110
- #puts "obj:" + obj.values.to_s
111
- obj
112
- end
113
-
114
- def self.create_empty(names, recipe_id)
115
- obj = DataObject.new
116
- names.each do |i|
117
- obj.values[i] = nil
118
- end
119
- obj.recipe_id = recipe_id
120
- obj
121
- end
122
-
123
- def pack(names, types)
124
- if names.length != types.length
125
- raise RuntimeError.new('List sizes are not identical.')
126
- end
127
- l = []
128
- l.append @recipe_id unless @recipe_id
129
- names.each do |i|
130
- raise RuntimeEror.new('Uninitialized parameter: ' + i) unless @values[i]
131
- l.push *@values[i]
132
- end
133
- l
134
- end
135
- end
136
-
137
- class DataConfig < Struct.new(:id, :names, :types, :fmt)
138
- def self.unpack_recipe(buf)
139
- rmd = DataConfig.new
140
- rmd.id = buf.unpack('C')[0]
141
- rmd.types = buf[1..-1].split(',')
142
- rmd.fmt = 'C'
143
- #puts "DataConfig: " +rmd.to_s
144
- rmd.types.each do |i|
145
- if i == 'INT32'
146
- rmd.fmt += 'i>'
147
- elsif i == 'UINT32'
148
- rmd.fmt += 'I>'
149
- elsif i == 'VECTOR6D'
150
- rmd.fmt += 'G'*6
151
- elsif i == 'VECTOR3D'
152
- rmd.fmt += 'G'*3
153
- elsif i == 'VECTOR6INT32'
154
- rmd.fmt += 'i>'*6
155
- elsif i == 'VECTOR6UINT32'
156
- rmd.fmt += 'I>'*6
157
- elsif i == 'DOUBLE'
158
- rmd.fmt += 'G'
159
- elsif i == 'UINT64'
160
- rmd.fmt += 'Q>'
161
- elsif i == 'UINT8'
162
- rmd.fmt += 'C'
163
- elsif i == 'IN_USE'
164
- raise TypeError 'An input parameter is already in use.'
165
- else
166
- raise TypeError 'Unknown data type: ' + i
167
- end
168
- end
169
- @fmt = rmd.fmt
170
- rmd
171
- end
172
-
173
- def pack(state)
174
- l = state.pack(self.names, self.types)
175
- l.pack(self.fmt)
176
- end
177
-
178
- def unpack(data)
179
- li = data.unpack(self.fmt)
180
- DataObject.unpack(li, self.names, self.types)
181
- end
182
- end
183
-
184
- end
185
- end
1
+ #!/usr/bin/env ruby
2
+
3
+ module UR
4
+ module Serialize
5
+ module ControlHeader
6
+ Data = Struct.new(:size, :command)
7
+ def self.unpack str
8
+ Data.new *str.unpack('S>C')
9
+ end
10
+ end
11
+
12
+ module ControlVersion
13
+ Data = Struct.new(:major, :minor, :bugfix, :build)
14
+ def self.unpack(str)
15
+ Data.new *str.unpack('I>I>I>I>')
16
+ end
17
+ end
18
+
19
+ module ReturnValue
20
+ Data = Struct.new :success
21
+ def self.unpack(str)
22
+ Data.new *str.unpack('C')
23
+ end
24
+ end
25
+
26
+ module Message
27
+ Data = Struct.new :level, :message, :source
28
+ EXCEPTION_MESSAGE = 0
29
+ ERROR_MESSAGE = 1
30
+ WARNING_MESSAGE = 2
31
+ INFO_MESSAGE = 3
32
+
33
+ def self.unpack
34
+ msg_length = buf.unpack('C')
35
+ msg = buf.unpack('x' + C * msg_length).pack('C*')
36
+ src_length = buf.unpack('x' + 'x' * msg_length + 'C')
37
+ src = buf.unpack('x' + 'x' * msg_length + 'x' + 'C' * src_length).pack('C*')
38
+ lvl = buf.unpack('x' + 'x' * msg_length + 'x' + 'x' * src_length + 'C')
39
+ Data.new(level,lvl,msg,src)
40
+ end
41
+ end
42
+
43
+ def self.get_item_size(data_type)
44
+ if data_type.start_with? 'VECTOR6'
45
+ 6
46
+ elsif data_type.start_with? 'VECTOR3'
47
+ 3
48
+ else
49
+ 1
50
+ end
51
+ end
52
+
53
+ def self.unpack_field(data, offset, data_type)
54
+ size = self.get_item_size(data_type)
55
+ if data_type == 'VECTOR6D' or data_type == 'VECTOR3D'
56
+ data[offset...offset+size].map(&:to_f)
57
+ elsif data_type == 'VECTOR6UINT32'
58
+ data[offset...offset+size].map(&:to_i)
59
+ elsif data_type == 'DOUBLE'
60
+ data[offset].to_f
61
+ elsif data_type == 'UINT32' or data_type == 'UINT64'
62
+ data[offset].to_i
63
+ elsif data_type == 'VECTOR6INT32'
64
+ data[offset...offset+size].map(&:to_i)
65
+ elsif data_type == 'INT32' or data_type == 'UINT8'
66
+ data[offset].to_i
67
+ else
68
+ raise TypeError.new('unpack_field: unknown data type: ' + data_type)
69
+ end
70
+ end
71
+ def [](item)
72
+ @values[item]
73
+ end
74
+
75
+ class DataObject
76
+ attr_reader :values
77
+ attr_accessor :recipe_id
78
+
79
+ def initialize
80
+ @values = {}
81
+ @recipe_id = nil
82
+ end
83
+
84
+ def [](item)
85
+ @values[item]
86
+ end
87
+ def []=(item,value)
88
+ @values[item] = value
89
+ end
90
+
91
+ def self.unpack(data, names, types)
92
+ if names.length != types.length
93
+ raise RuntimeError.new('List sizes are not identical.')
94
+ end
95
+ obj = DataObject.new
96
+ offset = 0
97
+ obj.recipe_id = data[0]
98
+
99
+ #puts "Datat:" + data.to_s
100
+
101
+ names.each_with_index do |name,i|
102
+ #obj.values[i] = data[1..-1].unpack('x' * offset + types[i])
103
+ #puts unpack_field(data[1..-1], offset, types[i])
104
+
105
+ obj.values[name] = Serialize.unpack_field(data[1..-1], offset, types[i])
106
+ #puts "obj"
107
+ #puts obj.values[i]
108
+ offset += Serialize::get_item_size(types[i])
109
+ end
110
+ #puts "obj:" + obj.values.to_s
111
+ obj
112
+ end
113
+
114
+ def self.create_empty(names, recipe_id)
115
+ obj = DataObject.new
116
+ names.each do |i|
117
+ obj.values[i] = nil
118
+ end
119
+ obj.recipe_id = recipe_id
120
+ obj
121
+ end
122
+
123
+ def pack(names, types)
124
+ if names.length != types.length
125
+ raise RuntimeError.new('List sizes are not identical.')
126
+ end
127
+ l = []
128
+ l.append @recipe_id if @recipe_id
129
+ names.each do |i|
130
+ raise RuntimeError.new('Uninitialized parameter: ' + i) unless @values[i]
131
+ l.push *@values[i]
132
+ end
133
+ l
134
+ end
135
+ end
136
+
137
+ class DataConfig < Struct.new(:id, :names, :types, :fmt)
138
+ def self.unpack_recipe(buf)
139
+ rmd = DataConfig.new
140
+ rmd.id = buf.unpack('C')[0]
141
+ rmd.types = buf[1..-1].split(',')
142
+ rmd.fmt = 'C'
143
+ p rmd.types
144
+ rmd.types.each do |i|
145
+ if i == 'INT32'
146
+ rmd.fmt += 'i>'
147
+ elsif i == 'UINT32'
148
+ rmd.fmt += 'I>'
149
+ elsif i == 'VECTOR6D'
150
+ rmd.fmt += 'G'*6
151
+ elsif i == 'VECTOR3D'
152
+ rmd.fmt += 'G'*3
153
+ elsif i == 'VECTOR6INT32'
154
+ rmd.fmt += 'i>'*6
155
+ elsif i == 'VECTOR6UINT32'
156
+ rmd.fmt += 'I>'*6
157
+ elsif i == 'DOUBLE'
158
+ rmd.fmt += 'G'
159
+ elsif i == 'UINT64'
160
+ rmd.fmt += 'Q>'
161
+ elsif i == 'UINT8'
162
+ rmd.fmt += 'C'
163
+ elsif i == 'IN_USE'
164
+ raise TypeError 'An input parameter is already in use.'
165
+ else
166
+ raise TypeError 'Unknown data type: ' + i
167
+ end
168
+ end
169
+ rmd
170
+ end
171
+
172
+ def pack(state)
173
+ p state.class
174
+ l = state.pack(self.names, self.types)
175
+ p l
176
+ p self.fmt
177
+ l.pack(self.fmt)
178
+ end
179
+
180
+ def unpack(data)
181
+ li = data.unpack(self.fmt)
182
+ DataObject.unpack(li, self.names, self.types)
183
+ end
184
+ end
185
+
186
+ end
187
+ end
data/lib/transfer.rb ADDED
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ require 'socket' # Sockets are in standard library
3
+ require 'logger'
4
+ require 'uri'
5
+
6
+ module UR
7
+
8
+ class Transfer
9
+ module ConnectionState
10
+ DISCONNECTED = 0
11
+ CONNECTED = 1
12
+ STARTED = 2
13
+ PAUSED = 3
14
+ end
15
+
16
+ def initialize(host, logger=Logger.new(STDOUT,level: :INFO))
17
+ host = '//' + host if host !~ /\/\//
18
+ uri = URI::parse(host)
19
+ @logger = logger
20
+ @hostname = uri.host
21
+ @port = uri.port.nil? ? 30003 : uri.port
22
+ @conn_state = ConnectionState::DISCONNECTED
23
+ @sock = nil
24
+ end
25
+
26
+ def connect
27
+ return if @sock
28
+ @sock = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
29
+ @sock.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1
30
+ @sock = TCPSocket.new(@hostname, @port)
31
+ @conn_state = ConnectionState::CONNECTED
32
+ self
33
+ end
34
+
35
+ def connected?
36
+ @conn_state != ConnectionState::DISCONNECTED
37
+ end
38
+
39
+ def disconnect
40
+ if @sock
41
+ @sock.close
42
+ @sock = nil
43
+ @conn_state = ConnectionState::DISCONNECTED
44
+ @logger.info "Connection closed " + @hostname + ":" + @port.to_s
45
+ end
46
+ end
47
+
48
+ def transfer(filename)
49
+ File.open(filename) do |file|
50
+ while not file.eof?
51
+ @sock.write(file.read(1024))
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end
data/lib/ur-sock.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  require_relative 'conf'
2
2
  require_relative 'rtde'
3
+ require_relative 'transfer'
data/ur-sock.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "ur-sock"
3
- s.version = "0.1"
3
+ s.version = "0.2"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3.0"
6
6
  s.summary = "Preliminary release of Universal Robot (UR) Socket Communication."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ur-sock
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Pauker
@@ -44,6 +44,7 @@ files:
44
44
  - lib/conf.rb
45
45
  - lib/rtde.rb
46
46
  - lib/serialize.rb
47
+ - lib/transfer.rb
47
48
  - lib/ur-sock.rb
48
49
  - ur-sock.gemspec
49
50
  homepage: https://github.com/fpauker/ur-sock