dino 0.8
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.
- data/.gitignore +21 -0
- data/.rvmrc +1 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +14 -0
- data/Rakefile +2 -0
- data/dino.gemspec +19 -0
- data/examples/button/button.png +0 -0
- data/examples/button/button.rb +23 -0
- data/examples/ir_receiver.rb +33 -0
- data/examples/led/led.rb +14 -0
- data/examples/potentiometer.rb +26 -0
- data/examples/rgb_led.rb +39 -0
- data/examples/sensor.rb +18 -0
- data/examples/servo.rb +16 -0
- data/examples/stepper.rb +18 -0
- data/lib/dino.rb +15 -0
- data/lib/dino/board.rb +114 -0
- data/lib/dino/components/base_component.rb +33 -0
- data/lib/dino/components/button.rb +53 -0
- data/lib/dino/components/ir_receiver.rb +33 -0
- data/lib/dino/components/led.rb +20 -0
- data/lib/dino/components/rgb_led.rb +44 -0
- data/lib/dino/components/sensor.rb +23 -0
- data/lib/dino/components/servo.rb +20 -0
- data/lib/dino/components/stepper.rb +29 -0
- data/lib/dino/tx_rx.rb +58 -0
- data/lib/dino/version.rb +3 -0
- data/spec/lib/board_spec.rb +242 -0
- data/spec/lib/components/base_component_spec.rb +37 -0
- data/spec/lib/components/button_spec.rb +84 -0
- data/spec/lib/components/led_spec.rb +54 -0
- data/spec/lib/components/rgb_led_spec.rb +78 -0
- data/spec/lib/components/sensor_spec.rb +58 -0
- data/spec/lib/components/servo_spec.rb +53 -0
- data/spec/lib/components/stepper_spec.rb +60 -0
- data/spec/lib/tx_rx_spec.rb +78 -0
- data/spec/spec_helper.rb +3 -0
- data/src/du.ino +251 -0
- metadata +111 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe BaseComponent do
|
6
|
+
it 'should initialize with board and pin' do
|
7
|
+
pin = "a pin"
|
8
|
+
board = "a board"
|
9
|
+
component = BaseComponent.new(pin: pin, board: board)
|
10
|
+
|
11
|
+
component.pin.should == pin
|
12
|
+
component.board.should == board
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should assign pins' do
|
16
|
+
pins = {red: 'red', green: 'green', blue: 'blue'}
|
17
|
+
board = "a board"
|
18
|
+
component = BaseComponent.new(pins: pins, board: board)
|
19
|
+
|
20
|
+
component.pins.should == pins
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should require a pin or pins' do
|
24
|
+
expect {
|
25
|
+
BaseComponent.new(board: 'some board')
|
26
|
+
}.to raise_exception
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should require a board' do
|
30
|
+
expect {
|
31
|
+
BaseComponent.new(pin: 'some pin')
|
32
|
+
}.to raise_exception
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe Button do
|
6
|
+
describe '#initialize' do
|
7
|
+
it 'should raise if it does not receive a pin' do
|
8
|
+
expect {
|
9
|
+
Button.new(board: 'a board')
|
10
|
+
}.to raise_exception
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should raise if it does not receive a board' do
|
14
|
+
expect {
|
15
|
+
Button.new(pin: 'a pin')
|
16
|
+
}.to raise_exception
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should add itself to the board and start reading' do
|
20
|
+
board = mock(:board)
|
21
|
+
board.should_receive(:add_digital_hardware)
|
22
|
+
board.should_receive(:start_read)
|
23
|
+
Button.new(board: board, pin: 'a pin')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'callbacks' do
|
28
|
+
let(:board) { mock(:board, add_digital_hardware: true, start_read: true) }
|
29
|
+
let(:button) {Button.new(board: board, pin: mock)}
|
30
|
+
describe '#down' do
|
31
|
+
it 'should add a callback to the down_callbacks array' do
|
32
|
+
button.down(callback_mock = mock)
|
33
|
+
button.instance_variable_get(:@down_callbacks).should include callback_mock
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#up' do
|
38
|
+
it 'should add a callback to the up_callbacks array' do
|
39
|
+
button.up(callback_mock = mock)
|
40
|
+
button.instance_variable_get(:@up_callbacks).should include callback_mock
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#update' do
|
45
|
+
it 'should call the down callbacks' do
|
46
|
+
button.down(callback_mock1 = mock)
|
47
|
+
button.down(callback_mock2 = mock)
|
48
|
+
callback_mock1.should_receive(:call)
|
49
|
+
callback_mock2.should_receive(:call)
|
50
|
+
button.update(Button::DOWN)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should call the up callbacks' do
|
54
|
+
button.up(callback_mock1 = mock)
|
55
|
+
button.up(callback_mock2 = mock)
|
56
|
+
|
57
|
+
button.instance_variable_set(:@state, Button::DOWN)
|
58
|
+
|
59
|
+
callback_mock1.should_receive(:call)
|
60
|
+
callback_mock2.should_receive(:call)
|
61
|
+
button.update(Button::UP)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should not call the callbacks if the state has not changed' do
|
65
|
+
button.up(callback_mock = mock)
|
66
|
+
|
67
|
+
callback_mock.should_not_receive(:call)
|
68
|
+
button.update(Button::UP)
|
69
|
+
button.update(Button::UP)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should not call the callbacks if the data is not UP or DOWN' do
|
73
|
+
button.up(callback_mock1 = mock)
|
74
|
+
button.down(callback_mock2 = mock)
|
75
|
+
|
76
|
+
callback_mock1.should_not_receive(:call)
|
77
|
+
callback_mock2.should_not_receive(:call)
|
78
|
+
button.update('foobarred')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe Led do
|
6
|
+
let(:board) { mock(:board, digital_write: true, set_pin_mode: true) }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
it 'should raise if it does not receive a pin' do
|
10
|
+
expect {
|
11
|
+
Led.new(board: board)
|
12
|
+
}.to raise_exception
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should raise if it does not receive a board' do
|
16
|
+
expect {
|
17
|
+
Led.new(pins: {})
|
18
|
+
}.to raise_exception
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should set the pin to out' do
|
22
|
+
board.should_receive(:set_pin_mode).with(13, :out)
|
23
|
+
Led.new(pin: 13, board: board)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should set the pin to low' do
|
27
|
+
board.should_receive(:digital_write).with(13, Board::LOW)
|
28
|
+
Led.new(pin: 13, board: board)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#on' do
|
33
|
+
it 'should send a high to the board with the pin' do
|
34
|
+
@led = Led.new(pin: 13, board: board)
|
35
|
+
board.should_receive(:digital_write).with(13, Board::HIGH)
|
36
|
+
@led.on
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#off' do
|
41
|
+
it 'should send a high to the board with the pin' do
|
42
|
+
@led = Led.new(pin: 13, board: board)
|
43
|
+
board.should_receive(:digital_write).with(13, Board::LOW)
|
44
|
+
@led.off
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#blink' do
|
49
|
+
it 'should turn the led off if it is on'
|
50
|
+
it 'should not block'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe RgbLed do
|
6
|
+
let(:board) { mock(:board, analog_write: true, set_pin_mode: true) }
|
7
|
+
let(:pins) { {red: 1, green: 2, blue: 3} }
|
8
|
+
let!(:rgb) {RgbLed.new(pins: pins, board: board)}
|
9
|
+
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'should raise if it does not receive a pin' do
|
12
|
+
expect {
|
13
|
+
RgbLed.new(board: 'a board')
|
14
|
+
}.to raise_exception
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should raise if it does not receive a board' do
|
18
|
+
expect {
|
19
|
+
RgbLed.new(pins: pins)
|
20
|
+
}.to raise_exception
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should set the pin to out' do
|
24
|
+
board.should_receive(:set_pin_mode).with(1, :out)
|
25
|
+
board.should_receive(:set_pin_mode).with(2, :out)
|
26
|
+
board.should_receive(:set_pin_mode).with(3, :out)
|
27
|
+
|
28
|
+
RgbLed.new(pins: pins, board: board)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should set the pin to low' do
|
32
|
+
board.should_receive(:analog_write).with(1, Board::LOW)
|
33
|
+
board.should_receive(:analog_write).with(2, Board::LOW)
|
34
|
+
board.should_receive(:analog_write).with(3, Board::LOW)
|
35
|
+
|
36
|
+
RgbLed.new(pins: pins, board: board)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#red' do
|
41
|
+
it 'should set red to high, blue and green to low' do
|
42
|
+
board.should_receive(:analog_write).with(1, Board::HIGH)
|
43
|
+
board.should_receive(:analog_write).with(2, Board::LOW)
|
44
|
+
board.should_receive(:analog_write).with(3, Board::LOW)
|
45
|
+
rgb.red
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#green' do
|
50
|
+
it 'should set green to high, red and blue to low' do
|
51
|
+
board.should_receive(:analog_write).with(1, Board::LOW)
|
52
|
+
board.should_receive(:analog_write).with(2, Board::HIGH)
|
53
|
+
board.should_receive(:analog_write).with(3, Board::LOW)
|
54
|
+
rgb.green
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '#blue' do
|
59
|
+
it 'should set blue to high, red and green to low' do
|
60
|
+
board.should_receive(:analog_write).with(1, Board::LOW)
|
61
|
+
board.should_receive(:analog_write).with(2, Board::LOW)
|
62
|
+
board.should_receive(:analog_write).with(3, Board::HIGH)
|
63
|
+
rgb.blue
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#blinky' do
|
68
|
+
it 'should set blue to high, red and green to low' do
|
69
|
+
Array.any_instance.should_receive(:cycle).and_yield(:red).and_yield(:green).and_yield(:blue)
|
70
|
+
rgb.should_receive(:red)
|
71
|
+
rgb.should_receive(:green)
|
72
|
+
rgb.should_receive(:blue)
|
73
|
+
rgb.blinky
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe Sensor do
|
6
|
+
|
7
|
+
let(:board){mock(:board).as_null_object}
|
8
|
+
|
9
|
+
describe '#initalize' do
|
10
|
+
it 'should raise if it does not receive a pin' do
|
11
|
+
expect {
|
12
|
+
Sensor.new(board: 'a board')
|
13
|
+
}.to raise_exception
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should raise if it does not receive a board' do
|
17
|
+
expect {
|
18
|
+
Sensor.new(pin: 'a pin')
|
19
|
+
}.to raise_exception
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should add itself to the board and start reading' do
|
23
|
+
board.should_receive(:add_analog_hardware)
|
24
|
+
board.should_receive(:start_read)
|
25
|
+
Sensor.new(board: board, pin: 'a pin')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should initalize data_callbacks' do
|
29
|
+
sensor = Sensor.new(board: board, pin: 'a pin')
|
30
|
+
sensor.instance_variable_get(:@data_callbacks).should == []
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#when_data_received' do
|
35
|
+
it 'should add a callback back to the list of callbacks' do
|
36
|
+
sensor = Sensor.new(board: board, pin: 'a pin')
|
37
|
+
sensor.when_data_received 'Foo'
|
38
|
+
sensor.instance_variable_get(:@data_callbacks).should == ['Foo']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#update' do
|
43
|
+
it 'should call all callbacks passing in the given data' do
|
44
|
+
first_callback, second_callback = mock, mock
|
45
|
+
first_callback.should_receive(:call).with('Some data')
|
46
|
+
second_callback.should_receive(:call).with('Some data')
|
47
|
+
|
48
|
+
sensor = Sensor.new(board: board, pin: 'a pin')
|
49
|
+
|
50
|
+
sensor.when_data_received first_callback
|
51
|
+
sensor.when_data_received second_callback
|
52
|
+
|
53
|
+
sensor.update('Some data')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe Servo do
|
6
|
+
let(:board) { mock(:board, analog_write: true, set_pin_mode: true) }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
it 'should raise if it does not receive a pin' do
|
10
|
+
expect {
|
11
|
+
Servo.new(board: board)
|
12
|
+
}.to raise_exception
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should raise if it does not receive a board' do
|
16
|
+
expect {
|
17
|
+
Servo.new(pin: 13)
|
18
|
+
}.to raise_exception
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should set the pins to out' do
|
22
|
+
board.should_receive(:set_pin_mode).with(13, :out)
|
23
|
+
Servo.new(pin: 13, board: board)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should set the inital position to 0' do
|
27
|
+
servo = Servo.new(pin: 13, board: board)
|
28
|
+
servo.instance_variable_get(:@position).should == 0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#position' do
|
33
|
+
let(:servo) {servo = Servo.new(pin: 13, board: board)}
|
34
|
+
|
35
|
+
it 'should set the position of the Servo' do
|
36
|
+
servo.position = 90
|
37
|
+
servo.instance_variable_get(:@position).should == 90
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should modulate the position at 180' do
|
41
|
+
servo.position = 190
|
42
|
+
servo.instance_variable_get(:@position).should == 10
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should write the new position to the board' do
|
46
|
+
servo.should_receive(:analog_write).with(10)
|
47
|
+
servo.position = 190
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
module Components
|
5
|
+
describe Stepper do
|
6
|
+
let(:board) { mock(:board, digital_write: true, set_pin_mode: true) }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
it 'should raise if it does not receive a step pin' do
|
10
|
+
expect {
|
11
|
+
Stepper.new(board: board)
|
12
|
+
}.to raise_exception
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should raise if it does not receive a direction pin' do
|
16
|
+
expect {
|
17
|
+
Stepper.new(board: board)
|
18
|
+
}.to raise_exception
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should raise if it does not receive a board' do
|
22
|
+
expect {
|
23
|
+
Stepper.new(pins: {step: 12, direction: 13})
|
24
|
+
}.to raise_exception
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should set the pins to out' do
|
28
|
+
board.should_receive(:set_pin_mode).with(13, :out)
|
29
|
+
board.should_receive(:set_pin_mode).with(12, :out)
|
30
|
+
Stepper.new(pins: {step: 13, direction: 12}, board: board)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should set the step pin to low' do
|
34
|
+
board.should_receive(:digital_write).with(13, Board::LOW)
|
35
|
+
Stepper.new(pins: {step: 13, direction: 12}, board: board)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#step_cc' do
|
40
|
+
it 'should send a high to the board with the pin' do
|
41
|
+
@stepper = Stepper.new(pins: {step: 13, direction: 12}, board: board)
|
42
|
+
board.should_receive(:digital_write).with(12, Board::HIGH)
|
43
|
+
board.should_receive(:digital_write).with(13, Board::HIGH)
|
44
|
+
board.should_receive(:digital_write).with(13, Board::LOW)
|
45
|
+
@stepper.step_cc
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#step_cw' do
|
50
|
+
it 'should send a high to the board with the pin' do
|
51
|
+
@stepper = Stepper.new(pins: {step: 13, direction: 12}, board: board)
|
52
|
+
board.should_receive(:digital_write).with(12, Board::LOW)
|
53
|
+
board.should_receive(:digital_write).with(13, Board::HIGH)
|
54
|
+
board.should_receive(:digital_write).with(13, Board::LOW)
|
55
|
+
@stepper.step_cw
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dino
|
4
|
+
describe TxRx do
|
5
|
+
it { should be }
|
6
|
+
|
7
|
+
describe '#initialize' do
|
8
|
+
it 'should set first_write to false' do
|
9
|
+
TxRx.new.instance_variable_get(:@first_write).should == true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#io' do
|
14
|
+
it 'should instantiate a new SerialPort for each usb tty device found' do
|
15
|
+
subject.should_receive(:tty_devices).and_return(['cu.usb', 'tty1.usb', 'tty2.usb'])
|
16
|
+
SerialPort.should_receive(:new).with('/dev/tty1.usb', TxRx::BAUD).and_return(mock_serial = mock)
|
17
|
+
SerialPort.should_receive(:new).with('/dev/tty2.usb', TxRx::BAUD).and_return(mock)
|
18
|
+
|
19
|
+
subject.io.should == mock_serial
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should use the existing io instance if set' do
|
23
|
+
subject.should_not_receive(:tty_devices)
|
24
|
+
SerialPort.stub(:new).and_return(mock_serial = mock)
|
25
|
+
|
26
|
+
subject.io = '/dev/tty1.usb'
|
27
|
+
subject.io.should == mock_serial
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#io=' do
|
32
|
+
it 'should set io to a new serial port with the specified device' do
|
33
|
+
SerialPort.should_receive(:new).with('/dev/tty1.usb', TxRx::BAUD).and_return(mock_serial = mock)
|
34
|
+
subject.io = '/dev/tty1.usb'
|
35
|
+
subject.instance_variable_get(:@io).should == mock_serial
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#read' do
|
40
|
+
it 'should create a new thread' do
|
41
|
+
Thread.should_receive :new
|
42
|
+
subject.read
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should get messages from the device' do
|
46
|
+
subject.stub(:io).and_return(mock_serial = mock)
|
47
|
+
|
48
|
+
IO.should_receive(:select).and_return(true)
|
49
|
+
Thread.should_receive(:new).and_yield
|
50
|
+
subject.should_receive(:loop).and_yield
|
51
|
+
mock_serial.should_receive(:gets).and_return("foo::bar\n")
|
52
|
+
subject.should_receive(:changed).and_return(true)
|
53
|
+
subject.should_receive(:notify_observers).with('foo','bar')
|
54
|
+
|
55
|
+
subject.read
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#close_read' do
|
60
|
+
it 'should kill the reading thread' do
|
61
|
+
subject.instance_variable_set(:@thread, mock_thread = mock)
|
62
|
+
Thread.should_receive(:kill).with(mock_thread)
|
63
|
+
subject.read
|
64
|
+
subject.close_read
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#write' do
|
69
|
+
it 'should write to the device' do
|
70
|
+
IO.should_receive(:select).and_return(true)
|
71
|
+
|
72
|
+
subject.stub(:io).and_return(mock_serial = mock)
|
73
|
+
mock_serial.should_receive(:puts).with('a message')
|
74
|
+
subject.write('a message')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|