class Tinkerforge::Packer
internal
Public Class Methods
get_error_code_from_data(data)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 217 def self.get_error_code_from_data(data) (data[7, 1].unpack('C')[0] >> 6) & 0x03 end
get_function_id_from_data(data)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 209 def self.get_function_id_from_data(data) data[5, 1].unpack('C')[0] end
get_length_from_data(data)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 205 def self.get_length_from_data(data) data[4, 1].unpack('C')[0] end
get_sequence_number_from_data(data)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 213 def self.get_sequence_number_from_data(data) (data[6, 1].unpack('C')[0] >> 4) & 0x0F end
get_uid_from_data(data)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 201 def self.get_uid_from_data(data) data[0, 4].unpack('L<')[0] end
pack(unpacked, format)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 79 def self.pack(unpacked, format) data = '' format.split(' ').each do |f| if f.length > 1 f0 = f[0, 1] f1 = f[1..-1] r = [] if f0 == '?' n1 = (Integer(f1) / 8.0).ceil r = Array.new(n1, 0) unpacked[0].each_with_index do |b, i| if b r[i / 8] |= 1 << (i % 8) end end data += r.pack "C#{n1}" elsif f0 == 'k' unpacked[0].each { |c| r << c.ord } data += r.pack "C#{f1}" else r = unpacked[0] if ['s', 'S', 'l', 'L', 'q', 'Q'].count(f0) > 0 data += r.pack "#{f0}<#{f1}" elsif f0 == 'Z' data += [r].pack "#{f0}#{f1}" else data += r.pack "#{f0}#{f1}" end end else if f == '?' r = [unpacked[0] ? 1 : 0] data += r.pack 'C' elsif f == 'k' r = [unpacked[0].ord] data += r.pack 'C' else r = [unpacked[0]] if ['s', 'S', 'l', 'L', 'q', 'Q'].count(f) > 0 data += r.pack "#{f}<" else data += r.pack f end end end unpacked = unpacked.drop 1 end data end
unpack(data, format)
click to toggle source
# File lib/tinkerforge/ip_connection.rb, line 135 def self.unpack(data, format) unpacked = [] format.split(' ').each do |f| if f.length > 1 f0 = f[0, 1] f1 = f[1..-1] u = [] if f0 == '?' n1 = (Integer(f1) / 8.0).ceil() r = data.unpack "C#{n1}a*" data = r[-1] r.delete_at(-1) for i in 0..Integer(f1) - 1 u << ((r[i / 8] & (1 << (i % 8))) != 0) end elsif f0 == 'k' r = data.unpack "C#{f1}a*" data = r[-1] r.delete_at(-1) r.each { |c| u << c.chr } else if ['s', 'S', 'l', 'L', 'q', 'Q'].count(f0) > 0 r = data.unpack "#{f}<a*" else r = data.unpack "#{f}a*" end data = r[-1] r.delete_at(-1) r.each { |k| u << k } end if u.length == 1 u = u[0] end unpacked << u else r = [] u = nil if f == '?' r = data.unpack "Ca*" u = r[0] != 0 elsif f == 'k' r = data.unpack "Ca*" u = r[0].chr else if ['s', 'q', 'l', 'L', 'S', 'Q'].count(f) > 0 r = data.unpack "#{f}<a*" else r = data.unpack "#{f}a*" end u = r[0] end data = r[1] unpacked << u end end unpacked end