gpio 0.0.3 → 0.0.4

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/changelog CHANGED
@@ -1,3 +1,14 @@
1
+ version 0.0.4
2
+ - major changes to reading/writing from/to gpio including checking permissions with hands free fallback to older sudo method
3
+ - path_write method checks permissions and writes using IO.write for performance and falls back to shelling out to sudo echo
4
+ - using IO.read and Dir.methods where possible for performance gains, added self.pin_prefix
5
+ - raspberry_pi.rb => device.rb: moved methods that are now generic enough to be in device.
6
+ - extracted paths to separate methods to allow for generic gpio methods to be moved to device and allow raspberr_pi.rb and other modules that extend device to be configuration.
7
+ - removed sudo from reads, only needed for writes
8
+ - print pin in error message raised
9
+ - benchmarks added to see timings of different methods of reading/writing
10
+ - found new methods of reading file that may be viable for microsecond intervals
11
+
1
12
  version 0.0.3
2
13
  - updated readme with example
3
14
  - example usage code added
@@ -12,4 +23,4 @@ version 0.0.2
12
23
  - lib files now load properly
13
24
 
14
25
  version 0.0.1: initial public release
15
- - proof of concept / prototype
26
+ - proof of concept / prototype
@@ -1,11 +1,11 @@
1
1
  module GPIO
2
2
  module Device
3
3
  def software_pin(pin)
4
- raise "That software pin doesn't exist." unless software_pins.include? pin
4
+ raise "That software pin #{pin} doesn't exist." unless software_pins.include? pin
5
5
  mapping == :software ? pin : software_pins[hardware_pins.index(pin)]
6
6
  end
7
7
  def hardware_pin(pin)
8
- raise "That hardware pin doesn't exist." unless hardware_pins.include? pin
8
+ raise "That hardware pin #{pin} doesn't exist." unless hardware_pins.include? pin
9
9
  mapping == :hardware ? pin : hardware_pins[software_pins.index(pin)]
10
10
  end
11
11
  def load_pins
@@ -14,5 +14,45 @@ module GPIO
14
14
  def unexport_all!
15
15
  load_pins.map(&unexport!)
16
16
  end
17
+
18
+ def get_pins(mapping)
19
+ pins = Dir.entries base_path.select!{|pin| pin[/(?:#{pin_prefix})(\d+)/]}.to_i
20
+ pins.map!{|pin| Pin.new(pin,nil,self).pin}
21
+ end
22
+ def get_direction(software_pin)
23
+ IO.read(direction_path(software_pin)).chomp!
24
+ end
25
+
26
+ def initialize_pin(software_pin, direction)
27
+ unexport!(software_pin) if exported?(software_pin) && direction != get_direction(software_pin)
28
+ export!(software_pin, direction) unless exported?(software_pin)
29
+ end
30
+
31
+ def exported?(software_pin)
32
+ Dir.exists? pin_path(software_pin)
33
+ end
34
+ def export!(software_pin,direction)
35
+ path_write export_path, software_pin
36
+ path_write direction_path(software_pin), direction
37
+ exported?(software_pin)
38
+ end
39
+ def unexport!(software_pin)
40
+ path_write unexport_path, software_pin
41
+ !exported? software_pin
42
+ end
43
+
44
+ def read(software_pin)
45
+ IO.read(value_path(software_pin), 1) == '1'
46
+ end
47
+ def write(software_pin,value)
48
+ raise "This pin is an input." if get_direction(software_pin) == 'in'
49
+ path_write value_path(software_pin), value
50
+ end
51
+ def path_write(path, value)
52
+ File::Stat.writable?(path) ? IO.write(path, value) : path_write_sudo(path, value)
53
+ end
54
+ def path_write_sudo(path, value)
55
+ `sudo bash -c "echo #{value} > #{path}"`.chomp!
56
+ end
17
57
  end
18
- end
58
+ end
@@ -11,39 +11,27 @@ module GPIO
11
11
  def self.software_pins
12
12
  [0,1,4,14,15,17,18,21,22,23,24,10,9,25,11,8,7]
13
13
  end
14
-
15
- def self.get_pins(mapping=@mapping)
16
- pins = `sudo ls /sys/class/gpio`.scan(/(?:gpio)(\d+)/).flatten.map!(&:to_i)
17
- pins.map!{|pin| Pin.new(pin,nil,self).pin}
14
+
15
+ def self.base_path
16
+ '/sys/class/gpio/'
18
17
  end
19
- def self.get_direction(software_pin)
20
- `sudo cat /sys/class/gpio/gpio#{software_pin}/direction`.chomp
18
+ def self.pin_path(n)
19
+ "#{base_path}#{pin_prefix}#{n}/"
21
20
  end
22
-
23
- def self.initialize_pin(software_pin, direction)
24
- unexport!(software_pin) if exported?(software_pin) && direction != get_direction(software_pin)
25
- export!(software_pin, direction) unless exported?(software_pin)
21
+ def self.direction_path(n)
22
+ "#{pin_path(n)}direction"
26
23
  end
27
-
28
- def self.exported?(software_pin)
29
- `sudo [ -d /sys/class/gpio/gpio#{software_pin} ] && echo true || false`.chomp == 'true'
24
+ def self.value_path(n)
25
+ "#{pin_path(n)}value"
30
26
  end
31
- def self.export!(software_pin,direction)
32
- `sudo bash -c "echo #{software_pin} > /sys/class/gpio/export"`
33
- `sudo bash -c "echo #{direction} > /sys/class/gpio/gpio#{software_pin}/direction"`
34
- exported?(software_pin)
27
+ def self.export_path
28
+ "#{base_path}export"
35
29
  end
36
- def self.unexport!(software_pin)
37
- `sudo bash -c "echo #{software_pin} > /sys/class/gpio/unexport"`
38
- !exported?(software_pin)
39
- end
40
-
41
- def self.read(software_pin)
42
- `sudo cat /sys/class/gpio/gpio#{software_pin}/value`.chomp == '1'
30
+ def self.unexport_path
31
+ "#{base_path}unexport"
43
32
  end
44
- def self.write(software_pin,value)
45
- raise "This pin is an input." if get_direction(software_pin) == 'in'
46
- `sudo bash -c "echo #{value} > /sys/class/gpio/gpio#{software_pin}/value && echo true || false"`.chomp == 'true'
33
+ def self.pin_prefix
34
+ "gpio"
47
35
  end
48
36
  end
49
- end
37
+ end
metadata CHANGED
@@ -1,70 +1,54 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gpio
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 3
9
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Christopher Klapp
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-06-05 00:00:00 -04:00
18
- default_executable:
12
+ date: 2012-06-05 00:00:00.000000000 Z
19
13
  dependencies: []
20
-
21
- description: gpio allows for devices such as raspberry pi or systems with 1wire usb adapters to speak to the system's input/output pins.
14
+ description: gpio allows for devices such as raspberry pi or systems with 1wire usb
15
+ adapters to speak to the system's input/output pins.
22
16
  email: christopher@klapp.name
23
17
  executables: []
24
-
25
18
  extensions: []
26
-
27
19
  extra_rdoc_files: []
28
-
29
- files:
30
- - lib/gpio/device.rb
31
- - lib/gpio/motion_detector.rb
32
- - lib/gpio/pin.rb
20
+ files:
21
+ - lib/gpio.rb
33
22
  - lib/gpio/raspberry_pi.rb
34
23
  - lib/gpio/sensor.rb
35
- - lib/gpio.rb
36
- - examples/motion_example.rb
24
+ - lib/gpio/pin.rb
25
+ - lib/gpio/motion_detector.rb
26
+ - lib/gpio/device.rb
37
27
  - README.md
38
28
  - changelog
39
- has_rdoc: true
40
29
  homepage: http://klappy.github.com/gpio
41
30
  licenses: []
42
-
43
31
  post_install_message:
44
32
  rdoc_options: []
45
-
46
- require_paths:
33
+ require_paths:
47
34
  - lib
48
- required_ruby_version: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - ">="
51
- - !ruby/object:Gem::Version
52
- segments:
53
- - 0
54
- version: "0"
55
- required_rubygems_version: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- segments:
60
- - 0
61
- version: "0"
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
62
47
  requirements: []
63
-
64
48
  rubyforge_project:
65
- rubygems_version: 1.3.6
49
+ rubygems_version: 1.8.24
66
50
  signing_key:
67
51
  specification_version: 3
68
- summary: a ruby gem and repository to contribute gpio code for devices such as Raspberry Pi to read sensors and control outputs.
52
+ summary: a ruby gem and repository to contribute gpio code for devices such as Raspberry
53
+ Pi to read sensors and control outputs.
69
54
  test_files: []
70
-
@@ -1,20 +0,0 @@
1
- # Let's setup a motion sensor on GPIO pin 17 on a RaspberryPi (default).
2
- motion = GPIO::MotionDetector.new(pin: 17)
3
-
4
- # Do we detect and motion yet?
5
- motion.detect
6
-
7
- # Let's print a message corresponding to the motion.detect?
8
- puts motion.detect ? "Motion detected!" : "No motion detected."
9
-
10
- # Was the value any different than the last time it detected?
11
- motion.changed?
12
- puts "last: #{motion.last_reading}, current: #{motion.reading}"
13
-
14
- # Wait until the value changes before we move on.
15
- until motion.changed? do
16
- motion.detect
17
- sleep 0.5
18
- end
19
- puts "Something changed!"
20
- puts "last: #{motion.last_reading}, current: #{motion.reading}"