flic 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +30 -0
- data/Rakefile +12 -0
- data/flic.gemspec +25 -0
- data/lib/flic.rb +7 -0
- data/lib/flic/client.rb +247 -0
- data/lib/flic/client/connection.rb +87 -0
- data/lib/flic/event_bus.rb +81 -0
- data/lib/flic/event_bus/driver.rb +23 -0
- data/lib/flic/event_bus/subscription.rb +66 -0
- data/lib/flic/protocol.rb +64 -0
- data/lib/flic/protocol/commands.rb +44 -0
- data/lib/flic/protocol/commands/cancel_scan_wizard.rb +15 -0
- data/lib/flic/protocol/commands/change_mode_parameters.rb +17 -0
- data/lib/flic/protocol/commands/command.rb +21 -0
- data/lib/flic/protocol/commands/create_connection_channel.rb +20 -0
- data/lib/flic/protocol/commands/create_scan_wizard.rb +15 -0
- data/lib/flic/protocol/commands/create_scanner.rb +14 -0
- data/lib/flic/protocol/commands/force_disconnect.rb +15 -0
- data/lib/flic/protocol/commands/get_button_uuid.rb +15 -0
- data/lib/flic/protocol/commands/get_info.rb +12 -0
- data/lib/flic/protocol/commands/ping.rb +14 -0
- data/lib/flic/protocol/commands/remove_connection_channel.rb +14 -0
- data/lib/flic/protocol/commands/remove_scanner.rb +14 -0
- data/lib/flic/protocol/events.rb +60 -0
- data/lib/flic/protocol/events/advertisement_packet.rb +25 -0
- data/lib/flic/protocol/events/bluetooth_controller_state_change.rb +15 -0
- data/lib/flic/protocol/events/button_click_or_hold.rb +19 -0
- data/lib/flic/protocol/events/button_single_or_double_click.rb +19 -0
- data/lib/flic/protocol/events/button_single_or_double_click_or_hold.rb +19 -0
- data/lib/flic/protocol/events/button_up_or_down.rb +19 -0
- data/lib/flic/protocol/events/connection_channel_removed.rb +16 -0
- data/lib/flic/protocol/events/connection_status_changed.rb +19 -0
- data/lib/flic/protocol/events/create_connection_channel_response.rb +18 -0
- data/lib/flic/protocol/events/event.rb +21 -0
- data/lib/flic/protocol/events/get_button_uuid_response.rb +17 -0
- data/lib/flic/protocol/events/get_info_response.rb +27 -0
- data/lib/flic/protocol/events/got_space_for_new_connection.rb +14 -0
- data/lib/flic/protocol/events/new_verified_button.rb +15 -0
- data/lib/flic/protocol/events/no_space_for_new_connection.rb +14 -0
- data/lib/flic/protocol/events/ping_response.rb +14 -0
- data/lib/flic/protocol/events/scan_wizard_button_connected.rb +14 -0
- data/lib/flic/protocol/events/scan_wizard_completed.rb +16 -0
- data/lib/flic/protocol/events/scan_wizard_found_private_button.rb +14 -0
- data/lib/flic/protocol/events/scan_wizard_found_public_button.rb +19 -0
- data/lib/flic/protocol/packet_header.rb +12 -0
- data/lib/flic/protocol/primitives.rb +22 -0
- data/lib/flic/protocol/primitives/bluetooth_address.rb +35 -0
- data/lib/flic/protocol/primitives/bluetooth_address_type.rb +13 -0
- data/lib/flic/protocol/primitives/bluetooth_controller_state.rb +14 -0
- data/lib/flic/protocol/primitives/boolean.rb +19 -0
- data/lib/flic/protocol/primitives/click_type.rb +17 -0
- data/lib/flic/protocol/primitives/connection_status.rb +14 -0
- data/lib/flic/protocol/primitives/create_connection_channel_error.rb +13 -0
- data/lib/flic/protocol/primitives/device_name.rb +44 -0
- data/lib/flic/protocol/primitives/disconnect_reason.rb +15 -0
- data/lib/flic/protocol/primitives/enum.rb +85 -0
- data/lib/flic/protocol/primitives/latency_mode.rb +14 -0
- data/lib/flic/protocol/primitives/removed_reason.rb +18 -0
- data/lib/flic/protocol/primitives/scan_wizard_result.rb +18 -0
- data/lib/flic/protocol/primitives/uuid.rb +23 -0
- data/lib/flic/version.rb +3 -0
- metadata +180 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'flic/protocol'
|
2
|
+
|
3
|
+
module Flic
|
4
|
+
module Protocol
|
5
|
+
module Events
|
6
|
+
autoload :AdvertisementPacket, 'flic/protocol/events/advertisement_packet'
|
7
|
+
autoload :BluetoothControllerStateChange, 'flic/protocol/events/bluetooth_controller_state_change'
|
8
|
+
autoload :ButtonClickOrHold, 'flic/protocol/events/button_click_or_hold'
|
9
|
+
autoload :ButtonSingleOrDoubleClick, 'flic/protocol/events/button_single_or_double_click'
|
10
|
+
autoload :ButtonSingleOrDoubleClickOrHold, 'flic/protocol/events/button_single_or_double_click_or_hold'
|
11
|
+
autoload :ButtonUpOrDown, 'flic/protocol/events/button_up_or_down'
|
12
|
+
autoload :ConnectionChannelRemoved, 'flic/protocol/events/connection_channel_removed'
|
13
|
+
autoload :ConnectionStatusChanged, 'flic/protocol/events/connection_status_changed'
|
14
|
+
autoload :CreateConnectionChannelResponse, 'flic/protocol/events/create_connection_channel_response'
|
15
|
+
autoload :Event, 'flic/protocol/events/event'
|
16
|
+
autoload :GetButtonUuidResponse, 'flic/protocol/events/get_button_uuid_response'
|
17
|
+
autoload :GetInfoResponse, 'flic/protocol/events/get_info_response'
|
18
|
+
autoload :GotSpaceForNewConnection, 'flic/protocol/events/got_space_for_new_connection'
|
19
|
+
autoload :NewVerifiedButton, 'flic/protocol/events/new_verified_button'
|
20
|
+
autoload :NoSpaceForNewConnection, 'flic/protocol/events/no_space_for_new_connection'
|
21
|
+
autoload :PingResponse, 'flic/protocol/events/ping_response'
|
22
|
+
autoload :ScanWizardButtonConnected, 'flic/protocol/events/scan_wizard_button_connected'
|
23
|
+
autoload :ScanWizardCompleted, 'flic/protocol/events/scan_wizard_completed'
|
24
|
+
autoload :ScanWizardFoundPrivateButton, 'flic/protocol/events/scan_wizard_found_private_button'
|
25
|
+
autoload :ScanWizardFoundPublicButton, 'flic/protocol/events/scan_wizard_found_public_button'
|
26
|
+
|
27
|
+
EVENT_CLASS_OPCODE = {
|
28
|
+
Events::AdvertisementPacket => 0x00,
|
29
|
+
Events::CreateConnectionChannelResponse => 0x01,
|
30
|
+
Events::ConnectionStatusChanged => 0x02,
|
31
|
+
Events::ConnectionChannelRemoved => 0x03,
|
32
|
+
Events::ButtonUpOrDown => 0x04,
|
33
|
+
Events::ButtonClickOrHold => 0x05,
|
34
|
+
Events::ButtonSingleOrDoubleClick => 0x06,
|
35
|
+
Events::ButtonSingleOrDoubleClickOrHold => 0x07,
|
36
|
+
Events::NewVerifiedButton => 0x08,
|
37
|
+
Events::GetInfoResponse => 0x09,
|
38
|
+
Events::NoSpaceForNewConnection => 0x0A,
|
39
|
+
Events::GotSpaceForNewConnection => 0x0B,
|
40
|
+
Events::BluetoothControllerStateChange => 0x0C,
|
41
|
+
Events::PingResponse => 0x0D,
|
42
|
+
Events::GetButtonUuidResponse => 0x0E,
|
43
|
+
Events::ScanWizardFoundPrivateButton => 0x0F,
|
44
|
+
Events::ScanWizardFoundPublicButton => 0x10,
|
45
|
+
Events::ScanWizardButtonConnected => 0x11,
|
46
|
+
Events::ScanWizardCompleted => 0x12
|
47
|
+
}.freeze
|
48
|
+
|
49
|
+
OPCODE_EVENT_CLASS = EVENT_CLASS_OPCODE.invert.freeze
|
50
|
+
|
51
|
+
def self.event_class_for_opcode(opcode)
|
52
|
+
OPCODE_EVENT_CLASS[opcode]
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.opcode_for_event_class(event_class)
|
56
|
+
EVENT_CLASS_OPCODE[event_class]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/bluetooth_address'
|
4
|
+
require 'flic/protocol/primitives/device_name'
|
5
|
+
require 'flic/protocol/primitives/boolean'
|
6
|
+
|
7
|
+
module Flic
|
8
|
+
module Protocol
|
9
|
+
module Events
|
10
|
+
class AdvertisementPacket < Event
|
11
|
+
endian :little
|
12
|
+
|
13
|
+
uint32 :scan_id
|
14
|
+
bluetooth_address :bluetooth_address
|
15
|
+
|
16
|
+
device_name :name
|
17
|
+
|
18
|
+
int8 :rssi
|
19
|
+
|
20
|
+
boolean :is_private
|
21
|
+
boolean :is_already_verified
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/bluetooth_controller_state'
|
4
|
+
|
5
|
+
module Flic
|
6
|
+
module Protocol
|
7
|
+
module Events
|
8
|
+
class BluetoothControllerStateChange < Event
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
bluetooth_controller_state :bluetooth_controller_state
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/click_type'
|
4
|
+
require 'flic/protocol/primitives/boolean'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class ButtonClickOrHold < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
click_type :click_type
|
14
|
+
boolean :was_queued
|
15
|
+
uint32 :time_difference
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/click_type'
|
4
|
+
require 'flic/protocol/primitives/boolean'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class ButtonSingleOrDoubleClick < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
click_type :click_type
|
14
|
+
boolean :was_queued
|
15
|
+
uint32 :time_difference
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/click_type'
|
4
|
+
require 'flic/protocol/primitives/boolean'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class ButtonSingleOrDoubleClickOrHold < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
click_type :click_type
|
14
|
+
boolean :was_queued
|
15
|
+
uint32 :time_difference
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/click_type'
|
4
|
+
require 'flic/protocol/primitives/boolean'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class ButtonUpOrDown < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
click_type :click_type
|
14
|
+
boolean :was_queued
|
15
|
+
uint32 :time_difference
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/removed_reason'
|
4
|
+
|
5
|
+
module Flic
|
6
|
+
module Protocol
|
7
|
+
module Events
|
8
|
+
class ConnectionChannelRemoved < Event
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint32 :connection_id
|
12
|
+
removed_reason :removed_reason
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/connection_status'
|
4
|
+
require 'flic/protocol/primitives/disconnect_reason'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class ConnectionStatusChanged < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
connection_status :connection_status
|
14
|
+
|
15
|
+
disconnect_reason :disconnect_reason # only relevant when connection_status is :disconnected
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/create_connection_channel_error'
|
4
|
+
require 'flic/protocol/primitives/connection_status'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class CreateConnectionChannelResponse < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
uint32 :connection_id
|
13
|
+
create_connection_channel_error :error
|
14
|
+
connection_status :connection_status
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
|
3
|
+
require 'bindata'
|
4
|
+
|
5
|
+
module Flic
|
6
|
+
module Protocol
|
7
|
+
module Events
|
8
|
+
class Event < BinData::Record
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
uint8 :opcode, initial_value: -> { init_opcode }
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def init_opcode
|
16
|
+
Event.opcode_for_event_class(self.class)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/bluetooth_address'
|
4
|
+
require 'flic/protocol/primitives/uuid'
|
5
|
+
|
6
|
+
module Flic
|
7
|
+
module Protocol
|
8
|
+
module Events
|
9
|
+
class GetButtonUuidResponse < Event
|
10
|
+
endian :little
|
11
|
+
|
12
|
+
bluetooth_address :bluetooth_address
|
13
|
+
uuid :uuid
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/bluetooth_controller_state'
|
4
|
+
require 'flic/protocol/primitives/bluetooth_address'
|
5
|
+
require 'flic/protocol/primitives/bluetooth_address_type'
|
6
|
+
|
7
|
+
module Flic
|
8
|
+
module Protocol
|
9
|
+
module Events
|
10
|
+
class GetInfoResponse < Event
|
11
|
+
endian :little
|
12
|
+
|
13
|
+
bluetooth_controller_state :bluetooth_controller_state
|
14
|
+
bluetooth_address :bluetooth_address
|
15
|
+
bluetooth_address_type :bluetooth_address_type
|
16
|
+
|
17
|
+
uint8 :maximum_pending_connections
|
18
|
+
int16 :maximum_concurrently_connected_buttons
|
19
|
+
uint8 :current_pending_connections
|
20
|
+
boolean :currently_no_space_for_new_connection
|
21
|
+
|
22
|
+
uint16 :verified_buttons_length
|
23
|
+
array :verified_buttons, type: :bluetooth_address, initial_length: :verified_buttons_length
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
|
4
|
+
module Flic
|
5
|
+
module Protocol
|
6
|
+
module Events
|
7
|
+
class GotSpaceForNewConnection < Event
|
8
|
+
endian :little
|
9
|
+
|
10
|
+
uint8 :maximum_concurrently_connected_buttons
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
require 'flic/protocol/primitives/bluetooth_address'
|
4
|
+
|
5
|
+
module Flic
|
6
|
+
module Protocol
|
7
|
+
module Events
|
8
|
+
class NewVerifiedButton < Event
|
9
|
+
endian :little
|
10
|
+
|
11
|
+
bluetooth_address :bluetooth_address
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'flic/protocol/events'
|
2
|
+
require 'flic/protocol/events/event'
|
3
|
+
|
4
|
+
module Flic
|
5
|
+
module Protocol
|
6
|
+
module Events
|
7
|
+
class NoSpaceForNewConnection < Event
|
8
|
+
endian :little
|
9
|
+
|
10
|
+
uint8 :maximum_concurrently_connected_buttons
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|