pi_piper 2.0.beta.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.travis.yml +10 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +39 -26
- data/LICENCE.md +23 -0
- data/README.md +53 -16
- data/Rakefile +4 -22
- data/examples/2_bit_counter/2_bit_counter.rb +21 -0
- data/examples/7-segment/7-segment.rb +37 -0
- data/examples/dsl_switch/dsl_switch.rb +15 -0
- data/examples/elro/README.md +75 -0
- data/examples/elro/docs/elro-dips.jpg +0 -0
- data/examples/elro/docs/elro-switch.jpg +0 -0
- data/examples/elro/docs/setup.jpg +0 -0
- data/examples/elro/docs/wireplan.jpg +0 -0
- data/examples/elro/docs/wrl10534.jpg +0 -0
- data/examples/elro/elro.rb +15 -0
- data/examples/elro/lib/elro_switch.rb +51 -0
- data/examples/elro/lib/elro_util.rb +64 -0
- data/examples/elro/spec/elro_spec.rb +35 -0
- data/examples/elro/spec/elro_util_spec.rb +51 -0
- data/examples/elro/spec/spec_helper.rb +6 -0
- data/examples/mcp3008/circuit.png +0 -0
- data/examples/mcp3008/mcp3008.rb +55 -0
- data/examples/mcp3008_spi/mcp3008_spi.rb +24 -0
- data/examples/morse_code/circuit.png +0 -0
- data/examples/morse_code/morse_code.rb +49 -0
- data/examples/simple_switch/circuit.png +0 -0
- data/examples/simple_switch/simple_switch.rb +10 -0
- data/lib/pi_piper.rb +5 -3
- data/lib/pi_piper/bcm2835.rb +84 -14
- data/lib/pi_piper/i2c.rb +0 -1
- data/lib/pi_piper/libbcm2835.so +0 -0
- data/lib/pi_piper/pin.rb +102 -63
- data/lib/pi_piper/pin_error.rb +3 -0
- data/lib/pi_piper/pin_values.rb +35 -0
- data/lib/pi_piper/platform.rb +5 -5
- data/lib/pi_piper/pwm.rb +95 -0
- data/lib/pi_piper/spi.rb +30 -45
- data/lib/pi_piper/stub_driver.rb +124 -0
- data/lib/pi_piper/version.rb +3 -0
- data/pi_piper.gemspec +24 -29
- data/spec/bcm2835_spec.rb +132 -0
- data/spec/i2c_spec.rb +62 -0
- data/spec/pin_spec.rb +140 -0
- data/spec/pwm_spec.rb +83 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/spi_spec.rb +38 -0
- data/spec/stub_driver_spec.rb +140 -0
- metadata +100 -26
- data/Manifest +0 -14
- data/lib/pi_piper/libbcm2835.img +0 -0
@@ -0,0 +1,124 @@
|
|
1
|
+
# @description driver that can be used either with tests or with rails or other frameworks for development
|
2
|
+
require_relative 'pin_values'
|
3
|
+
|
4
|
+
module PiPiper
|
5
|
+
|
6
|
+
class NullLogger
|
7
|
+
def debug(*) end
|
8
|
+
end
|
9
|
+
|
10
|
+
module StubDriver
|
11
|
+
include PiPiper::PinValues
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def new(options = {})
|
15
|
+
opts = {
|
16
|
+
:logger => NullLogger.new
|
17
|
+
}.merge(options)
|
18
|
+
|
19
|
+
@logger = opts[:logger]
|
20
|
+
|
21
|
+
@pins = {}
|
22
|
+
|
23
|
+
@spi = {data:[], chip_select:0,}
|
24
|
+
|
25
|
+
self
|
26
|
+
end
|
27
|
+
alias_method :reset, :new
|
28
|
+
|
29
|
+
|
30
|
+
def gpio_select_function(pin_number, alt_fun)
|
31
|
+
end
|
32
|
+
|
33
|
+
def pin_input(pin_number)
|
34
|
+
#@pins[pin_number] = { direction: :in }
|
35
|
+
pin(pin_number)[:direction] = :in
|
36
|
+
@logger.debug("Pin ##{pin_number} -> Input")
|
37
|
+
end
|
38
|
+
|
39
|
+
def pin_output(pin_number)
|
40
|
+
#@pins[pin_number] = { direction: :in }
|
41
|
+
pin(pin_number)[:direction] = :out
|
42
|
+
@logger.debug("Pin ##{pin_number} -> Output")
|
43
|
+
end
|
44
|
+
|
45
|
+
def pin_direction(pin_number)
|
46
|
+
pin(pin_number)[:direction] if @pins[pin_number]
|
47
|
+
end
|
48
|
+
|
49
|
+
def pin_set(pin_number, value)
|
50
|
+
pin(pin_number)[:value] = value
|
51
|
+
@logger.debug("Pin ##{pin_number} -> #{value}")
|
52
|
+
end
|
53
|
+
|
54
|
+
def pin_set_pud(pin_number, value)
|
55
|
+
pin(pin_number)[:pud] = value
|
56
|
+
@logger.debug("PinPUD ##{pin_number} -> #{value}")
|
57
|
+
end
|
58
|
+
|
59
|
+
def pwm_clock(clock_divider)
|
60
|
+
end
|
61
|
+
|
62
|
+
def pwm_mode(channel, mode, start)
|
63
|
+
end
|
64
|
+
|
65
|
+
def pwm_range(channel, range)
|
66
|
+
end
|
67
|
+
|
68
|
+
def pwm_data(channel, data)
|
69
|
+
end
|
70
|
+
|
71
|
+
def spidev_out(array)
|
72
|
+
@spi[:data] = array
|
73
|
+
@logger.debug("SPIDEV -> #{array.pack('C*')}")
|
74
|
+
end
|
75
|
+
|
76
|
+
def spi_begin
|
77
|
+
@logger.debug("SPI Begin")
|
78
|
+
@spi[:data] = []
|
79
|
+
end
|
80
|
+
|
81
|
+
def spi_transfer_bytes(data)
|
82
|
+
@logger.debug("SPI CS#{@spi[:chip_select]} <- #{data.to_s}")
|
83
|
+
@spi[:data] = Array(data)
|
84
|
+
end
|
85
|
+
|
86
|
+
def spi_chip_select(chip = nil)
|
87
|
+
chip = chip || @spi[:chip_select]
|
88
|
+
@logger.debug("SPI Chip Select = #{chip}")
|
89
|
+
@spi[:chip_select] = chip
|
90
|
+
end
|
91
|
+
|
92
|
+
def pin_read(pin_number)
|
93
|
+
val = pin(pin_number)[:value]
|
94
|
+
val ||= case pin(pin_number)[:pud]
|
95
|
+
when GPIO_PUD_UP then GPIO_HIGH
|
96
|
+
when GPIO_PUD_DOWN then GPIO_LOW
|
97
|
+
else nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def release_pins
|
102
|
+
@pins.keys.each { |pin_number| release_pin(pin_number) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def release_pin(pin_number)
|
106
|
+
@pins.delete(pin_number)
|
107
|
+
end
|
108
|
+
|
109
|
+
def method_missing(meth, *args, &block)
|
110
|
+
puts "Needs Implementation: StubDriver##{meth}"
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def pin(pin_number)
|
116
|
+
@pins[pin_number] ||= {}
|
117
|
+
end
|
118
|
+
|
119
|
+
## The following methods are only for testing and are not available on any platforms
|
120
|
+
def spi_data
|
121
|
+
@spi[:data]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/pi_piper.gemspec
CHANGED
@@ -1,35 +1,30 @@
|
|
1
|
-
#
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'pi_piper/version'
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
|
-
s.name =
|
5
|
-
s.version =
|
7
|
+
s.name = 'pi_piper'
|
8
|
+
s.version = PiPiper::VERSION
|
6
9
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new(
|
8
|
-
s.authors = [
|
9
|
-
s.
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.
|
19
|
-
s.summary = "Event driven Raspberry Pi GPIO library"
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 2.0.0') if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ['Jason Whitehorn']
|
12
|
+
s.description = 'Event driven Raspberry Pi GPIO library'
|
13
|
+
s.email = 'jason.whitehorn@gmail.com'
|
14
|
+
s.extra_rdoc_files = ['README.md', 'lib/pi_piper/libbcm2835.so']
|
15
|
+
s.files = `git ls-files -z`.split("\x0")
|
16
|
+
s.homepage = 'http://github.com/jwhitehorn/pi_piper'
|
17
|
+
s.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'Pi_piper', '--main', 'README.md']
|
18
|
+
s.require_paths = ['lib']
|
19
|
+
s.rubygems_version = '2.2.2'
|
20
|
+
s.summary = 'Event driven Raspberry Pi GPIO library'
|
21
|
+
s.licenses = ['BSD']
|
20
22
|
|
21
|
-
if s.respond_to? :specification_version
|
22
|
-
s.specification_version = 4
|
23
|
+
s.specification_version = 4 if s.respond_to? :specification_version
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
s.add_dependency(%q<eventmachine>, ["= 1.0.3"])
|
30
|
-
end
|
31
|
-
else
|
32
|
-
s.add_dependency(%q<ffi>, [">= 0"])
|
33
|
-
s.add_dependency(%q<eventmachine>, ["= 1.0.3"])
|
34
|
-
end
|
25
|
+
s.add_runtime_dependency 'ffi', '>= 0'
|
26
|
+
s.add_runtime_dependency 'eventmachine', '= 1.0.9'
|
27
|
+
s.add_development_dependency 'rspec', '~> 3.0'
|
28
|
+
s.add_development_dependency 'mocha'
|
29
|
+
s.add_development_dependency 'simplecov'
|
35
30
|
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe 'Bcm2835' do
|
5
|
+
|
6
|
+
before :context do
|
7
|
+
Platform.driver
|
8
|
+
end
|
9
|
+
|
10
|
+
after :context do
|
11
|
+
Bcm2835.exported_pins.delete_if { true }
|
12
|
+
end
|
13
|
+
|
14
|
+
# describe 'GPIO' do
|
15
|
+
let(:file_like_object) { double("file like object") }
|
16
|
+
|
17
|
+
before :example do
|
18
|
+
allow(File).to receive(:read).and_return("1")
|
19
|
+
allow(File).to receive(:write).and_return("1")
|
20
|
+
allow(File).to receive(:open).and_return(file_like_object)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should export a given pin & add it to the list' do
|
24
|
+
expect(File).to receive(:write).with("/sys/class/gpio/export", 4)
|
25
|
+
expect(Bcm2835.exported_pins.include?(4)).not_to be true
|
26
|
+
Bcm2835.export(4)
|
27
|
+
expect(Bcm2835.exported_pins.include?(4)).to be true
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should unexport a given pin & removed it from the list' do
|
31
|
+
expect(File).to receive(:write).with("/sys/class/gpio/unexport", 4)
|
32
|
+
|
33
|
+
Bcm2835.export(4)
|
34
|
+
expect(Bcm2835.exported_pins.include?(4)).to be true
|
35
|
+
Bcm2835.unexport_pin(4)
|
36
|
+
expect(Bcm2835.exported_pins.include?(4)).not_to be true
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should unexport every exported pin' do
|
40
|
+
Bcm2835.export(4)
|
41
|
+
Bcm2835.export(18)
|
42
|
+
Bcm2835.export(27)
|
43
|
+
expect(Bcm2835.exported_pins).to eq [4,18,27]
|
44
|
+
Bcm2835.unexport_all
|
45
|
+
expect(Bcm2835.exported_pins).to eq []
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should tell if a pin is exported or not' do
|
49
|
+
Bcm2835.export(4)
|
50
|
+
expect(Bcm2835.exported?(4)).to be true
|
51
|
+
expect(Bcm2835.exported?(112)).to be false
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
xit 'should unexport every pin at exit of the program' do
|
56
|
+
pending 'Not yet very sure how to test that_exit hook !?'
|
57
|
+
Bcm2835.export(18)
|
58
|
+
Bcm2835.export(4)
|
59
|
+
|
60
|
+
at_exit {
|
61
|
+
expect(Bcm2835.exported_pins).to eq []
|
62
|
+
}
|
63
|
+
end
|
64
|
+
# end
|
65
|
+
|
66
|
+
# describe 'GPIO' do
|
67
|
+
# before(:all) do
|
68
|
+
# Bcm2835.export(5)
|
69
|
+
# end
|
70
|
+
|
71
|
+
it 'should set pin\'s direction' do
|
72
|
+
Bcm2835.export(5)
|
73
|
+
expect(File).to receive(:write).with("/sys/class/gpio/gpio5/direction", "in")
|
74
|
+
Bcm2835.pin_direction(5, 'in')
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should set pin as an input' do
|
78
|
+
expect(Bcm2835).to receive(:export).with(4)
|
79
|
+
expect(Bcm2835).to receive(:pin_direction).with(4, 'in')
|
80
|
+
Bcm2835.pin_input(4)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should set pin as an output' do
|
84
|
+
expect(Bcm2835).to receive(:export).with(4)
|
85
|
+
expect(Bcm2835).to receive(:pin_direction).with(4, 'out')
|
86
|
+
Bcm2835.pin_output(4)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should set pin value' do
|
90
|
+
Bcm2835.export(5)
|
91
|
+
expect(File).to receive(:write).with("/sys/class/gpio/gpio5/value", 1)
|
92
|
+
Bcm2835.pin_set(5, 1)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should get pin value' do
|
96
|
+
Bcm2835.export(5)
|
97
|
+
expect(File).to receive(:read).with("/sys/class/gpio/gpio5/value")
|
98
|
+
Bcm2835.pin_read(5)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should stop RW access to pin after unexport' do
|
102
|
+
Bcm2835.unexport_pin(4)
|
103
|
+
expect { Bcm2835.pin_read(4) }.to raise_error(PinError)
|
104
|
+
expect { Bcm2835.pin_set(4, 1) }.to raise_error(PinError)
|
105
|
+
expect { Bcm2835.pin_direction(4, 1) }.to raise_error(PinError)
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should set pin edge' do
|
109
|
+
Bcm2835.export(5)
|
110
|
+
expect(File).to receive(:write).with("/sys/class/gpio/gpio5/edge", :both)
|
111
|
+
Bcm2835.pin_set_edge(5, :both)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should wait for an edge event to return' do
|
115
|
+
pending 'how could we test edge trigger ?!'
|
116
|
+
fail
|
117
|
+
end
|
118
|
+
|
119
|
+
# end
|
120
|
+
|
121
|
+
xdescribe 'SPI' do
|
122
|
+
it 'spidev_out(array)'
|
123
|
+
it 'spi_transfer_bytes(data)'
|
124
|
+
end
|
125
|
+
|
126
|
+
xdescribe 'I2C' do
|
127
|
+
it 'i2c_allowed_clocks'
|
128
|
+
it 'i2c_transfer_bytes(data)'
|
129
|
+
it 'i2c_read_bytes(bytes)'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
data/spec/i2c_spec.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe 'I2C' do
|
4
|
+
|
5
|
+
before(:example) do |example|
|
6
|
+
Platform.driver = StubDriver.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'clock setting' do
|
10
|
+
it 'should check driver settings' do
|
11
|
+
expect(Platform.driver).to receive(:i2c_allowed_clocks).and_return([100.kilohertz])
|
12
|
+
I2C.clock = 100.kilohertz
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should accept 100 kHz' do
|
16
|
+
expect(Platform.driver).to receive(:i2c_allowed_clocks).and_return([100.kilohertz])
|
17
|
+
expect(Platform.driver).to receive(:i2c_set_clock).with(100.kilohertz)
|
18
|
+
I2C.clock = 100.kilohertz
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should not accept 200 kHz' do
|
22
|
+
expect(Platform.driver).to receive(:i2c_allowed_clocks).and_return([100.kilohertz])
|
23
|
+
expect { I2C.clock = 200.kilohertz }.to raise_error(RuntimeError)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'when in block' do
|
28
|
+
it 'should call i2c_begin' do
|
29
|
+
expect(Platform.driver).to receive(:i2c_begin)
|
30
|
+
I2C.begin {}
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should call i2c_end' do
|
34
|
+
expect(Platform.driver).to receive(:i2c_end)
|
35
|
+
I2C.begin {}
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should call i2c_end even after raise' do
|
39
|
+
expect(Platform.driver).to receive(:i2c_end)
|
40
|
+
begin
|
41
|
+
I2C.begin { raise 'OMG' }
|
42
|
+
rescue
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'write operation' do
|
47
|
+
it 'should set address' do
|
48
|
+
expect(Platform.driver).to receive(:i2c_set_address).with(4)
|
49
|
+
I2C.begin do
|
50
|
+
write to: 4, data: [1, 2, 3, 4]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should pass data to driver' do
|
55
|
+
expect(Platform.driver).to receive(:i2c_transfer_bytes).with([1, 2, 3, 4])
|
56
|
+
I2C.begin do
|
57
|
+
write to: 4, data: [1, 2, 3, 4]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/spec/pin_spec.rb
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
include PiPiper
|
3
|
+
|
4
|
+
describe 'Pin' do
|
5
|
+
|
6
|
+
before(:example) do |example|
|
7
|
+
Platform.driver = StubDriver.new
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'Basic Behaviour' do
|
11
|
+
it 'should export pin for input' do
|
12
|
+
expect(Platform.driver).to receive(:pin_input).with(4)
|
13
|
+
Pin.new pin: 4, direction: :in
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should export pin for output' do
|
17
|
+
expect(Platform.driver).to receive(:pin_output).with(4)
|
18
|
+
Pin.new pin: 4, direction: :out
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should read start value on construction' do
|
22
|
+
expect(Platform.driver).to receive(:pin_read).with(4).and_return(0)
|
23
|
+
Pin.new pin: 4, direction: :in
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should detect on?' do
|
27
|
+
expect(Platform.driver).to receive(:pin_read).with(4).and_return(1)
|
28
|
+
pin = Pin.new pin: 4, direction: :in
|
29
|
+
expect(pin.on?).to be(true)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should detect off?' do
|
33
|
+
expect(Platform.driver).to receive(:pin_read).with(4).and_return(0)
|
34
|
+
pin = Pin.new pin: 4, direction: :in
|
35
|
+
expect(pin.off?).to be(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should invert true' do
|
39
|
+
expect(Platform.driver).to receive(:pin_read).with(4).and_return(1)
|
40
|
+
pin = Pin.new pin: 4, direction: :in, invert: true
|
41
|
+
expect(pin.on?).to be(false)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should invert true' do
|
45
|
+
expect(Platform.driver).to receive(:pin_read).with(4).and_return(0)
|
46
|
+
pin = Pin.new pin: 4, direction: :in, invert: true
|
47
|
+
expect(pin.off?).to be(false)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should write high' do
|
51
|
+
expect(Platform.driver).to receive(:pin_set).with(4, 1)
|
52
|
+
pin = Pin.new pin: 4, direction: :out
|
53
|
+
pin.on
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should write low' do
|
57
|
+
expect(Platform.driver).to receive(:pin_set).with(4, 0)
|
58
|
+
pin = Pin.new pin: 4, direction: :out
|
59
|
+
pin.off
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should not write high on direction in' do
|
63
|
+
expect(Platform.driver).not_to receive(:pin_set)
|
64
|
+
pin = Pin.new pin: 4, direction: :in
|
65
|
+
pin.on
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should not write low on direction in' do
|
69
|
+
expect(Platform.driver).not_to receive(:pin_set)
|
70
|
+
pin = Pin.new pin: 4, direction: :in
|
71
|
+
pin.off
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should detect high to low change' do
|
75
|
+
value = 1
|
76
|
+
# begins low, then high, low, high, low...
|
77
|
+
allow(Platform.driver).to receive(:pin_read) { value ^= 1 }
|
78
|
+
|
79
|
+
pin = Pin.new pin: 4, direction: :in
|
80
|
+
expect(pin.off?).to be(true)
|
81
|
+
pin.read
|
82
|
+
expect(pin.off?).to be(false)
|
83
|
+
expect(pin.changed?).to be(true)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should wait for change' do
|
87
|
+
expect(Platform.driver).to receive(:pin_wait_for).with(4, :both)
|
88
|
+
pin = Pin.new pin: 4, direction: :out, edge: :rising
|
89
|
+
pin.wait_for_change
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'Pull up/down/float' do
|
94
|
+
let!(:pin_up) do
|
95
|
+
Pin.new(pin: 17, direction: :in, pull: :up)
|
96
|
+
end
|
97
|
+
let!(:pin_down) do
|
98
|
+
Pin.new(pin: 17, direction: :in, pull: :down)
|
99
|
+
end
|
100
|
+
let!(:pin_off) do
|
101
|
+
Pin.new(pin: 17, direction: :in, pull: :off)
|
102
|
+
end
|
103
|
+
let!(:pin_float) do
|
104
|
+
Pin.new(pin: 17, direction: :in, pull: :float)
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should raise an error for invalid :pull values' do
|
108
|
+
expect { Pin.new(pin: 17, direction: :in, pull: :wth) }.to raise_error PinError
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should restrict allowed :pull values' do
|
112
|
+
expect(pin_up.pull?).to eq(:up)
|
113
|
+
expect(pin_down.pull?).to eq(:down)
|
114
|
+
expect(pin_off.pull?).to eq(:off)
|
115
|
+
expect(pin_float.pull?).to eq(:off)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should not accept pulls when direction is :out' do
|
119
|
+
expect{ Pin.new(pin: 17, direction: :out, pull: :up) }.to raise_error PinError
|
120
|
+
expect{ Pin.new(pin: 17, direction: :out, pull: :down) }.to raise_error PinError
|
121
|
+
expect{ Pin.new(pin: 17, direction: :out, pull: :off) }.not_to raise_error
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should not allow pull! when direction is :out' do
|
125
|
+
p_out = Pin.new(pin: 17, direction: :out)
|
126
|
+
expect{ p_out.pull!(:up) }.to raise_error PinError
|
127
|
+
expect{ p_out.pull!(:down) }.to raise_error PinError
|
128
|
+
expect{ p_out.pull!(:off) }.not_to raise_error
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should allow subsequent pull resistor changes when direction is :in' do
|
132
|
+
expect(Platform.driver).to receive(:pin_set_pud).with(17, PinValues::GPIO_PUD_UP)
|
133
|
+
expect(Platform.driver).to receive(:pin_set_pud).with(17, PinValues::GPIO_PUD_DOWN)
|
134
|
+
expect(Platform.driver).to receive(:pin_set_pud).with(17, PinValues::GPIO_PUD_OFF)
|
135
|
+
pin_off.pull!(:up)
|
136
|
+
pin_off.pull!(:down)
|
137
|
+
pin_off.pull!(:off)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|