Class: DACPClient::DMAPConverter

Inherits:
Object
  • Object
show all
Defined in:
lib/dacpclient/dmapconverter.rb

Overview

The DMAPConverter class converts between binary and ruby formats

Class Method Summary collapse

Class Method Details

.bin_to_bool(data) ⇒ Object



25
26
27
# File 'lib/dacpclient/dmapconverter.rb', line 25

def bin_to_bool(data)
  data == "\x01"
end

.bin_to_byte(data) ⇒ Object



9
10
11
# File 'lib/dacpclient/dmapconverter.rb', line 9

def bin_to_byte(data)
  data.unpack('C').first
end

.bin_to_date(data) ⇒ Object



37
38
39
# File 'lib/dacpclient/dmapconverter.rb', line 37

def bin_to_date(data)
  Time.at(bin_to_int(data))
end

.bin_to_hex(data) ⇒ Object



33
34
35
# File 'lib/dacpclient/dmapconverter.rb', line 33

def bin_to_hex(data)
  data.bytes.reduce('') { |a, e| a + sprintf('%02X', e) }
end

.bin_to_int(data) ⇒ Object Also known as: bin_to_uint32



17
18
19
# File 'lib/dacpclient/dmapconverter.rb', line 17

def bin_to_int(data)
  data.unpack('N').first
end

.bin_to_long(data) ⇒ Object Also known as: bin_to_uint64



13
14
15
# File 'lib/dacpclient/dmapconverter.rb', line 13

def bin_to_long(data)
  (bin_to_int(data[0..3]) << 32) + bin_to_int(data[4..7])
end

.bin_to_short(data) ⇒ Object Also known as: bin_to_uint16



21
22
23
# File 'lib/dacpclient/dmapconverter.rb', line 21

def bin_to_short(data)
  data.unpack('n').first
end

.bin_to_string(data) ⇒ Object Also known as: string_to_bin



84
85
86
# File 'lib/dacpclient/dmapconverter.rb', line 84

def bin_to_string(data)
  data
end

.bin_to_version(data) ⇒ Object



29
30
31
# File 'lib/dacpclient/dmapconverter.rb', line 29

def bin_to_version(data)
  data.unpack('nCC').join '.'
end

.bool_to_bin(data) ⇒ Object



41
42
43
# File 'lib/dacpclient/dmapconverter.rb', line 41

def bool_to_bin(data)
  (data ? 1 : 0).chr
end

.byte_to_bin(data) ⇒ Object



49
50
51
# File 'lib/dacpclient/dmapconverter.rb', line 49

def byte_to_bin(data)
  [data.to_i].pack 'C'
end

.date_to_bin(data) ⇒ Object



5
6
7
# File 'lib/dacpclient/dmapconverter.rb', line 5

def date_to_bin(data)
  int_to_bin(value.to_i)
end

.decode(type, data) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/dacpclient/dmapconverter.rb', line 98

def decode(type, data)
  decode_method = ('bin_to_' + type.to_s).to_sym
  if respond_to? decode_method
    send(decode_method, data)
  else
    warn "Decoder: Unknown type #{type}"
    decode_unknown(data)
  end
end

.decode_unknown(data) ⇒ Object Also known as: bin_to_unknown



69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/dacpclient/dmapconverter.rb', line 69

def decode_unknown(data)
  if data =~ /[^\x20-\x7e]/ # non-readable characters
    if data.bytesize == 1
      return DMAPConverter.bin_to_byte(data)
    elsif data.bytesize == 2
      return DMAPConverter.bin_to_short(data)
    elsif data.bytesize == 4
      return DMAPConverter.bin_to_int(data)
    elsif data.bytesize == 8
      return DMAPConverter.bin_to_long(data)
    end
  end
  data
end

.encode(type, data) ⇒ Object



108
109
110
111
112
113
114
115
116
# File 'lib/dacpclient/dmapconverter.rb', line 108

def encode(type, data)
  encode_method = (type.to_s + '_to_bin').to_sym
  if respond_to? encode_method
    send(encode_method, data)
  else
    warn "Encoder: Unknown type #{type}"
    data
  end
end

.hex_to_bin(data) ⇒ Object



65
66
67
# File 'lib/dacpclient/dmapconverter.rb', line 65

def hex_to_bin(data)
  [data].pack 'H*'
end

.int_to_bin(data) ⇒ Object Also known as: uint32_to_bin



45
46
47
# File 'lib/dacpclient/dmapconverter.rb', line 45

def int_to_bin(data)
  [data.to_i].pack 'N'
end

.long_to_bin(data) ⇒ Object Also known as: uint64_to_bin



53
54
55
# File 'lib/dacpclient/dmapconverter.rb', line 53

def long_to_bin(data)
  [data >> 32, data & 0xfffffff].pack 'NN'
end

.short_to_bin(data) ⇒ Object Also known as: uint16_to_bin



57
58
59
# File 'lib/dacpclient/dmapconverter.rb', line 57

def short_to_bin(data)
  [data.to_i].pack 'n'
end

.version_to_bin(data) ⇒ Object



61
62
63
# File 'lib/dacpclient/dmapconverter.rb', line 61

def version_to_bin(data)
  data.split('.').pack 'nCC'
end