class Zoney::Zone

Constants

ZONE_DECODER_REGEX

Attributes

number_of_amplifiers[R]
port[R]

Public Class Methods

new(port: "/dev/ttyUSB0", number_of_amplifiers: 1) click to toggle source
# File lib/zoney/zone.rb, line 20
def initialize(port: "/dev/ttyUSB0", number_of_amplifiers: 1)
  @port = port
  @number_of_amplifiers = number_of_amplifiers
end

Public Instance Methods

all() click to toggle source
# File lib/zoney/zone.rb, line 25
def all
  @zones ||= begin
    data_string = []

    number_of_amplifiers.times do |amplifier_number|
      amp_number = amplifier_number + 1
      carriage_returns = "\r" * amp_number
      data_string << "?#{amp_number}0#{carriage_returns}\n"
    end

    write_data(string: data_string.join) && sleep(1)

    decoded_response
  end
end
change_bass_level(zone_number:, level:) click to toggle source
# File lib/zoney/zone.rb, line 80
def change_bass_level(zone_number:, level:)
  update_attribute(
    zone_number: zone_number,
    attribute: "bs",
    value: level,
  )
end
change_source(zone_number:, source_number:) click to toggle source
# File lib/zoney/zone.rb, line 64
def change_source(zone_number:, source_number:)
  update_attribute(
    zone_number: zone_number,
    attribute: "ch",
    value: source_number,
  )
end
change_treble_level(zone_number:, level:) click to toggle source
# File lib/zoney/zone.rb, line 88
def change_treble_level(zone_number:, level:)
  update_attribute(
    zone_number: zone_number,
    attribute: "tr",
    value: level,
  )
end
change_volume_level(zone_number:, level:) click to toggle source
# File lib/zoney/zone.rb, line 72
def change_volume_level(zone_number:, level:)
  update_attribute(
    zone_number: zone_number,
    attribute: "vo",
    value: level,
  )
end
find(zone_number:) click to toggle source
# File lib/zoney/zone.rb, line 41
def find(zone_number:)
  data_string = "?#{zone_number}\r\n"
  write_data(string: data_string) && sleep(1)

  decoded_response[0]
end
mute(zone_number:) click to toggle source
# File lib/zoney/zone.rb, line 56
def mute(zone_number:)
  update_attribute(zone_number: zone_number, attribute: "mu", value: "01")
end
power_off(zone_number:) click to toggle source
# File lib/zoney/zone.rb, line 52
def power_off(zone_number:)
  update_attribute(zone_number: zone_number, attribute: "pr", value: "00")
end
power_on(zone_number:) click to toggle source
# File lib/zoney/zone.rb, line 48
def power_on(zone_number:)
  update_attribute(zone_number: zone_number, attribute: "pr", value: "01")
end
unmute(zone_number:) click to toggle source
# File lib/zoney/zone.rb, line 60
def unmute(zone_number:)
  update_attribute(zone_number: zone_number, attribute: "mu", value: "00")
end
update_attribute(zone_number:, attribute:, value:) click to toggle source
# File lib/zoney/zone.rb, line 96
def update_attribute(zone_number:, attribute:, value:)
  serial_port.write("<#{zone_number}#{attribute}#{padded_number(value)}\r")
end

Private Instance Methods

decoded_response() click to toggle source
# File lib/zoney/zone.rb, line 116
def decoded_response
  split_data = read_data.split("\n")
  zone_map =
    split_data.map { |datum| datum.match(ZONE_DECODER_REGEX) }.compact

  zone_map.map do |zone|
    {
      balance: zone[9],
      bass_level: zone[8],
      dt: zone[5],
      keypad: zone[11],
      mute: zone[4],
      pa: zone[2],
      power: zone[3],
      source: zone[10],
      treble_level: zone[7],
      volume_level: zone[6],
      zone_number: zone[1],
    }
  end
end
padded_number(number) click to toggle source
# File lib/zoney/zone.rb, line 138
def padded_number(number)
  stringified_number = number.to_s

  if stringified_number.length < 2
    "0#{stringified_number}"
  else
    stringified_number
  end
end
read_data() click to toggle source
# File lib/zoney/zone.rb, line 108
def read_data
  serial_port.read(10_000)
end
serial_port() click to toggle source
# File lib/zoney/zone.rb, line 104
def serial_port
  @_serial_port ||= Serial.new(port)
end
write_data(string:) click to toggle source
# File lib/zoney/zone.rb, line 112
def write_data(string:)
  serial_port.write(string)
end