farmbot-serial 0.0.1 → 0.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/.gitignore +0 -1
- data/farmbot-serial.gemspec +2 -2
- data/lib/hardware_interface_arduino.rb +62 -163
- data/lib/hardware_interface_arduino_values_received.rb +8 -1
- data/lib/hardware_interface_write_status.rb +35 -0
- metadata +3 -13
- data/lib/arduino_default_params.rb +0 -148
- data/lib/hardware_interface.rb +0 -210
- data/lib/hardware_interface_arduino_write_status.rb +0 -30
- data/lib/hardware_interface_param.rb +0 -218
- data/lib/status.rb +0 -52
- data/spec/lib/ramps_arduino_write_status_spec.rb +0 -27
- data/spec/lib/ramps_param_spec.rb +0 -555
- data/spec/lib/ramps_spec.rb +0 -289
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 873981048eab4aa88fcf4cacae9f3c88de7a4073
|
4
|
+
data.tar.gz: c56dc431685db09f7238cf2ae7285acc1cc05f9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31f5d25c1b2fcd205b240b4d8f8bfcad3adde8be560f288db9f8d14c0a31cc800420c0fe9b5b92d2f7dd1f2a345082362ad83bb62f0a9e88077ec121eb33b772
|
7
|
+
data.tar.gz: 138d3fc9b44b824a3081656fbcfd994aa0cd3e4bcbd6d4400f5bb25bb3f67169bad4eade7f9d123c00438c1cb3d66e262a9beab7ead0db4d4a3fe54a6fbb4d6e
|
data/.gitignore
CHANGED
data/farmbot-serial.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "farmbot-serial"
|
7
|
-
spec.version = '0.0.
|
7
|
+
spec.version = '0.0.2' # TODO: Fb::VERSION
|
8
8
|
spec.authors = ["Tim Evers", "Rick Carlino"]
|
9
9
|
spec.email = ["rick.carlino@gmail.com"]
|
10
10
|
spec.description = "Serial library for Farmbot"
|
@@ -23,5 +23,5 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "pry"#, "~> 0.10"
|
24
24
|
spec.add_development_dependency "simplecov"#, "~> 0.9"
|
25
25
|
|
26
|
-
spec.add_runtime_dependency
|
26
|
+
spec.add_runtime_dependency "serialport"#, "~> 1.3"
|
27
27
|
end
|
@@ -7,22 +7,28 @@
|
|
7
7
|
module Fb
|
8
8
|
class HardwareInterfaceArduino
|
9
9
|
|
10
|
-
attr_accessor :ramps_param, :ramps_main
|
11
|
-
#attr_accessor :test_serial_read, :test_serial_write
|
12
10
|
attr_accessor :serial_port
|
13
|
-
|
11
|
+
|
12
|
+
attr_reader :is_busy
|
13
|
+
attr_reader :is_error
|
14
|
+
attr_reader :is_done
|
15
|
+
attr_reader :return_values
|
14
16
|
|
15
17
|
# initialize the interface
|
16
18
|
#
|
17
19
|
def initialize(test_mode)
|
18
|
-
@status_debug_msg
|
19
|
-
|
20
|
-
@test_mode = test_mode
|
20
|
+
@status_debug_msg = $debug_msg
|
21
|
+
@test_mode = test_mode
|
21
22
|
|
22
23
|
# connect to arduino
|
23
24
|
connect_board()
|
24
25
|
|
25
|
-
@external_info
|
26
|
+
@external_info = ""
|
27
|
+
@return_values = Queue.new
|
28
|
+
|
29
|
+
@is_busy = false
|
30
|
+
@is_error = false
|
31
|
+
@is_done = false
|
26
32
|
|
27
33
|
end
|
28
34
|
|
@@ -50,32 +56,37 @@ module Fb
|
|
50
56
|
|
51
57
|
# write a command to the robot
|
52
58
|
#
|
53
|
-
def
|
59
|
+
def write_command(text, log, onscreen)
|
54
60
|
begin
|
55
61
|
|
56
62
|
write_status = create_write_status(text, log, onscreen)
|
63
|
+
write_to_serial(write_status)
|
64
|
+
|
65
|
+
@parameters = []
|
66
|
+
@is_busy = true
|
67
|
+
@is_error = false
|
57
68
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
# wait until the arduino responds
|
63
|
-
while(write_status.is_busy())
|
69
|
+
rescue => e
|
70
|
+
handle_execution_exception(e)
|
71
|
+
end
|
72
|
+
end
|
64
73
|
|
74
|
+
# check the responses from the robot
|
75
|
+
#
|
76
|
+
def check_command_execution
|
77
|
+
begin
|
78
|
+
if Time.now - write_status.start < write_status.timeout and @is_done == 0
|
79
|
+
@is_error = true
|
80
|
+
else
|
65
81
|
check_emergency_stop
|
66
82
|
process_feedback(write_status)
|
67
|
-
|
68
83
|
end
|
69
|
-
|
70
|
-
log_result_of_execution(write_status)
|
71
|
-
|
72
84
|
rescue => e
|
73
|
-
#puts 'exception received'
|
74
|
-
#puts e
|
75
85
|
handle_execution_exception(e)
|
76
86
|
end
|
77
87
|
end
|
78
88
|
|
89
|
+
|
79
90
|
def create_write_status(text, log, onscreen)
|
80
91
|
write_status = Fb::HardwareInterfaceArduinoWriteStatus.new
|
81
92
|
write_status.text = text
|
@@ -89,18 +100,16 @@ module Fb
|
|
89
100
|
puts("ST: serial error\n#{e.message}\n#{e.backtrace.inspect}")
|
90
101
|
@serial_port.rts = 1
|
91
102
|
connect_board
|
92
|
-
|
103
|
+
@is_error = true
|
93
104
|
end
|
94
105
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
sleep 5 if @test_mode == false
|
103
|
-
end
|
106
|
+
# set the serial port ready to send and write the text
|
107
|
+
#
|
108
|
+
def write_to_serial(write_status)
|
109
|
+
puts "WR: #{write_status.text}" if write_status.onscreen
|
110
|
+
@serial_port.read_timeout = 2
|
111
|
+
clean_serial_buffer() if @test_mode == false
|
112
|
+
serial_port_write( "#{write_status.text}\n" )
|
104
113
|
end
|
105
114
|
|
106
115
|
# receive all characters coming from the serial port
|
@@ -108,31 +117,24 @@ module Fb
|
|
108
117
|
def process_feedback(write_status)
|
109
118
|
i = @serial_port.read(1)
|
110
119
|
|
111
|
-
#print "-#{i}"
|
112
|
-
#print "#{i}"
|
113
|
-
|
114
120
|
if i != nil
|
115
121
|
i.each_char do |c|
|
116
|
-
|
117
|
-
add_and_process_characters(write_status, c)
|
118
|
-
|
122
|
+
process_characters(write_status, c)
|
119
123
|
end
|
120
124
|
else
|
121
125
|
sleep 0.001 if @test_mode == false
|
122
|
-
#write_status.done = 1 if @test_mode == true
|
123
126
|
end
|
124
127
|
end
|
125
128
|
|
126
129
|
# keep incoming characters in a buffer until it is a complete string
|
127
130
|
#
|
128
|
-
def
|
131
|
+
def process_characters(write_status, c)
|
129
132
|
|
130
133
|
if c == "\r" or c == "\n"
|
131
134
|
if write_status.received.length >= 3
|
132
135
|
log_incoming_text(write_status)
|
133
136
|
write_status.split_received
|
134
137
|
process_code_and_params(write_status)
|
135
|
-
|
136
138
|
end
|
137
139
|
else
|
138
140
|
write_status.received = write_status.received + c
|
@@ -153,11 +155,11 @@ module Fb
|
|
153
155
|
# command is finished
|
154
156
|
when 'R02'
|
155
157
|
write_status.done = 1
|
156
|
-
|
158
|
+
@is_done = true
|
157
159
|
# command is finished with errors
|
158
160
|
when 'R03'
|
159
161
|
write_status.done = 1
|
160
|
-
|
162
|
+
@is_done = true
|
161
163
|
# command is still ongoing
|
162
164
|
when 'R04'
|
163
165
|
write_status.start = Time.now
|
@@ -172,15 +174,6 @@ module Fb
|
|
172
174
|
|
173
175
|
end
|
174
176
|
|
175
|
-
# set the serial port ready to send
|
176
|
-
#
|
177
|
-
def prepare_serial_port(write_status)
|
178
|
-
puts "WR: #{write_status.text}" if write_status.onscreen
|
179
|
-
@serial_port.read_timeout = 2
|
180
|
-
clean_serial_buffer() if @test_mode == false
|
181
|
-
serial_port_write( "#{write_status.text}\n" )
|
182
|
-
end
|
183
|
-
|
184
177
|
# empty the input buffer so no old data is processed
|
185
178
|
#
|
186
179
|
def clean_serial_buffer
|
@@ -195,10 +188,8 @@ module Fb
|
|
195
188
|
|
196
189
|
# if there is an emergency stop, immediately write it to the arduino
|
197
190
|
#
|
198
|
-
def
|
199
|
-
|
200
|
-
serial_port_write( "E\n" )
|
201
|
-
end
|
191
|
+
def emergency_stop
|
192
|
+
serial_port_write( "E\n" )
|
202
193
|
end
|
203
194
|
|
204
195
|
# write to log
|
@@ -211,136 +202,44 @@ module Fb
|
|
211
202
|
#
|
212
203
|
def process_value(code,text)
|
213
204
|
|
214
|
-
|
215
|
-
|
216
|
-
process_value_split(code, params, text)
|
205
|
+
# get all parameters in the current text
|
206
|
+
return_value = process_value_split(code, text)
|
217
207
|
|
218
|
-
#
|
219
|
-
|
220
|
-
# and respong on it as needed
|
221
|
-
|
222
|
-
process_value_process_param_list(params,code)
|
223
|
-
process_value_process_named_params(params,code)
|
224
|
-
process_value_process_text(code,text)
|
208
|
+
# save the list for the client
|
209
|
+
@return_values << return_value
|
225
210
|
|
226
211
|
end
|
227
212
|
|
228
|
-
def process_value_split(code,
|
213
|
+
def process_value_split(code, text)
|
214
|
+
|
215
|
+
params = Fb::HardwareInterfaceArduinoValuesReceived.new
|
216
|
+
params.code = code
|
217
|
+
params.text = text
|
229
218
|
|
230
219
|
# get all separate parameters from the text
|
231
220
|
text.split(' ').each do |param|
|
232
221
|
|
233
|
-
|
234
|
-
|
235
|
-
|
222
|
+
case code
|
223
|
+
when "R81"
|
224
|
+
# this is the only code that uses two letter parameters
|
225
|
+
par_name = param[0..1].to_s
|
236
226
|
par_value = param[2..-1].to_i
|
237
227
|
else
|
238
|
-
|
228
|
+
par_name = param[0..0].to_s
|
239
229
|
par_value = param[1..-1].to_i
|
240
230
|
end
|
241
231
|
|
242
|
-
params.load_parameter(
|
243
|
-
|
244
|
-
end
|
245
|
-
|
246
|
-
end
|
247
|
-
|
248
|
-
def process_value_process_param_list(params,code)
|
249
|
-
#if params.p != 0
|
250
|
-
process_value_R21(params,code)
|
251
|
-
process_value_R23(params,code)
|
252
|
-
process_value_R41(params,code)
|
253
|
-
#end
|
254
|
-
end
|
255
|
-
|
256
|
-
|
257
|
-
# Process report parameter value
|
258
|
-
#
|
259
|
-
def process_value_R21(params,code)
|
260
|
-
if code == 'R21'
|
261
|
-
param = @ramps_param.get_param_by_id(params.p)
|
262
|
-
if param != nil
|
263
|
-
param['value_ar'] = params.v
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
# Process report parameter value and save to database
|
269
|
-
#
|
270
|
-
def process_value_R23(params,code)
|
271
|
-
if code == 'R23'
|
272
|
-
param = @ramps_param.get_param_by_id(params.p)
|
273
|
-
if param != nil
|
274
|
-
@ramps_param.save_param_value(params.p, :by_id, :from_db, params.v)
|
275
|
-
end
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
|
-
# Process report pin values
|
280
|
-
#
|
281
|
-
def process_value_R41(params,code)
|
282
|
-
raise 'Not implemented.'
|
283
|
-
end
|
284
|
-
|
285
|
-
def process_value_process_named_params(params,code)
|
286
|
-
process_value_R81(params,code)
|
287
|
-
process_value_R82(params,code)
|
288
|
-
end
|
289
|
-
|
290
|
-
# Process report end stops
|
291
|
-
#
|
292
|
-
def process_value_R81(params,code)
|
293
|
-
if code == 'R81'
|
294
|
-
Fb::HardwareInterface.current.status.info_end_stop_x_a = (params.xa == 1)
|
295
|
-
Fb::HardwareInterface.current.status.info_end_stop_x_b = (params.xb == 1)
|
296
|
-
Fb::HardwareInterface.current.status.info_end_stop_y_a = (params.ya == 1)
|
297
|
-
Fb::HardwareInterface.current.status.info_end_stop_y_b = (params.yb == 1)
|
298
|
-
Fb::HardwareInterface.current.status.info_end_stop_z_a = (params.za == 1)
|
299
|
-
Fb::HardwareInterface.current.status.info_end_stop_z_b = (params.zb == 1)
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
# Process report position
|
304
|
-
def process_value_R82(params,code)
|
305
|
-
if code == 'R82'
|
306
|
-
|
307
|
-
Fb::HardwareInterface.current.status.info_current_x_steps = params.x
|
308
|
-
Fb::HardwareInterface.current.status.info_current_x = params.x / @ramps_param.axis_x_steps_per_unit
|
309
|
-
|
310
|
-
Fb::HardwareInterface.current.status.info_current_y_steps = params.y
|
311
|
-
Fb::HardwareInterface.current.status.info_current_y = params.y / @ramps_param.axis_y_steps_per_unit
|
232
|
+
params.load_parameter(par_name, par_value)
|
312
233
|
|
313
|
-
Fb::HardwareInterface.current.status.info_current_z_steps = params.z
|
314
|
-
Fb::HardwareInterface.current.status.info_current_z = params.z / @ramps_param.axis_z_steps_per_unit
|
315
|
-
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
def process_value_process_text(code,text)
|
320
|
-
process_value_process_R83(code,text)
|
321
|
-
process_value_process_R99(code,text)
|
322
|
-
end
|
323
|
-
|
324
|
-
# Process report software version
|
325
|
-
#
|
326
|
-
def process_value_process_R83(code,text)
|
327
|
-
if code == 'R83'
|
328
|
-
Fb::HardwareInterface.current.status.device_version = text
|
329
234
|
end
|
330
|
-
end
|
331
235
|
|
332
|
-
|
333
|
-
#
|
334
|
-
def process_value_process_R99(code,text)
|
335
|
-
if code == 'R99'
|
336
|
-
puts ">#{text}<"
|
337
|
-
end
|
236
|
+
return params
|
338
237
|
end
|
339
238
|
|
340
239
|
def puts(*)
|
341
240
|
# Too many messages in the test buffer right now. Will delete this later.
|
342
241
|
# just disabling it for now.
|
343
|
-
STDOUT.print('
|
242
|
+
STDOUT.print('x')
|
344
243
|
end
|
345
244
|
end
|
346
245
|
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
module Fb
|
2
2
|
class HardwareInterfaceArduinoValuesReceived
|
3
3
|
|
4
|
+
attr_accessor :code
|
5
|
+
attr_accessor :text
|
6
|
+
attr_accessor :external_info
|
7
|
+
|
8
|
+
# value holders with the name used in the serial
|
9
|
+
# communucation as they are received from arduino
|
4
10
|
attr_accessor :p , :v
|
5
11
|
attr_accessor :x , :y , :z
|
6
12
|
attr_accessor :xa, :xb
|
@@ -21,7 +27,8 @@ module Fb
|
|
21
27
|
@yb = 0
|
22
28
|
@za = 0
|
23
29
|
@zb = 0
|
24
|
-
|
30
|
+
@text = ''
|
31
|
+
@code = 0
|
25
32
|
end
|
26
33
|
|
27
34
|
def load_parameter(name, value)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class HardwareInterfaceArduinoWriteStatus
|
2
|
+
|
3
|
+
attr_accessor :done
|
4
|
+
attr_accessor :code
|
5
|
+
attr_accessor :received
|
6
|
+
attr_accessor :start
|
7
|
+
attr_accessor :log
|
8
|
+
attr_accessor :onscreen
|
9
|
+
attr_accessor :text
|
10
|
+
attr_accessor :params
|
11
|
+
attr_accessor :timeout
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@done = 0
|
15
|
+
@code = ''
|
16
|
+
@received = ''
|
17
|
+
@text = ''
|
18
|
+
@params = ''
|
19
|
+
@log = false
|
20
|
+
@onscreen = false
|
21
|
+
@start = Time.now
|
22
|
+
@timeout = 5
|
23
|
+
end
|
24
|
+
|
25
|
+
# def is_busy
|
26
|
+
# Time.now - @start < @timeout and @done == 0
|
27
|
+
# end
|
28
|
+
|
29
|
+
def split_received
|
30
|
+
# get the parameter and data part
|
31
|
+
@code = received[0..2].upcase
|
32
|
+
@params = received[3..-1].to_s.upcase.strip
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: farmbot-serial
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Evers
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-03-
|
12
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -107,20 +107,13 @@ files:
|
|
107
107
|
- README.md
|
108
108
|
- Rakefile
|
109
109
|
- farmbot-serial.gemspec
|
110
|
-
- lib/arduino_default_params.rb
|
111
110
|
- lib/farmbot-serial.rb
|
112
|
-
- lib/hardware_interface.rb
|
113
111
|
- lib/hardware_interface_arduino.rb
|
114
112
|
- lib/hardware_interface_arduino_values_received.rb
|
115
|
-
- lib/
|
116
|
-
- lib/hardware_interface_param.rb
|
113
|
+
- lib/hardware_interface_write_status.rb
|
117
114
|
- lib/serial_port_sim.rb
|
118
|
-
- lib/status.rb
|
119
115
|
- spec/lib/ramps_arduino_spec.rb
|
120
116
|
- spec/lib/ramps_arduino_values_received_spec.rb
|
121
|
-
- spec/lib/ramps_arduino_write_status_spec.rb
|
122
|
-
- spec/lib/ramps_param_spec.rb
|
123
|
-
- spec/lib/ramps_spec.rb
|
124
117
|
- spec/spec_helper.rb
|
125
118
|
- testcommands.csv
|
126
119
|
homepage: http://github.com/farmbot/farmbot-serial
|
@@ -150,7 +143,4 @@ summary: Serial library for Farmbot
|
|
150
143
|
test_files:
|
151
144
|
- spec/lib/ramps_arduino_spec.rb
|
152
145
|
- spec/lib/ramps_arduino_values_received_spec.rb
|
153
|
-
- spec/lib/ramps_arduino_write_status_spec.rb
|
154
|
-
- spec/lib/ramps_param_spec.rb
|
155
|
-
- spec/lib/ramps_spec.rb
|
156
146
|
- spec/spec_helper.rb
|