BBB 0.0.1 → 0.0.2
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 +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
|
+
[](https://coveralls.io/r/Sparkboxx/bbb)
|
9
|
+
[](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
|