rbone 0.1.0

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ # - jruby-18mode # JRuby in 1.8 mode
7
+ # - jruby-19mode # JRuby in 1.9 mode
8
+ # - rbx-18mode
9
+ # - rbx-19mode
10
+ # uncomment this line if your project needs to run something other than `rake`:
11
+ # script: bundle exec rspec spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rbone.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Matt Mayers
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # Rbone
2
+
3
+ [![Build Status](https://secure.travis-ci.org/majormajors/rbone.png)](http://travis-ci.org/majormajors/rbone)
4
+
5
+ Rbone makes it easy to write Arduino-style applications for your BeagleBone in Ruby.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'rbone'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rbone
20
+
21
+ ## Usage
22
+
23
+ TODO: Write usage instructions here
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,68 @@
1
+ require "rbone/version"
2
+
3
+ module Rbone; end
4
+
5
+ LOW = 0x00
6
+ HIGH = 0x01
7
+
8
+ INPUT = 0x00
9
+ OUTPUT = 0x01
10
+
11
+ GPIO0 = 0x00
12
+ GPIO1 = GPIO0 + 0x20
13
+ GPIO2 = GPIO1 + 0x20
14
+ GPIO3 = GPIO2 + 0x20
15
+
16
+ # Digital IO pins
17
+ P8_3 = GPIO1 + 0x06
18
+ P8_4 = GPIO1 + 0x07
19
+ P8_5 = GPIO1 + 0x02
20
+ P8_6 = GPIO1 + 0x03
21
+ P8_11 = GPIO1 + 0x0D
22
+ P8_12 = GPIO1 + 0x0C
23
+ P8_14 = GPIO0 + 0x1A
24
+ P8_15 = GPIO1 + 0x0F
25
+ P8_16 = GPIO1 + 0x0E
26
+ P8_17 = GPIO0 + 0x1B
27
+ P8_18 = GPIO2 + 0x01
28
+ P8_20 = GPIO1 + 0x1F
29
+ P8_21 = GPIO1 + 0x1E
30
+ P8_22 = GPIO1 + 0x05
31
+ P8_23 = GPIO1 + 0x04
32
+ P8_24 = GPIO1 + 0x01
33
+ P8_25 = GPIO1 + 0x00
34
+ P8_26 = GPIO1 + 0x1D
35
+ P8_27 = GPIO2 + 0x16
36
+ P8_28 = GPIO2 + 0x18
37
+ P8_29 = GPIO2 + 0x17
38
+ P8_30 = GPIO2 + 0x19
39
+ P8_39 = GPIO2 + 0x0C
40
+ P8_40 = GPIO2 + 0x0D
41
+ P8_41 = GPIO2 + 0x0A
42
+ P8_42 = GPIO2 + 0x0B
43
+ P8_43 = GPIO2 + 0x08
44
+ P8_44 = GPIO2 + 0x09
45
+ P8_45 = GPIO2 + 0x06
46
+ P8_46 = GPIO2 + 0x07
47
+ P9_12 = GPIO1 + 0x1C
48
+ P9_15 = GPIO1 + 0x10
49
+ P9_23 = GPIO1 + 0x11
50
+ P9_25 = GPIO3 + 0x15
51
+ P9_27 = GPIO3 + 0x13
52
+ P9_42 = GPIO0 + 0x07
53
+
54
+ USR0 = GPIO1 + 0x15
55
+ USR1 = GPIO1 + 0x16
56
+ USR2 = GPIO1 + 0x17
57
+ USR3 = GPIO1 + 0x18
58
+
59
+ # Analog input pins
60
+ P9_33 = 'ain4'
61
+ P9_35 = 'ain6'
62
+ P9_36 = 'ain5'
63
+ P9_37 = 'ain2'
64
+ P9_38 = 'ain3'
65
+ P9_39 = 'ain0'
66
+ P9_40 = 'ain1'
67
+
68
+ require "rbone/app"
@@ -0,0 +1,129 @@
1
+ require 'rbone'
2
+
3
+ module Rbone
4
+ class PinRefError < StandardError; end
5
+
6
+ class App
7
+
8
+ DIGITAL_PINS = [
9
+ P8_3, P8_4, P8_5, P8_6, P8_11, P8_12,
10
+ P8_14, P8_15, P8_16, P8_17, P8_18, P8_20,
11
+ P8_21, P8_22, P8_23, P8_24, P8_25, P8_26,
12
+ P8_27, P8_28, P8_29, P8_30, P8_39, P8_40,
13
+ P8_41, P8_42, P8_43, P8_44, P8_45, P8_46,
14
+ P9_12, P9_15, P9_23, P9_25, P9_27, P9_42,
15
+ ].freeze
16
+
17
+ USR_LEDS = [
18
+ USR0, USR1, USR2, USR3
19
+ ].freeze
20
+
21
+ ANALOG_PINS = [
22
+ P9_33, P9_35, P9_36, P9_37, P9_38, P9_39, P9_40
23
+ ].freeze
24
+
25
+ def initialize
26
+ @exported_pins = []
27
+ if block_given?
28
+ yield(self)
29
+ end
30
+ end
31
+
32
+ def setup(&block)
33
+ @setup = block
34
+ end
35
+
36
+ def loop(delay=nil, &block)
37
+ @loop = block
38
+ self.run unless delay == :delay
39
+ end
40
+
41
+ def run
42
+ self.instance_eval(&@setup)
43
+ self.instance_eval(&@loop) while true
44
+ rescue Interrupt => e
45
+ cleanup!
46
+ rescue Exception => e
47
+ cleanup!
48
+ $stderr.puts e
49
+ end
50
+
51
+ def pinMode(pin, direction)
52
+ if DIGITAL_PINS.include?(pin)
53
+ File.open('/sys/class/gpio/export', 'w') do |f|
54
+ f.write("%s\n" % [pin])
55
+ end
56
+
57
+ filename = '/sys/class/gpio/gpio%d/direction' % [pin]
58
+ File.open(filename, 'w') do |f|
59
+ if direction == INPUT
60
+ f.write("in\n")
61
+ else
62
+ f.write("out\n")
63
+ end
64
+ end
65
+
66
+ @exported_pins.push(pin)
67
+ else
68
+ raise PinRefError, "#{pin} is not a valid digital pin reference"
69
+ end
70
+ end
71
+
72
+ def digitalWrite(pin, value)
73
+ if DIGITAL_PINS.include?(pin)
74
+ filename = '/sys/class/gpio/gpio%d/value' % [pin]
75
+ elsif USR_LEDS.include?(pin)
76
+ led_id = pin - USR0
77
+ filename = '/sys/devices/platform/leds-gpio/leds/beaglebone::usr%s/brightness' % [led_id]
78
+ else
79
+ raise PinRefError, "#{pin} is not a valid digital pin reference"
80
+ end
81
+
82
+ if value == HIGH || value == LOW
83
+ File.open(filename, 'w') do |f|
84
+ f.write("%s" % [value])
85
+ end
86
+ return true
87
+ else
88
+ return false
89
+ end
90
+ end
91
+
92
+ def digitalRead(pin)
93
+ if DIGITAL_PINS.include?(pin)
94
+ filename = '/sys/class/gpio/gpio%d/value' % [pin]
95
+ value = open(filename).read
96
+ case value.chomp
97
+ when '0' then LOW
98
+ when '1' then HIGH
99
+ else nil
100
+ end
101
+ else
102
+ raise PinRefError, "#{pin} is not a valid digital pin reference"
103
+ end
104
+ end
105
+
106
+ def analogRead(pin)
107
+ if ANALOG_PINS.include?(pin)
108
+ filename = "/sys/devices/platform/tsc/#{pin}"
109
+ File.open(filename, 'r') do |f|
110
+ return
111
+ end
112
+ else
113
+ raise PinRefError, "#{pin} is not a valid analog pin reference"
114
+ end
115
+ end
116
+
117
+ def delay(ms)
118
+ sleep(ms.to_f / 1000.0)
119
+ end
120
+
121
+ def cleanup!
122
+ puts "cleanup!"
123
+ end
124
+
125
+ def pinUnexport(pin)
126
+
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,3 @@
1
+ module Rbone
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/rbone/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Matt Mayers"]
6
+ gem.email = ["matt@mattmayers.com"]
7
+ gem.description = %q{This gem provides a simple interface for writing Arduino-style programs for the BeagleBone.}
8
+ gem.summary = %q{Write simple Arduino-style programs for your BeagleBone}
9
+ gem.homepage = "http://github.com/majormajors/rbone"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "rbone"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Rbone::VERSION
17
+
18
+ gem.add_development_dependency "rake"
19
+ gem.add_development_dependency "rspec"
20
+ gem.add_development_dependency "fakefs"
21
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ require 'rbone/app'
3
+
4
+ describe Rbone::App do
5
+ before :all do
6
+ FileUtils.mkdir_p('/sys/class/gpio')
7
+
8
+ # mock USR leds
9
+ %w(0 1 2 3).map{ |n| "/sys/devices/platform/leds-gpio/leds/beaglebone::usr#{n}" }.each do |base_dir|
10
+ FileUtils.mkdir_p(base_dir)
11
+ FileUtils.touch(%w(brightness max_brightness trigger uevent).map{ |f| "#{base_dir}/#{f}" })
12
+ end
13
+ end
14
+
15
+ before :each do
16
+ @app = Rbone::App.new
17
+ end
18
+
19
+ def mock_export(pin)
20
+ base_dir = "/sys/class/gpio/gpio%s" % [pin]
21
+ FileUtils.mkdir_p(base_dir)
22
+ FileUtils.touch(%w(active_low direction edge uevent value).map{ |f| "#{base_dir}/#{f}" })
23
+ end
24
+
25
+ def read_value(file)
26
+ f = File.open(file, 'r')
27
+ value = f.read
28
+ f.close
29
+ value
30
+ end
31
+
32
+ describe '#digitalWrite' do
33
+ it "sets the GPIO pin to HIGH" do
34
+ mock_export(P8_3)
35
+ @app.digitalWrite(P8_3, HIGH).should be_true
36
+ read_value("/sys/class/gpio/gpio38/value").should == '1'
37
+ end
38
+
39
+ it "sets the GPIO pin to LOW" do
40
+ mock_export(P8_3)
41
+ @app.digitalWrite(P8_3, LOW).should be_true
42
+ read_value("/sys/class/gpio/gpio38/value").should == '0'
43
+ end
44
+
45
+ it "sets the USR LED to HIGH" do
46
+ @app.digitalWrite(USR1, HIGH).should be_true
47
+ read_value("/sys/devices/platform/leds-gpio/leds/beaglebone::usr1/brightness").should == '1'
48
+ end
49
+
50
+ it "sets the USR LED to LOW" do
51
+ @app.digitalWrite(USR1, LOW).should be_true
52
+ read_value("/sys/devices/platform/leds-gpio/leds/beaglebone::usr1/brightness").should == '0'
53
+ end
54
+
55
+ it "returns false if an invalid value is supplied" do
56
+ @app.digitalWrite(USR0, 3).should be_false
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rbone do
4
+ end
@@ -0,0 +1,14 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+ end
12
+
13
+ require 'pp'
14
+ require 'fakefs'
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbone
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matt Mayers
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70355878496380 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70355878496380
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70355878495480 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70355878495480
36
+ - !ruby/object:Gem::Dependency
37
+ name: fakefs
38
+ requirement: &70355888796100 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70355888796100
47
+ description: This gem provides a simple interface for writing Arduino-style programs
48
+ for the BeagleBone.
49
+ email:
50
+ - matt@mattmayers.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - .rspec
57
+ - .travis.yml
58
+ - Gemfile
59
+ - LICENSE
60
+ - README.md
61
+ - Rakefile
62
+ - lib/rbone.rb
63
+ - lib/rbone/app.rb
64
+ - lib/rbone/version.rb
65
+ - rbone.gemspec
66
+ - spec/rbone/app_spec.rb
67
+ - spec/rbone_spec.rb
68
+ - spec/spec_helper.rb
69
+ homepage: http://github.com/majormajors/rbone
70
+ licenses: []
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ segments:
82
+ - 0
83
+ hash: -1113520713437468281
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ segments:
91
+ - 0
92
+ hash: -1113520713437468281
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 1.8.11
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: Write simple Arduino-style programs for your BeagleBone
99
+ test_files:
100
+ - spec/rbone/app_spec.rb
101
+ - spec/rbone_spec.rb
102
+ - spec/spec_helper.rb