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 +4 -4
- data/lib/conf.rb +2 -2
- data/lib/serialize.rb +187 -185
- data/lib/transfer.rb +58 -0
- data/lib/ur-sock.rb +1 -0
- data/ur-sock.gemspec +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e73ba1728ec6f9dbe31b47e258eecae23f768436d334563f31c6396c408296d
|
4
|
+
data.tar.gz: e32570a81a62e2a8eca025438d0f814352e4f0327782ae0495ae5edc1223481d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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("
|
12
|
-
@types[key.value] = doc.find("
|
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
|
129
|
-
names.each do |i|
|
130
|
-
raise
|
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
|
-
|
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
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
l = state.pack(self.names, self.types)
|
175
|
-
l
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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
data/ur-sock.gemspec
CHANGED
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.
|
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
|