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