Module: Flic::Protocol

Extended by:
Protocol
Included in:
Protocol
Defined in:
lib/flic/protocol.rb,
lib/flic/protocol/events.rb,
lib/flic/protocol/commands.rb,
lib/flic/protocol/connection.rb,
lib/flic/protocol/primitives.rb,
lib/flic/protocol/events/event.rb,
lib/flic/protocol/commands/ping.rb,
lib/flic/protocol/packet_header.rb,
lib/flic/protocol/primitives/enum.rb,
lib/flic/protocol/primitives/uuid.rb,
lib/flic/protocol/commands/command.rb,
lib/flic/protocol/commands/get_info.rb,
lib/flic/protocol/primitives/boolean.rb,
lib/flic/protocol/events/ping_response.rb,
lib/flic/protocol/primitives/click_type.rb,
lib/flic/protocol/primitives/device_name.rb,
lib/flic/protocol/commands/create_scanner.rb,
lib/flic/protocol/commands/remove_scanner.rb,
lib/flic/protocol/primitives/latency_mode.rb,
lib/flic/protocol/commands/get_button_uuid.rb,
lib/flic/protocol/events/button_up_or_down.rb,
lib/flic/protocol/events/get_info_response.rb,
lib/flic/protocol/commands/force_disconnect.rb,
lib/flic/protocol/primitives/removed_reason.rb,
lib/flic/protocol/events/new_verified_button.rb,
lib/flic/protocol/primitives/disconnect_time.rb,
lib/flic/protocol/commands/cancel_scan_wizard.rb,
lib/flic/protocol/commands/create_scan_wizard.rb,
lib/flic/protocol/events/advertisement_packet.rb,
lib/flic/protocol/events/button_click_or_hold.rb,
lib/flic/protocol/events/scan_wizard_completed.rb,
lib/flic/protocol/primitives/bluetooth_address.rb,
lib/flic/protocol/primitives/connection_status.rb,
lib/flic/protocol/primitives/disconnect_reason.rb,
lib/flic/protocol/primitives/scan_wizard_result.rb,
lib/flic/protocol/commands/change_mode_parameters.rb,
lib/flic/protocol/events/get_button_uuid_response.rb,
lib/flic/protocol/events/connection_status_changed.rb,
lib/flic/protocol/events/connection_channel_removed.rb,
lib/flic/protocol/primitives/bluetooth_address_type.rb,
lib/flic/protocol/commands/create_connection_channel.rb,
lib/flic/protocol/commands/remove_connection_channel.rb,
lib/flic/protocol/events/no_space_for_new_connection.rb,
lib/flic/protocol/events/got_space_for_new_connection.rb,
lib/flic/protocol/events/scan_wizard_button_connected.rb,
lib/flic/protocol/events/button_single_or_double_click.rb,
lib/flic/protocol/primitives/bluetooth_controller_state.rb,
lib/flic/protocol/events/scan_wizard_found_public_button.rb,
lib/flic/protocol/events/scan_wizard_found_private_button.rb,
lib/flic/protocol/events/bluetooth_controller_state_change.rb,
lib/flic/protocol/events/create_connection_channel_response.rb,
lib/flic/protocol/primitives/create_connection_channel_error.rb,
lib/flic/protocol/events/button_single_or_double_click_or_hold.rb

Overview

This module contains an implementation of the Flic binary protocol. Of particular external interest is ‘Flic::Protocol::Connection` which provides a wrapper for the binary protocol around a socket instance.

Defined Under Namespace

Modules: Commands, Events, Primitives Classes: Connection, Error, PacketHeader

Instance Method Summary collapse

Instance Method Details

#parse_command(serialized_command) ⇒ Flic::Protocol::Commands::Command

Deserializes an instance of a protocol command class from a binary string

Parameters:

  • serialized_command (String)

    binary string

Returns:



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/flic/protocol.rb', line 34

def parse_command(serialized_command)
  command = Commands::Command.read(serialized_command)
  opcode = command.opcode
  command_class = Commands::Command.command_class_for_opcode(opcode)

  if command_class
    command_class.read(serialized_command)
  else
    raise NotImplementedError, "Unknown command opcode #{opcode}"
  end
rescue
  raise Error, "Cannot parse event `#{serialized_command.inspect}`"
end

#parse_event(serialized_event) ⇒ Flic::Protocol::Events::Event

Deserializes an instance of a protocol event class from a binary string

Parameters:

  • serialized_event (String)

    binary string

Returns:



65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/flic/protocol.rb', line 65

def parse_event(serialized_event)
  event = Events::Event.read(serialized_event)
  opcode = event.opcode
  event_class = Events.event_class_for_opcode(opcode)

  if event_class
    event_class.read(serialized_event)
  else
    raise NotImplementedError, "Unknown event opcode #{opcode}"
  end
rescue
  raise Error, "Cannot parse event `#{serialized_event.inspect}`"
end

#serialize_command(command) ⇒ String

Serializes an instance of a protocol command class to a binary string

Parameters:

Returns:

  • (String)

    binary string



20
21
22
23
24
25
26
27
28
29
# File 'lib/flic/protocol.rb', line 20

def serialize_command(command)
  case command
    when Commands::Command
      command.to_binary_s
    else
      raise NotImplementedError
  end
rescue
  raise Error, "Cannot serialize command `#{command.inspect}`"
end

#serialize_event(event) ⇒ String

Serializes an instance of a protocol event class to a binary string

Parameters:

Returns:

  • (String)

    binary string



51
52
53
54
55
56
57
58
59
60
# File 'lib/flic/protocol.rb', line 51

def serialize_event(event)
  case event
    when Commands::Event
      event.to_binary_s
    else
      raise NotImplementedError
  end
rescue
  raise Error, "Cannot serialize event `#{event.inspect}`"
end