BBB 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/Gemfile +5 -0
- data/README.md +31 -0
- data/Rakefile +4 -0
- data/examples/led.rb +34 -0
- data/examples/sketches.rb +86 -0
- data/lib/BBB.rb +18 -1
- data/lib/BBB/application.rb +44 -0
- data/lib/BBB/board.rb +41 -0
- data/lib/BBB/circuit.rb +72 -0
- data/lib/BBB/components/led.rb +33 -0
- data/lib/BBB/components/pinnable.rb +15 -0
- data/lib/BBB/exceptions.rb +5 -0
- data/lib/BBB/gpio/base.rb +56 -0
- data/lib/BBB/gpio/digital_pin.rb +69 -0
- data/lib/BBB/gpio/pin_converter.rb +22 -0
- data/lib/BBB/io/digital_pin.rb +67 -0
- data/lib/BBB/io/mock_pin.rb +8 -0
- data/lib/BBB/io/pinnable.rb +12 -0
- data/lib/BBB/pin_mapper.rb +84 -0
- data/lib/BBB/test_board.rb +11 -0
- data/lib/BBB/version.rb +1 -1
- data/spec/application_spec.rb +53 -0
- data/spec/board_spec.rb +49 -0
- data/spec/circuit_spec.rb +47 -0
- data/spec/components/led_spec.rb +45 -0
- data/spec/components/pinnable_spec.rb +19 -0
- data/spec/gpio/base_spec.rb +48 -0
- data/spec/gpio/digital_pin_spec.rb +100 -0
- data/spec/gpio/pin_converter_spec.rb +19 -0
- data/spec/io/digital_pin_spec.rb +14 -0
- data/spec/io/mock_pin_spec.rb +13 -0
- data/spec/io/pinnable_spec.rb +13 -0
- data/spec/pin_mapper_spec.rb +17 -0
- data/spec/spec_helper.rb +4 -0
- metadata +46 -4
- data/LICENSE.txt +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4573344a902cd2566d5521229f4d7529cb31f633
|
4
|
+
data.tar.gz: b75dc03459a79e65ee931f8c37482524bfa98576
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67101648320187e3e261d19511db14d80a8b8a6ca21c811f8b2f1316fcfad48296cb245646e36d58933540cb09e2f663f2ae66df828a193e13860e017967e667
|
7
|
+
data.tar.gz: 8ffc3dc8effcbf3a7209e7e7f753e0effbdb2787353053f352410aa2bad5fe1c6275c4c21d5c5bf6232340f73503d24bcd9581ac278db79dc12a039d01c3d001
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
|
1
2
|
# BBB - BeagleBone Black
|
2
3
|
|
3
4
|
Helper functions and modules to ruby around on the beagle bone black.
|
4
5
|
|
6
|
+
## Badges
|
7
|
+
|
8
|
+
[![Coverage Status](https://coveralls.io/repos/Sparkboxx/bbb/badge.png)](https://coveralls.io/r/Sparkboxx/bbb)
|
9
|
+
[![Build Status](https://travis-ci.org/Sparkboxx/bbb.png?branch=master)](https://travis-ci.org/Sparkboxx/bbb)
|
10
|
+
|
5
11
|
## Installation
|
6
12
|
|
7
13
|
Add this line to your application's Gemfile:
|
@@ -27,3 +33,28 @@ TODO: Write usage instructions here
|
|
27
33
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
34
|
4. Push to the branch (`git push origin my-new-feature`)
|
29
35
|
5. Create new Pull Request
|
36
|
+
|
37
|
+
## License
|
38
|
+
|
39
|
+
Copyright (c) 2013 Wilco van Duinkerken
|
40
|
+
|
41
|
+
MIT License
|
42
|
+
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
44
|
+
a copy of this software and associated documentation files (the
|
45
|
+
"Software"), to deal in the Software without restriction, including
|
46
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
47
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
48
|
+
permit persons to whom the Software is furnished to do so, subject to
|
49
|
+
the following conditions:
|
50
|
+
|
51
|
+
The above copyright notice and this permission notice shall be
|
52
|
+
included in all copies or substantial portions of the Software.
|
53
|
+
|
54
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
55
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
56
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
57
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
58
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
59
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
60
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
data/examples/led.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'BBB'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Setup the LED Circuit
|
5
|
+
#
|
6
|
+
class Circuit < BBB::Circuit
|
7
|
+
def initialize
|
8
|
+
# Attach the led to pin P8_10
|
9
|
+
attach BBB::Components::Led, pin: :P8_10, as: :led
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Setup the actual Application
|
15
|
+
#
|
16
|
+
class LedExampleApplication < BBB::Application
|
17
|
+
# Run this on the BeableBoneBlack
|
18
|
+
board BBB::Board.new
|
19
|
+
|
20
|
+
# Connection the led circuit
|
21
|
+
circuit LedExample::Circuit.new
|
22
|
+
|
23
|
+
# This is the basic run loop
|
24
|
+
def run
|
25
|
+
led.on! # this does what you think it does
|
26
|
+
sleep(1) # sleep for 1 second, kind of blunt, since it blocks everthing.
|
27
|
+
led.off!
|
28
|
+
sleep(1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Initialize and run the LedExampleApplication
|
33
|
+
app = LedExampleApplication.new
|
34
|
+
app.start
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'bbb'
|
2
|
+
|
3
|
+
module Thunderball
|
4
|
+
class Copter << BBB::Application
|
5
|
+
##
|
6
|
+
# Use the BBB as the board, allows for possible ports to e.g. the Pi
|
7
|
+
#
|
8
|
+
board BBB::Board.new
|
9
|
+
|
10
|
+
##
|
11
|
+
# Load the thunderball layout
|
12
|
+
#
|
13
|
+
layout Thunderball::Circuit.new
|
14
|
+
|
15
|
+
attr_reader :stabalizer, :mover
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@stabalizer = Stabalizer.new(escs: escs,
|
19
|
+
gyro: gyro,
|
20
|
+
accelerometer: acc)
|
21
|
+
|
22
|
+
@mover = Mover.new(escs: escs)
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Once start is called the run function will be called in a loop
|
27
|
+
#
|
28
|
+
def run
|
29
|
+
stabalizer
|
30
|
+
move(:forward=>20, :right=>10)
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Stabalize function is just syntactic sugar to make the run method look nice.
|
35
|
+
#
|
36
|
+
def stabilize
|
37
|
+
stabalizer.update
|
38
|
+
end
|
39
|
+
|
40
|
+
##
|
41
|
+
# move function is just syntactic sugar to make the run method look nice.
|
42
|
+
#
|
43
|
+
def move
|
44
|
+
mover.update
|
45
|
+
end
|
46
|
+
end # Copter
|
47
|
+
|
48
|
+
class Circuit < BBB::Circuit
|
49
|
+
def initialize
|
50
|
+
attach_escs
|
51
|
+
attach_led
|
52
|
+
end
|
53
|
+
|
54
|
+
def attach_escs
|
55
|
+
attach ESC, :pins=>[:P8_1, :P8_2], :as=>:esc_1, :group=>:escs
|
56
|
+
attach ESC, :pins=>[:P9_1, :P9_2], :as=>:esc_2, :group=>:escs
|
57
|
+
end
|
58
|
+
|
59
|
+
def attach_leds
|
60
|
+
attach Led, :pin=>:P9_12
|
61
|
+
end
|
62
|
+
end # Circuit
|
63
|
+
|
64
|
+
class Mover
|
65
|
+
def initialize(opts={})
|
66
|
+
@escs = opts[:escs]
|
67
|
+
end
|
68
|
+
|
69
|
+
def move
|
70
|
+
# Do some complex logic here with the escs
|
71
|
+
end
|
72
|
+
end # Mover
|
73
|
+
|
74
|
+
def Stabalizer
|
75
|
+
def initialize(opts={})
|
76
|
+
@escs = opts[:escs]
|
77
|
+
@gyo = opts[:gyro]
|
78
|
+
@accelerometer = opts[:accelerometer]
|
79
|
+
end
|
80
|
+
|
81
|
+
def stabalize
|
82
|
+
# Do someting complex with all the components
|
83
|
+
# and update all values
|
84
|
+
end
|
85
|
+
end #Stabalizer
|
86
|
+
end
|
data/lib/BBB.rb
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
require "BBB/version"
|
2
|
+
require "BBB/board"
|
3
|
+
require "BBB/test_board"
|
4
|
+
require "BBB/circuit"
|
5
|
+
require "BBB/pin_mapper"
|
6
|
+
require "BBB/exceptions"
|
7
|
+
|
8
|
+
require "BBB/gpio/base"
|
9
|
+
require "BBB/gpio/digital_pin"
|
10
|
+
require "BBB/gpio/pin_converter"
|
11
|
+
|
12
|
+
require "BBB/io/pinnable"
|
13
|
+
require "BBB/io/digital_pin"
|
14
|
+
require "BBB/io/mock_pin"
|
15
|
+
|
16
|
+
require "BBB/components/pinnable"
|
17
|
+
require "BBB/components/led"
|
18
|
+
|
19
|
+
require "BBB/application"
|
2
20
|
|
3
21
|
module BBB
|
4
|
-
# Your code goes here...
|
5
22
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module BBB
|
2
|
+
class Application
|
3
|
+
|
4
|
+
def self.board(board)
|
5
|
+
@_board = board
|
6
|
+
connect unless @_circuit.nil?
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.circuit(circuit)
|
10
|
+
@_circuit = circuit
|
11
|
+
connect unless @_board.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def self._board
|
15
|
+
@_board
|
16
|
+
end
|
17
|
+
|
18
|
+
def self._circuit
|
19
|
+
@_circuit
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.connect
|
23
|
+
@_circuit.components.each_pair do |name, component|
|
24
|
+
component.pins.each do |pin|
|
25
|
+
@_board.connect_io_pin(pin)
|
26
|
+
end
|
27
|
+
|
28
|
+
define_method(name) do
|
29
|
+
circuit.send(name)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def board
|
35
|
+
@board ||= self.class._board
|
36
|
+
end
|
37
|
+
|
38
|
+
def circuit
|
39
|
+
@circuit ||= self.class._circuit
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
data/lib/BBB/board.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
module BBB
|
2
|
+
class Board
|
3
|
+
attr_reader :gpio, :pin_converter
|
4
|
+
|
5
|
+
def initialize(pin_converter=nil)
|
6
|
+
@pin_converter = pin_converter || self.class.pin_converter
|
7
|
+
@pins = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
##
|
11
|
+
# Define methods for a GPIO::PIN
|
12
|
+
#
|
13
|
+
def setup_pin(pin)
|
14
|
+
@pins[pin.position] = pin
|
15
|
+
|
16
|
+
metaclass = class << self; self; end
|
17
|
+
metaclass.class_eval do
|
18
|
+
define_method("p#{pin.position.to_s[1..-1]}") do
|
19
|
+
@pins[pin.position].read
|
20
|
+
end
|
21
|
+
|
22
|
+
define_method("p#{pin.position.to_s[1..-1]}=") do |value|
|
23
|
+
@pins[pin.position].write value
|
24
|
+
end if pin.mode == :output
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def connect_io_pin(pin)
|
29
|
+
gpio_pin = pin_converter.convert(pin)
|
30
|
+
pin.pin_io = gpio_pin
|
31
|
+
setup_pin(pin)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def self.pin_converter
|
37
|
+
GPIO::PinConverter.new
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/BBB/circuit.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
module BBB
|
2
|
+
##
|
3
|
+
# The idea here is to attach a piece of equipment to a circuit. The circuit
|
4
|
+
# will later be connected to a board.
|
5
|
+
#
|
6
|
+
# A component (e.g. Led or Servo) will define generic pins, like
|
7
|
+
# DigitalInput or AnalogOutput. And then, when the circuit gets attached to
|
8
|
+
# the board those pins will be "connected" to their "physical" counterparts
|
9
|
+
# on the board.
|
10
|
+
#
|
11
|
+
# This allows you to develop generic circuits that can be attached to any
|
12
|
+
# board. At least, in theory :-)
|
13
|
+
#
|
14
|
+
# For now the attachment will be made onto specific pin numbers. For the BBB
|
15
|
+
# this might for example be :P8_3, however, the plan is to, in a future
|
16
|
+
# release, make sure that there are converters between the different kind of
|
17
|
+
# boards. For example by mapping P8_3 on BBB to P1 on an Arduino.
|
18
|
+
#
|
19
|
+
# As of now, the act of "attaching" something onto the circuit equals
|
20
|
+
# setting up a component with generic pins.
|
21
|
+
#
|
22
|
+
class Circuit
|
23
|
+
attr_reader :components
|
24
|
+
|
25
|
+
def components
|
26
|
+
@components ||= {}
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Attach a component of a certain type to the circuit
|
31
|
+
#
|
32
|
+
# @param component [Class] The class of the object you # want to attach.
|
33
|
+
# @param opts [Hash] Hash of options that setup the component
|
34
|
+
#
|
35
|
+
# @option opts [Array<Symbol>] :pins The list of pin numbers used on the
|
36
|
+
# circuit.
|
37
|
+
#
|
38
|
+
def attach(component, opts={})
|
39
|
+
if component.kind_of?(Class)
|
40
|
+
component = component.new
|
41
|
+
end
|
42
|
+
|
43
|
+
if pin_positions = opts[:pins] || [opts[:pin]]
|
44
|
+
component_pins = component.pins
|
45
|
+
verify_pin_argument_count(component_pins.count, pin_positions.count)
|
46
|
+
component.register_pin_positions(pin_positions)
|
47
|
+
end
|
48
|
+
|
49
|
+
name = opts.fetch(:as)
|
50
|
+
register_component(component, name)
|
51
|
+
end
|
52
|
+
|
53
|
+
def register_component(component, name)
|
54
|
+
components[name] = component
|
55
|
+
eigenclass = class << self; self; end
|
56
|
+
eigenclass.class_eval do
|
57
|
+
define_method(name) do
|
58
|
+
components[name]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def verify_pin_argument_count(type_count, position_count)
|
64
|
+
if type_count != position_count
|
65
|
+
raise PinsDoNotMatchException,
|
66
|
+
"#{object.to_s} requires #{types_count} but received #{position_count} pin arguments."
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module BBB
|
2
|
+
module Components
|
3
|
+
class Led
|
4
|
+
include Pinnable
|
5
|
+
attr_reader :state, :pin
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@state = :low
|
9
|
+
@pin = BBB::IO::DigitalPin.new(:output)
|
10
|
+
@pins = [@pin]
|
11
|
+
end
|
12
|
+
|
13
|
+
def on!
|
14
|
+
pin.on!
|
15
|
+
@state = :high
|
16
|
+
end
|
17
|
+
|
18
|
+
def off!
|
19
|
+
pin.off!
|
20
|
+
@state = :low
|
21
|
+
end
|
22
|
+
|
23
|
+
def on?
|
24
|
+
state == :high
|
25
|
+
end
|
26
|
+
|
27
|
+
def off?
|
28
|
+
state == :low
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|