gpio 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/changelog +8 -0
- data/lib/gpio.rb +1 -1
- data/lib/gpio/device.rb +32 -9
- data/lib/gpio/devices/other.rb +18 -0
- data/lib/gpio/devices/raspberry_pi.rb +18 -0
- data/lib/gpio/pin.rb +5 -11
- data/lib/gpio/pins/input_pin.rb +17 -0
- data/lib/gpio/pins/output_pin.rb +17 -0
- data/lib/gpio/sensor.rb +10 -5
- data/lib/gpio/{motion_detector.rb → sensors/motion_detector.rb} +0 -0
- metadata +7 -4
- data/lib/gpio/raspberry_pi.rb +0 -37
data/changelog
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
version 0.0.6
|
2
|
+
- new reading method File.new and f.getc/rewind that gets into ~35 microsecond reads instead of ~55 microsecond IO.new io.getc/rewind and ~350 microsecond reads with IO.read
|
3
|
+
- typed input/output pins, mainly to prepare for pwm, bidirectional/1wire, and more
|
4
|
+
- organized folders for devices/pins/sensors
|
5
|
+
|
6
|
+
version 0.0.5
|
7
|
+
- date bump
|
8
|
+
|
1
9
|
version 0.0.4
|
2
10
|
- major changes to reading/writing from/to gpio including checking permissions with hands free fallback to older sudo method
|
3
11
|
- path_write method checks permissions and writes using IO.write for performance and falls back to shelling out to sudo echo
|
data/lib/gpio.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
%w[device raspberry_pi pin sensor motion_detector].each{|file| require File.dirname(__FILE__)+'/gpio/'+file}
|
1
|
+
%w[device devices/raspberry_pi pin pins/input_pin pins/output_pin sensor sensors/motion_detector].each{|file| require File.dirname(__FILE__)+'/gpio/'+file}
|
data/lib/gpio/device.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module GPIO
|
2
2
|
module Device
|
3
3
|
def software_pin(pin)
|
4
|
-
raise "That software pin #{pin} doesn't exist." unless
|
5
|
-
|
4
|
+
raise "That software pin #{pin} doesn't exist." unless self::SOFTWARE_PINS.include? pin
|
5
|
+
self::MAPPING == :software ? pin : self::SOFTWARE_PINS[self::HARDWARE_PINS.index(pin)]
|
6
6
|
end
|
7
7
|
def hardware_pin(pin)
|
8
|
-
raise "That hardware pin #{pin} doesn't exist." unless
|
9
|
-
|
8
|
+
raise "That hardware pin #{pin} doesn't exist." unless self::HARDWARE_PINS.include? pin
|
9
|
+
self::MAPPING == :hardware ? pin : self::HARDWARE_PINS[self::SOFTWARE_PINS.index(pin)]
|
10
10
|
end
|
11
11
|
def load_pins
|
12
12
|
get_pins(:hardware).map{|pin| Pin.new(pin,get_direction(pin),self)}
|
@@ -16,7 +16,7 @@ module GPIO
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def get_pins(mapping)
|
19
|
-
pins = Dir.entries
|
19
|
+
pins = Dir.entries self::BASE_PATH.select!{|pin| pin[/(?:#{PIN_PREFIX})(\d+)/]}.to_i
|
20
20
|
pins.map!{|pin| Pin.new(pin,nil,self).pin}
|
21
21
|
end
|
22
22
|
def get_direction(software_pin)
|
@@ -29,18 +29,27 @@ module GPIO
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def exported?(software_pin)
|
32
|
-
|
32
|
+
File.exists? pin_path(software_pin)
|
33
33
|
end
|
34
34
|
def export!(software_pin,direction)
|
35
|
-
path_write
|
35
|
+
path_write self::EXPORT_PATH, software_pin
|
36
36
|
path_write direction_path(software_pin), direction
|
37
37
|
exported?(software_pin)
|
38
38
|
end
|
39
39
|
def unexport!(software_pin)
|
40
|
-
path_write
|
40
|
+
path_write self::UNEXPORT_PATH, software_pin
|
41
41
|
!exported? software_pin
|
42
42
|
end
|
43
43
|
|
44
|
+
def pin_file(software_pin, mode)
|
45
|
+
m = case mode.to_s
|
46
|
+
when 'in'; 'r'
|
47
|
+
when 'out'; 'w'
|
48
|
+
when 'bi'; 'r+'
|
49
|
+
end
|
50
|
+
File.new value_path(software_pin), m
|
51
|
+
end
|
52
|
+
|
44
53
|
def read(software_pin)
|
45
54
|
IO.read(value_path(software_pin), 1) == '1'
|
46
55
|
end
|
@@ -49,10 +58,24 @@ module GPIO
|
|
49
58
|
path_write value_path(software_pin), value
|
50
59
|
end
|
51
60
|
def path_write(path, value)
|
52
|
-
File::Stat.
|
61
|
+
File::Stat.new(path).writable? ? IO.write(path, value) : path_write_sudo(path, value)
|
53
62
|
end
|
54
63
|
def path_write_sudo(path, value)
|
55
64
|
`sudo bash -c "echo #{value} > #{path}"`.chomp!
|
56
65
|
end
|
66
|
+
|
67
|
+
def pin_path(n)
|
68
|
+
"#{self::BASE_PATH}#{self::PIN_PREFIX}#{n}/"
|
69
|
+
end
|
70
|
+
def direction_path(n)
|
71
|
+
"#{pin_path(n)}#{self::DIRECTION_FILE}"
|
72
|
+
end
|
73
|
+
def value_path(n)
|
74
|
+
"#{pin_path(n)}#{self::VALUE_FILE}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def valid?
|
78
|
+
IO.read(self::VALIDATE_FILE).chomp! == self::VALIDATE_VALUE
|
79
|
+
end
|
57
80
|
end
|
58
81
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GPIO
|
2
|
+
module Other
|
3
|
+
extend Device
|
4
|
+
|
5
|
+
VALIDATE_FILE = "/sys/class/gpio/gpiochip0/label"
|
6
|
+
VALIDATE_VALUE = "chipset_gpio"
|
7
|
+
|
8
|
+
MAPPING = :hardware
|
9
|
+
HARDWARE_PINS = [0,1,2]
|
10
|
+
SOFTWARE_PINS = [2,1,0]
|
11
|
+
BASE_PATH = '/sys/class/gpio/'
|
12
|
+
EXPORT_PATH = "#{BASE_PATH}export"
|
13
|
+
UNEXPORT_PATH = "#{BASE_PATH}unexport"
|
14
|
+
PIN_PREFIX = "gpio"
|
15
|
+
DIRECTION_FILE = "mode"
|
16
|
+
VALUE_FILE = "value"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GPIO
|
2
|
+
module RaspberryPi
|
3
|
+
extend Device
|
4
|
+
|
5
|
+
VALIDATE_FILE = "/sys/class/gpio/gpiochip0/label"
|
6
|
+
VALIDATE_VALUE = "bcm2708_gpio"
|
7
|
+
|
8
|
+
MAPPING = :hardware
|
9
|
+
HARDWARE_PINS = [3,5,7,8,10,11,12,13,15,16,17,19,21,22,23,24,26]
|
10
|
+
SOFTWARE_PINS = [0,1,4,14,15,17,18,21,22,23,24,10,9,25,11,8,7]
|
11
|
+
BASE_PATH = '/sys/class/gpio/'
|
12
|
+
EXPORT_PATH = "#{BASE_PATH}export"
|
13
|
+
UNEXPORT_PATH = "#{BASE_PATH}unexport"
|
14
|
+
PIN_PREFIX = "gpio"
|
15
|
+
DIRECTION_FILE = "direction"
|
16
|
+
VALUE_FILE = "value"
|
17
|
+
end
|
18
|
+
end
|
data/lib/gpio/pin.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module GPIO
|
2
2
|
class Pin
|
3
|
-
attr_reader :pin, :mode, :device, :hardware_pin, :software_pin
|
3
|
+
attr_reader :pin, :mode, :device, :hardware_pin, :software_pin, :file
|
4
4
|
def initialize(params) #(pin, mode, device=:RaspberryPi)
|
5
5
|
@device = GPIO.const_get(params[:device]||:RaspberryPi)
|
6
6
|
|
@@ -8,22 +8,16 @@ module GPIO
|
|
8
8
|
@hardware_pin = device.hardware_pin(pin)
|
9
9
|
@software_pin = device.software_pin(pin)
|
10
10
|
|
11
|
-
@mode = params[:mode].to_s
|
11
|
+
@mode = params[:mode].to_s
|
12
12
|
raise "Mode should be :in, :out, :bi, :pwm." unless ['in','out'].include? @mode
|
13
13
|
|
14
14
|
device.initialize_pin(software_pin, @mode)
|
15
|
+
@mode ||= get_direction
|
16
|
+
@file = @device.pin_file(pin, mode)
|
15
17
|
end
|
16
18
|
|
17
|
-
def on
|
18
|
-
device.write software_pin, 1
|
19
|
-
read
|
20
|
-
end
|
21
|
-
def off
|
22
|
-
device.write software_pin, 0
|
23
|
-
read
|
24
|
-
end
|
25
19
|
def read
|
26
|
-
|
20
|
+
file.rewind; file.getc
|
27
21
|
end
|
28
22
|
end
|
29
23
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GPIO
|
2
|
+
class InputPin < Pin
|
3
|
+
attr_reader :last_reading, :reading
|
4
|
+
def initialize(params) #(pin, mode, device=:RaspberryPi)
|
5
|
+
params.merge!(:mode => :in)
|
6
|
+
super(params)
|
7
|
+
end
|
8
|
+
|
9
|
+
def changed?
|
10
|
+
@last_reading != @reading
|
11
|
+
end
|
12
|
+
def read
|
13
|
+
@last_reading = @reading
|
14
|
+
@reading = super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GPIO
|
2
|
+
class OutputPin < Pin
|
3
|
+
def initialize(params) #(pin, mode, device=:RaspberryPi)
|
4
|
+
params.merge!(:mode => :out)
|
5
|
+
super(params)
|
6
|
+
end
|
7
|
+
|
8
|
+
def on
|
9
|
+
device.write software_pin, 1
|
10
|
+
read
|
11
|
+
end
|
12
|
+
def off
|
13
|
+
device.write software_pin, 0
|
14
|
+
read
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/gpio/sensor.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
module GPIO
|
2
2
|
class Sensor
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :pin
|
4
4
|
def initialize(params)
|
5
|
-
@pin =
|
5
|
+
@pin = InputPin.new(:pin => params[:pin], :mode => :in, :device => params[:device])
|
6
6
|
end
|
7
7
|
def changed?
|
8
|
-
|
8
|
+
pin.changed?
|
9
9
|
end
|
10
10
|
def read
|
11
|
-
|
12
|
-
|
11
|
+
pin.read
|
12
|
+
end
|
13
|
+
def reading
|
14
|
+
pin.reading
|
15
|
+
end
|
16
|
+
def last_reading
|
17
|
+
pin.last_reading
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
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: 2012-06-
|
12
|
+
date: 2012-06-08 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: gpio allows for devices such as raspberry pi or systems with 1wire usb
|
15
15
|
adapters to speak to the system's input/output pins.
|
@@ -19,11 +19,14 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- lib/gpio.rb
|
22
|
-
- lib/gpio/
|
22
|
+
- lib/gpio/sensors/motion_detector.rb
|
23
23
|
- lib/gpio/sensor.rb
|
24
24
|
- lib/gpio/pin.rb
|
25
|
-
- lib/gpio/
|
25
|
+
- lib/gpio/pins/output_pin.rb
|
26
|
+
- lib/gpio/pins/input_pin.rb
|
26
27
|
- lib/gpio/device.rb
|
28
|
+
- lib/gpio/devices/raspberry_pi.rb
|
29
|
+
- lib/gpio/devices/other.rb
|
27
30
|
- README.md
|
28
31
|
- changelog
|
29
32
|
homepage: http://klappy.github.com/gpio
|
data/lib/gpio/raspberry_pi.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module GPIO
|
2
|
-
module RaspberryPi
|
3
|
-
extend Device
|
4
|
-
|
5
|
-
def self.mapping
|
6
|
-
:hardware
|
7
|
-
end
|
8
|
-
def self.hardware_pins
|
9
|
-
[3,5,7,8,10,11,12,13,15,16,17,19,21,22,23,24,26]
|
10
|
-
end
|
11
|
-
def self.software_pins
|
12
|
-
[0,1,4,14,15,17,18,21,22,23,24,10,9,25,11,8,7]
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.base_path
|
16
|
-
'/sys/class/gpio/'
|
17
|
-
end
|
18
|
-
def self.pin_path(n)
|
19
|
-
"#{base_path}#{pin_prefix}#{n}/"
|
20
|
-
end
|
21
|
-
def self.direction_path(n)
|
22
|
-
"#{pin_path(n)}direction"
|
23
|
-
end
|
24
|
-
def self.value_path(n)
|
25
|
-
"#{pin_path(n)}value"
|
26
|
-
end
|
27
|
-
def self.export_path
|
28
|
-
"#{base_path}export"
|
29
|
-
end
|
30
|
-
def self.unexport_path
|
31
|
-
"#{base_path}unexport"
|
32
|
-
end
|
33
|
-
def self.pin_prefix
|
34
|
-
"gpio"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|