artoo-gpio 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dddfa7c2d25bd688baa7eb5d4311cf357aed9a91
4
+ data.tar.gz: b58a3d1be358edbc5c1261384af7a4677288d06a
5
+ SHA512:
6
+ metadata.gz: 932aba40c52749c0deb31af3b96091c90fb791be0f41548d2b9d33e7c1787b442f6cdaae8f23cd414adf74b0ffa6f038cb870feb6cd87c26b67d1f114b44a67b
7
+ data.tar.gz: f23c0cd415319400a44c2ea49dabf55127cf8371b465f726778210520b2d9482f4e62eb63ab7fe15a28d60c95ca48be9049096c465fcc667d6ab6ce5af959bbb
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in artoo-gpio.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,59 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ artoo-gpio (0.0.1)
5
+ artoo (~> 1.1.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ artoo (1.1.0)
11
+ celluloid (~> 0.15.0)
12
+ celluloid-io (~> 0.15.0)
13
+ multi_json (~> 1.6)
14
+ pry (~> 0.9)
15
+ rake (~> 10.0)
16
+ reel (~> 0.4.0.pre)
17
+ thor (~> 0.18.1)
18
+ celluloid (0.15.1)
19
+ timers (~> 1.1.0)
20
+ celluloid-io (0.15.0)
21
+ celluloid (>= 0.15.0)
22
+ nio4r (>= 0.5.0)
23
+ coderay (1.0.9)
24
+ http (0.5.0.pre)
25
+ http_parser.rb
26
+ http_parser.rb (0.6.0.beta.2)
27
+ metaclass (0.0.1)
28
+ method_source (0.8.2)
29
+ minitest (5.0.7)
30
+ minitest-happy (1.0.0)
31
+ mocha (0.14.0)
32
+ metaclass (~> 0.0.1)
33
+ multi_json (1.8.0)
34
+ nio4r (0.5.0)
35
+ pry (0.9.12.2)
36
+ coderay (~> 1.0.5)
37
+ method_source (~> 0.8)
38
+ slop (~> 3.4)
39
+ rake (10.1.0)
40
+ reel (0.4.0.pre5)
41
+ celluloid (>= 0.15.0)
42
+ celluloid-io (>= 0.15.0)
43
+ http (>= 0.5.0.pre)
44
+ http_parser.rb (>= 0.6.0.beta.2)
45
+ websocket_parser (>= 0.1.4)
46
+ slop (3.4.6)
47
+ thor (0.18.1)
48
+ timers (1.1.0)
49
+ websocket_parser (0.1.4)
50
+ http
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ artoo-gpio!
57
+ minitest (~> 5.0)
58
+ minitest-happy
59
+ mocha (~> 0.14.0)
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2012, 2013 The Hybrid Group
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # Artoo Drivers For GPIO Devices
2
+
3
+ This repository contains the Artoo (http://artoo.io/) standard drivers for analog, digital, PWM, and servo devices.
4
+
5
+ Artoo is a open source micro-framework for robotics using Ruby.
6
+
7
+ For more information abut Artoo, check out our repo at https://github.com/hybridgroup/artoo
8
+
9
+ [![Code Climate](https://codeclimate.com/github/hybridgroup/artoo-gpio.png)](https://codeclimate.com/github/hybridgroup/artoo-gpio) [![Build Status](https://travis-ci.org/hybridgroup/artoo-gpio.png?branch=master)](https://travis-ci.org/hybridgroup/artoo-gpio)
10
+
11
+ ## Installing
12
+
13
+ ```
14
+ gem install artoo-gpio
15
+ ```
16
+
17
+ ## Using
18
+
19
+ Normally, this gem is automatically included as part of using an Artoo adaptor that can connect to your hardware. For example, artoo-arduino and artoo-raspi both make use of the drivers in this gem.
20
+
21
+ ```ruby
22
+ require 'artoo'
23
+
24
+ connection :arduino, :adaptor => :firmata, :port => '127.0.0.1:8023'
25
+ device :board
26
+ device :led, :driver => :led, :pin => 13
27
+
28
+ work do
29
+ puts "Firmware name #{board.firmware_name}"
30
+ puts "Firmata version #{board.version}"
31
+ every 1.second do
32
+ led.toggle
33
+ end
34
+ end
35
+ ```
36
+
37
+ ## Devices supported
38
+
39
+ The following GPIO hardware devices have driver support:
40
+ - Button
41
+ - LED
42
+ - Maxbotix ultrasonic range finder
43
+ - Motor (DC)
44
+ - Servo
45
+
46
+
47
+ ## Contributing
48
+
49
+ 1. Fork it
50
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
51
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
52
+ 4. Push to the branch (`git push origin my-new-feature`)
53
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.pattern = "test/**/*_test.rb"
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "artoo-gpio/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "artoo-gpio"
7
+ s.version = Artoo::Gpio::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Ron Evans", "Adrian Zankich", "Rafael Magaña", "Edgar Silva"]
10
+ s.email = ["artoo@hybridgroup.com"]
11
+ s.homepage = "https://github.com/hybridgroup/artoo-gpio"
12
+ s.summary = %q{Artoo standard drivers for GPIO devices}
13
+ s.description = %q{Artoo standard drivers for GPIO devices such as digital IO, analog IO, PWM IO, and servos}
14
+ s.license = 'Apache 2.0'
15
+
16
+ s.rubyforge_project = "artoo-gpio"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+
23
+ s.add_runtime_dependency 'artoo', '~> 1.1.0'
24
+ s.add_development_dependency 'minitest', '~> 5.0'
25
+ s.add_development_dependency 'minitest-happy'
26
+ s.add_development_dependency 'mocha', '~> 0.14.0'
27
+ end
@@ -0,0 +1,43 @@
1
+ require 'artoo/drivers/driver'
2
+
3
+ module Artoo
4
+ module Drivers
5
+ # Button driver behaviors
6
+ class Button < Driver
7
+ COMMANDS = [:is_pressed?].freeze
8
+
9
+ DOWN = 1
10
+ UP = 0
11
+
12
+ # @return [Boolean] True if pressed
13
+ def is_pressed?
14
+ (@pressed_val == 1) ? true : false
15
+ end
16
+
17
+ def start_driver
18
+ @pressed_val = 0
19
+
20
+ every(interval) do
21
+ new_value = connection.digital_read(pin)
22
+ update(new_value) if !new_value.nil? && new_value != is_pressed?
23
+ end
24
+
25
+ super
26
+ end
27
+
28
+ private
29
+ # Publishes events according to the button feedback
30
+ def update(new_val)
31
+ if new_val == 1
32
+ @pressed_val = 1
33
+ publish(event_topic_name("update"), "push", new_val)
34
+ publish(event_topic_name("push"), new_val)
35
+ else
36
+ @pressed_val = 0
37
+ publish(event_topic_name("update"), "release", new_val)
38
+ publish(event_topic_name("release"), new_val)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,59 @@
1
+ require 'artoo/drivers/driver'
2
+
3
+ module Artoo
4
+ module Drivers
5
+ # The LED driver behaviors
6
+ class Led < Driver
7
+
8
+ COMMANDS = [:on, :off, :toggle,
9
+ :brightness,
10
+ :on?, :off?].freeze
11
+
12
+ def initialize(params = {})
13
+ @is_on = false
14
+ super
15
+ end
16
+
17
+ # @return [Boolean] True if on
18
+ def on?
19
+ @is_on
20
+ end
21
+
22
+ # @return [Boolean] True if off
23
+ def off?
24
+ (not on?)
25
+ end
26
+
27
+ # Sets led to level HIGH
28
+ def on
29
+ change_state(pin, :high)
30
+ @is_on = true
31
+ true
32
+ end
33
+
34
+ # Sets led to level LOW
35
+ def off
36
+ change_state(pin, :low)
37
+ @is_on = false
38
+ true
39
+ end
40
+
41
+ # Toggle status
42
+ # @example on > off, off > on
43
+ def toggle
44
+ on? ? off : on
45
+ end
46
+
47
+ # Change brightness level
48
+ # @param [Integer] level
49
+ def brightness(level=0)
50
+ connection.pwm_write(pin, level)
51
+ end
52
+
53
+ private
54
+ def change_state(pin, level)
55
+ connection.digital_write(pin, level)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,44 @@
1
+ require 'artoo/drivers/driver'
2
+
3
+ module Artoo
4
+ module Drivers
5
+ # Maxbotix ultrasonic range finder driver behaviors for Firmata
6
+ class Maxbotix < Driver
7
+ COMMANDS = [:range].freeze
8
+
9
+ attr_accessor :last_reading
10
+
11
+ def initialize(params={})
12
+ @last_reading = 0.0
13
+ super
14
+ end
15
+
16
+ # @return [float] last range reading in inches
17
+ def range
18
+ return ( 254.0 / 1024.0 ) * 2.0 * last_reading
19
+ end
20
+
21
+ # @return [float] last range reading in cm
22
+ def range_cm
23
+ return (last_reading / 2.0) * 2.54
24
+ end
25
+
26
+ # Sets values to read from ultrasonic range finder
27
+ # and starts driver
28
+ def start_driver
29
+ every(interval) do
30
+ update(connection.analog_read(pin))
31
+ end
32
+
33
+ super
34
+ end
35
+
36
+ # Publishes events according to the ultrasonic rangefinder value
37
+ def update(value)
38
+ last_reading = value
39
+ publish(event_topic_name("update"), "range", range)
40
+ publish(event_topic_name("range"), range)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,167 @@
1
+ require 'artoo/drivers/driver'
2
+
3
+ module Artoo
4
+ module Drivers
5
+ class Motor < Driver
6
+
7
+ COMMANDS = [:stop, :start, :on?, :off?, :toggle, :speed, :min, :max, :forward, :backward, :current_speed].freeze
8
+
9
+ attr_reader :speed_pin, :switch_pin, :current_speed
10
+
11
+ def initialize(params={})
12
+ super
13
+
14
+ additional_params = params[:additional_params]
15
+ @speed_pin = additional_params[:speed_pin]
16
+ @switch_pin = additional_params[:switch_pin] if additional_params[:switch_pin]
17
+
18
+ @forward_pin = additional_params[:forward_pin]
19
+ @backward_pin = additional_params[:backward_pin]
20
+
21
+ @current_state = :low
22
+ @current_speed = 0
23
+
24
+ # digital: just to switch the motor on or off, no speed control
25
+ # analog: speed control
26
+ @current_mode = :digital
27
+
28
+ @current_direction = :forward
29
+
30
+ @@modules_to_include = modules_to_include
31
+
32
+ class << self
33
+ @@modules_to_include.each do |m|
34
+ include m
35
+ end if @@modules_to_include
36
+ end
37
+
38
+ end
39
+
40
+ def digital?
41
+ @current_mode == :digital
42
+ end
43
+
44
+ def analog?
45
+ @current_mode == :analog
46
+ end
47
+
48
+ def stop
49
+ if digital?
50
+ change_state(:low)
51
+ else
52
+ speed(0)
53
+ end
54
+ end
55
+
56
+ def start
57
+ if digital?
58
+ change_state(:high)
59
+ else
60
+ speed(@current_speed.zero? ? 255 : @current_speed)
61
+ end
62
+ end
63
+
64
+ def min
65
+ stop
66
+ end
67
+
68
+ def max
69
+ speed(255)
70
+ end
71
+
72
+ def on?
73
+ if digital?
74
+ @current_state == :high
75
+ else
76
+ @current_speed > 0
77
+ end
78
+ end
79
+
80
+ def off?
81
+ !on?
82
+ end
83
+
84
+ def toggle
85
+ on? ? stop : start
86
+ end
87
+
88
+ def change_state(state)
89
+ @current_state = state
90
+ @current_speed = state == :low ? 0 : 255
91
+ connection.digital_write(@speed_pin, state)
92
+ end
93
+
94
+ # Set motor speed
95
+ # @param [Integer] value (must be an integer between 0-255)
96
+ def speed(value)
97
+ @current_mode = :analog
98
+ raise "Motor speed must be an integer between 0-255" unless (value.is_a?(Numeric) && value >= 0 && value <= 255)
99
+ @current_speed = value
100
+ connection.pwm_write(speed_pin, value)
101
+ end
102
+
103
+ private
104
+ def modules_to_include
105
+ if @forward_pin and @backward_pin
106
+ [BidirectionalWithForwardBackwardPins]
107
+ end
108
+ end
109
+ end
110
+
111
+ module BidirectionalWithForwardBackwardPins
112
+
113
+ # Sets movement forward
114
+ # @param [Integer] speed
115
+ def forward(speed = nil)
116
+ direction(:forward)
117
+ speed ? self.speed(speed) : start
118
+ end
119
+
120
+ # Sets movement backward
121
+ # @param [Integer] speed
122
+ def backward(speed = nil)
123
+ direction(:backward)
124
+ speed ? self.speed(speed) : start
125
+ end
126
+
127
+ def forward?
128
+ @current_direction == :forward
129
+ end
130
+
131
+ def backward?
132
+ (not forward?)
133
+ end
134
+
135
+ private
136
+ def change_state(state)
137
+ @current_state = state
138
+ @current_speed = state.zero? ? 0 : 255
139
+ if state == :high
140
+ direction(@current_direction)
141
+ speed(@current_speed) if speed_pin
142
+ elsif state == :low
143
+ direction(:none)
144
+ end
145
+ end
146
+
147
+ def direction(direction)
148
+ @current_direction = direction
149
+ case direction
150
+ when :forward
151
+ forward_pin_level = :high
152
+ backward_pin_level = :low
153
+ when :backward
154
+ forward_pin_level = :low
155
+ backward_pin_level = :high
156
+ when :none
157
+ forward_pin_level = :low
158
+ backward_pin_level = :low
159
+ end
160
+
161
+ connection.digital_write(@forward_pin, forward_pin_level)
162
+ connection.digital_write(@backward_pin, backward_pin_level)
163
+ end
164
+
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,49 @@
1
+ require 'artoo/drivers/driver'
2
+
3
+ module Artoo
4
+ module Drivers
5
+ # Servo behaviors for Firmata
6
+ class Servo < Driver
7
+ COMMANDS = [:move, :min, :center, :max, :current_angle].freeze
8
+
9
+ attr_reader :current_angle
10
+
11
+ # Create new Servo with angle=0
12
+ def initialize(params={})
13
+ super
14
+
15
+ @current_angle = 0
16
+ end
17
+
18
+ # Moves to specified angle
19
+ # @param [Integer] angle must be between 0-180
20
+ def move(angle)
21
+ raise "Servo angle must be an integer between 0-180" unless (angle.is_a?(Numeric) && angle >= 0 && angle <= 180)
22
+
23
+ @current_angle = angle
24
+ connection.servo_write(pin, angle_to_span(angle))
25
+ end
26
+
27
+ # Moves to min position
28
+ def min
29
+ move(0)
30
+ end
31
+
32
+ # Moves to center position
33
+ def center
34
+ move(90)
35
+ end
36
+
37
+ # Moves to max position
38
+ def max
39
+ move(180)
40
+ end
41
+
42
+ # converts an angle to a span between 0-255
43
+ # @param [Integer] angle
44
+ def angle_to_span(angle)
45
+ (angle * 255 / 180).to_i
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module Artoo
2
+ module Gpio
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
data/lib/artoo-gpio.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'lib/artoo/adaptors/gpio'
2
+ require 'lib/artoo/drivers/gpio'
3
+ require 'lib/artoo-gpio/version'
@@ -0,0 +1,92 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'artoo/drivers/led'
3
+
4
+ describe Artoo::Drivers::Led do
5
+ before do
6
+ @device = mock('device')
7
+ @pin = 13
8
+ @device.stubs(:pin).returns(@pin)
9
+ @led = Artoo::Drivers::Led.new(:parent => @device)
10
+ @connection = mock('connection')
11
+ @device.stubs(:connection).returns(@connection)
12
+ end
13
+
14
+ describe 'state switching' do
15
+ describe '#on' do
16
+ it 'must turn the led on' do
17
+ @connection.expects(:digital_write).with(@pin, :high)
18
+ @led.on
19
+ end
20
+ end
21
+
22
+ describe '#off' do
23
+ it 'must turn the led off' do
24
+ @connection.expects(:digital_write).with(@pin, :low)
25
+ @led.off
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'state checking' do
31
+
32
+ before do
33
+ @led.stubs(:change_state)
34
+ end
35
+
36
+ describe '#on?' do
37
+ it 'must return true if led is on' do
38
+ @led.on
39
+ @led.on?.must_equal true
40
+ end
41
+
42
+ it 'must return false if led is off' do
43
+ @led.off
44
+ @led.on?.must_equal false
45
+ end
46
+ end
47
+
48
+ describe '#off?' do
49
+ it 'must return true if led is off' do
50
+ @led.off
51
+ @led.off?.must_equal true
52
+ end
53
+
54
+ it 'must return false if led is on' do
55
+ @led.on
56
+ @led.off?.must_equal false
57
+ end
58
+ end
59
+ end
60
+
61
+ describe '#toggle' do
62
+ it 'must toggle the state of the led' do
63
+ @led.stubs(:pin_state_on_board).returns(false)
64
+ @connection.stubs(:set_pin_mode)
65
+ @connection.stubs(:digital_write)
66
+ @led.off?.must_equal true
67
+ @led.toggle
68
+ @led.on?.must_equal true
69
+ @led.toggle
70
+ @led.off?.must_equal true
71
+ end
72
+ end
73
+
74
+ describe '#brightness' do
75
+ it 'must change the brightness of the led' do
76
+ val = 100
77
+ @connection.expects(:pwm_write).with(@pin, val)
78
+ @led.brightness(val)
79
+ end
80
+ end
81
+
82
+ describe '#commands' do
83
+ it 'must contain all the necessary commands' do
84
+ @led.commands.must_include :on
85
+ @led.commands.must_include :off
86
+ @led.commands.must_include :toggle
87
+ @led.commands.must_include :brightness
88
+ @led.commands.must_include :on?
89
+ @led.commands.must_include :off?
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'artoo/drivers/maxbotix'
3
+
4
+ describe Artoo::Drivers::Maxbotix do
5
+ before do
6
+ @device = mock('device')
7
+ @pin = 0
8
+ @device.stubs(:pin).returns(@pin)
9
+ @maxbotix = Artoo::Drivers::Maxbotix.new(:parent => @device)
10
+ @connection = mock('connection')
11
+ @device.stubs(:connection).returns(@connection)
12
+ end
13
+
14
+ describe '#range' do
15
+ it 'must have initial value' do
16
+ @maxbotix.range.must_equal 0.0
17
+ end
18
+
19
+ it 'must adjust based on last_reading' do
20
+ @maxbotix.last_reading = 13.5
21
+ @maxbotix.range.must_equal 6.697265625
22
+ @maxbotix.range_cm.must_equal 17.145
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,204 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'artoo/drivers/motor'
3
+
4
+ describe Artoo::Drivers::Motor do
5
+
6
+ let(:connection) { mock('connection') }
7
+
8
+ before do
9
+ @device = mock('device')
10
+ connection.stubs(:pwm_write)
11
+ connection.stubs(:digital_write)
12
+ @device.stubs(:connection).returns(connection)
13
+ end
14
+
15
+ describe 'mode predicate methods' do
16
+
17
+ let(:motor) { Artoo::Drivers::Motor.new(:parent => @device, :additional_params => {}) }
18
+
19
+ it '#digital?' do
20
+ motor.digital?.must_equal true #initial state
21
+ motor.speed(1)
22
+ motor.digital?.must_equal false
23
+ end
24
+
25
+ it '#analog?' do
26
+ motor.analog?.must_equal false
27
+ motor.speed(1)
28
+ motor.analog?.must_equal true
29
+ end
30
+
31
+ end
32
+
33
+ describe 'when unidirectional' do
34
+
35
+ describe 'when switching states (digital)' do
36
+
37
+ let(:motor) { Artoo::Drivers::Motor.new(:parent => @device, :additional_params => {switch_pin: 1}) }
38
+
39
+ it '#start' do
40
+ motor.start
41
+ motor.on?.must_equal true
42
+ end
43
+
44
+ it '#stop' do
45
+ motor.stop
46
+ motor.off?.must_equal true
47
+ end
48
+
49
+ it '#max' do
50
+ motor.expects(:speed).with(255)
51
+ motor.max
52
+ end
53
+
54
+ it '#min' do
55
+ motor.min
56
+ end
57
+
58
+ describe '#toggle' do
59
+ it 'toggles to on when off' do
60
+ motor.start
61
+ motor.toggle
62
+ motor.off?.must_equal true
63
+ end
64
+
65
+ it 'toggles to off when on' do
66
+ motor.stop
67
+ motor.toggle
68
+ motor.on?.must_equal true
69
+ end
70
+ end
71
+ end
72
+
73
+ describe 'when changing speed (analog)' do
74
+
75
+ let(:motor) { Artoo::Drivers::Motor.new(:parent => @device, :additional_params => {speed_pin: 3}) }
76
+
77
+ it '#speed' do
78
+ connection.expects(:pwm_write).with(3, 255)
79
+ motor.speed(255)
80
+ end
81
+
82
+ it '#start' do
83
+ motor.speed(0)
84
+ motor.start
85
+ motor.current_speed.must_equal 255
86
+ end
87
+
88
+ it '#stop' do
89
+ motor.speed(255)
90
+ motor.stop
91
+ motor.current_speed.must_equal 0
92
+ end
93
+
94
+ it '#max' do
95
+ motor.speed(0)
96
+ motor.max
97
+ motor.current_speed.must_equal 255
98
+ end
99
+
100
+ it '#min' do
101
+ motor.speed(255)
102
+ motor.min
103
+ motor.current_speed.must_equal 0
104
+ end
105
+
106
+ it '#on?' do
107
+ motor.speed(1)
108
+ motor.on?.must_equal true
109
+ motor.speed(0)
110
+ motor.on?.must_equal false
111
+ end
112
+
113
+ it '#off?' do
114
+ motor.speed(1)
115
+ motor.off?.must_equal false
116
+ motor.speed(0)
117
+ motor.off?.must_equal true
118
+ end
119
+ end
120
+
121
+ end
122
+
123
+ describe 'bididirectional' do
124
+ let(:motor) { Artoo::Drivers::Motor.new(:parent => @device,
125
+ :additional_params =>
126
+ {:forward_pin => 1,
127
+ :backward_pin => 2}) }
128
+
129
+ describe '#forward' do
130
+
131
+ before do
132
+ connection.expects(:digital_write).with(1, :high)
133
+ connection.expects(:digital_write).with(2, :low)
134
+ end
135
+
136
+ describe 'when no parameter' do
137
+
138
+ it '#forward' do
139
+ motor.expects(:start)
140
+ motor.forward
141
+ end
142
+
143
+ end
144
+
145
+ describe 'when speed parameter' do
146
+
147
+ it '#forward' do
148
+ motor.expects(:speed).with(255)
149
+ motor.forward(255)
150
+ end
151
+
152
+ end
153
+
154
+ end
155
+
156
+ describe '#backward' do
157
+
158
+ before do
159
+ connection.expects(:digital_write).with(1, :low)
160
+ connection.expects(:digital_write).with(2, :high)
161
+ end
162
+
163
+ describe 'when no parameter' do
164
+
165
+ it '#backward' do
166
+ motor.expects(:start)
167
+ motor.backward
168
+ end
169
+
170
+ end
171
+
172
+ describe 'when speed parameter' do
173
+
174
+ it '#backward' do
175
+ motor.expects(:speed).with(255)
176
+ motor.backward(255)
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+ end
183
+
184
+
185
+ #it 'Motor#speed must be valid' do
186
+ #invalid_speed = lambda { @motor2 = Artoo::Drivers::Motor.new(:parent => @device, :additional_params => {}); @motor2.speed("ads") }
187
+ #invalid_speed.must_raise RuntimeError
188
+ #error = invalid_speed.call rescue $!
189
+ #error.message.must_equal 'Motor speed must be an integer between 0-255'
190
+ #end
191
+
192
+ #it 'Motor#forward' do
193
+ #@motor.expects(:set_legs)
194
+ #@motor.forward(100)
195
+ #@motor.current_speed.must_equal 100
196
+ #end
197
+
198
+ #it 'Motor#backward' do
199
+ #@motor.expects(:set_legs)
200
+ #@motor.backward(100)
201
+ #@motor.current_speed.must_equal 100
202
+ #end
203
+
204
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+ require 'artoo/drivers/servo'
3
+
4
+ describe Artoo::Drivers::Servo do
5
+ before do
6
+ @device = mock('device')
7
+ @device.stubs(:pin).returns(3)
8
+ @servo = Artoo::Drivers::Servo.new(:parent => @device)
9
+
10
+ @connection = mock('connection')
11
+ @connection.stubs(:servo_write)
12
+ @device.stubs(:connection).returns(@connection)
13
+ end
14
+
15
+ it "Servo#angle_to_span" do
16
+ @servo.angle_to_span(0).must_equal 0
17
+ @servo.angle_to_span(30).must_equal 42
18
+ @servo.angle_to_span(90).must_equal 127
19
+ @servo.angle_to_span(180).must_equal 255
20
+ end
21
+
22
+ it 'Servo#move must be valid' do
23
+ invalid_angle = lambda { @servo2 = Artoo::Drivers::Servo.new(:parent => @device); @servo2.move(360) }
24
+ invalid_angle.must_raise RuntimeError
25
+ error = invalid_angle.call rescue $!
26
+ error.message.must_equal 'Servo angle must be an integer between 0-180'
27
+ end
28
+
29
+ it 'Servo#min' do
30
+ @servo.min
31
+ @servo.current_angle.must_equal 0
32
+ end
33
+
34
+ it 'Servo#center' do
35
+ @servo.center
36
+ @servo.current_angle.must_equal 90
37
+ end
38
+
39
+ it 'Servo#max' do
40
+ @servo.max
41
+ @servo.current_angle.must_equal 180
42
+ end
43
+ end
@@ -0,0 +1,10 @@
1
+ require 'minitest/autorun'
2
+ require 'mocha/setup'
3
+ require 'artoo/robot'
4
+
5
+ Celluloid.logger = nil
6
+
7
+ MiniTest::Spec.before do
8
+ Celluloid.shutdown
9
+ Celluloid.boot
10
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: artoo-gpio
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ron Evans
8
+ - Adrian Zankich
9
+ - Rafael Magaña
10
+ - Edgar Silva
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2013-09-11 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: artoo
18
+ requirement: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: minitest
32
+ requirement: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ~>
35
+ - !ruby/object:Gem::Version
36
+ version: '5.0'
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '5.0'
44
+ - !ruby/object:Gem::Dependency
45
+ name: minitest-happy
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ - !ruby/object:Gem::Dependency
59
+ name: mocha
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: 0.14.0
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ~>
70
+ - !ruby/object:Gem::Version
71
+ version: 0.14.0
72
+ description: Artoo standard drivers for GPIO devices such as digital IO, analog IO,
73
+ PWM IO, and servos
74
+ email:
75
+ - artoo@hybridgroup.com
76
+ executables: []
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - Gemfile
81
+ - Gemfile.lock
82
+ - LICENSE
83
+ - README.md
84
+ - Rakefile
85
+ - artoo-gpio.gemspec
86
+ - lib/artoo-gpio.rb
87
+ - lib/artoo-gpio/version.rb
88
+ - lib/artoo/drivers/button.rb
89
+ - lib/artoo/drivers/led.rb
90
+ - lib/artoo/drivers/maxbotix.rb
91
+ - lib/artoo/drivers/motor.rb
92
+ - lib/artoo/drivers/servo.rb
93
+ - test/drivers/led_test.rb
94
+ - test/drivers/maxbotix_test.rb
95
+ - test/drivers/motor_test.rb
96
+ - test/drivers/servo_test.rb
97
+ - test/test_helper.rb
98
+ homepage: https://github.com/hybridgroup/artoo-gpio
99
+ licenses:
100
+ - Apache 2.0
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project: artoo-gpio
118
+ rubygems_version: 2.0.3
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: Artoo standard drivers for GPIO devices
122
+ test_files: []