Turns a Keybow into a macro keyboard with multiple, on-the-fly switchable layouts – so you don't need to swap mSD cards.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

210 lines
4.6 KiB

keybow = {}
local KEYCODES = "abcdefghijklmnopqrstuvwxyz1234567890\n\a\b\t -=[]\\#;'`,./"
local SHIFTED_KEYCODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()\a\a\a\a\a_+{}|~:\"~<>?"
keybow.LEFT_CTRL = 0
keybow.LEFT_SHIFT = 1
keybow.LEFT_ALT = 2
keybow.LEFT_META = 3
keybow.RIGHT_CTRL = 4
keybow.RIGHT_SHIFT = 5
keybow.RIGHT_ALT = 6
keybow.RIGHT_META = 7
keybow.ENTER = 0x28
keybow.ESC = 0x29
keybow.BACKSPACE = 0x2a
keybow.TAB = 0x2b
keybow.SPACE = 0x2c
keybow.CAPSLOCK = 0x39
keybow.LEFT_ARROW = 0x50
keybow.RIGHT_ARROW = 0x4f
keybow.UP_ARROW = 0x52
keybow.DOWN_ARROW = 0x51
keybow.F1 = 0x3a
keybow.F2 = 0x3b
keybow.F3 = 0x3c
keybow.F4 = 0x3d
keybow.F5 = 0x3e
keybow.F6 = 0x3f
keybow.F7 = 0x40
keybow.F8 = 0x41
keybow.F9 = 0x42
keybow.F10 = 0x43
keybow.F11 = 0x44
keybow.F12 = 0x45
keybow.KEY_DOWN = true
keybow.KEY_UP = false
-- Functions exposed from C
function keybow.set_modifier(key, state)
keybow_set_modifier(key, state)
end
function keybow.sleep(time)
keybow_sleep(time)
end
function keybow.usleep(time)
keybow_usleep(time)
end
function keybow.text(text)
for i = 1, #text do
local c = text:sub(i, i)
keybow.tap_key(c)
end
keybow.set_modifier(keybow.LEFT_SHIFT, false)
end
-- Lighting control
function keybow.set_pixel(x, r, g, b)
keybow_set_pixel(x, r, g, b)
end
function keybow.auto_lights(state)
keybow_auto_lights(state)
end
function keybow.clear_lights()
keybow_clear_lights()
end
function keybow.load_pattern(file)
keybow_load_pattern(file)
end
-- Meta keys - ctrl, shift, alt and win/apple
function keybow.tap_left_ctrl()
keybow.set_modifier(keybow.LEFT_CTRL, keybow.KEY_DOWN)
keybow.set_modifier(keybow.LEFT_CTRL, keybow.KEY_UP)
end
function keybow.tap_right_ctrl()
keybow.set_modifier(keybow.RIGHT_CTRL, keybow.KEY_DOWN)
keybow.set_modifier(keybow.RIGHT_CTRL, keybow.KEY_UP)
end
function keybow.tap_left_shift()
keybow.set_modifier(keybow.LEFT_SHIFT, keybow.KEY_DOWN)
keybow.set_modifier(keybow.LEFT_SHIFT, keybow.KEY_UP)
end
function keybow.tap_right_shift()
keybow.set_modifier(keybow.RIGHT_SHIFT, keybow.KEY_DOWN)
keybow.set_modifier(keybow.RIGHT_SHIFT, keybow.KEY_UP)
end
function keybow.tap_left_alt()
keybow.set_modifier(keybow.LEFT_ALT, keybow.KEY_DOWN)
keybow.set_modifier(keybow.LEFT_ALT, keybow.KEY_UP)
end
function keybow.tap_right_alt()
keybow.set_modifier(keybow.RIGHT_ALT, keybow.KEY_DOWN)
keybow.set_modifier(keybow.RIGHT_ALT, keybow.KEY_UP)
end
function keybow.tap_left_meta()
keybow.set_modifier(keybow.LEFT_META, keybow.KEY_DOWN)
keybow.set_modifier(keybow.LEFT_META, keybow.KEY_UP)
end
function keybow.tap_right_meta()
keybow.set_modifier(keybow.RIGHT_META, keybow.KEY_DOWN)
keybow.set_modifier(keybow.RIGHT_META, keybow.KEY_UP)
end
-- Function keys
function keybow.tap_function_key(index)
index = 57 + index -- Offset to 0x39 (F1 is 0x3a)
keybow.set_key(index, true)
keybow.set_key(index, false)
end
function keybow.ascii_to_shift(key)
if not (type(key) == "string") then
return false
end
return SHIFTED_KEYCODES.find(key) ~= nil
end
function keybow.ascii_to_hid(key)
if not (type(key) == "string") then
return key
end
key = key:lower()
code = KEYCODES:find(key)
if code == nil then return nil end
return code + 3
end
function keybow.set_key(key, pressed)
if type(key) == "string" then
local hid_code = nil
local shifted = SHIFTED_KEYCODES:find(key, 1, true) ~= nil
if shifted then
hid_code = SHIFTED_KEYCODES:find(key, 1, true)
else
hid_code = KEYCODES:find(key, 1, true)
end
if not (hid_code == nil) then
hid_code = hid_code + 3
if shifted then keybow.set_modifier(keybow.LEFT_SHIFT, pressed) end
keybow_set_key(hid_code, pressed)
end
else -- already a key code
keybow_set_key(key, pressed)
end
end
function keybow.tap_enter()
keybow.set_key(keybow.ENTER, true)
keybow.set_key(keybow.ENTER, false)
end
function keybow.tap_space()
keybow.set_key(keybow.SPACE, true)
keybow.set_key(keybow.SPACE, false)
end
function keybow.tap_shift()
keybow.set_key(keybow.LEFT_SHIFT, true)
keybow.set_key(keybow.LEFT_SHIFT, false)
end
function keybow.tap_tab()
keybow.set_key(keybow.TAB, true)
keybow.set_key(keybow.TAB, false)
end
function keybow.tap_key(key)
keybow.set_key(key, true)
keybow.set_key(key, false)
end
function keybow.press_key(key)
keybow.set_key(key, true)
end
function keybow.release_key(key)
keybow.set_key(key, false)
end