ur-sock 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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