farmbot-serial 0.3.0 → 0.3.1
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/arduino.rb +5 -1
- data/lib/arduino/outgoing_handler.rb +6 -2
- data/lib/arduino/status.rb +1 -5
- data/lib/default_serial_port.rb +1 -0
- data/spec/fakes/fake_arduino.rb +1 -0
- data/spec/lib/arduino/outgoing_handler_spec.rb +76 -0
- data/spec/lib/arduino/status_spec.rb +15 -0
- data/spec/lib/arduino_spec.rb +41 -17
- data/spec/spec_helper.rb +2 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7218c2ba0e30dadcc95541989c77a39c7cb45983
|
4
|
+
data.tar.gz: 8cf08101df89cc74f18f0e78ed5fbe9f81a00d13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c1c83d20b6c46fba884cdc3b39ecd502ef7e6ffe243cd0e214296f120702c98ec29350d980b02daddad9a34f87e8bef1d004b7fc0a659b5ddf0ca49124e0ebc
|
7
|
+
data.tar.gz: c71840a5bac1d79eb389c9b7f772529b4154df7e4a0e60529ab427aca79a75c8de2297b83e79726568dddbba23736f2a71d6702339baae07884aa783e27cbc76
|
data/lib/arduino.rb
CHANGED
@@ -68,6 +68,10 @@ module FB
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
def next_cmd
|
72
|
+
outbound_queue.first
|
73
|
+
end
|
74
|
+
|
71
75
|
def pop_gcode_off_queue
|
72
76
|
gcode = @outbound_queue.pop
|
73
77
|
if gcode.is_a?(FB::Gcode)
|
@@ -83,7 +87,7 @@ module FB
|
|
83
87
|
def start_event_listeners
|
84
88
|
status.onchange { |diff| @onchange.call(diff) if @onchange }
|
85
89
|
inbound_queue.subscribe do |gcodes|
|
86
|
-
gcodes.each do |gcode|
|
90
|
+
Array(gcodes).each do |gcode|
|
87
91
|
parse_incoming(gcode)
|
88
92
|
@onmessage.call(gcode) if @onmessage
|
89
93
|
end
|
@@ -17,8 +17,9 @@ module FB
|
|
17
17
|
|
18
18
|
def move_relative(x: 0, y: 0, z: 0, s: 100)
|
19
19
|
write do
|
20
|
-
#
|
21
|
-
#
|
20
|
+
# REMEBER: YOU NEVER WANT TO MUTATE VARIABLES HERE. If you mutate vars
|
21
|
+
# in a block, it will result in the return value getting incremented
|
22
|
+
# every time the value is read. For this reason, we use ||= and not =.
|
22
23
|
x1 ||= [(bot.current_position.x + (x || 0)), 0].max
|
23
24
|
y1 ||= [(bot.current_position.y + (y || 0)), 0].max
|
24
25
|
z1 ||= [(bot.current_position.z + (z || 0)), 0].max
|
@@ -28,6 +29,9 @@ module FB
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def move_absolute(x: 0, y: 0, z: 0, s: 100)
|
32
|
+
x = [x.to_i, 0].max
|
33
|
+
y = [y.to_i, 0].max
|
34
|
+
z = [z.to_i, 0].max
|
31
35
|
write { "G00 X#{x} Y#{y} Z#{z}" }
|
32
36
|
end
|
33
37
|
|
data/lib/arduino/status.rb
CHANGED
@@ -20,11 +20,7 @@ module FB
|
|
20
20
|
def []=(register, value)
|
21
21
|
transaction do
|
22
22
|
register = register.upcase.to_sym
|
23
|
-
if @info.members.include?(register)
|
24
|
-
@info[register] = value
|
25
|
-
else
|
26
|
-
bot.log "Ignoring attempt to set unknown status value: #{register}"
|
27
|
-
end
|
23
|
+
@info[register] = value if @info.members.include?(register)
|
28
24
|
end
|
29
25
|
end
|
30
26
|
|
data/lib/default_serial_port.rb
CHANGED
data/spec/fakes/fake_arduino.rb
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FB::ArduinoEventMachine do
|
4
|
+
|
5
|
+
let(:handler) { FB::OutgoingHandler.new(FakeArduino.new) }
|
6
|
+
let(:bot) { handler.bot }
|
7
|
+
it 'initializes' do
|
8
|
+
handler
|
9
|
+
expect(handler.bot).to be_kind_of(FB::Arduino)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'emergency_stop()s' do
|
13
|
+
10.times { handler.move_relative(x: 1) }
|
14
|
+
|
15
|
+
handler.emergency_stop
|
16
|
+
|
17
|
+
expect(bot.outbound_queue.length).to eq(0)
|
18
|
+
expect(bot.status[:LAST]).to eq(:emergency_stop)
|
19
|
+
expect(bot.serial_port.message).to eq('E')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'adjusts relative movements to bots position RIGHT NOW' do
|
23
|
+
handler.move_relative(x: 1, y: 2, z: 3)
|
24
|
+
expect(bot.next_cmd.to_s).to eq("G0 X1 Y2 Z3")
|
25
|
+
[:x, :y, :z].each { |pos| bot.status[pos] = 3 }
|
26
|
+
expect(bot.next_cmd.to_s).to eq("G0 X4 Y5 Z6")
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'never goes behind the 0 line' do
|
30
|
+
handler.move_relative(x: -999, y: -999, z: -999)
|
31
|
+
expect(bot.outbound_queue.first.value_of(:x)).to eq(0)
|
32
|
+
expect(bot.outbound_queue.first.value_of(:y)).to eq(0)
|
33
|
+
expect(bot.outbound_queue.first.value_of(:z)).to eq(0)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'Moves absolute' do
|
37
|
+
[:x, :y, :z].each { |pos| bot.status[pos] = 300 }
|
38
|
+
handler.move_absolute(x: 5, y: 6, z: 7)
|
39
|
+
expect(bot.next_cmd.to_s).to eq("G0 X5 Y6 Z7")
|
40
|
+
handler.move_absolute(x: 7, y: 8, z: 9)
|
41
|
+
expect(bot.next_cmd.to_s).to eq("G0 X7 Y8 Z9")
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'Never goes farther than 0 when moving absolute' do
|
45
|
+
handler.move_absolute(x: -987, y: -654, z: -321)
|
46
|
+
expect(bot.next_cmd.to_s).to eq("G0 X0 Y0 Z0")
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'homes x, y, z, all' do
|
50
|
+
handler.home_x
|
51
|
+
expect(bot.next_cmd.to_s).to eq("F11")
|
52
|
+
handler.home_y
|
53
|
+
expect(bot.next_cmd.to_s).to eq("F12")
|
54
|
+
handler.home_z
|
55
|
+
expect(bot.next_cmd.to_s).to eq("F13")
|
56
|
+
handler.home_all
|
57
|
+
expect(bot.next_cmd.to_s).to eq("G28")
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'reads / writes parameters' do
|
61
|
+
handler.read_parameter(0)
|
62
|
+
expect(bot.next_cmd.to_s).to eq("F21 P0")
|
63
|
+
handler.write_parameter(0, 1)
|
64
|
+
expect(bot.next_cmd.to_s).to eq("F22 P0 V1")
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'reads status' do
|
68
|
+
handler.read_status(0)
|
69
|
+
expect(bot.next_cmd.to_s).to eq("F31 P0")
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'writes to a pin' do
|
73
|
+
handler.pin_write(pin: 0, value: 1, mode: 3)
|
74
|
+
expect(bot.next_cmd.to_s).to eq("F41 P0 V1 M3")
|
75
|
+
end
|
76
|
+
end
|
@@ -36,5 +36,20 @@ describe FB::IncomingHandler do
|
|
36
36
|
expect(status[:busy]).to eq(1)
|
37
37
|
expect(@diff).to eq(:BUSY => 1)
|
38
38
|
end
|
39
|
+
|
40
|
+
it 'Updates status registers directly from GCode' do
|
41
|
+
command = FB::Gcode.new { "A1 X88 Y77 Z66" }
|
42
|
+
status.gcode_update(command)
|
43
|
+
expect(status[:x]).to eq(88)
|
44
|
+
expect(status[:y]).to eq(77)
|
45
|
+
expect(status[:z]).to eq(66)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'reads known and unknow pin values' do
|
49
|
+
status.set_pin(1, 1)
|
50
|
+
expect(status.pin(1)).to eq(:on)
|
51
|
+
expect(status.pin(2)).to eq(:unknown)
|
52
|
+
end
|
53
|
+
|
39
54
|
end
|
40
55
|
|
data/spec/lib/arduino_spec.rb
CHANGED
@@ -3,18 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe FB::Arduino do
|
4
4
|
let(:logger) { FakeLogger.new }
|
5
5
|
let(:serial_port) { FakeSerialPort.new }
|
6
|
+
let(:command) { FB::Gcode.new { 'A1 B2 C3' } }
|
6
7
|
let(:bot) do
|
7
8
|
FB::Arduino.new(serial_port: serial_port, logger: logger)
|
8
9
|
end
|
9
10
|
|
10
11
|
|
11
|
-
it
|
12
|
+
it 'logs' do
|
12
13
|
bot.log 'Hello, world!'
|
13
14
|
expect(logger.message).to eq('Hello, world!')
|
14
15
|
end
|
15
16
|
|
16
17
|
|
17
|
-
it
|
18
|
+
it 'initializes' do
|
18
19
|
expect(bot).to be_kind_of(FB::Arduino)
|
19
20
|
expect(bot.serial_port).to be_kind_of(FakeSerialPort)
|
20
21
|
expect(bot.logger).to be_kind_of(StringIO)
|
@@ -25,17 +26,17 @@ describe FB::Arduino do
|
|
25
26
|
end
|
26
27
|
|
27
28
|
it 'prints to the logger object' do
|
28
|
-
bot.log
|
29
|
-
expect(logger.message).to eq(
|
29
|
+
bot.log 'Hello, World!'
|
30
|
+
expect(logger.message).to eq('Hello, World!')
|
30
31
|
end
|
31
32
|
|
32
33
|
it 'writes to outbound command queue' do
|
33
|
-
bot.write(
|
34
|
-
expect(bot.outbound_queue).to include(
|
34
|
+
bot.write('A1 B2 C3')
|
35
|
+
expect(bot.outbound_queue).to include('A1 B2 C3')
|
35
36
|
end
|
36
37
|
|
37
|
-
it
|
38
|
-
yowza = ->{ bot.log
|
38
|
+
it 'sets change/message/close callbacks' do
|
39
|
+
yowza = ->{ bot.log 'QQQ' }
|
39
40
|
bot.onmessage(&yowza)
|
40
41
|
bot.onclose(&yowza)
|
41
42
|
bot.onchange(&yowza)
|
@@ -44,16 +45,16 @@ describe FB::Arduino do
|
|
44
45
|
expect(bot.instance_variable_get(:@onchange)).to be(yowza)
|
45
46
|
end
|
46
47
|
|
47
|
-
it
|
48
|
+
it 'calls onclose callback via disconnect()' do
|
48
49
|
calls = []
|
49
|
-
bot.onclose { calls <<
|
50
|
+
bot.onclose { calls << 'Hey!' }
|
50
51
|
bot.disconnect
|
51
|
-
expect(logger.message).to eq(
|
52
|
+
expect(logger.message).to eq('Connection to device lost')
|
52
53
|
expect(calls.length).to eq(1)
|
53
|
-
expect(calls).to include(
|
54
|
+
expect(calls).to include('Hey!')
|
54
55
|
end
|
55
56
|
|
56
|
-
it
|
57
|
+
it 'reports current_position' do
|
57
58
|
bot.status[:x] = 1
|
58
59
|
bot.status[:y] = 2
|
59
60
|
bot.status[:z] = 3
|
@@ -62,15 +63,38 @@ describe FB::Arduino do
|
|
62
63
|
expect(bot.current_position.z).to eq(3)
|
63
64
|
end
|
64
65
|
|
65
|
-
it
|
66
|
-
command = FB::Gcode.new { "A1 B2 C3" }
|
66
|
+
it 'pops gcode off queue' do
|
67
67
|
bot.outbound_queue.push(command)
|
68
68
|
expect(bot.outbound_queue.length).to eq(1)
|
69
69
|
within_event_loop { bot.pop_gcode_off_queue }
|
70
70
|
expect(bot.outbound_queue.length).to eq(0)
|
71
|
-
expect(serial_port.message).to eq(
|
71
|
+
expect(serial_port.message).to eq('A1 B2 C3')
|
72
72
|
expect(bot.status.ready?).to be_falsey
|
73
73
|
expect(bot.status[:last]).to eq(:unknown)
|
74
74
|
end
|
75
|
-
end
|
76
75
|
|
76
|
+
it 'starts event listeners' do
|
77
|
+
called_onmessage = 0
|
78
|
+
called_onchange = 0
|
79
|
+
bot.inbound_queue.push(command)
|
80
|
+
|
81
|
+
bot.onmessage do |msg|
|
82
|
+
called_onmessage += 1
|
83
|
+
bot.status[:X] = 33
|
84
|
+
end
|
85
|
+
|
86
|
+
bot.onchange do |diff|
|
87
|
+
called_onchange += 1
|
88
|
+
end
|
89
|
+
|
90
|
+
within_event_loop { bot }
|
91
|
+
|
92
|
+
expect(called_onmessage).to eq(1)
|
93
|
+
expect(called_onchange).to eq(1)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'Flips out if a message is not a GCode object.' do
|
97
|
+
bot.inbound_queue.push "I don't think so!"
|
98
|
+
expect { bot.pop_gcode_off_queue }.to raise_error(TypeError)
|
99
|
+
end
|
100
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,9 +15,9 @@ end
|
|
15
15
|
|
16
16
|
# This is used for testing things that require an event loop. Once run, you can
|
17
17
|
# observe / make assertions on side effects.
|
18
|
-
def within_event_loop
|
18
|
+
def within_event_loop(ticks_remaining = 1)
|
19
19
|
EM.run do
|
20
|
+
EventMachine::PeriodicTimer.new(0.1) { EM.stop }
|
20
21
|
yield
|
21
|
-
EM.next_tick { EM.stop }
|
22
22
|
end
|
23
23
|
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.3.
|
4
|
+
version: 0.3.1
|
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-04-
|
12
|
+
date: 2015-04-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- spec/fakes/fake_logger.rb
|
135
135
|
- spec/fakes/fake_serial_port.rb
|
136
136
|
- spec/lib/arduino/event_machine_spec.rb
|
137
|
+
- spec/lib/arduino/outgoing_handler_spec.rb
|
137
138
|
- spec/lib/arduino/status_spec.rb
|
138
139
|
- spec/lib/arduino_spec.rb
|
139
140
|
- spec/lib/gcode_spec.rb
|
@@ -167,7 +168,9 @@ test_files:
|
|
167
168
|
- spec/fakes/fake_logger.rb
|
168
169
|
- spec/fakes/fake_serial_port.rb
|
169
170
|
- spec/lib/arduino/event_machine_spec.rb
|
171
|
+
- spec/lib/arduino/outgoing_handler_spec.rb
|
170
172
|
- spec/lib/arduino/status_spec.rb
|
171
173
|
- spec/lib/arduino_spec.rb
|
172
174
|
- spec/lib/gcode_spec.rb
|
173
175
|
- spec/spec_helper.rb
|
176
|
+
has_rdoc:
|