ur-sock 0.3.2 → 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/README.md +6 -1
- data/lib/dashboard.rb +142 -46
- data/lib/psi.rb +12 -3
- data/lib/rtde.rb +68 -23
- data/lib/serialize.rb +6 -3
- data/ur-sock.gemspec +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a78431f336bb9dec101ac249d78b1ff36e0d40846b8beeec19a837e1a9e2fdee
|
4
|
+
data.tar.gz: 727b583ef420264d83698d0632f51853d684cd28d2bca074ab431b50990304e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98cae8207b8fcdbe4db0e99716a9b634a576bcb0384b9968e5729d49445d7ab356006f73b2818f70a04263908097f8f25728d49d3a9bbc0e492efd267dc9c6c6
|
7
|
+
data.tar.gz: 07d59722f52e3215ac3076837dd6bb85543e90dbc1be743b94dbb039516aed6dc6994bd57f4e6807bbccc33977ad4e1cf8965096e55cc4792d2d5f3d7c47765d
|
data/README.md
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
Universal robot interface implementation in ruby. This library provides functions using different interfaces of the universal robot. Primary this was designed for the new e-series.
|
4
4
|
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
This software requires URControl version newer than 5.1.
|
8
|
+
Latest supported URControl vresion: 5.5
|
9
|
+
|
5
10
|
## Getting Started
|
6
11
|
|
7
12
|
This library uses 3 interfaces of the universal robot:
|
@@ -79,7 +84,7 @@ Please read [CONTRIBUTING.md](https://gist.github.com/PurpleBooth/b24679402957c6
|
|
79
84
|
* **Florian Pauker**
|
80
85
|
* **Jürgen Mangler**
|
81
86
|
|
82
|
-
See also the list of [contributors](https://
|
87
|
+
See also the list of [contributors](https://github.com/fpauker/ua4ur/contributors) who participated in this project.
|
83
88
|
|
84
89
|
## License
|
85
90
|
|
data/lib/dashboard.rb
CHANGED
@@ -6,6 +6,8 @@ require 'uri'
|
|
6
6
|
module UR
|
7
7
|
|
8
8
|
class Dash
|
9
|
+
class Reconnect < Exception; end
|
10
|
+
|
9
11
|
module ConnectionState
|
10
12
|
DISCONNECTED = 'DISCONNECTED'
|
11
13
|
CONNECTED = 'CONNECTED'
|
@@ -77,17 +79,16 @@ module UR
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def load_program (programname)
|
80
|
-
@logger.
|
82
|
+
@logger.debug "loadprogram"
|
81
83
|
send = "load " + programname + ".urp\n"
|
82
|
-
|
83
|
-
@sock.write (send)
|
84
|
+
@sock.write send
|
84
85
|
line = @sock.gets.strip
|
85
|
-
if line.match(
|
86
|
-
@logger.
|
86
|
+
if line.match(/^L/)
|
87
|
+
@logger.debug line
|
87
88
|
true
|
88
89
|
else
|
89
90
|
@logger.error line
|
90
|
-
|
91
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -95,11 +96,11 @@ module UR
|
|
95
96
|
@sock.write("play\n")
|
96
97
|
line = @sock.gets.strip
|
97
98
|
if line == "Starting program"
|
98
|
-
@logger.
|
99
|
+
@logger.debug line
|
99
100
|
true
|
100
101
|
else
|
101
102
|
@logger.error line
|
102
|
-
|
103
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
@@ -107,118 +108,140 @@ module UR
|
|
107
108
|
@sock.write("stop\n")
|
108
109
|
line = @sock.gets.strip
|
109
110
|
if line == "Stopped"
|
110
|
-
@logger.
|
111
|
+
@logger.debug line
|
111
112
|
true
|
112
113
|
else
|
113
114
|
@logger.error line
|
114
|
-
|
115
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
115
116
|
end
|
116
117
|
end
|
117
118
|
|
118
119
|
def pause_program
|
119
120
|
@sock.write("pause\n")
|
121
|
+
line = @sock.gets.strip
|
120
122
|
if line == "Pausing program"
|
121
|
-
@logger.
|
123
|
+
@logger.debug line
|
122
124
|
true
|
123
125
|
else
|
124
126
|
@logger.error line
|
125
|
-
|
127
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
126
128
|
end
|
127
129
|
end
|
128
130
|
|
129
131
|
def shutdown
|
130
132
|
@sock.write("shutdown\n")
|
133
|
+
line = @sock.gets.strip
|
131
134
|
if line == "Shutting down"
|
132
|
-
@logger.
|
135
|
+
@logger.debug line
|
133
136
|
true
|
134
137
|
else
|
135
138
|
@logger.error line
|
136
|
-
|
139
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
137
140
|
end
|
138
141
|
end
|
139
142
|
|
140
143
|
def running?
|
141
144
|
@sock.write("running\n")
|
145
|
+
line = @sock.gets.strip
|
142
146
|
if line == "Program running: True"
|
143
|
-
@logger.
|
147
|
+
@logger.debug line
|
144
148
|
true
|
145
149
|
else
|
146
150
|
@logger.error line
|
147
|
-
|
151
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
148
152
|
end
|
149
153
|
end
|
150
154
|
|
151
155
|
def get_robotmode
|
152
156
|
@sock.write("robotmode\n")
|
153
157
|
line = @sock.gets.strip
|
154
|
-
@logger.
|
158
|
+
@logger.debug line
|
155
159
|
result = $1.strip if line.match(/^Robotmode:\s(.+)/)
|
156
160
|
end
|
157
161
|
|
158
162
|
def get_loaded_program
|
159
|
-
|
160
|
-
|
163
|
+
begin
|
164
|
+
@sock.write ("get loaded program\n")
|
165
|
+
line = @sock.gets.strip
|
166
|
+
rescue
|
167
|
+
raise UR::Dash::Reconnect.new('Loaded program can not be got. Dashboard server down or not in Remote Mode')
|
168
|
+
end
|
169
|
+
@logger.debug line
|
161
170
|
if line.match(/^Loaded program:\s(.+)/)
|
162
|
-
|
163
|
-
|
164
|
-
else
|
165
|
-
@logger.error line
|
171
|
+
$1.strip
|
172
|
+
elsif line.match(/^No program loaded/)
|
166
173
|
nil
|
174
|
+
else
|
175
|
+
raise UR::Dash::Reconnect.new('Loaded program can not be got. Dashboard server down or not in Remote Mode')
|
167
176
|
end
|
168
177
|
end
|
169
178
|
|
170
179
|
def open_popupmessage(message)
|
171
180
|
@sock.write ("popup " + message.to_s + "\n")
|
172
|
-
@logger.
|
181
|
+
@logger.debug @sock.gets.strip
|
173
182
|
end
|
174
183
|
|
175
184
|
def close_popupmessage
|
176
185
|
@sock.write ("close popup\n")
|
177
|
-
@logger.
|
186
|
+
@logger.debug @sock.gets.strip
|
178
187
|
end
|
179
188
|
|
180
189
|
def add_to_log(message)
|
181
190
|
@sock.write ("addToLog " + message.to_s + "\n")
|
182
191
|
line = @sock.gets.strip
|
183
192
|
if line.match(/^Added log message/)
|
184
|
-
@logger.
|
193
|
+
@logger.debug line
|
185
194
|
else
|
186
195
|
@logger.error line
|
196
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
187
197
|
end
|
188
198
|
end
|
189
199
|
|
190
200
|
def is_program_saved?
|
191
201
|
@sock.write("isProgramSaved\n")
|
202
|
+
line = @sock.gets.strip
|
192
203
|
if line == "True"
|
193
|
-
@logger.
|
204
|
+
@logger.debug line
|
194
205
|
true
|
195
206
|
else
|
196
207
|
@logger.error line
|
197
|
-
|
208
|
+
raise UR::Dash::Reconnect.new('Cant determine if program is saved. Dashboard server down or not in Remote Mode')
|
198
209
|
end
|
199
210
|
end
|
200
211
|
|
201
212
|
def get_program_state
|
202
213
|
@sock.write("programState\n")
|
203
214
|
line = @sock.gets.strip
|
204
|
-
@logger.
|
215
|
+
@logger.debug line
|
205
216
|
line
|
206
217
|
end
|
207
218
|
|
208
219
|
def get_polyscope_version
|
209
220
|
@sock.write("PolyscopeVersion\n")
|
210
221
|
line = @sock.gets.strip
|
211
|
-
@logger.
|
222
|
+
@logger.debug line
|
212
223
|
line
|
213
224
|
end
|
214
225
|
|
226
|
+
def set_operation_mode_manual
|
227
|
+
@sock.write("set operational mode manual\n")
|
228
|
+
line = @sock.gets.strip
|
229
|
+
if line.match(/^S/)
|
230
|
+
@logger.debug line
|
231
|
+
else
|
232
|
+
@logger.error line
|
233
|
+
raise UR::Dash::Reconnect.new('Cant set operation mode manual. Dashboard server down or not in Remote Mode')
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
215
237
|
def set_operation_mode_auto
|
216
238
|
@sock.write("set operational mode automatic\n")
|
217
239
|
line = @sock.gets.strip
|
218
240
|
if line.match(/^S/)
|
219
|
-
@logger.
|
241
|
+
@logger.debug line
|
220
242
|
else
|
221
243
|
@logger.error line
|
244
|
+
raise UR::Dash::Reconnect.new('Cant set operation mode automatic. Dashboard server down or not in Remote Mode')
|
222
245
|
end
|
223
246
|
end
|
224
247
|
|
@@ -226,96 +249,169 @@ module UR
|
|
226
249
|
@sock.write("clear operational mode\n")
|
227
250
|
line = @sock.gets.strip
|
228
251
|
if line.match(/^operational/)
|
229
|
-
@logger.
|
252
|
+
@logger.debug line
|
230
253
|
true
|
231
254
|
else
|
232
255
|
@logger.error line
|
256
|
+
raise UR::Dash::Reconnect.new('Cant clear operation mode. Dashboard server down or not in Remote Mode')
|
233
257
|
end
|
234
258
|
end
|
235
259
|
|
236
260
|
def power_on
|
237
261
|
@sock.write("power on\n")
|
262
|
+
line = @sock.gets.strip
|
238
263
|
if line.match(/^Powering/)
|
239
|
-
@logger.
|
264
|
+
@logger.debug line
|
240
265
|
true
|
241
266
|
else
|
242
267
|
@logger.error line
|
243
|
-
|
268
|
+
raise UR::Dash::Reconnect.new('Cant power on. Dashboard server down or not in Remote Mode')
|
244
269
|
end
|
245
270
|
end
|
246
271
|
|
247
272
|
def power_off
|
248
273
|
@sock.write("power off\n")
|
274
|
+
line = @sock.gets.strip
|
249
275
|
if line.match(/^Powering/)
|
250
|
-
@logger.
|
276
|
+
@logger.debug line
|
251
277
|
true
|
252
278
|
else
|
253
279
|
@logger.error line
|
254
|
-
|
280
|
+
raise UR::Dash::Reconnect.new('Cant power off. Dashboard server down or not in Remote Mode')
|
255
281
|
end
|
256
282
|
end
|
257
283
|
|
258
284
|
def break_release
|
259
285
|
@sock.write("brake release\n")
|
286
|
+
line = @sock.gets.strip
|
260
287
|
if line.match(/^Brake/)
|
261
|
-
@logger.
|
288
|
+
@logger.debug line
|
262
289
|
true
|
263
290
|
else
|
264
291
|
@logger.error line
|
265
|
-
|
292
|
+
raise UR::Dash::Reconnect.new('Cant release breaks. Dashboard server down or not in Remote Mode')
|
266
293
|
end
|
267
294
|
end
|
268
295
|
|
269
296
|
def get_safety_mode
|
270
297
|
@sock.write("safetymode\n")
|
271
298
|
line = @sock.gets.strip
|
272
|
-
@logger.
|
299
|
+
@logger.debug line
|
273
300
|
result = $1.strip if line.match(/^Safetymode:\s(.+)/)
|
274
301
|
end
|
275
302
|
|
276
303
|
def unlock_protective_stop
|
277
304
|
@sock.write("unlock protective stop\n")
|
305
|
+
line = @sock.gets.strip
|
278
306
|
if line.match(/^Protective/)
|
279
|
-
@logger.
|
307
|
+
@logger.debug line
|
280
308
|
true
|
281
309
|
else
|
282
310
|
@logger.error line
|
283
|
-
|
311
|
+
raise UR::Dash::Reconnect.new('Cant unlock protective stop. Dashboard server down or not in Remote Mode')
|
284
312
|
end
|
285
313
|
end
|
286
314
|
|
287
315
|
def close_safety_popup
|
288
316
|
@sock.write("close safety popup\n")
|
317
|
+
line = @sock.gets.strip
|
289
318
|
if line.match(/^closing/)
|
290
|
-
@logger.
|
319
|
+
@logger.debug line
|
291
320
|
true
|
292
321
|
else
|
293
322
|
@logger.error line
|
294
|
-
|
323
|
+
raise UR::Dash::Reconnect.new('Cant close safety popup. Dashboard server down or not in Remote Mode')
|
295
324
|
end
|
296
325
|
end
|
297
326
|
|
298
327
|
def load_installation
|
299
328
|
@sock.write("load installation\n")
|
329
|
+
line = @sock.gets.strip
|
300
330
|
if line.match(/^Loading/)
|
301
|
-
@logger.
|
331
|
+
@logger.debug line
|
302
332
|
true
|
303
333
|
else
|
304
334
|
@logger.error line
|
305
|
-
|
335
|
+
raise UR::Dash::Reconnect.new('Cant load installation. Dashboard server down or not in Remote Mode')
|
306
336
|
end
|
307
337
|
end
|
308
338
|
|
309
339
|
def restart_safety
|
310
340
|
@sock.write("restart safety\n")
|
341
|
+
line = @sock.gets.strip
|
311
342
|
if line.match(/^Brake/)
|
312
|
-
@logger.
|
343
|
+
@logger.debug line
|
313
344
|
true
|
345
|
+
elsif line.match(/^could not understand/)
|
346
|
+
@logger.warn'Could not execute restart_safety: Please upgrade to current version'
|
347
|
+
nil
|
314
348
|
else
|
315
349
|
@logger.error line
|
350
|
+
raise UR::Dash::Reconnect.new('Cant restart safety. Dashboard server down or not in Remote Mode')
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
def get_operational_mode
|
355
|
+
@sock.write("get operational mode\n")
|
356
|
+
line = @sock.gets.strip
|
357
|
+
if line == "MANUAL" || line == "AUTOMATIC"
|
358
|
+
@logger.debug line
|
359
|
+
line
|
360
|
+
elsif line == "NONE"
|
361
|
+
@logger.warn'No password set, so no modes variable is available'
|
362
|
+
nil
|
363
|
+
elsif line.match(/^could not understand/)
|
364
|
+
@logger.warn'Could not execute get_operational_mode: Please upgrade to current version'
|
316
365
|
nil
|
366
|
+
else
|
367
|
+
@logger.error line
|
368
|
+
raise UR::Dash::Reconnect.new('Cant get operational mode. Dashboard server down or not in Remote Mode')
|
317
369
|
end
|
318
370
|
end
|
319
371
|
|
372
|
+
def is_in_remote_control
|
373
|
+
@sock.write("is in remote control\n")
|
374
|
+
line = @sock.gets.strip
|
375
|
+
if line.match(/^could not understand/)
|
376
|
+
@logger.warn'Could not execute is_in_remote_control: Please upgrade to current version'
|
377
|
+
nil
|
378
|
+
elsif line == 'true' || line == 'false'
|
379
|
+
@logger.debug line
|
380
|
+
line
|
381
|
+
else
|
382
|
+
@logger.error line
|
383
|
+
raise UR::Dash::Reconnect.new('Cant determine if robot is in remote control mode. Dashboard server down maybe down')
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
def get_serial_number
|
388
|
+
@sock.write("get serial number\n")
|
389
|
+
line = @sock.gets.strip
|
390
|
+
if line.match(/^could not understand/)
|
391
|
+
@logger.warn'Could not execute get_serial_number: Please upgrade to current version'
|
392
|
+
nil
|
393
|
+
elsif line.match(/^\d+$/)
|
394
|
+
@logger.debug line
|
395
|
+
line
|
396
|
+
else
|
397
|
+
@logger.error line
|
398
|
+
raise UR::Dash::Reconnect.new('Cant get serial number. Dashboard server down maybe down or not in Remote Mode')
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
def get_robot_model
|
403
|
+
@sock.write("get robot model\n")
|
404
|
+
line = @sock.gets.strip
|
405
|
+
if line.match(/^could not understand/)
|
406
|
+
@logger.warn'Could not execute get_robot_model: Please upgrade to current version'
|
407
|
+
nil
|
408
|
+
elsif line.match(/^UR/)
|
409
|
+
@logger.debug line
|
410
|
+
line
|
411
|
+
else
|
412
|
+
@logger.error line
|
413
|
+
raise UR::Dash::Reconnect.new('Cant get robot model. Dashboard server down maybe down or not in Remote Mode')
|
414
|
+
end
|
415
|
+
end
|
320
416
|
end
|
321
417
|
end
|
data/lib/psi.rb
CHANGED
@@ -41,18 +41,27 @@ module UR
|
|
41
41
|
@sock.close
|
42
42
|
@sock = nil
|
43
43
|
@conn_state = ConnectionState::DISCONNECTED
|
44
|
-
@logger.info
|
44
|
+
@logger.info 'Connection closed ' + @hostname + ':' + @port.to_s
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
48
|
+
def execute_ur_script_file(filename)
|
49
|
+
@logger.info 'Executing UR Script File: ' + filename
|
49
50
|
File.open(filename) do |file|
|
50
51
|
while not file.eof?
|
51
|
-
@sock.write(file.
|
52
|
+
@sock.write(file.readline)
|
53
|
+
line = @sock.gets.strip
|
54
|
+
@logger.debug line
|
52
55
|
end
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
59
|
+
def execute_ur_script(str)
|
60
|
+
@logger.info 'Executing UR Script ...'
|
61
|
+
@sock.write(str)
|
62
|
+
line = @sock.gets.strip
|
63
|
+
@logger.debug line
|
64
|
+
end
|
56
65
|
end
|
57
66
|
|
58
67
|
end
|
data/lib/rtde.rb
CHANGED
@@ -7,17 +7,66 @@ module UR
|
|
7
7
|
|
8
8
|
class Rtde
|
9
9
|
PROTOCOL_VERSION = 2
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
10
|
+
ROBOTMODE = {
|
11
|
+
-1 => 'No Controller',
|
12
|
+
0 => 'Disconnected',
|
13
|
+
1 => 'Confirm Safety',
|
14
|
+
2 => 'Booting',
|
15
|
+
3 => 'Power Off',
|
16
|
+
4 => 'Power On',
|
17
|
+
5 => 'Idle',
|
18
|
+
6 => 'Backdrive',
|
19
|
+
7 => 'Running',
|
20
|
+
8 => 'Updating Firmware'
|
21
|
+
}
|
22
|
+
PROGRAMSTATE = {
|
23
|
+
1 => 'Stopped',
|
24
|
+
2 => 'Playing',
|
25
|
+
4 => 'Paused'
|
26
|
+
}
|
27
|
+
JOINTMODE = {
|
28
|
+
235 => 'JOINT_MODE_RESET',
|
29
|
+
236 => 'JOINT_MODE_SHUTTING_DOWN',
|
30
|
+
237 => 'JOINT_PART_D_CALIBRATION_MODE (INTERNAL USE ONLY)',
|
31
|
+
238 => 'JOINT_MODE_BACKDRIVE',
|
32
|
+
239 => 'JOINT_MODE_POWER_OFF',
|
33
|
+
240 => 'JOINT_MODE_READY_FOR_POWER_OFF (FROM VERSION 5.1)',
|
34
|
+
245 => 'JOINT_MODE_NOT_RESPONDING',
|
35
|
+
246 => 'JOINT_MODE_MOTOR_INITIALISATION',
|
36
|
+
247 => 'JOINT_MODE_BOOTING',
|
37
|
+
248 => 'JOINT_PART_D_CALIBRATION_ERROR_MODE (INTERNAL USE ONLY)',
|
38
|
+
249 => 'JOINT_MODE_BOOTLOADER',
|
39
|
+
250 => 'JOINT_CALIBRATION_MODE (INTERNAL USE ONLY)',
|
40
|
+
251 => 'JOINT_MODE_VIOLATION',
|
41
|
+
252 => 'JOINT_MODE_FAULT',
|
42
|
+
253 => 'JOINT_MODE_RUNNING',
|
43
|
+
255 => 'JOINT_MODE_IDLE'
|
44
|
+
}
|
45
|
+
SAFETYMODE = {
|
46
|
+
11 => 'SAFETY_MODE_UNDEFINED_SAFETY_MODE',
|
47
|
+
10 => 'SAFETY_MODE_VALIDATE_JOINT_ID',
|
48
|
+
9 => 'SAFETY_MODE_FAULT',
|
49
|
+
8 => 'SAFETY_MODE_VIOLATION',
|
50
|
+
7 => 'SAFETY_MODE_ROBOT_EMERGENCY_STOP',
|
51
|
+
6 => 'SAFETY_MODE_SYSTEM_EMERGENCY_STOP',
|
52
|
+
5 => 'SAFETY_MODE_SAFEGUARD_STOP',
|
53
|
+
4 => 'SAFETY_MODE_RECOVERY',
|
54
|
+
3 => 'SAFETY_MODE_PROTECTIVE_STOP',
|
55
|
+
2 => 'SAFETY_MODE_REDUCED',
|
56
|
+
1 => 'SAFETY_MODE_NORMAL'
|
57
|
+
}
|
58
|
+
|
59
|
+
TOOLMODE = {
|
60
|
+
235 => 'JOINT_MODE_RESET',
|
61
|
+
236 => 'JOINT_MODE_SHUTTING_DOWN',
|
62
|
+
239 => 'JOINT_MODE_POWER_OFF',
|
63
|
+
245 => 'JOINT_MODE_NOT_RESPONDING',
|
64
|
+
247 => 'JOINT_MODE_BOOTING',
|
65
|
+
249 => 'JOINT_MODE_BOOTLOADER',
|
66
|
+
252 => 'JOINT_MODE_FAULT',
|
67
|
+
253 => 'JOINT_MODE_RUNNING',
|
68
|
+
255 => 'JOINT_MODE_IDLE'
|
69
|
+
}
|
21
70
|
|
22
71
|
module Command #{{{
|
23
72
|
RTDE_REQUEST_PROTOCOL_VERSION = 86 # ASCII V
|
@@ -37,10 +86,6 @@ module UR
|
|
37
86
|
PAUSED = 3
|
38
87
|
end #}}}
|
39
88
|
|
40
|
-
def get_robotmode
|
41
|
-
@@robotmode
|
42
|
-
end
|
43
|
-
|
44
89
|
def initialize(host, logger=Logger.new(STDOUT,level: :INFO)) #{{{
|
45
90
|
host = '//' + host if host !~ /\/\//
|
46
91
|
uri = URI::parse(host)
|
@@ -56,7 +101,7 @@ module UR
|
|
56
101
|
def connect #{{{
|
57
102
|
return if @sock
|
58
103
|
|
59
|
-
@buf = '' # buffer data in binary format
|
104
|
+
@buf = ''.b # buffer data in binary format
|
60
105
|
begin
|
61
106
|
@sock = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
|
62
107
|
@sock.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1
|
@@ -114,18 +159,18 @@ module UR
|
|
114
159
|
@logger.error 'Cannot send when RTDE synchroinization is inactive'
|
115
160
|
return
|
116
161
|
end
|
117
|
-
if not @input_config.
|
162
|
+
if not @input_config.include? input_data.recipe_id
|
118
163
|
@logger.error 'Input configuration id not found: ' + @input_data.recipe_id
|
119
164
|
return
|
120
165
|
end
|
121
166
|
config = @input_config[input_data.recipe_id]
|
122
167
|
send_all Command::RTDE_DATA_PACKAGE, config.pack(input_data)
|
123
168
|
end #}}}
|
124
|
-
def send_and_receive(cmd, payload = '') #{{{
|
169
|
+
def send_and_receive(cmd, payload = ''.b) #{{{
|
125
170
|
@logger.debug 'Start send_and_receive'
|
126
171
|
send_all(cmd, payload) ? recv(cmd) : nil
|
127
172
|
end #}}}
|
128
|
-
def send_all(command, payload = '') #{{{
|
173
|
+
def send_all(command, payload = ''.b) #{{{
|
129
174
|
fmt = 'S>C'
|
130
175
|
size = ([0,0].pack fmt).length + payload.length
|
131
176
|
buf = [size, command].pack(fmt) + payload
|
@@ -216,16 +261,16 @@ module UR
|
|
216
261
|
return true
|
217
262
|
end #}}}
|
218
263
|
|
219
|
-
def receive #{{{
|
264
|
+
def receive(binary=false) #{{{
|
220
265
|
@logger.debug 'Start receive'
|
221
266
|
if !@output_config
|
222
267
|
@logger.error 'Output configuration not initialized'
|
223
268
|
nil
|
224
269
|
end
|
225
270
|
return nil if @conn_state != ConnectionState::STARTED
|
226
|
-
recv Command::RTDE_DATA_PACKAGE
|
271
|
+
recv Command::RTDE_DATA_PACKAGE, binary
|
227
272
|
end #}}}
|
228
|
-
def recv(command) #{{{
|
273
|
+
def recv(command, binary=false) #{{{
|
229
274
|
@logger.debug 'Start recv' + @buf.to_s
|
230
275
|
while connected?
|
231
276
|
readable, _, xlist = IO.select([@sock], [], [@sock])
|
@@ -266,7 +311,7 @@ module UR
|
|
266
311
|
end
|
267
312
|
if packet_header.command == command
|
268
313
|
@logger.debug 'returning becuase of packet_header.command == command'
|
269
|
-
return data
|
314
|
+
return binary ? packet[1..-1] : data
|
270
315
|
else
|
271
316
|
@logger.info 'skipping package(2)'
|
272
317
|
end
|
data/lib/serialize.rb
CHANGED
@@ -64,6 +64,8 @@ module UR
|
|
64
64
|
data[offset...offset+size].map(&:to_i)
|
65
65
|
elsif data_type == 'INT32' or data_type == 'UINT8'
|
66
66
|
data[offset].to_i
|
67
|
+
elsif data_type == 'BOOL'
|
68
|
+
data[offset].to_i > 0 ? true : false
|
67
69
|
else
|
68
70
|
raise TypeError.new('unpack_field: unknown data type: ' + data_type)
|
69
71
|
end
|
@@ -131,7 +133,6 @@ module UR
|
|
131
133
|
rmd.id = buf.unpack('C')[0]
|
132
134
|
rmd.types = buf[1..-1].split(',')
|
133
135
|
rmd.fmt = 'C'
|
134
|
-
#p rmd.types
|
135
136
|
rmd.types.each do |i|
|
136
137
|
if i == 'INT32'
|
137
138
|
rmd.fmt += 'i>'
|
@@ -151,10 +152,12 @@ module UR
|
|
151
152
|
rmd.fmt += 'Q>'
|
152
153
|
elsif i == 'UINT8'
|
153
154
|
rmd.fmt += 'C'
|
155
|
+
elsif i == 'BOOL'
|
156
|
+
rmd.fmt += '?'
|
154
157
|
elsif i == 'IN_USE'
|
155
|
-
raise TypeError 'An input parameter is already in use.'
|
158
|
+
#raise TypeError 'An input parameter is already in use.'
|
156
159
|
else
|
157
|
-
raise TypeError 'Unknown data type: ' + i
|
160
|
+
#raise TypeError 'Unknown data type: ' + i
|
158
161
|
end
|
159
162
|
end
|
160
163
|
rmd
|
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: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Pauker
|
@@ -9,28 +9,28 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xml-smart
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
18
|
- - ">="
|
22
19
|
- !ruby/object:Gem::Version
|
23
20
|
version: 0.3.6
|
21
|
+
- - "~>"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "~>"
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
31
28
|
- - ">="
|
32
29
|
- !ruby/object:Gem::Version
|
33
30
|
version: 0.3.6
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
34
|
description: see https://github.com/fpauker/ur-sock
|
35
35
|
email: florian.pauker@gmail.com
|
36
36
|
executables: []
|
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
requirements: []
|
70
|
-
rubygems_version: 3.
|
70
|
+
rubygems_version: 3.1.2
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: Preliminary release of Universal Robot (UR) Socket Communication.
|