pi_piper 1.2.1 → 1.3
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/Manifest +0 -1
- data/README.md +6 -2
- data/Rakefile +1 -1
- data/lib/pi_piper.rb +26 -4
- data/lib/pi_piper/bcm2835.rb +2 -0
- data/lib/pi_piper/pin.rb +19 -1
- data/lib/pi_piper/spi.rb +36 -28
- data/pi_piper.gemspec +2 -2
- metadata +2 -2
data/Manifest
CHANGED
data/README.md
CHANGED
@@ -7,9 +7,10 @@ Pi Piper brings event driven programming to the Raspberry Pi's GPIO pins. To get
|
|
7
7
|
### GPIO
|
8
8
|
```ruby
|
9
9
|
require 'pi_piper'
|
10
|
+
include PiPiper
|
10
11
|
|
11
|
-
|
12
|
-
puts "Pin changed from #{
|
12
|
+
watch :pin => 23 do
|
13
|
+
puts "Pin changed from #{last_value} to #{value}"
|
13
14
|
end
|
14
15
|
|
15
16
|
PiPiper.wait
|
@@ -36,6 +37,9 @@ PiPiper::Spi.begin do |spi|
|
|
36
37
|
end
|
37
38
|
```
|
38
39
|
|
40
|
+
## Documentation
|
41
|
+
|
42
|
+
API documentation for Pi Piper can be found at [rdoc.info](http://rdoc.info/github/jwhitehorn/pi_piper/frames/).
|
39
43
|
|
40
44
|
## Example projects
|
41
45
|
|
data/Rakefile
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'echoe'
|
4
4
|
|
5
|
-
Echoe.new('pi_piper', '1.
|
5
|
+
Echoe.new('pi_piper', '1.3') do |p|
|
6
6
|
p.description = "Event driven Raspberry Pi GPIO library"
|
7
7
|
p.url = "http://github.com/jwhitehorn/pi_piper"
|
8
8
|
p.author = "Jason Whitehorn"
|
data/lib/pi_piper.rb
CHANGED
@@ -5,18 +5,40 @@ end
|
|
5
5
|
PiPiper::Bcm2835.init
|
6
6
|
|
7
7
|
module PiPiper
|
8
|
-
|
9
|
-
|
8
|
+
extend self
|
9
|
+
|
10
|
+
#Defines an event block to be executed when an pin event occurs.
|
11
|
+
#
|
12
|
+
# == Parameters:
|
13
|
+
# options:
|
14
|
+
# Options hash. Options include `:pin`, `:invert` and `:trigger`.
|
15
|
+
#
|
16
|
+
def watch(options, &block)
|
10
17
|
Thread.new do
|
11
18
|
pin = PiPiper::Pin.new(options)
|
12
19
|
loop do
|
13
20
|
pin.wait_for_change
|
14
|
-
|
21
|
+
if block.arity > 0
|
22
|
+
block.call pin
|
23
|
+
else
|
24
|
+
pin.instance_exec &block
|
25
|
+
end
|
15
26
|
end
|
16
27
|
end.abort_on_exception = true
|
17
28
|
end
|
29
|
+
|
30
|
+
#Defines an event block to be executed after a pin either goes high or low.
|
31
|
+
#
|
32
|
+
# @param [Hash] options A hash of options
|
33
|
+
# @option options [Fixnum] :pin The pin number to initialize. Required.
|
34
|
+
# @option options [Symbol] :goes The event to watch for. Either :high or :low. Required.
|
35
|
+
def after(options, &block)
|
36
|
+
options[:trigger] = options.delete(:goes) == :high ? :rising : :falling
|
37
|
+
watch options, &block
|
38
|
+
end
|
18
39
|
|
19
|
-
|
40
|
+
#Prevents the main thread from exiting. Required when using PiPiper.watch
|
41
|
+
def wait
|
20
42
|
loop do sleep 1 end
|
21
43
|
end
|
22
44
|
|
data/lib/pi_piper/bcm2835.rb
CHANGED
data/lib/pi_piper/pin.rb
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
module PiPiper
|
2
|
+
# Represents a GPIO pin on the Raspberry Pi
|
2
3
|
class Pin
|
3
4
|
attr_reader :pin, :last_value, :value, :direction, :invert
|
4
5
|
|
6
|
+
#Initializes a new GPIO pin.
|
7
|
+
#
|
8
|
+
# @param [Hash] options A hash of options
|
9
|
+
# @option options [Fixnum] :pin The pin number to initialize. Required.
|
10
|
+
# @option options [Symbol] :direction The direction of communication, either :in or :out. Defaults to :in.
|
11
|
+
# @option options [Boolean] :invert Indicates if the value read from the physical pin should be inverted. Defaults to false.
|
12
|
+
# @option options [Symbol] :trigger Indicates when the wait_for_change method will detect a change, either :rising, :falling, or :both edge triggers. Defaults to :both.
|
5
13
|
def initialize(options)
|
6
14
|
options = {:direction => :in, :invert => false, :trigger => :both}.merge options
|
7
15
|
@pin = options[:pin]
|
@@ -18,30 +26,38 @@ module PiPiper
|
|
18
26
|
read
|
19
27
|
end
|
20
28
|
|
29
|
+
# If the pin has been initialized for output this method will set the logic level high.
|
21
30
|
def on
|
22
31
|
File.open(value_file, 'w') {|f| f.write("1") } if direction == :out
|
23
32
|
end
|
24
33
|
|
34
|
+
# Tests if the logic level is high.
|
25
35
|
def on?
|
26
36
|
not off?
|
27
37
|
end
|
28
38
|
|
39
|
+
# If the pin has been initialized for output this method will set the logic level low.
|
29
40
|
def off
|
30
41
|
File.open(value_file, 'w') {|f| f.write("0") } if direction == :out
|
31
42
|
end
|
32
43
|
|
44
|
+
# Tests if the logic level is low.
|
33
45
|
def off?
|
34
46
|
value == 0
|
35
47
|
end
|
36
48
|
|
49
|
+
# If the pin has been initialized for output this method will either raise or lower the logic level depending on `new_value`.
|
50
|
+
# @param [Object] new_value If false or 0 the pin will be set to off, otherwise on.
|
37
51
|
def update_value(new_value)
|
38
52
|
!new_value || new_value == 0 ? off : on
|
39
53
|
end
|
40
54
|
|
55
|
+
# Tests if the logic level has changed since the pin was last read.
|
41
56
|
def changed?
|
42
57
|
last_value != value
|
43
58
|
end
|
44
59
|
|
60
|
+
# blocks until a logic level change occurs. The initializer option `:trigger` modifies what edge this method will release on.
|
45
61
|
def wait_for_change
|
46
62
|
fd = File.open(value_file, "r")
|
47
63
|
File.open(edge_file, "w") { |f| f.write("both") }
|
@@ -56,7 +72,9 @@ module PiPiper
|
|
56
72
|
end
|
57
73
|
end
|
58
74
|
end
|
59
|
-
|
75
|
+
|
76
|
+
# Reads the current value from the pin. Without calling this method first, `value`, `last_value` and `changed?` will not be updated.
|
77
|
+
# In short, you must call this method if you are curious about the current state of the pin.
|
60
78
|
def read
|
61
79
|
@last_value = @value
|
62
80
|
val = File.read(value_file).to_i
|
data/lib/pi_piper/spi.rb
CHANGED
@@ -1,32 +1,38 @@
|
|
1
|
-
|
2
|
-
Modifications Copyright 2013, Jason Whitehorn and released under the terms
|
3
|
-
of the license included in README.md
|
4
|
-
|
5
|
-
Based on works, Copyright (c) 2012 Joshua Nussbaum
|
6
|
-
|
7
|
-
MIT License
|
8
|
-
|
9
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
10
|
-
a copy of this software and associated documentation files (the
|
11
|
-
"Software"), to deal in the Software without restriction, including
|
12
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
13
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
14
|
-
|
15
|
-
the
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
1
|
+
#--
|
2
|
+
#Modifications Copyright 2013, Jason Whitehorn and released under the terms
|
3
|
+
#of the license included in README.md
|
4
|
+
#
|
5
|
+
#Based on works, Copyright (c) 2012 Joshua Nussbaum
|
6
|
+
#
|
7
|
+
#MIT License
|
8
|
+
#
|
9
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
10
|
+
#a copy of this software and associated documentation files (the
|
11
|
+
#"Software"), to deal in the Software without restriction, including
|
12
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
13
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
14
|
+
#
|
15
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
16
|
+
#the following conditions:
|
17
|
+
#
|
18
|
+
#The above copyright notice and this permission notice shall be
|
19
|
+
#included in all copies or substantial portions of the Software.
|
20
|
+
#
|
21
|
+
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
22
|
+
#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
23
|
+
#MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
24
|
+
#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
25
|
+
#LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
26
|
+
#OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
27
|
+
#WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
28
|
+
#++
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
28
33
|
|
29
34
|
module PiPiper
|
35
|
+
# class for SPI interfaces on the Raspberry Pi
|
30
36
|
class Spi
|
31
37
|
# 65536 = 256us = 4kHz
|
32
38
|
CLOCK_DIVIDER_65536 = 0
|
@@ -69,6 +75,7 @@ module PiPiper
|
|
69
75
|
# No CS, control it yourself
|
70
76
|
CHIP_SELECT_NONE = 3
|
71
77
|
|
78
|
+
#Sets the SPI mode. Defaults to mode (0,0).
|
72
79
|
def self.set_mode(cpol, cpha)
|
73
80
|
mode = SPI_MODE0 #default
|
74
81
|
mode = SPI_MODE1 if cpol == 0 and cpha == 1
|
@@ -77,6 +84,7 @@ module PiPiper
|
|
77
84
|
Bcma2835.spi_set_data_mode mode
|
78
85
|
end
|
79
86
|
|
87
|
+
#Begin an SPI block. All SPI communications should be wrapped in a block.
|
80
88
|
def self.begin(chip=nil)
|
81
89
|
Bcm2835.spi_begin
|
82
90
|
chip = CHIP_SELECT_0 if !chip && block_given?
|
@@ -190,7 +198,7 @@ module PiPiper
|
|
190
198
|
# @example Write multiple bytes
|
191
199
|
# spi.write(0x22, 0x33, 0x44)
|
192
200
|
#
|
193
|
-
# @return [Number|Array
|
201
|
+
# @return [Number|Array] data that came out of MISO during write
|
194
202
|
def write(*args)
|
195
203
|
case args.count
|
196
204
|
when 0
|
data/pi_piper.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "pi_piper"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Jason Whitehorn"]
|
9
|
-
s.date = "2013-01-
|
9
|
+
s.date = "2013-01-28"
|
10
10
|
s.description = "Event driven Raspberry Pi GPIO library"
|
11
11
|
s.email = "jason.whitehorn@gmail.com"
|
12
12
|
s.extra_rdoc_files = ["README.md", "lib/pi_piper.rb", "lib/pi_piper/bcm2835.rb", "lib/pi_piper/libbcm2835.img", "lib/pi_piper/pin.rb", "lib/pi_piper/spi.rb"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pi_piper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.3'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|