wall_e 0.0.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.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +11 -0
- data/cookbook/Led/blink.rb +14 -0
- data/cookbook/Led/fade_in.rb +19 -0
- data/cookbook/Led/fade_out.rb +16 -0
- data/cookbook/Led/pulse.rb +20 -0
- data/cookbook/Piezo/morse_code.rb +83 -0
- data/cookbook/Servo/sweep.rb +18 -0
- data/lib/wall_e.rb +97 -0
- data/lib/wall_e/components/led.rb +68 -0
- data/lib/wall_e/components/piezo.rb +45 -0
- data/lib/wall_e/components/servo.rb +56 -0
- data/lib/wall_e/logger.rb +15 -0
- data/lib/wall_e/pin.rb +84 -0
- data/lib/wall_e/serial_snoop.rb +37 -0
- data/lib/wall_e/version.rb +3 -0
- data/test/led_test.rb +66 -0
- data/test/piezo_test.rb +31 -0
- data/test/pin_test.rb +82 -0
- data/test/serial_snoop_test.rb +29 -0
- data/test/servo_test.rb +71 -0
- data/test/test_helper.rb +3 -0
- data/wall_e.gemspec +23 -0
- metadata +141 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 'Mike Breen'
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# WallE
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'wall_e'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install wall_e
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'wall_e'
|
3
|
+
|
4
|
+
WallE::Assembler.build do
|
5
|
+
|
6
|
+
led = Led(9)
|
7
|
+
|
8
|
+
direction = 1000 / (255 * 2)
|
9
|
+
|
10
|
+
repeat do
|
11
|
+
|
12
|
+
direction = 1 if led.value.zero?
|
13
|
+
|
14
|
+
direction = -1 if led.value == 255
|
15
|
+
|
16
|
+
led.brightness(led.value + direction)
|
17
|
+
|
18
|
+
delay 0.01
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'wall_e'
|
3
|
+
|
4
|
+
class MorseCode
|
5
|
+
|
6
|
+
LETTERS = {
|
7
|
+
"a" => ".-",
|
8
|
+
"b" => "-...",
|
9
|
+
"c" => "-.-.",
|
10
|
+
"d" => "-..",
|
11
|
+
"e" => ".",
|
12
|
+
"f" => "..-.",
|
13
|
+
"g" => "--.",
|
14
|
+
"h" => "....",
|
15
|
+
"i" => "..",
|
16
|
+
"j" => ".---",
|
17
|
+
"k" => "-.-",
|
18
|
+
"l" => ".-..",
|
19
|
+
"m" => "--",
|
20
|
+
"o" => "---",
|
21
|
+
"p" => ".--.",
|
22
|
+
"q" => "--.-",
|
23
|
+
"r" => ".-.",
|
24
|
+
"s" => "...",
|
25
|
+
"t" => "-",
|
26
|
+
"u" => "..-",
|
27
|
+
"v" => "...-",
|
28
|
+
"w" => ".--",
|
29
|
+
"x" => "-..-",
|
30
|
+
"y" => "-.--",
|
31
|
+
"z" => "--.."
|
32
|
+
}
|
33
|
+
|
34
|
+
def initialize(piezo)
|
35
|
+
@piezo = piezo
|
36
|
+
@dit_length = 0.15
|
37
|
+
@dah_length = @dit_length * 3
|
38
|
+
@space_length = @dit_length * 7
|
39
|
+
@tone = 1275
|
40
|
+
end
|
41
|
+
|
42
|
+
def dit
|
43
|
+
puts '.'
|
44
|
+
output(@dit_length)
|
45
|
+
end
|
46
|
+
|
47
|
+
def dah
|
48
|
+
puts '-'
|
49
|
+
output(@dah_length)
|
50
|
+
end
|
51
|
+
|
52
|
+
def output(duration)
|
53
|
+
@piezo.on(@tone)
|
54
|
+
sleep(duration)
|
55
|
+
@piezo.off
|
56
|
+
sleep(@dit_length)
|
57
|
+
end
|
58
|
+
|
59
|
+
def say(string)
|
60
|
+
string.each_char do |letter|
|
61
|
+
pattern = LETTERS[letter.downcase]
|
62
|
+
if pattern.nil?
|
63
|
+
sleep @space_length
|
64
|
+
else
|
65
|
+
pattern.each_char do |p|
|
66
|
+
case p
|
67
|
+
when '.' then dit
|
68
|
+
when '-' then dah
|
69
|
+
end
|
70
|
+
end
|
71
|
+
sleep @dah_length
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
WallE::Assembler.build do
|
78
|
+
piezo = Piezo(9)
|
79
|
+
|
80
|
+
mc = MorseCode.new(piezo)
|
81
|
+
|
82
|
+
mc.say('Hello World')
|
83
|
+
end
|
data/lib/wall_e.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'wall_e/version'
|
2
|
+
require 'wall_e/serial_snoop'
|
3
|
+
require 'wall_e/pin'
|
4
|
+
require 'pry'
|
5
|
+
|
6
|
+
require 'wall_e/components/led'
|
7
|
+
require 'wall_e/components/servo'
|
8
|
+
require 'wall_e/components/piezo'
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
module WallE
|
13
|
+
class Assembler
|
14
|
+
|
15
|
+
attr_reader :board
|
16
|
+
|
17
|
+
def self.build(&block)
|
18
|
+
|
19
|
+
arduino = SerialSnoop.locate_ports
|
20
|
+
|
21
|
+
wall_e = new(arduino)
|
22
|
+
|
23
|
+
wall_e.instance_eval(&block)
|
24
|
+
|
25
|
+
Pry.start(wall_e, :prompt => [ proc { |obj, *| "wall_e > " }, proc { |obj, *| "wall_e* "} ])
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(arduino)
|
29
|
+
@board = arduino
|
30
|
+
@board.connect unless arduino.connected?
|
31
|
+
@running = true
|
32
|
+
@group = ThreadGroup.new
|
33
|
+
|
34
|
+
Thread.new do
|
35
|
+
loop do
|
36
|
+
begin
|
37
|
+
arduino.read_and_process
|
38
|
+
sleep(0.5)
|
39
|
+
rescue Exception => e
|
40
|
+
puts e.message
|
41
|
+
puts e.backtrace.inspect
|
42
|
+
Thread.kill
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def Led(pin_number)
|
49
|
+
pin = Pin.new(pin_number, @board)
|
50
|
+
Led.new(pin)
|
51
|
+
end
|
52
|
+
|
53
|
+
def Servo(pin_number, options = {})
|
54
|
+
pin = Pin.new(pin_number, @board)
|
55
|
+
Servo.new(pin, options)
|
56
|
+
end
|
57
|
+
|
58
|
+
def Piezo(pin_number)
|
59
|
+
pin = Pin.new(pin_number, @board)
|
60
|
+
Piezo.new(pin)
|
61
|
+
end
|
62
|
+
|
63
|
+
def delay(seconds)
|
64
|
+
@board.delay seconds
|
65
|
+
end
|
66
|
+
|
67
|
+
def pause
|
68
|
+
@running = false
|
69
|
+
end
|
70
|
+
|
71
|
+
def resume
|
72
|
+
@running = true
|
73
|
+
@group.list.each(&:wakeup)
|
74
|
+
end
|
75
|
+
|
76
|
+
def turn_off
|
77
|
+
@group.list.each(&:kill)
|
78
|
+
end
|
79
|
+
|
80
|
+
def repeat(&block)
|
81
|
+
t = Thread.new do
|
82
|
+
loop do
|
83
|
+
Thread.stop unless @running
|
84
|
+
begin
|
85
|
+
block.call
|
86
|
+
rescue Exception => e
|
87
|
+
puts e.message
|
88
|
+
puts e.backtrace.inspect
|
89
|
+
Thread.kill
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
@group.add(t)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module WallE
|
2
|
+
class Led
|
3
|
+
|
4
|
+
# Public: Initialize an LED
|
5
|
+
#
|
6
|
+
# pin - the Pin the LED is attached to.
|
7
|
+
def initialize(pin)
|
8
|
+
@pin = pin
|
9
|
+
@is_on = false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Public: Turn the LED on.
|
13
|
+
#
|
14
|
+
# Returns nothing.
|
15
|
+
def on
|
16
|
+
@pin.set_mode(Pin::OUTPUT)
|
17
|
+
@pin.digital_write(Pin::HIGH)
|
18
|
+
@is_on = true
|
19
|
+
end
|
20
|
+
|
21
|
+
# Public: Turn the LED off.
|
22
|
+
#
|
23
|
+
# Returns nothing.
|
24
|
+
def off
|
25
|
+
@pin.set_mode(Pin::OUTPUT)
|
26
|
+
@pin.digital_write(Pin::LOW)
|
27
|
+
@is_on = false
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Set the brightness of the LED.
|
31
|
+
#
|
32
|
+
# Returns nothing.
|
33
|
+
def brightness(value)
|
34
|
+
@pin.set_mode(Pin::PWM)
|
35
|
+
@pin.analog_write(value)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: Indicates if the LED is currently on.
|
39
|
+
#
|
40
|
+
# Returns Boolean.
|
41
|
+
def on?
|
42
|
+
@is_on
|
43
|
+
end
|
44
|
+
|
45
|
+
# Public: Indicates if the LED is current off.
|
46
|
+
def off?
|
47
|
+
!on?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Public: Toggle the LED on or off.
|
51
|
+
#
|
52
|
+
# Returns nothing.
|
53
|
+
def toggle
|
54
|
+
if on?
|
55
|
+
off
|
56
|
+
else
|
57
|
+
on
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Public: The current value of the LED.
|
62
|
+
#
|
63
|
+
# Returns Integer value.
|
64
|
+
def value
|
65
|
+
@pin.value
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module WallE
|
2
|
+
class Piezo
|
3
|
+
|
4
|
+
# Public: Initialize a Piezo
|
5
|
+
#
|
6
|
+
# pin - the Pin the piezo is attached to
|
7
|
+
def initialize(pin)
|
8
|
+
@pin = pin
|
9
|
+
@pin.set_mode(Pin::PWM)
|
10
|
+
@is_on = false
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Turn the piezo on.
|
14
|
+
#
|
15
|
+
# tone - the Integer tone to play.
|
16
|
+
#
|
17
|
+
# Returns nothing.
|
18
|
+
def on(tone)
|
19
|
+
@is_on = true
|
20
|
+
@pin.analog_write(tone)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Turn the piezo off.
|
24
|
+
#
|
25
|
+
# Returns nothing.
|
26
|
+
def off
|
27
|
+
@is_on = false
|
28
|
+
@pin.analog_write(0)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Public: Indicates if the piezo is currently on.
|
32
|
+
#
|
33
|
+
# Returns Boolean.
|
34
|
+
def on?
|
35
|
+
@is_on
|
36
|
+
end
|
37
|
+
|
38
|
+
# Pubilc: Indicates if the piezo is currently off.
|
39
|
+
#
|
40
|
+
# Returns Boolean.
|
41
|
+
def off?
|
42
|
+
!@is_on
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module WallE
|
2
|
+
class Servo
|
3
|
+
OutOfBoundsError = Class.new(StandardError)
|
4
|
+
|
5
|
+
# Public: Initialize a Servo
|
6
|
+
#
|
7
|
+
# pin - the Pin the servo is attached to.
|
8
|
+
# options - the Hash options to configure the servo (default: {}):
|
9
|
+
# :range - the Range to restrict movement (default 0..180).
|
10
|
+
def initialize(pin, options = {})
|
11
|
+
@pin = pin
|
12
|
+
@pin.set_mode(Pin::SERVO)
|
13
|
+
@range = options.fetch(:range) { 0..180 }
|
14
|
+
end
|
15
|
+
|
16
|
+
# Public: Move the servo the the minimum degree.
|
17
|
+
#
|
18
|
+
# Returns nothing.
|
19
|
+
def min
|
20
|
+
move_to @range.min
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Move the servo to the maximum degree.
|
24
|
+
#
|
25
|
+
# Returns nothing.
|
26
|
+
def max
|
27
|
+
move_to @range.max
|
28
|
+
end
|
29
|
+
|
30
|
+
# Public: Move the servo to the center degree.
|
31
|
+
#
|
32
|
+
# Returns nothing.
|
33
|
+
def center
|
34
|
+
move_to ((min + max) / 2).abs
|
35
|
+
end
|
36
|
+
|
37
|
+
# Public: Move the servo.
|
38
|
+
#
|
39
|
+
# degrees - the Integer degrees to move to.
|
40
|
+
#
|
41
|
+
# Returns nothing.
|
42
|
+
# Raises OutOfBoundsError if the servo cannot move to the degree.
|
43
|
+
def move_to(degrees)
|
44
|
+
raise OutOfBoundsError unless @range.include?(degrees)
|
45
|
+
@pin.servo_write(degrees)
|
46
|
+
end
|
47
|
+
|
48
|
+
def maxed?
|
49
|
+
position == @range.max
|
50
|
+
end
|
51
|
+
|
52
|
+
def position
|
53
|
+
@pin.value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/wall_e/pin.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
module WallE
|
2
|
+
class Pin
|
3
|
+
class UnsupportedModeError < StandardError; end
|
4
|
+
|
5
|
+
# Internal: Fixnum byte for pin mode input.
|
6
|
+
INPUT = 0x00
|
7
|
+
# Internal: Fixnum byte for pin mode output.
|
8
|
+
OUTPUT = 0x01
|
9
|
+
# Internal: Fixnum byte for pin mode analog.
|
10
|
+
ANALOG = 0x02
|
11
|
+
# Internal: Fixnum byte for pin mode pulse width modulation.
|
12
|
+
PWM = 0x03
|
13
|
+
# Internal: Fixnum byte for pin mode servo.
|
14
|
+
SERVO = 0x04
|
15
|
+
|
16
|
+
LOW = 0
|
17
|
+
HIGH = 1
|
18
|
+
|
19
|
+
# Public: Returns the Integer pin number.
|
20
|
+
attr_reader :number
|
21
|
+
|
22
|
+
# Public: Initialize a Pin
|
23
|
+
#
|
24
|
+
# number - the Integer pin number on the board.
|
25
|
+
# board - the WallE::Board this pin is on.
|
26
|
+
# mode - the Fixnum mode to set the pin to (default: OUTPUT).
|
27
|
+
def initialize(number, board, mode = OUTPUT)
|
28
|
+
@number = number
|
29
|
+
@board = board
|
30
|
+
@onboard_pin = @board.pins[@number]
|
31
|
+
set_mode(mode)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Public: Write a digital value to the pin.
|
35
|
+
#
|
36
|
+
# value - an Integer value.
|
37
|
+
#
|
38
|
+
# Returns nothing.
|
39
|
+
def digital_write(value)
|
40
|
+
@board.digital_write(@number, value)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Public: Write analog value to the pin
|
44
|
+
#
|
45
|
+
# value - an Integer value.
|
46
|
+
#
|
47
|
+
# Returns nothing.
|
48
|
+
def analog_write(value)
|
49
|
+
@board.analog_write(@number, value)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Public: write value to servo
|
53
|
+
#
|
54
|
+
# value - an Integer value.
|
55
|
+
#
|
56
|
+
# Returns nothing.
|
57
|
+
alias_method :servo_write, :analog_write
|
58
|
+
|
59
|
+
# Public: Set the pin mode.
|
60
|
+
#
|
61
|
+
# mode - an Integer mode.
|
62
|
+
#
|
63
|
+
# Returns nothing.
|
64
|
+
# Raises UnsupportedModeError if the pin does not support the mode.
|
65
|
+
def set_mode(mode)
|
66
|
+
raise UnsupportedModeError unless @onboard_pin.supported_modes.include?(mode)
|
67
|
+
@board.set_pin_mode(@number, mode) unless current_mode == mode
|
68
|
+
end
|
69
|
+
|
70
|
+
# Public: Get the current mode.
|
71
|
+
#
|
72
|
+
# Returns Integer mode.
|
73
|
+
def current_mode
|
74
|
+
@onboard_pin.mode
|
75
|
+
end
|
76
|
+
|
77
|
+
# Public: Get the current value of the pin.
|
78
|
+
#
|
79
|
+
# Returns Integer value.
|
80
|
+
def value
|
81
|
+
@onboard_pin.value
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'logger'
|
2
|
+
require 'firmata'
|
3
|
+
|
4
|
+
module WallE
|
5
|
+
module SerialSnoop
|
6
|
+
extend self
|
7
|
+
extend Logger
|
8
|
+
|
9
|
+
def locate_ports
|
10
|
+
ports = Dir['/dev/*'].grep(/usb|acm/)
|
11
|
+
board = nil
|
12
|
+
if ports.any?
|
13
|
+
what = 'serial port'
|
14
|
+
what << 's' unless ports.one?
|
15
|
+
|
16
|
+
info "Found possible #{what} #{ports}"
|
17
|
+
ports.each do |port|
|
18
|
+
begin
|
19
|
+
info "Connecting to #{port}..."
|
20
|
+
board = Firmata::Board.new(port)
|
21
|
+
info "Connected to #{port}."
|
22
|
+
break # we've found a board
|
23
|
+
rescue => e
|
24
|
+
error e.message
|
25
|
+
board = nil
|
26
|
+
end
|
27
|
+
end
|
28
|
+
else
|
29
|
+
error 'Error: No USB devices detected'
|
30
|
+
end
|
31
|
+
|
32
|
+
error 'Error: Unable to connect to USB device' unless board
|
33
|
+
|
34
|
+
board
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/led_test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require_relative '../lib/wall_e/pin'
|
3
|
+
require_relative '../lib/wall_e/components/led'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class LedTest < MiniTest::Unit::TestCase
|
8
|
+
|
9
|
+
def test_turning_on
|
10
|
+
pin = MiniTest::Mock.new
|
11
|
+
pin.expect(:set_mode, 1, [WallE::Pin::OUTPUT])
|
12
|
+
pin.expect(:digital_write, 1, [WallE::Pin::HIGH])
|
13
|
+
|
14
|
+
led = WallE::Led.new(pin)
|
15
|
+
|
16
|
+
led.on
|
17
|
+
|
18
|
+
assert led.on?
|
19
|
+
pin.verify
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_turning_off
|
23
|
+
pin = MiniTest::Mock.new
|
24
|
+
pin.expect(:set_mode, 1, [WallE::Pin::OUTPUT])
|
25
|
+
pin.expect(:digital_write, 1, [WallE::Pin::LOW])
|
26
|
+
|
27
|
+
led = WallE::Led.new(pin)
|
28
|
+
|
29
|
+
led.off
|
30
|
+
|
31
|
+
assert led.off?
|
32
|
+
pin.verify
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_toggle
|
36
|
+
pin = MiniTest::Mock.new
|
37
|
+
pin.expect(:set_mode, 1, [WallE::Pin::OUTPUT])
|
38
|
+
pin.expect(:digital_write, 1, [WallE::Pin::HIGH])
|
39
|
+
|
40
|
+
led = WallE::Led.new(pin)
|
41
|
+
|
42
|
+
led.toggle
|
43
|
+
|
44
|
+
assert led.on?, 'led not toggled on'
|
45
|
+
pin.verify
|
46
|
+
|
47
|
+
pin.expect(:set_mode, 1, [WallE::Pin::OUTPUT])
|
48
|
+
pin.expect(:digital_write, 1, [WallE::Pin::LOW])
|
49
|
+
|
50
|
+
led.toggle
|
51
|
+
|
52
|
+
assert led.off?, 'led not toggled off'
|
53
|
+
pin.verify
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_brightness
|
57
|
+
pin = MiniTest::Mock.new
|
58
|
+
pin.expect(:set_mode, 1, [WallE::Pin::PWM])
|
59
|
+
pin.expect(:analog_write, 1, [255])
|
60
|
+
|
61
|
+
led = WallE::Led.new(pin)
|
62
|
+
|
63
|
+
led.brightness(255)
|
64
|
+
pin.verify
|
65
|
+
end
|
66
|
+
end
|
data/test/piezo_test.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require_relative '../lib/wall_e/pin'
|
3
|
+
require_relative '../lib/wall_e/components/piezo'
|
4
|
+
|
5
|
+
class PiezoTest < MiniTest::Unit::TestCase
|
6
|
+
|
7
|
+
def test_turning_on
|
8
|
+
note = 1136 # 'a'
|
9
|
+
pin = MiniTest::Mock.new
|
10
|
+
pin.expect(:set_mode, 1, [WallE::Pin::PWM])
|
11
|
+
pin.expect(:analog_write, 1, [note])
|
12
|
+
|
13
|
+
piezo = WallE::Piezo.new(pin)
|
14
|
+
piezo.on(note)
|
15
|
+
|
16
|
+
assert piezo.on?
|
17
|
+
pin.verify
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_turning_off
|
21
|
+
pin = MiniTest::Mock.new
|
22
|
+
pin.expect(:set_mode, 1, [WallE::Pin::PWM])
|
23
|
+
pin.expect(:analog_write, 1, [0])
|
24
|
+
|
25
|
+
piezo = WallE::Piezo.new(pin)
|
26
|
+
piezo.off
|
27
|
+
|
28
|
+
assert piezo.off?
|
29
|
+
pin.verify
|
30
|
+
end
|
31
|
+
end
|
data/test/pin_test.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require_relative '../lib/wall_e/pin'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
|
6
|
+
DummyBoard = Class.new do
|
7
|
+
attr_reader :pins
|
8
|
+
|
9
|
+
def initialize(pins)
|
10
|
+
@pins = pins
|
11
|
+
end
|
12
|
+
|
13
|
+
def digital_write(*args); args.length; end
|
14
|
+
def set_pin_mode(pin_number, mode); pin_number; end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class PinTest < MiniTest::Unit::TestCase
|
19
|
+
|
20
|
+
def test_will_not_set_to_a_mode_pin_does_not_support
|
21
|
+
board_pins = []
|
22
|
+
board_pins.insert(13, OpenStruct.new(supported_modes: Array(0..3)))
|
23
|
+
|
24
|
+
board = DummyBoard.new(board_pins)
|
25
|
+
|
26
|
+
pin = WallE::Pin.new(13, board)
|
27
|
+
|
28
|
+
assert_raises(WallE::Pin::UnsupportedModeError) { pin.set_mode WallE::Pin::SERVO }
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_set_mode_will_only_set_changes
|
32
|
+
pin_number = 13
|
33
|
+
board_pins = []
|
34
|
+
board_pins.insert(pin_number, OpenStruct.new(supported_modes: Array(0..4)))
|
35
|
+
|
36
|
+
board = OpenStruct.new(pins: board_pins, set_pin_mode: 1)
|
37
|
+
|
38
|
+
pin = nil
|
39
|
+
|
40
|
+
board.stub :set_pin_mode, 1 do
|
41
|
+
pin = WallE::Pin.new(pin_number, board, WallE::Pin::PWM)
|
42
|
+
end
|
43
|
+
|
44
|
+
pin.stub :current_mode, WallE::Pin::PWM do
|
45
|
+
pin.set_mode WallE::Pin::PWM
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_digital_write_to_board
|
50
|
+
pin_number = 13
|
51
|
+
board_pins = []
|
52
|
+
board_pins.insert(pin_number, OpenStruct.new(supported_modes: Array(0..3)))
|
53
|
+
|
54
|
+
board = MiniTest::Mock.new
|
55
|
+
board.expect(:pins, board_pins)
|
56
|
+
board.expect(:set_pin_mode, 1, [pin_number, WallE::Pin::OUTPUT])
|
57
|
+
board.expect(:digital_write, 1, [pin_number, 1])
|
58
|
+
|
59
|
+
pin = WallE::Pin.new(pin_number, board)
|
60
|
+
|
61
|
+
pin.digital_write(1)
|
62
|
+
|
63
|
+
board.verify
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_analog_write_to_board
|
67
|
+
pin_number = 13
|
68
|
+
board_pins = []
|
69
|
+
board_pins.insert(pin_number, OpenStruct.new(supported_modes: Array(0..4)))
|
70
|
+
|
71
|
+
board = MiniTest::Mock.new
|
72
|
+
board.expect(:pins, board_pins)
|
73
|
+
board.expect(:set_pin_mode, 1, [pin_number, WallE::Pin::PWM])
|
74
|
+
board.expect(:analog_write, 1, [pin_number, 255])
|
75
|
+
|
76
|
+
pin = WallE::Pin.new(pin_number, board, WallE::Pin::PWM)
|
77
|
+
|
78
|
+
pin.analog_write(255)
|
79
|
+
|
80
|
+
board.verify
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
require_relative '../lib/wall_e/serial_snoop'
|
4
|
+
|
5
|
+
class Dummy; end
|
6
|
+
|
7
|
+
class SerialSnoopTest < MiniTest::Unit::TestCase
|
8
|
+
|
9
|
+
def test_no_port_available
|
10
|
+
Dir.stub :[], [] do
|
11
|
+
assert_nil WallE::SerialSnoop.locate_ports
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_cannot_connect_to_found_port
|
16
|
+
Dir.stub :[], ['tty.usbmodemfd13131'] do
|
17
|
+
assert_nil WallE::SerialSnoop.locate_ports
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_connect_to_found_port
|
22
|
+
Dir.stub :[], ['tty.usbmodemfd13131'] do
|
23
|
+
Firmata::Board.stub :new, Dummy.new do
|
24
|
+
refute_nil WallE::SerialSnoop.locate_ports
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/test/servo_test.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
require_relative '../lib/wall_e/pin'
|
3
|
+
require_relative '../lib/wall_e/components/servo'
|
4
|
+
|
5
|
+
class ServoTest < MiniTest::Unit::TestCase
|
6
|
+
|
7
|
+
def test_set_pin_mode_to_servo
|
8
|
+
pin = MiniTest::Mock.new
|
9
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
10
|
+
|
11
|
+
servo = WallE::Servo.new(pin)
|
12
|
+
|
13
|
+
pin.verify
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_move_to
|
17
|
+
pin = MiniTest::Mock.new
|
18
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
19
|
+
pin.expect(:servo_write, 1, [90])
|
20
|
+
|
21
|
+
servo = WallE::Servo.new(pin)
|
22
|
+
servo.move_to(90)
|
23
|
+
|
24
|
+
pin.verify
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_move_to_will_not_move_past_bounds
|
28
|
+
pin = MiniTest::Mock.new
|
29
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
30
|
+
|
31
|
+
servo = WallE::Servo.new(pin)
|
32
|
+
|
33
|
+
assert_raises(WallE::Servo::OutOfBoundsError) { servo.move_to(181) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_moving_to_min
|
37
|
+
pin = MiniTest::Mock.new
|
38
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
39
|
+
pin.expect(:servo_write, 1, [0])
|
40
|
+
|
41
|
+
servo = WallE::Servo.new(pin)
|
42
|
+
servo.min
|
43
|
+
|
44
|
+
pin.verify
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_moving_to_max
|
48
|
+
pin = MiniTest::Mock.new
|
49
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
50
|
+
pin.expect(:servo_write, 1, [180])
|
51
|
+
|
52
|
+
servo = WallE::Servo.new(pin)
|
53
|
+
servo.max
|
54
|
+
|
55
|
+
pin.verify
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_moving_to_center
|
59
|
+
def test_moving_to_min
|
60
|
+
pin = MiniTest::Mock.new
|
61
|
+
pin.expect(:set_mode, 1, [WallE::Pin::SERVO])
|
62
|
+
pin.expect(:servo_write, 1, [90])
|
63
|
+
|
64
|
+
servo = WallE::Servo.new(pin)
|
65
|
+
servo.center
|
66
|
+
|
67
|
+
pin.verify
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/test/test_helper.rb
ADDED
data/wall_e.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/wall_e/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["'Mike Breen'"]
|
6
|
+
gem.email = ["hardbap@gmail.com"]
|
7
|
+
gem.description = %q{A Firmata based Arduino library}
|
8
|
+
gem.summary = %q{}
|
9
|
+
gem.homepage = "https://github.com/hardbap/wall_e"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "wall_e"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = WallE::VERSION
|
17
|
+
|
18
|
+
|
19
|
+
gem.add_development_dependency("minitest", "~> 3.3.0")
|
20
|
+
gem.add_runtime_dependency("firmata", "~> 0.0.6")
|
21
|
+
gem.add_runtime_dependency("event_spitter", "~> 0.5.0")
|
22
|
+
gem.add_runtime_dependency("pry", "~> 0.9.10")
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wall_e
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- ! '''Mike Breen'''
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minitest
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.3.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.3.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: firmata
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.0.6
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.0.6
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: event_spitter
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.5.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.5.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.10
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.10
|
78
|
+
description: A Firmata based Arduino library
|
79
|
+
email:
|
80
|
+
- hardbap@gmail.com
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- Gemfile
|
87
|
+
- LICENSE
|
88
|
+
- README.md
|
89
|
+
- Rakefile
|
90
|
+
- cookbook/Led/blink.rb
|
91
|
+
- cookbook/Led/fade_in.rb
|
92
|
+
- cookbook/Led/fade_out.rb
|
93
|
+
- cookbook/Led/pulse.rb
|
94
|
+
- cookbook/Piezo/morse_code.rb
|
95
|
+
- cookbook/Servo/sweep.rb
|
96
|
+
- lib/wall_e.rb
|
97
|
+
- lib/wall_e/components/led.rb
|
98
|
+
- lib/wall_e/components/piezo.rb
|
99
|
+
- lib/wall_e/components/servo.rb
|
100
|
+
- lib/wall_e/logger.rb
|
101
|
+
- lib/wall_e/pin.rb
|
102
|
+
- lib/wall_e/serial_snoop.rb
|
103
|
+
- lib/wall_e/version.rb
|
104
|
+
- test/led_test.rb
|
105
|
+
- test/piezo_test.rb
|
106
|
+
- test/pin_test.rb
|
107
|
+
- test/serial_snoop_test.rb
|
108
|
+
- test/servo_test.rb
|
109
|
+
- test/test_helper.rb
|
110
|
+
- wall_e.gemspec
|
111
|
+
homepage: https://github.com/hardbap/wall_e
|
112
|
+
licenses: []
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ! '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
requirements: []
|
130
|
+
rubyforge_project:
|
131
|
+
rubygems_version: 1.8.24
|
132
|
+
signing_key:
|
133
|
+
specification_version: 3
|
134
|
+
summary: ''
|
135
|
+
test_files:
|
136
|
+
- test/led_test.rb
|
137
|
+
- test/piezo_test.rb
|
138
|
+
- test/pin_test.rb
|
139
|
+
- test/serial_snoop_test.rb
|
140
|
+
- test/servo_test.rb
|
141
|
+
- test/test_helper.rb
|