Class: Dino::Board

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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_hardwareObject (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_zeroObject (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_hardwareObject (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

#handshakeObject



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

Raises:

  • (Exception)


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

Raises:

  • (Exception)


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

Raises:

  • (Exception)


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_readObject



28
29
30
# File 'lib/dino/board.rb', line 28

def start_read
  @io.read
end

#stop_readObject



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