pi_piper 1.9.9 → 2.0.beta.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 13fdeb8e5268450e6f5e16b76fadd8c86c21d14e
4
- data.tar.gz: 0cf0fc4609e69c32a9f2fe67eb6b581a9959d021
3
+ metadata.gz: cecbad62bc8eeedf7e061bfc03396691f584ee82
4
+ data.tar.gz: 5c22774ad6b6c737019baa7802c99934668f537a
5
5
  SHA512:
6
- metadata.gz: 87894270c282f9368be74074bd7872cd5fd3ce9e26f961cb5cace37a8599cb8ac5aef5c4fcd03368274800cb37da9a10d21012cae8b2a8db0461e3577b77f6f8
7
- data.tar.gz: 51bc8cec9b89c1005881a20277543242e458c56c7e2e495daa32d46bdff5af3ab5671b7553d7ce66904d6d121ad76bccae618d2f4d65790d6524b1d332920c6c
6
+ metadata.gz: dac9621e23d30b021ead1b74f30496fedfa93474346bb1656fb5a9f1a882e7bedfbdff87c28e6b3b4c3c84adb39427599a37c1eedd3c9fde9f318c22e7e3d5c7
7
+ data.tar.gz: 7167326e0245ee3a3272fc926298b94d7aa2b4e893c5b20f8ce5bb6a84414efca45bb5776adac1454a60f4e8f7c2eb4b3c9d792c623c5926ccbdfa006d89f008
data/Gemfile CHANGED
@@ -3,6 +3,4 @@ source 'https://rubygems.org'
3
3
  gem 'echoe'
4
4
  gem 'rake'
5
5
  gem 'ffi'
6
- gem "eventmachine", "~> 1.0.9"
7
-
8
- gemspec
6
+ gem 'rspec'
@@ -1,10 +1,3 @@
1
- PATH
2
- remote: .
3
- specs:
4
- pi_piper (2.0.beta.11)
5
- eventmachine (= 1.0.9)
6
- ffi
7
-
8
1
  GEM
9
2
  remote: https://rubygems.org/
10
3
  specs:
@@ -16,50 +9,27 @@ GEM
16
9
  rake (>= 0.9.2)
17
10
  rdoc (>= 3.6.1)
18
11
  rubyforge (>= 2.0.4)
19
- eventmachine (1.0.9)
20
- ffi (1.9.0)
12
+ ffi (1.4.0)
21
13
  gemcutter (0.7.1)
22
- json (1.8.1)
23
- json_pure (1.8.1)
24
- metaclass (0.0.1)
25
- mocha (0.14.0)
26
- metaclass (~> 0.0.1)
27
- multi_json (1.8.2)
28
- rake (10.1.0)
29
- rdoc (4.0.1)
30
- json (~> 1.4)
31
- rspec (3.4.0)
32
- rspec-core (~> 3.4.0)
33
- rspec-expectations (~> 3.4.0)
34
- rspec-mocks (~> 3.4.0)
35
- rspec-core (3.4.1)
36
- rspec-support (~> 3.4.0)
37
- rspec-expectations (3.4.0)
38
- diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.4.0)
40
- rspec-mocks (3.4.1)
41
- diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.4.0)
43
- rspec-support (3.4.1)
14
+ json_pure (1.7.7)
15
+ rake (10.0.3)
16
+ rdoc (4.0.0)
17
+ rspec (2.14.1)
18
+ rspec-core (~> 2.14.0)
19
+ rspec-expectations (~> 2.14.0)
20
+ rspec-mocks (~> 2.14.0)
21
+ rspec-core (2.14.5)
22
+ rspec-expectations (2.14.2)
23
+ diff-lcs (>= 1.1.3, < 2.0)
24
+ rspec-mocks (2.14.3)
44
25
  rubyforge (2.0.4)
45
26
  json_pure (>= 1.1.7)
46
- simplecov (0.7.1)
47
- multi_json (~> 1.0)
48
- simplecov-html (~> 0.7.1)
49
- simplecov-html (0.7.1)
50
27
 
51
28
  PLATFORMS
52
29
  ruby
53
30
 
54
31
  DEPENDENCIES
55
32
  echoe
56
- eventmachine (~> 1.0.9)
57
33
  ffi
58
- mocha
59
- pi_piper!
60
34
  rake
61
35
  rspec
62
- simplecov
63
-
64
- BUNDLED WITH
65
- 1.11.2
data/README.md CHANGED
@@ -1,16 +1,14 @@
1
1
  ## Overview
2
2
 
3
- [![Build Status](https://travis-ci.org/jwhitehorn/pi_piper.png)](https://travis-ci.org/jwhitehorn/pi_piper)
4
-
5
- Pi Piper brings event driven programming to the Raspberry Pi's GPIO pins. Pi Piper works with all revisions of the Raspberry Pi,
3
+ Pi Piper brings event driven programming to the Raspberry Pi's GPIO pins. Pi Piper works with all revisions of the Raspberry Pi,
6
4
  and has been tested with Ruby 1.9.3 & 2.0 under both [Raspbian "wheezy"](http://www.raspberrypi.org/downloads) and [Occidentalis v0.2](http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2).
7
5
 
8
6
  To get started:
9
7
 
10
8
  If you do not already have Ruby installed, first you'll need to:
11
-
9
+
12
10
  sudo apt-get install ruby ruby1.9.1-dev
13
-
11
+
14
12
  Despite one of the packages being titled "ruby1.9.1-dev", the above command will install Ruby 1.9.3 (as of January 2013) and the Ruby dev tools.
15
13
 
16
14
  To install Pi Piper:
@@ -40,7 +38,7 @@ PiPiper.wait
40
38
 
41
39
  Your block will be called when a change to the pin's state is detected.
42
40
 
43
- When using pins as input, you can use internal resistors to pull the pin
41
+ When using pins as input, you can use internal resistors to pull the pin
44
42
  up or pull down. This is important if you use open-collector sensors
45
43
  which have floating output in some states.
46
44
 
@@ -65,26 +63,15 @@ sleep 1
65
63
  pin.off
66
64
  ```
67
65
 
68
- _please note, in the above context "pin" refers to the GPIO number of the Raspberry Pi._
69
-
70
66
  ### SPI
71
- Starting with version 1.2, Pi Piper offers SPI support.
67
+ Starting with version 1.2, Pi Piper offers SPI support.
72
68
 
73
69
  ```ruby
74
- PiPiper::Spi.begin do
75
- puts write [0x01, 0x80, 0x00]
70
+ PiPiper::Spi.begin do
71
+ puts write [0x01, 0x80, 0x00]
76
72
  end
77
73
  ```
78
74
 
79
- If you are using an operating system that supports `/dev/spidev0.0` like the [adafruit
80
- distro][adafruit-linux] you can also write to the spi using `PiPiper::Spi.spidev_out`
81
-
82
- ```ruby
83
- # Example writing red, green, blue to a string of WS2801 pixels
84
- PiPiper::Spi.spidev_out([255,0,0,0,255,0,0,0,255])
85
- ```
86
- [adafruit-linux]:http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/overview
87
-
88
75
  ## Documentation
89
76
 
90
77
  API documentation for Pi Piper can be found at [rdoc.info](http://rdoc.info/github/jwhitehorn/pi_piper/frames/).
@@ -98,26 +85,9 @@ Looking for more examples/sample code for Pi Piper? Then check out the following
98
85
  * [Project 3: 2-bit counter](https://github.com/jwhitehorn/pi_piper/wiki/Project-3:-2-bit-counter)
99
86
  * [Project 4: MCP3008](https://github.com/jwhitehorn/pi_piper/wiki/Project-4:-MCP3008)
100
87
 
101
- ## Under the hood
102
-
103
- PiPiper use the libbcm2835 library from Mike McCauley at airspayce.
104
-
105
- http://www.airspayce.com/mikem/bcm2835/index.html
106
-
107
- if you want to upgrade or downgrade the library for compatibility reason, get it and make it a shared object library :
108
-
109
- ```script
110
- wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.49.tar.gz
111
- tar zxvf bcm2835-1.49.tar.gz && cd bcm2835-1.49
112
- ./configure && make
113
- sudo make check
114
- sudo make install
115
- cd src && cc -shared bcm2835.o -o libbcm2835.so
116
- cp libbcm2835.so ~/pi_piper/lib/pi_piper
117
-
118
88
  ## License
119
89
 
120
- Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
90
+ Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
121
91
  All rights reserved.
122
92
 
123
93
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
data/Rakefile CHANGED
@@ -1,24 +1,23 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
- require 'rspec/core/rake_task'
4
+ require 'rake/testtask'
5
5
 
6
6
  #rake manifest
7
7
  #rake build_gemspec
8
- #gem build pi_piper.gemspec
9
- #gem push xxx.gem
8
+ #rake release
10
9
 
11
- Echoe.new('pi_piper', '2.0.beta.4') do |p|
10
+ Echoe.new('pi_piper', '2.0.beta.1') do |p|
12
11
  p.description = "Event driven Raspberry Pi GPIO library"
13
12
  p.url = "http://github.com/jwhitehorn/pi_piper"
14
13
  p.author = "Jason Whitehorn"
15
14
  p.email = "jason.whitehorn@gmail.com"
16
15
  p.ignore_pattern = ["examples/**/*", "spec/**/*"]
17
- p.dependencies = ['ffi', 'eventmachine 1.0.3']
16
+ p.dependencies = ['ffi']
18
17
  end
19
18
 
20
19
  Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
21
20
 
22
- RSpec::Core::RakeTask.new(:spec)
23
-
24
- task :default => :spec
21
+ Rake::TestTask.new do |t|
22
+ t.pattern = 'spec/**/*_spec.rb'
23
+ end
@@ -1,4 +1,3 @@
1
- require 'eventmachine'
2
1
  Dir[File.dirname(__FILE__) + '/pi_piper/*.rb'].each {|file| require file unless file.end_with?('bcm2835.rb') }
3
2
 
4
3
  module PiPiper
@@ -11,7 +10,7 @@ module PiPiper
11
10
  # Options hash. Options include `:pin`, `:invert` and `:trigger`.
12
11
  #
13
12
  def watch(options, &block)
14
- new_thread = Thread.new do
13
+ Thread.new do
15
14
  pin = PiPiper::Pin.new(options)
16
15
  loop do
17
16
  pin.wait_for_change
@@ -21,9 +20,7 @@ module PiPiper
21
20
  pin.instance_exec &block
22
21
  end
23
22
  end
24
- end
25
- new_thread.abort_on_exception = true
26
- new_thread
23
+ end.abort_on_exception = true
27
24
  end
28
25
 
29
26
  #Defines an event block to be executed after a pin either goes high or low.
@@ -35,44 +32,8 @@ module PiPiper
35
32
  options[:trigger] = options.delete(:goes) == :high ? :rising : :falling
36
33
  watch options, &block
37
34
  end
38
-
39
- #Defines an event block to be called on a regular schedule. The block will be passed the slave output.
40
- #
41
- # @param [Hash] options A hash of options.
42
- # @option options [Fixnum] :every A frequency of time (in seconds) to poll the SPI slave.
43
- # @option options [Fixnum] :slave The slave number to poll.
44
- # @option options [Number|Array] :write Data to poll the SPI slave with.
45
- def poll_spi(options, &block)
46
- EM::PeriodicTimer.new(options[:every]) do
47
- Spi.begin options[:slave] do
48
- output = write options[:write]
49
- block.call output
50
- end
51
- end
52
- end
53
-
54
- #Defines an event block to be called when SPI slave output meets certain characteristics.
55
- #The block will be passed the slave output.
56
- #
57
- # @param [Hash] options A hash of options.
58
- # @option options [Fixnum] :every A frequency of time (in seconds) to poll the SPI slave.
59
- # @option options [Fixnum] :slave The slave number to poll.
60
- # @option options [Number|Array] :write Data to poll the SPI slave with.
61
- # @option options [Fixnum] :eq Tests for SPI slave output equality.
62
- # @option options [Fixnum] :lt Tests for SPI slave output less than supplied value.
63
- # @option options [Fixnum] :gt Tests for SPI slave output greater than supplied value.
64
- def when_spi(options, &block)
65
- poll_spi options do |value|
66
- if (options[:eq] && value == options[:eq]) ||
67
- (options[:lt] && value < options[:lt]) ||
68
- (options[:gt] && value > options[:gt])
69
- block.call value
70
- end
71
- end
72
- end
73
35
 
74
36
  #Prevents the main thread from exiting. Required when using PiPiper.watch
75
- # @deprecated Please use EventMachine.run instead
76
37
  def wait
77
38
  loop do sleep 1 end
78
39
  end
@@ -5,8 +5,7 @@ module PiPiper
5
5
  # It serves as an FFI library for PiPiper::SPI & PiPiper::I2C.
6
6
  module Bcm2835
7
7
  extend FFI::Library
8
- ffi_lib File.dirname(__FILE__) + '/libbcm2835.so'
9
- @pins = []
8
+ ffi_lib File.dirname(__FILE__) + '/libbcm2835.img'
10
9
 
11
10
  SPI_MODE0 = 0
12
11
  SPI_MODE1 = 1
@@ -20,54 +19,28 @@ module PiPiper
20
19
 
21
20
  attach_function :init, :bcm2835_init, [], :uint8
22
21
  attach_function :close, :bcm2835_close, [], :uint8
23
-
22
+
24
23
  #pin support...
25
- attach_function :pin_set_pud, :bcm2835_gpio_set_pud, [:uint8, :uint8], :void
24
+ attach_function :pin_set_pud, :bcm2835_gpio_set_pud, [:uint8, :uint8], :void
26
25
 
27
26
  def self.pin_input(pin)
28
- export(pin)
29
- pin_direction(pin, 'in')
27
+ File.open("/sys/class/gpio/export", "w") { |f| f.write("#{pin}") }
28
+ File.open("/sys/class/gpio/gpio#{pin}/direction", "w") { |f| f.write("in") }
30
29
  end
31
-
30
+
32
31
  def self.pin_set(pin, value)
33
32
  File.open("/sys/class/gpio/gpio#{pin}/value", 'w') {|f| f.write("#{value}") }
34
33
  end
35
-
34
+
36
35
  def self.pin_output(pin)
37
- export(pin)
38
- pin_direction(pin, 'out')
36
+ File.open("/sys/class/gpio/export", "w") { |f| f.write("#{pin}") }
37
+ File.open(direction_file, "w") { |f| f.write("out") }
39
38
  end
40
-
39
+
41
40
  def self.pin_read(pin)
42
41
  File.read("/sys/class/gpio/gpio#{pin}/value").to_i
43
42
  end
44
43
 
45
- def self.pin_direction(pin, direction)
46
- File.open("/sys/class/gpio/gpio#{pin}/direction", 'w') do |f|
47
- f.write(direction)
48
- end
49
- end
50
-
51
- # Exports pin and subsequently locks it from outside access
52
- def self.export(pin)
53
- File.open('/sys/class/gpio/export', 'w') { |f| f.write("#{pin}") }
54
- @pins << pin unless @pins.include?(pin)
55
- end
56
-
57
- def self.release_pin(pin)
58
- File.open('/sys/class/gpio/unexport', 'w') { |f| f.write("#{pin}") }
59
- @pins.delete(pin)
60
- end
61
-
62
- def self.release_pins
63
- @pins.dup.each { |pin| release_pin(pin) }
64
- end
65
-
66
- #NOTE to use: chmod 666 /dev/spidev0.0
67
- def self.spidev_out(array)
68
- File.open('/dev/spidev0.0', 'wb'){|f| f.write(array.pack('C*')) }
69
- end
70
-
71
44
  #SPI support...
72
45
  attach_function :spi_begin, :bcm2835_spi_begin, [], :uint8
73
46
  attach_function :spi_end, :bcm2835_spi_end, [], :uint8
@@ -86,17 +59,16 @@ module PiPiper
86
59
  attach_function :i2c_write, :bcm2835_i2c_write, [:pointer, :uint], :uint8
87
60
  attach_function :i2c_set_address,:bcm2835_i2c_setSlaveAddress, [:uint8], :void
88
61
  attach_function :i2c_set_clock_divider, :bcm2835_i2c_setClockDivider, [:uint16], :void
89
- attach_function :i2c_read, :bcm2835_i2c_read, [:pointer, :uint], :uint8
90
62
 
91
63
  def self.i2c_allowed_clocks
92
64
  [100.kilohertz,
93
65
  399.3610.kilohertz,
94
66
  1.666.megahertz,
95
- 1.689.megahertz]
67
+ 1.689.megahertz]
96
68
  end
97
69
 
98
70
  def self.spi_transfer_bytes(data)
99
- data_out = FFI::MemoryPointer.new(data.count)
71
+ data_out = FFI::MemoryPointer.new(data.count)
100
72
  data_in = FFI::MemoryPointer.new(data.count)
101
73
  (0..data.count-1).each { |i| data_out.put_uint8(i, data[i]) }
102
74
 
@@ -112,11 +84,5 @@ module PiPiper
112
84
  i2c_write data_out, data.count
113
85
  end
114
86
 
115
- def self.i2c_read_bytes(bytes)
116
- data_in = FFI::MemoryPointer.new(bytes)
117
- i2c_read(data_in, bytes) #TODO reason codes
118
-
119
- (0..bytes-1).map { |i| data_in.get_uint8(i) }
120
- end
121
87
  end
122
88
  end
@@ -28,6 +28,7 @@ module PiPiper
28
28
 
29
29
  def self.clock=(clock)
30
30
  valid_clocks = Platform.driver.i2c_allowed_clocks
31
+
31
32
  raise "Invalid clock rate. Valid clocks are 100 kHz, 399.3610 kHz, 1.666 MHz and 1.689 MHz" unless valid_clocks.include? clock
32
33
 
33
34
  Platform.driver.i2c_set_clock clock
@@ -42,10 +43,6 @@ module PiPiper
42
43
  Platform.driver.i2c_transfer_bytes data
43
44
  end
44
45
 
45
- def read(bytes)
46
- Platform.driver.i2c_read_bytes(bytes)
47
- end
48
-
49
46
  end
50
47
 
51
48
  end
@@ -1,112 +1,72 @@
1
- require_relative 'pin_values'
2
-
3
1
  module PiPiper
4
2
  # Represents a GPIO pin on the Raspberry Pi
5
3
  class Pin
6
- include PiPiper::PinValues
4
+ GPIO_PUD_OFF = 0
5
+ GPIO_PUD_DOWN = 1
6
+ GPIO_PUD_UP = 2
7
7
 
8
- attr_reader :pin, :last_value, :direction, :invert
8
+ attr_reader :pin, :last_value, :value, :direction, :invert
9
9
 
10
10
  #Initializes a new GPIO pin.
11
11
  #
12
12
  # @param [Hash] options A hash of options
13
13
  # @option options [Fixnum] :pin The pin number to initialize. Required.
14
- #
15
- # @option options [Symbol] :direction The direction of communication,
16
- # either :in or :out. Defaults to :in.
17
- #
18
- # @option options [Boolean] :invert Indicates if the value read from the
19
- # physical pin should be inverted. Defaults to false.
20
- #
21
- # @option options [Symbol] :trigger Indicates when the wait_for_change
22
- # method will detect a change, either :rising, :falling, or :both edge
23
- # triggers. Defaults to :both.
24
- #
25
- # @option options [Symbol] :pull Indicates if and how pull mode must be
26
- # set when pin direction is set to :in. Either :up, :down or :offing.
27
- # Defaults to :off.
28
- #
14
+ # @option options [Symbol] :direction The direction of communication, either :in or :out. Defaults to :in.
15
+ # @option options [Boolean] :invert Indicates if the value read from the physical pin should be inverted. Defaults to false.
16
+ # @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.
17
+ # @option options [Symbol] :pull Indicates if and how pull mode must be set when pin direction is set to :in. Either :up, :down or :offing. Defaults to :off.
29
18
  def initialize(options)
30
- options = { :direction => :in,
31
- :invert => false,
32
- :trigger => :both,
33
- :pull => :off}.merge(options)
34
-
35
- @pin = options[:pin]
19
+ options = {:direction => :in, :invert => false, :trigger => :both, :pull => :off}.merge options
20
+ @pin = options[:pin]
36
21
  @direction = options[:direction]
37
- @invert = options[:invert]
38
- @trigger = options[:trigger]
39
- @pull = options[:pull]
40
- @released = false
22
+ @invert = options[:invert]
23
+ @trigger = options[:trigger]
24
+ @pull = options[:pull]
41
25
 
42
- raise "Invalid pull mode. Options are :up, :down or :float (default)" unless
43
- [:up, :down, :float, :off].include? @pull
44
- raise "Unable to use pull-ups : pin direction must be ':in' for this" if
45
- @direction != :in and [:up, :down].include?(@pull)
46
- raise "Invalid direction. Options are :in or :out" unless
47
- [:in, :out].include? @direction
48
- raise "Invalid trigger. Options are :rising, :falling, or :both" unless
49
- [:rising, :falling, :both].include? @trigger
26
+ raise "Invalid pull mode. Options are :up, :down or :float (default)" unless [:up, :down, :float, :off].include? @pull
27
+ raise "Unable to use pull-ups : pin direction must be ':in' for this" if @direction != :in && [:up, :down].include?(@pull)
28
+ raise "Invalid direction. Options are :in or :out" unless [:in, :out].include? @direction
29
+ raise "Invalid trigger. Options are :rising, :falling, or :both" unless [:rising, :falling, :both].include? @trigger
30
+
31
+ @direction == :out ? Platform.driver.pin_output(@pin) : Platform.driver.pin_input(@pin)
50
32
 
51
- if @direction == :out
52
- Platform.driver.pin_output(@pin)
53
- else
54
- Platform.driver.pin_input(@pin)
55
- end
56
33
  pull!(@pull)
57
34
 
58
35
  read
59
36
  end
60
-
61
- # If the pin has been initialized for output this method will set the
62
- # logic level high.
37
+
38
+ # If the pin has been initialized for output this method will set the logic level high.
63
39
  def on
64
- fail PiPiper::PinError, "Pin #{@pin} already released" if released?
65
- Platform.driver.pin_set(pin, GPIO_HIGH) if direction == :out
40
+ Platform.driver.pin_set(pin, 1) if direction == :out
66
41
  end
67
-
42
+
68
43
  # Tests if the logic level is high.
69
44
  def on?
70
45
  not off?
71
46
  end
72
-
73
- # If the pin has been initialized for output this method will set
74
- # the logic level low.
47
+
48
+ # If the pin has been initialized for output this method will set the logic level low.
75
49
  def off
76
- fail PiPiper::PinError, "Pin #{@pin} already released" if released?
77
- Platform.driver.pin_set(pin, GPIO_LOW) if direction == :out
50
+ Platform.driver.pin_set(pin, 0) if direction == :out
78
51
  end
79
-
52
+
80
53
  # Tests if the logic level is low.
81
54
  def off?
82
- value == GPIO_LOW
55
+ value == 0
83
56
  end
84
57
 
85
- def value
86
- @value ||= read
87
- end
88
-
89
- # If the pin has been initialized for output this method will either raise
90
- # or lower the logic level depending on `new_value`.
58
+ # If the pin has been initialized for output this method will either raise or lower the logic level depending on `new_value`.
91
59
  # @param [Object] new_value If false or 0 the pin will be set to off, otherwise on.
92
60
  def update_value(new_value)
93
- !new_value || new_value == GPIO_LOW ? off : on
61
+ !new_value || new_value == 0 ? off : on
94
62
  end
95
- alias_method :value=, :update_value
96
63
 
97
- # When the pin has been initialized in input mode, internal resistors can
98
- # be pulled up or down (respectively with :up and :down).
99
- #
100
- # Pulling an input pin will prevent noise from triggering it when the input
101
- # is floating.
102
- #
103
- # For instance when nothing is plugged in, pulling the pin-up will make
104
- # subsequent value readings to return 'on' (or high, or 1...).
105
- # @param [Symbol] state Indicates if and how pull mode must be set when
106
- # pin direction is set to :in. Either :up, :down or :offing. Defaults to :off.
64
+ # When the pin has been initialized in input mode, internal resistors can be pulled up or down (respectively with :up and :down).
65
+ # Pulling an input pin wil prevent noise from triggering it when the input is floating.
66
+ # For instance when nothing is plugged in, pulling the pin-up will make subsequent value readings to return 'on' (or high, or 1...).
67
+ # @param [Symbol] state Indicates if and how pull mode must be set when pin direction is set to :in. Either :up, :down or :offing. Defaults to :off.
107
68
  def pull!(state)
108
- return nil if @direction != :in
109
- fail PiPiper::PinError, "Pin #{@pin} already released" if released?
69
+ return nil unless @direction == :in
110
70
  @pull = case state
111
71
  when :up then GPIO_PUD_UP
112
72
  when :down then GPIO_PUD_DOWN
@@ -119,8 +79,7 @@ module PiPiper
119
79
  @pull
120
80
  end
121
81
 
122
- # If the pin direction is input, it will return the current state of
123
- # pull-up/pull-down resistor, either :up, :down or :off.
82
+ # If the pin direction is input, it will return the current state of pull-up/pull-down resistor, either :up, :down or :off.
124
83
  def pull?
125
84
  case @pull
126
85
  when GPIO_PUD_UP then :up
@@ -134,15 +93,14 @@ module PiPiper
134
93
  last_value != value
135
94
  end
136
95
 
137
- # Blocks until a logic level change occurs. The initializer option
138
- # `:trigger` modifies what edge this method will release on.
96
+ # blocks until a logic level change occurs. The initializer option `:trigger` modifies what edge this method will release on.
139
97
  def wait_for_change
140
98
  fd = File.open(value_file, "r")
141
99
  File.open(edge_file, "w") { |f| f.write("both") }
142
100
  loop do
143
101
  fd.read
144
102
  IO.select(nil, nil, [fd], nil)
145
- read
103
+ read
146
104
  if changed?
147
105
  next if @trigger == :rising and value == 0
148
106
  next if @trigger == :falling and value == 1
@@ -151,29 +109,15 @@ module PiPiper
151
109
  end
152
110
  end
153
111
 
154
- # Reads the current value from the pin. Without calling this method
155
- # first, `value`, `last_value` and `changed?` will not be updated.
156
- #
157
- # In short, you must call this method if you are curious about the
158
- # current state of the pin.
159
- def read
160
- fail PiPiper::PinError, "Pin #{@pin} already released" if released?
112
+ # Reads the current value from the pin. Without calling this method first, `value`, `last_value` and `changed?` will not be updated.
113
+ # In short, you must call this method if you are curious about the current state of the pin.
114
+ def read
161
115
  @last_value = @value
162
116
  val = Platform.driver.pin_read(@pin)
163
117
  @value = invert ? (val ^ 1) : val
164
118
  end
165
-
166
- def release
167
- Platform.driver.release_pin(@pin)
168
- @released = true
169
- end
170
-
171
- def released?
172
- @released == true
173
- end
174
-
119
+
175
120
  private
176
-
177
121
  def value_file
178
122
  "/sys/class/gpio/gpio#{pin}/value"
179
123
  end
@@ -185,5 +129,6 @@ module PiPiper
185
129
  def direction_file
186
130
  "/sys/class/gpio/gpio#{pin}/direction"
187
131
  end
132
+
188
133
  end
189
134
  end