View Source AFK
A library for modeling the internal state of a computer keyboard. It supports arbitrary layouts with any number of layers, and outputs a basic 6-key HID report byte string.
Its intended use is to model the state for keyboard firmware.
installation
Installation
AFK can be installed by adding afk
to your list of dependencies in mix.exs
:
def deps do
[
{:afk, "~> 0.3"}
]
end
basic-usage
Basic Usage
First, you define a keymap:
keymap = [
# Layer 0 (default)
%{
k001: AFK.Keycode.Key.new(:a),
k002: AFK.Keycode.Modifier.new(:left_control),
k003: AFK.Keycode.Layer.new(:hold, 1),
k004: AFK.Keycode.Key.new(:caps_lock)
},
# Layer 1
%{
k001: AFK.Keycode.Key.new(:z),
k002: AFK.Keycode.Modifier.new(:right_super),
k003: AFK.Keycode.None.new(),
k004: AFK.Keycode.Transparent.new()
}
]
You can now start a state process using AFK.State.start_link/2
, by providing a
keymap, an event receiver PID, and a module that implements the AFK.HIDReport
behaviour.
{:ok, state} =
AFK.State.start_link(
keymap: keymap,
event_receiver: self(),
hid_report_mod: AFK.HIDReport.SixKeyRollover
)
AFK.State.press_key(state, :k003)
AFK.State.press_key(state, :k002)
AFK.State.press_key(state, :k001)
AFK.State.release_key(state, :k002)
# take a look at our process mailbox
:erlang.process_info(self(), :messages)
# {:messages,
# [
# hid_report: <<0, 0, 0, 0, 0, 0, 0, 0>>,
# hid_report: <<128, 0, 0, 0, 0, 0, 0, 0>>,
# hid_report: <<128, 0, 29, 0, 0, 0, 0, 0>>,
# hid_report: <<0, 0, 29, 0, 0, 0, 0, 0>>
# ]}
future-features
Future Features
AFK provides a behaviour for defining how to convert the state into a HID report. Currently only a 6-key rollover implementation is provided, but an N-key rollover implementation would be a great addition. (Pull requests welcome!)
It may eventually also support more complex interactions, such as sticky keys, macros, leader keys, etc. These features require a lot more thinking though, as they will require the state undergoing changes over time.
docs
Docs
Documentation can be found at https://hexdocs.pm/afk.