Class: Dino::Board
- Inherits:
-
Object
- Object
- Dino::Board
- Defined in:
- lib/dino/board.rb
Constant Summary collapse
- PIN_COMMANDS =
{ digital_write: '01', digital_read: '02', analog_write: '03', analog_read: '04', digital_listen: '05', analog_listen: '06', stop_listener: '07', servo_toggle: '08', servo_write: '09' }
Instance Attribute Summary collapse
-
#analog_hardware ⇒ Object
readonly
Returns the value of attribute analog_hardware.
-
#analog_zero ⇒ Object
readonly
Returns the value of attribute analog_zero.
-
#digital_hardware ⇒ Object
readonly
Returns the value of attribute digital_hardware.
Instance Method Summary collapse
- #add_analog_hardware(part) ⇒ Object
- #add_digital_hardware(part) ⇒ Object
- #analog_divider=(value) ⇒ Object
- #handshake ⇒ Object
- #heart_rate=(value) ⇒ Object
-
#initialize(io) ⇒ Board
constructor
A new instance of Board.
- #normalize_cmd(cmd) ⇒ Object
- #normalize_pin(pin) ⇒ Object
- #normalize_value(value) ⇒ Object
- #remove_analog_hardware(part) ⇒ Object
- #remove_digital_hardware(part) ⇒ Object
- #set_pin_mode(pin, mode, pullup = nil) ⇒ Object
- #set_pullup(pin, pullup) ⇒ Object
- #start_read ⇒ Object
- #stop_read ⇒ Object
- #update(pin, msg) ⇒ Object
- #write(msg, opts = {}) ⇒ Object
Constructor Details
#initialize(io) ⇒ Board
Returns a new instance of Board.
6 7 8 9 10 |
# File 'lib/dino/board.rb', line 6 def initialize(io) @io, @digital_hardware, @analog_hardware = io, [], [] io.add_observer(self) handshake end |
Instance Attribute Details
#analog_hardware ⇒ Object (readonly)
Returns the value of attribute analog_hardware.
3 4 5 |
# File 'lib/dino/board.rb', line 3 def analog_hardware @analog_hardware end |
#analog_zero ⇒ Object (readonly)
Returns the value of attribute analog_zero.
3 4 5 |
# File 'lib/dino/board.rb', line 3 def analog_zero @analog_zero end |
#digital_hardware ⇒ Object (readonly)
Returns the value of attribute digital_hardware.
3 4 5 |
# File 'lib/dino/board.rb', line 3 def digital_hardware @digital_hardware end |
Instance Method Details
#add_analog_hardware(part) ⇒ Object
58 59 60 61 62 |
# File 'lib/dino/board.rb', line 58 def add_analog_hardware(part) set_pin_mode(part.pin, :in) analog_listen(part.pin) @analog_hardware << part end |
#add_digital_hardware(part) ⇒ Object
47 48 49 50 51 |
# File 'lib/dino/board.rb', line 47 def add_digital_hardware(part) set_pin_mode(part.pin, :in, part.pullup) digital_listen(part.pin) @digital_hardware << part end |
#analog_divider=(value) ⇒ Object
16 17 18 19 20 21 22 |
# File 'lib/dino/board.rb', line 16 def analog_divider=(value) unless [1, 2, 4, 8, 16, 32, 64, 128].include? value puts "Analog divider must be in 1, 2, 4, 8, 16, 32, 64, 128" else write "9700#{normalize_value(value)}" end end |
#handshake ⇒ Object
12 13 14 |
# File 'lib/dino/board.rb', line 12 def handshake @analog_zero = @io.handshake end |
#heart_rate=(value) ⇒ Object
24 25 26 |
# File 'lib/dino/board.rb', line 24 def heart_rate=(value) write "9800#{normalize_value(value)}" end |
#normalize_cmd(cmd) ⇒ Object
108 109 110 111 |
# File 'lib/dino/board.rb', line 108 def normalize_cmd(cmd) raise Exception.new('commands can only be two digits') if cmd.to_s.length > 2 normalize(cmd, 2) end |
#normalize_pin(pin) ⇒ Object
98 99 100 101 102 103 104 105 106 |
# File 'lib/dino/board.rb', line 98 def normalize_pin(pin) if pin.to_s.match /\Aa/i int_pin = @analog_zero + pin.to_s.gsub(/\Aa/i, '').to_i else int_pin = pin end raise Exception.new('pin number must be in 0-99') if int_pin.to_i > 99 return normalize(int_pin, 2) end |
#normalize_value(value) ⇒ Object
113 114 115 116 |
# File 'lib/dino/board.rb', line 113 def normalize_value(value) raise Exception.new('values are limited to three digits') if value.to_s.length > 3 normalize(value, 3) end |
#remove_analog_hardware(part) ⇒ Object
64 65 66 67 |
# File 'lib/dino/board.rb', line 64 def remove_analog_hardware(part) stop_listener(part.pin) @analog_hardware.delete(part) end |
#remove_digital_hardware(part) ⇒ Object
53 54 55 56 |
# File 'lib/dino/board.rb', line 53 def remove_digital_hardware(part) stop_listener(part.pin) @digital_hardware.delete(part) end |
#set_pin_mode(pin, mode, pullup = nil) ⇒ Object
69 70 71 72 73 |
# File 'lib/dino/board.rb', line 69 def set_pin_mode(pin, mode, pullup=nil) pin, value = normalize_pin(pin), normalize_value(mode == :out ? 0 : 1) write("00#{pin}#{value}") set_pullup(pin, pullup) if mode == :in end |
#set_pullup(pin, pullup) ⇒ Object
75 76 77 |
# File 'lib/dino/board.rb', line 75 def set_pullup(pin, pullup) pullup ? digital_write(pin, HIGH) : digital_write(pin, LOW) end |
#start_read ⇒ Object
28 29 30 |
# File 'lib/dino/board.rb', line 28 def start_read @io.read end |
#stop_read ⇒ Object
32 33 34 |
# File 'lib/dino/board.rb', line 32 def stop_read @io.close_read end |
#update(pin, msg) ⇒ Object
41 42 43 44 45 |
# File 'lib/dino/board.rb', line 41 def update(pin, msg) (@digital_hardware + @analog_hardware).each do |part| part.update(msg) if normalize_pin(pin) == normalize_pin(part.pin) end end |
#write(msg, opts = {}) ⇒ Object
36 37 38 39 |
# File 'lib/dino/board.rb', line 36 def write(msg, opts = {}) formatted_msg = opts.delete(:no_wrap) ? msg : "!#{msg}." @io.write(formatted_msg) end |