farmbot-serial 0.0.2 → 0.0.4

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
  SHA1:
3
- metadata.gz: 873981048eab4aa88fcf4cacae9f3c88de7a4073
4
- data.tar.gz: c56dc431685db09f7238cf2ae7285acc1cc05f9c
3
+ metadata.gz: 11e0f51d8ab86f321618b7624b564390dea98f8a
4
+ data.tar.gz: b4ee5f17fc86632387f3bbe853637eed6ee16d60
5
5
  SHA512:
6
- metadata.gz: 31f5d25c1b2fcd205b240b4d8f8bfcad3adde8be560f288db9f8d14c0a31cc800420c0fe9b5b92d2f7dd1f2a345082362ad83bb62f0a9e88077ec121eb33b772
7
- data.tar.gz: 138d3fc9b44b824a3081656fbcfd994aa0cd3e4bcbd6d4400f5bb25bb3f67169bad4eade7f9d123c00438c1cb3d66e262a9beab7ead0db4d4a3fe54a6fbb4d6e
6
+ metadata.gz: cdaaf0a5772e4c18e1f8236ac9c02af0747150caf715c42e08dd8f506ec8e0795f7268d70997b599f38790ac7beefd4ba1951693433ae96b408d4080e6a50637
7
+ data.tar.gz: ad07522eb174172366067978f59979a965d208b4c3b5d4f5b82ebcf87a03a2fb89ba3a94d9f3fef382b92ff811a148d4cd0eca6f0f9fe6ed0d9820324126552d
data/.gitignore CHANGED
@@ -43,3 +43,4 @@ snippets.rb
43
43
  tmp/**/*
44
44
  *.rb~
45
45
  Gemfile.lock
46
+ idea.rb
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --require spec_helper
3
+ --format documentation
data/lib/arduino.rb ADDED
@@ -0,0 +1,41 @@
1
+ ## HARDWARE INTERFACE
2
+ ## ******************
3
+
4
+ # Communicate with the arduino using a serial interface
5
+ # All information is exchanged using a variation of g-code
6
+ # Parameters are stored in the database
7
+ module FB
8
+ class Arduino
9
+ class EmergencyStop < StandardError; end # Not yet used.
10
+
11
+ attr_reader :serial_port, :logger
12
+
13
+ # Initial and provide a serial object, as well as an IO object to send
14
+ # log messages to. Default SerialPort is DefaultSerialPort. Default logger
15
+ # is STDOUT
16
+ def initialize(serial_port = DefaultSerialPort.new, logger = STDOUT)
17
+ @serial_port, @logger = serial_port, logger
18
+ end
19
+
20
+ # Log to screen/file/IO stream
21
+ def log(message)
22
+ logger.puts(message)
23
+ end
24
+
25
+ # Handle incoming text from arduino into pi
26
+ def read(string)
27
+ log "RECEIVED #{string}"
28
+ end
29
+
30
+ # Send outgoing test to arduino from pi
31
+ def write(string)
32
+ serial_port.puts string
33
+ log "SENT #{string}"
34
+ end
35
+
36
+ # Handle loss of serial connection
37
+ def disconnect
38
+ log "Connection to device lost"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ require 'eventmachine'
2
+ module FB
3
+ # Class that is fed into event machine's event loop to handle incoming serial
4
+ # messages asynchronously via EM.attach(). See: EM.attach
5
+ class ArduinoEventMachine < EventMachine::Connection
6
+ class << self
7
+ attr_accessor :arduino
8
+ end
9
+
10
+ def receive_data(data)
11
+ self.class.arduino.read(data)
12
+ end
13
+
14
+ # Gets called when the connection breaks.
15
+ def unbind
16
+ self.class.arduino.disconnect
17
+ EM.stop
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ require 'serialport'
2
+
3
+ # This object creates a Serial IO with sane default, since most FarmBot setups
4
+ # follow the same serial configuration setup.
5
+ class DefaultSerialPort < SerialPort
6
+ COM_PORT = '/dev/ttyACM0'
7
+ OPTIONS = { "baud" => 115200,
8
+ "data_bits" => 8,
9
+ "stop_bits" => 1,
10
+ "parity" => SerialPort::NONE,
11
+ "flow_control" => SerialPort::SOFT }
12
+
13
+ # Why `def self::new()`? it was defined that way in the parent class,
14
+ # therefore, I can't call super in #initialize().
15
+ def self::new(com = COM_PORT, conf = OPTIONS)
16
+ super
17
+ end
18
+ end
19
+
@@ -1,9 +1,5 @@
1
1
  require 'serialport'
2
- require 'serial_port_sim'
3
- require 'status'
4
- require 'arduino_default_params'
5
- require 'hardware_interface_arduino'
6
- require 'hardware_interface_param'
7
- require 'hardware_interface'
8
- require 'hardware_interface_arduino_values_received'
9
- require 'hardware_interface_arduino_write_status'
2
+
3
+ require_relative 'default_serial_port'
4
+ require_relative 'arduino_event_machine'
5
+ require_relative 'arduino'
@@ -1,21 +1,15 @@
1
- module Fb
1
+ module FB
2
+ # Rename to StatusIndicator or StatusRegister
2
3
  class HardwareInterfaceArduinoValuesReceived
3
4
 
4
- attr_accessor :code
5
- attr_accessor :text
6
- attr_accessor :external_info
5
+ attr_accessor :code, :text, :external_info
7
6
 
8
- # value holders with the name used in the serial
7
+ # value holders with the name used in the serial
9
8
  # communucation as they are received from arduino
10
- attr_accessor :p , :v
11
- attr_accessor :x , :y , :z
12
- attr_accessor :xa, :xb
13
- attr_accessor :ya, :yb
14
- attr_accessor :za, :zb
9
+ attr_accessor :p , :v, :x , :y , :z, :xa, :xb, :ya, :yb, :za, :zb
15
10
 
16
11
 
17
12
  def initialize
18
-
19
13
  @p = -1
20
14
  @v = 0
21
15
  @x = 0
@@ -30,32 +24,34 @@ module Fb
30
24
  @text = ''
31
25
  @code = 0
32
26
  end
33
-
27
+ # Change name to []=?
34
28
  def load_parameter(name, value)
35
-
29
+ name = name.upcase.to_sym
36
30
  case name
37
- when 'P'
31
+ when :P
38
32
  @p = value
39
- when 'V'
33
+ when :V
40
34
  @v = value
41
- when 'XA'
35
+ when :XA
42
36
  @xa = value
43
- when 'XB'
37
+ when :XB
44
38
  @xb = value
45
- when 'YA'
39
+ when :YA
46
40
  @ya = value
47
- when 'YB'
41
+ when :YB
48
42
  @yb = value
49
- when 'ZA'
43
+ when :ZA
50
44
  @za = value
51
- when 'ZB'
45
+ when :ZB
52
46
  @zb = value
53
- when 'X'
47
+ when :X
54
48
  @x = value
55
- when 'Y'
49
+ when :Y
56
50
  @y = value
57
- when 'Z'
51
+ when :Z
58
52
  @z = value
53
+ else
54
+ raise "Unknown status symbol '#{name}'"
59
55
  end
60
56
  end
61
57
 
@@ -0,0 +1,58 @@
1
+ # An outbound (Pi -> Arduino) status message.
2
+ # Originally HardwareInterfaceArduinoWriteStatus
3
+ class OutboundMessage
4
+
5
+ attr_accessor :done, :code, :received, :start, :log, :onscreen, :text,
6
+ :params, :timeout
7
+
8
+ def initialize(text)
9
+ @text = text
10
+ @done = 0
11
+ @code = ''
12
+ @received = ''
13
+ @text = ''
14
+ @params = ''
15
+ @log = false
16
+ @onscreen = false
17
+ @start = Time.now
18
+ @timeout = 5
19
+ end
20
+
21
+ def parse_response!
22
+ # get the parameter and data part
23
+ @code = received[0..2].upcase
24
+ @params = received[3..-1].to_s.upcase.strip
25
+ end
26
+
27
+ # handle the incoming message depending on the first code number
28
+ #
29
+ def process_code_and_params
30
+
31
+ # process the feedback
32
+ case self.code
33
+
34
+ # command received by arduino
35
+ when 'R01'
36
+ self.timeout = 90
37
+ # command is finished
38
+ when 'R02'
39
+ self.done = 1
40
+ @is_done = true
41
+ # command is finished with errors
42
+ when 'R03'
43
+ self.done = 1
44
+ @is_done = true
45
+ # command is still ongoing
46
+ when 'R04'
47
+ self.start = Time.now
48
+ self.timeout = 90
49
+ # specific feedback that is processes separately
50
+ else
51
+ process_value(self.code,self.params)
52
+ end
53
+
54
+ self.received = ''
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,19 @@
1
+ ## SERIAL PORT SIMULATION
2
+ ## **********************
3
+
4
+ # Used for unit tests
5
+
6
+ module FB
7
+ class StubSerialPort
8
+ def initialize(comm_port, parameters)
9
+ end
10
+
11
+ def write(text)
12
+ text
13
+ end
14
+
15
+ def read(characters)
16
+ characters
17
+ end
18
+ end
19
+ end
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
- describe Fb::HardwareInterfaceArduino do
2
+ describe FB::HardwareInterfaceArduino do
3
3
 
4
4
  before do
5
- Fb::HardwareInterface.current.status = Fb::Status.new
5
+ FB::HardwareInterface.current.status = FB::Status.new
6
6
 
7
- @ramps = Fb::HardwareInterfaceArduino.new(true)
7
+ @ramps = FB::HardwareInterfaceArduino.new(true)
8
8
 
9
- @ramps_param = Fb::HardwareInterfaceParam.new
9
+ @ramps_param = FB::HardwareInterfaceParam.new
10
10
  @ramps.ramps_param = @ramps_param
11
11
  end
12
12
 
@@ -27,12 +27,12 @@ describe Fb::HardwareInterfaceArduino do
27
27
 
28
28
  it "execute_command with causing an error" do
29
29
 
30
- Fb::HardwareInterface.current.status = nil
30
+ FB::HardwareInterface.current.status = nil
31
31
 
32
32
  @ramps.serial_port.rts = 0
33
33
  @ramps.execute_command(nil,nil,nil)
34
34
 
35
- Fb::HardwareInterface.current.status = Fb::Status.new
35
+ FB::HardwareInterface.current.status = FB::Status.new
36
36
 
37
37
  expect { @ramps }.to_not raise_error
38
38
 
@@ -183,7 +183,7 @@ describe Fb::HardwareInterfaceArduino do
183
183
 
184
184
  @ramps.process_code_and_params(write_status)
185
185
 
186
- expect(Fb::HardwareInterface.current.status.device_version).to eq(write_status.params)
186
+ expect(FB::HardwareInterface.current.status.device_version).to eq(write_status.params)
187
187
 
188
188
  end
189
189
 
@@ -214,14 +214,14 @@ describe Fb::HardwareInterfaceArduino do
214
214
 
215
215
  it "emergency stop off" do
216
216
  @ramps.serial_port.test_serial_write = ""
217
- Fb::HardwareInterface.current.status.emergency_stop = false
217
+ FB::HardwareInterface.current.status.emergency_stop = false
218
218
  @ramps.check_emergency_stop
219
219
  expect(@ramps.serial_port.test_serial_write).to eq("")
220
220
  end
221
221
 
222
222
  it "emergency stop on" do
223
223
  @ramps.serial_port.test_serial_write = ""
224
- Fb::HardwareInterface.current.status.emergency_stop = true
224
+ FB::HardwareInterface.current.status.emergency_stop = true
225
225
  @ramps.check_emergency_stop
226
226
  expect(@ramps.serial_port.test_serial_write).to eq("E\n")
227
227
  end
@@ -239,7 +239,7 @@ describe Fb::HardwareInterfaceArduino do
239
239
 
240
240
  it "process value split two letters" do
241
241
 
242
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
242
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
243
243
  code = "R81"
244
244
  text = "ZA1 ZB2 XA3 XB4 YA5 YB6"
245
245
  @ramps.process_value_split(code, params, text)
@@ -254,7 +254,7 @@ describe Fb::HardwareInterfaceArduino do
254
254
 
255
255
  it "process value split one letters" do
256
256
 
257
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
257
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
258
258
  code = "R99"
259
259
  text = "P1 V2 X3 Y4 Z5"
260
260
  @ramps.process_value_split(code, params, text)
@@ -275,7 +275,7 @@ describe Fb::HardwareInterfaceArduino do
275
275
  code = "R21"
276
276
  text = "P#{param} V#{value}"
277
277
 
278
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
278
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
279
279
  @ramps.process_value_split(code, params, text)
280
280
  @ramps.process_value_R21(params,code)
281
281
 
@@ -293,7 +293,7 @@ describe Fb::HardwareInterfaceArduino do
293
293
  code = "R23"
294
294
  text = "P#{param} V#{value}"
295
295
 
296
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
296
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
297
297
  @ramps.process_value_split(code, params, text)
298
298
  @ramps.process_value_R23(params,code)
299
299
 
@@ -314,7 +314,7 @@ describe Fb::HardwareInterfaceArduino do
314
314
 
315
315
  @ramps.external_info = exinf
316
316
 
317
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
317
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
318
318
  @ramps.process_value_split(code, params, text)
319
319
  @ramps.process_value_R41(params,code)
320
320
 
@@ -333,103 +333,103 @@ describe Fb::HardwareInterfaceArduino do
333
333
 
334
334
  it "process value R81 XA" do
335
335
 
336
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
336
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
337
337
  code = "R81"
338
338
  text = " XA1 XB0 YA0 YB0 ZA0 ZB0 "
339
339
  @ramps.process_value_split(code, params, text)
340
340
  @ramps.process_value_R81(params,code)
341
341
 
342
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(true)
343
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
344
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
345
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
346
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
347
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
342
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(true)
343
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
344
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
345
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
346
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
347
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
348
348
 
349
349
  end
350
350
 
351
351
  it "process value R81 XB" do
352
352
 
353
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
353
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
354
354
  code = "R81"
355
355
  text = " XA0 XB1 YA0 YB0 ZA0 ZB0 "
356
356
  @ramps.process_value_split(code, params, text)
357
357
  @ramps.process_value_R81(params,code)
358
358
 
359
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
360
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(true)
361
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
362
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
363
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
364
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
359
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
360
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(true)
361
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
362
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
363
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
364
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
365
365
 
366
366
  end
367
367
 
368
368
  it "process value R81 YA" do
369
369
 
370
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
370
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
371
371
  code = "R81"
372
372
  text = " XA0 XB0 YA1 YB0 ZA0 ZB0 "
373
373
  @ramps.process_value_split(code, params, text)
374
374
  @ramps.process_value_R81(params,code)
375
375
 
376
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
377
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
378
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(true)
379
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
380
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
381
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
376
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
377
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
378
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(true)
379
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
380
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
381
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
382
382
 
383
383
  end
384
384
 
385
385
  it "process value R81 YB" do
386
386
 
387
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
387
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
388
388
  code = "R81"
389
389
  text = " XA0 XB0 YA0 YB1 ZA0 ZB0 "
390
390
  @ramps.process_value_split(code, params, text)
391
391
  @ramps.process_value_R81(params,code)
392
392
 
393
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
394
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
395
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
396
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(true)
397
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
398
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
393
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
394
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
395
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
396
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(true)
397
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
398
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
399
399
 
400
400
  end
401
401
 
402
402
  it "process value R81 ZA" do
403
403
 
404
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
404
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
405
405
  code = "R81"
406
406
  text = " XA0 XB0 YA0 YB0 ZA1 ZB0 "
407
407
  @ramps.process_value_split(code, params, text)
408
408
  @ramps.process_value_R81(params,code)
409
409
 
410
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
411
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
412
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
413
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
414
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(true)
415
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
410
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
411
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
412
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
413
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
414
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(true)
415
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(false)
416
416
 
417
417
  end
418
418
 
419
419
  it "process value R81 ZB" do
420
420
 
421
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
421
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
422
422
  code = "R81"
423
423
  text = " XA0 XB0 YA0 YB0 ZA0 ZB1 "
424
424
  @ramps.process_value_split(code, params, text)
425
425
  @ramps.process_value_R81(params,code)
426
426
 
427
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
428
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
429
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
430
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
431
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
432
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
427
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
428
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
429
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
430
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
431
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
432
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
433
433
 
434
434
  end
435
435
 
@@ -439,19 +439,19 @@ describe Fb::HardwareInterfaceArduino do
439
439
  y = rand(9999999).to_i
440
440
  z = rand(9999999).to_i
441
441
 
442
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
442
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
443
443
  code = "R82"
444
444
  text = "X#{x} Y#{y} Z#{z}"
445
445
  @ramps.process_value_split(code, params, text)
446
446
  @ramps.process_value_R82(params,code)
447
447
 
448
- expect(Fb::HardwareInterface.current.status.info_current_x_steps).to eq(x)
449
- expect(Fb::HardwareInterface.current.status.info_current_y_steps).to eq(y)
450
- expect(Fb::HardwareInterface.current.status.info_current_z_steps).to eq(z)
448
+ expect(FB::HardwareInterface.current.status.info_current_x_steps).to eq(x)
449
+ expect(FB::HardwareInterface.current.status.info_current_y_steps).to eq(y)
450
+ expect(FB::HardwareInterface.current.status.info_current_z_steps).to eq(z)
451
451
 
452
- expect(Fb::HardwareInterface.current.status.info_current_x ).to eq(x / @ramps_param.axis_x_steps_per_unit)
453
- expect(Fb::HardwareInterface.current.status.info_current_y ).to eq(y / @ramps_param.axis_y_steps_per_unit)
454
- expect(Fb::HardwareInterface.current.status.info_current_z ).to eq(z / @ramps_param.axis_z_steps_per_unit)
452
+ expect(FB::HardwareInterface.current.status.info_current_x ).to eq(x / @ramps_param.axis_x_steps_per_unit)
453
+ expect(FB::HardwareInterface.current.status.info_current_y ).to eq(y / @ramps_param.axis_y_steps_per_unit)
454
+ expect(FB::HardwareInterface.current.status.info_current_z ).to eq(z / @ramps_param.axis_z_steps_per_unit)
455
455
 
456
456
  end
457
457
 
@@ -461,7 +461,7 @@ describe Fb::HardwareInterfaceArduino do
461
461
 
462
462
  @ramps.process_value_process_R83(code, text)
463
463
 
464
- expect(Fb::HardwareInterface.current.status.device_version).to eq(text)
464
+ expect(FB::HardwareInterface.current.status.device_version).to eq(text)
465
465
  end
466
466
 
467
467
 
@@ -502,7 +502,7 @@ describe Fb::HardwareInterfaceArduino do
502
502
  code = "R21"
503
503
  text = "P#{param} V#{value}"
504
504
 
505
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
505
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
506
506
  @ramps.process_value_split(code, params, text)
507
507
  @ramps.process_value_process_param_list(params,code)
508
508
 
@@ -521,7 +521,7 @@ describe Fb::HardwareInterfaceArduino do
521
521
  code = "R23"
522
522
  text = "P#{param} V#{value}"
523
523
 
524
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
524
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
525
525
  @ramps.process_value_split(code, params, text)
526
526
  @ramps.process_value_process_param_list(params,code)
527
527
 
@@ -544,7 +544,7 @@ describe Fb::HardwareInterfaceArduino do
544
544
 
545
545
  @ramps.external_info = exinf
546
546
 
547
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
547
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
548
548
  @ramps.process_value_split(code, params, text)
549
549
  @ramps.process_value_process_param_list(params,code)
550
550
 
@@ -568,7 +568,7 @@ describe Fb::HardwareInterfaceArduino do
568
568
 
569
569
  @ramps.process_value_process_R83(code, text)
570
570
 
571
- expect(Fb::HardwareInterface.current.status.device_version).to eq(text)
571
+ expect(FB::HardwareInterface.current.status.device_version).to eq(text)
572
572
 
573
573
  end
574
574
 
@@ -615,34 +615,34 @@ describe Fb::HardwareInterfaceArduino do
615
615
 
616
616
  it "process value 3" do
617
617
 
618
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
618
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
619
619
  code = "R81"
620
620
  text = " XA0 XB0 YA0 YB0 ZA0 ZB1 "
621
621
  @ramps.process_value(code,text)
622
622
 
623
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
624
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
625
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
626
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
627
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
628
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
623
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
624
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
625
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
626
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
627
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
628
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
629
629
 
630
630
  end
631
631
 
632
632
  it "process value named parameters 1" do
633
633
 
634
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
634
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
635
635
  code = "R81"
636
636
  text = " XA0 XB0 YA0 YB0 ZA0 ZB1 "
637
637
  @ramps.process_value_split(code, params, text)
638
638
  @ramps.process_value_process_named_params(params,code)
639
639
 
640
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
641
- expect(Fb::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
642
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
643
- expect(Fb::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
644
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
645
- expect(Fb::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
640
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_a).to eq(false)
641
+ expect(FB::HardwareInterface.current.status.info_end_stop_x_b).to eq(false)
642
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_a).to eq(false)
643
+ expect(FB::HardwareInterface.current.status.info_end_stop_y_b).to eq(false)
644
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_a).to eq(false)
645
+ expect(FB::HardwareInterface.current.status.info_end_stop_z_b).to eq(true)
646
646
 
647
647
  end
648
648
 
@@ -652,19 +652,19 @@ describe Fb::HardwareInterfaceArduino do
652
652
  y = rand(9999999).to_i
653
653
  z = rand(9999999).to_i
654
654
 
655
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
655
+ params = FB::HardwareInterfaceArduinoValuesReceived.new
656
656
  code = "R82"
657
657
  text = "X#{x} Y#{y} Z#{z}"
658
658
  @ramps.process_value_split(code, params, text)
659
659
  @ramps.process_value_process_named_params(params,code)
660
660
 
661
- expect(Fb::HardwareInterface.current.status.info_current_x_steps).to eq(x)
662
- expect(Fb::HardwareInterface.current.status.info_current_y_steps).to eq(y)
663
- expect(Fb::HardwareInterface.current.status.info_current_z_steps).to eq(z)
661
+ expect(FB::HardwareInterface.current.status.info_current_x_steps).to eq(x)
662
+ expect(FB::HardwareInterface.current.status.info_current_y_steps).to eq(y)
663
+ expect(FB::HardwareInterface.current.status.info_current_z_steps).to eq(z)
664
664
 
665
- expect(Fb::HardwareInterface.current.status.info_current_x ).to eq(x / @ramps_param.axis_x_steps_per_unit)
666
- expect(Fb::HardwareInterface.current.status.info_current_y ).to eq(y / @ramps_param.axis_y_steps_per_unit)
667
- expect(Fb::HardwareInterface.current.status.info_current_z ).to eq(z / @ramps_param.axis_z_steps_per_unit)
665
+ expect(FB::HardwareInterface.current.status.info_current_x ).to eq(x / @ramps_param.axis_x_steps_per_unit)
666
+ expect(FB::HardwareInterface.current.status.info_current_y ).to eq(y / @ramps_param.axis_y_steps_per_unit)
667
+ expect(FB::HardwareInterface.current.status.info_current_z ).to eq(z / @ramps_param.axis_z_steps_per_unit)
668
668
 
669
669
  end
670
670
 
@@ -1,18 +1,18 @@
1
1
  require 'spec_helper'
2
- describe Fb::HardwareInterfaceArduinoValuesReceived do
2
+ describe FB::HardwareInterfaceArduinoValuesReceived do
3
3
 
4
4
  before do
5
5
 
6
6
 
7
7
 
8
8
 
9
- Fb::HardwareInterface.current.status = Fb::Status.new
9
+ FB::HardwareInterface.current.status = FB::Status.new
10
10
 
11
- @ramps = Fb::HardwareInterfaceArduinoValuesReceived.new()
11
+ @ramps = FB::HardwareInterfaceArduinoValuesReceived.new()
12
12
 
13
- #@ramps = Fb::HardwareInterfaceArduino.new(true)
13
+ #@ramps = FB::HardwareInterfaceArduino.new(true)
14
14
 
15
- #@ramps_param = Fb::HardwareInterfaceParam.new
15
+ #@ramps_param = FB::HardwareInterfaceParam.new
16
16
  #@ramps.ramps_param = @ramps_param
17
17
 
18
18
  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.2
4
+ version: 0.0.4
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-23 00:00:00.000000000 Z
12
+ date: 2015-03-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -81,6 +81,20 @@ dependencies:
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: eventmachine
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: serialport
86
100
  requirement: !ruby/object:Gem::Requirement
@@ -103,15 +117,16 @@ extensions: []
103
117
  extra_rdoc_files: []
104
118
  files:
105
119
  - ".gitignore"
106
- - Gemfile
120
+ - ".rspec"
107
121
  - README.md
108
122
  - Rakefile
109
- - farmbot-serial.gemspec
123
+ - lib/arduino.rb
124
+ - lib/arduino_event_machine.rb
125
+ - lib/default_serial_port.rb
110
126
  - lib/farmbot-serial.rb
111
- - lib/hardware_interface_arduino.rb
112
127
  - lib/hardware_interface_arduino_values_received.rb
113
- - lib/hardware_interface_write_status.rb
114
- - lib/serial_port_sim.rb
128
+ - lib/outbound_message.rb
129
+ - spec/fixtures/stub_serial_port.rb
115
130
  - spec/lib/ramps_arduino_spec.rb
116
131
  - spec/lib/ramps_arduino_values_received_spec.rb
117
132
  - spec/spec_helper.rb
@@ -141,6 +156,7 @@ signing_key:
141
156
  specification_version: 4
142
157
  summary: Serial library for Farmbot
143
158
  test_files:
159
+ - spec/fixtures/stub_serial_port.rb
144
160
  - spec/lib/ramps_arduino_spec.rb
145
161
  - spec/lib/ramps_arduino_values_received_spec.rb
146
162
  - spec/spec_helper.rb
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'rspec'
4
- gem 'pry'
5
- gem 'simplecov'
6
- gem 'serialport'
@@ -1,27 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "farmbot-serial"
7
- spec.version = '0.0.2' # TODO: Fb::VERSION
8
- spec.authors = ["Tim Evers", "Rick Carlino"]
9
- spec.email = ["rick.carlino@gmail.com"]
10
- spec.description = "Serial library for Farmbot"
11
- spec.summary = "Serial library for Farmbot"
12
- spec.homepage = "http://github.com/farmbot/farmbot-serial"
13
- spec.license = "MIT"
14
-
15
- spec.files = `git ls-files`.split($/)
16
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ["lib"]
19
-
20
- spec.add_development_dependency "bundler"#, "~> 1.3"
21
- spec.add_development_dependency "rake"#, "~> 10.4"
22
- spec.add_development_dependency "rspec"#, "~> 3.2"
23
- spec.add_development_dependency "pry"#, "~> 0.10"
24
- spec.add_development_dependency "simplecov"#, "~> 0.9"
25
-
26
- spec.add_runtime_dependency "serialport"#, "~> 1.3"
27
- end
@@ -1,245 +0,0 @@
1
- ## HARDWARE INTERFACE
2
- ## ******************
3
-
4
- # Communicate with the arduino using a serial interface
5
- # All information is exchanged using a variation of g-code
6
- # Parameters are stored in the database
7
- module Fb
8
- class HardwareInterfaceArduino
9
-
10
- attr_accessor :serial_port
11
-
12
- attr_reader :is_busy
13
- attr_reader :is_error
14
- attr_reader :is_done
15
- attr_reader :return_values
16
-
17
- # initialize the interface
18
- #
19
- def initialize(test_mode)
20
- @status_debug_msg = $debug_msg
21
- @test_mode = test_mode
22
-
23
- # connect to arduino
24
- connect_board()
25
-
26
- @external_info = ""
27
- @return_values = Queue.new
28
-
29
- @is_busy = false
30
- @is_error = false
31
- @is_done = false
32
-
33
- end
34
-
35
- ## ARDUINO HANLDING
36
- ## ****************
37
-
38
- # connect to the serial port and start communicating with the arduino/firmata protocol
39
- #
40
- def connect_board
41
-
42
- parameters =
43
- {
44
- "baud" => 115200,
45
- "data_bits" => 8,
46
- "stop_bits" => 1,
47
- "parity" => SerialPort::NONE,
48
- "flow_control" => SerialPort::SOFT
49
- }
50
-
51
- comm_port = '/dev/ttyACM0'
52
- @serial_port = SerialPort.new(comm_port, parameters) if @test_mode == false
53
- @serial_port = SerialPortSim.new(comm_port, parameters) if @test_mode == true
54
-
55
- end
56
-
57
- # write a command to the robot
58
- #
59
- def write_command(text, log, onscreen)
60
- begin
61
-
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
68
-
69
- rescue => e
70
- handle_execution_exception(e)
71
- end
72
- end
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
81
- check_emergency_stop
82
- process_feedback(write_status)
83
- end
84
- rescue => e
85
- handle_execution_exception(e)
86
- end
87
- end
88
-
89
-
90
- def create_write_status(text, log, onscreen)
91
- write_status = Fb::HardwareInterfaceArduinoWriteStatus.new
92
- write_status.text = text
93
- write_status.log = log
94
-
95
- write_status.onscreen = onscreen
96
- write_status
97
- end
98
-
99
- def handle_execution_exception(e)
100
- puts("ST: serial error\n#{e.message}\n#{e.backtrace.inspect}")
101
- @serial_port.rts = 1
102
- connect_board
103
- @is_error = true
104
- end
105
-
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" )
113
- end
114
-
115
- # receive all characters coming from the serial port
116
- #
117
- def process_feedback(write_status)
118
- i = @serial_port.read(1)
119
-
120
- if i != nil
121
- i.each_char do |c|
122
- process_characters(write_status, c)
123
- end
124
- else
125
- sleep 0.001 if @test_mode == false
126
- end
127
- end
128
-
129
- # keep incoming characters in a buffer until it is a complete string
130
- #
131
- def process_characters(write_status, c)
132
-
133
- if c == "\r" or c == "\n"
134
- if write_status.received.length >= 3
135
- log_incoming_text(write_status)
136
- write_status.split_received
137
- process_code_and_params(write_status)
138
- end
139
- else
140
- write_status.received = write_status.received + c
141
- end
142
- end
143
-
144
- # handle the incoming message depending on the first code number
145
- #
146
- def process_code_and_params(write_status)
147
-
148
- # process the feedback
149
- case write_status.code
150
-
151
- # command received by arduino
152
- when 'R01'
153
- write_status.timeout = 90
154
-
155
- # command is finished
156
- when 'R02'
157
- write_status.done = 1
158
- @is_done = true
159
- # command is finished with errors
160
- when 'R03'
161
- write_status.done = 1
162
- @is_done = true
163
- # command is still ongoing
164
- when 'R04'
165
- write_status.start = Time.now
166
- write_status.timeout = 90
167
-
168
- # specific feedback that is processes separately
169
- else
170
- process_value(write_status.code,write_status.params)
171
- end
172
-
173
- write_status.received = ''
174
-
175
- end
176
-
177
- # empty the input buffer so no old data is processed
178
- #
179
- def clean_serial_buffer
180
- while (@serial_port.read(1) != nil)
181
- end
182
- end
183
-
184
- # write something to the serial port
185
- def serial_port_write(text)
186
- @serial_port.write( text )
187
- end
188
-
189
- # if there is an emergency stop, immediately write it to the arduino
190
- #
191
- def emergency_stop
192
- serial_port_write( "E\n" )
193
- end
194
-
195
- # write to log
196
- #
197
- def log_incoming_text(write_status)
198
- puts "RD: #{write_status.received}" if write_status.onscreen
199
- end
200
-
201
- # process values received from arduino
202
- #
203
- def process_value(code,text)
204
-
205
- # get all parameters in the current text
206
- return_value = process_value_split(code, text)
207
-
208
- # save the list for the client
209
- @return_values << return_value
210
-
211
- end
212
-
213
- def process_value_split(code, text)
214
-
215
- params = Fb::HardwareInterfaceArduinoValuesReceived.new
216
- params.code = code
217
- params.text = text
218
-
219
- # get all separate parameters from the text
220
- text.split(' ').each do |param|
221
-
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
226
- par_value = param[2..-1].to_i
227
- else
228
- par_name = param[0..0].to_s
229
- par_value = param[1..-1].to_i
230
- end
231
-
232
- params.load_parameter(par_name, par_value)
233
-
234
- end
235
-
236
- return params
237
- end
238
-
239
- def puts(*)
240
- # Too many messages in the test buffer right now. Will delete this later.
241
- # just disabling it for now.
242
- STDOUT.print('x')
243
- end
244
- end
245
- end
@@ -1,35 +0,0 @@
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
@@ -1,31 +0,0 @@
1
- ## SERIAL PORT SIMULATION
2
- ## **********************
3
-
4
- # Used for unit tests
5
-
6
- module Fb
7
- class SerialPortSim
8
- attr_accessor :rts, :read_timeout, :test_serial_read, :test_serial_write
9
-
10
- def initialize(comm_port, parameters)
11
- @test_serial_read = ""
12
- @test_serial_write = ""
13
- end
14
-
15
- def write(text)
16
- @test_serial_write = text
17
- end
18
-
19
- def read(characters)
20
- i = nil
21
- @test_serial_read = nil if @test_serial_read == ""
22
-
23
- if @test_serial_read != nil
24
- i = @test_serial_read[0]
25
- @test_serial_read = @test_serial_read[1..-1]
26
- end
27
- i
28
- end
29
-
30
- end
31
- end