|
|
|
@ -22,31 +22,39 @@ require("ffi/linux_input_h")
|
|
|
|
|
-- luacheck: push
|
|
|
|
|
-- luacheck: ignore
|
|
|
|
|
-- key press event values (KEY.value)
|
|
|
|
|
local EVENT_VALUE_KEY_PRESS = 1
|
|
|
|
|
local EVENT_VALUE_KEY_REPEAT = 2
|
|
|
|
|
local EVENT_VALUE_KEY_PRESS = 1
|
|
|
|
|
local EVENT_VALUE_KEY_REPEAT = 2
|
|
|
|
|
local EVENT_VALUE_KEY_RELEASE = 0
|
|
|
|
|
|
|
|
|
|
-- For Kindle Oasis orientation events (ABS.code)
|
|
|
|
|
-- the ABS code of orientation event will be adjusted to -24 from 24 (C.ABS_PRESSURE)
|
|
|
|
|
-- as C.ABS_PRESSURE is also used to detect touch input in KOBO devices.
|
|
|
|
|
local ABS_OASIS_ORIENTATION = -24
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_LEFT = 15
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_RIGHT = 17
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT = 19
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_ROTATED_LEFT = 16
|
|
|
|
|
local ABS_OASIS_ORIENTATION = -24
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_LEFT = 15
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_RIGHT = 17
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT = 19
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_ROTATED_LEFT = 16
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_ROTATED_RIGHT = 18
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_ROTATED = 20
|
|
|
|
|
local DEVICE_ORIENTATION_LANDSCAPE = 21
|
|
|
|
|
local DEVICE_ORIENTATION_LANDSCAPE_ROTATED = 22
|
|
|
|
|
|
|
|
|
|
-- For the events of the Forma accelerometer (MSC.value)
|
|
|
|
|
local MSC_RAW_GSENSOR_PORTRAIT_DOWN = 0x17
|
|
|
|
|
local MSC_RAW_GSENSOR_PORTRAIT_UP = 0x18
|
|
|
|
|
local MSC_RAW_GSENSOR_LANDSCAPE_RIGHT = 0x19
|
|
|
|
|
local MSC_RAW_GSENSOR_LANDSCAPE_LEFT = 0x1a
|
|
|
|
|
local DEVICE_ORIENTATION_PORTRAIT_ROTATED = 20
|
|
|
|
|
local DEVICE_ORIENTATION_LANDSCAPE = 21
|
|
|
|
|
local DEVICE_ORIENTATION_LANDSCAPE_ROTATED = 22
|
|
|
|
|
|
|
|
|
|
-- Kindle Oasis 2 & 3 variant
|
|
|
|
|
-- c.f., drivers/input/misc/accel/bma2x2.c
|
|
|
|
|
local UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED = 15
|
|
|
|
|
local UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED = 16
|
|
|
|
|
local UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED = 17
|
|
|
|
|
local UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED = 18
|
|
|
|
|
|
|
|
|
|
-- For the events of the Forma & Libra accelerometers (MSC.value)
|
|
|
|
|
-- c.f., drivers/hwmon/mma8x5x.c
|
|
|
|
|
local MSC_RAW_GSENSOR_PORTRAIT_DOWN = 0x17
|
|
|
|
|
local MSC_RAW_GSENSOR_PORTRAIT_UP = 0x18
|
|
|
|
|
local MSC_RAW_GSENSOR_LANDSCAPE_RIGHT = 0x19
|
|
|
|
|
local MSC_RAW_GSENSOR_LANDSCAPE_LEFT = 0x1a
|
|
|
|
|
-- Not that we care about those, but they are reported, and accurate ;).
|
|
|
|
|
local MSC_RAW_GSENSOR_BACK = 0x1b
|
|
|
|
|
local MSC_RAW_GSENSOR_FRONT = 0x1c
|
|
|
|
|
local MSC_RAW_GSENSOR_BACK = 0x1b
|
|
|
|
|
local MSC_RAW_GSENSOR_FRONT = 0x1c
|
|
|
|
|
|
|
|
|
|
-- For debug logging of ev.type
|
|
|
|
|
local linux_evdev_type_map = {
|
|
|
|
@ -490,7 +498,7 @@ function Input:handleKeyBoardEv(ev)
|
|
|
|
|
or keycode == "RPgFwd" then
|
|
|
|
|
--- @fixme Crappy event staggering!
|
|
|
|
|
--
|
|
|
|
|
-- The Forma repeats every 80ms after a 400ms delay, and 500ms roughly corresponds to a flashing update,
|
|
|
|
|
-- The Forma & co repeats every 80ms after a 400ms delay, and 500ms roughly corresponds to a flashing update,
|
|
|
|
|
-- so stuff is usually in sync when you release the key.
|
|
|
|
|
-- Obvious downside is that this ends up slower than just mashing the key.
|
|
|
|
|
--
|
|
|
|
@ -715,22 +723,46 @@ end
|
|
|
|
|
|
|
|
|
|
function Input:handleOasisOrientationEv(ev)
|
|
|
|
|
local rotation_mode, screen_mode
|
|
|
|
|
if ev.value == DEVICE_ORIENTATION_PORTRAIT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_LEFT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_RIGHT then
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_LANDSCAPE then
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED_LEFT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED_RIGHT then
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT_ROTATED
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_LANDSCAPE_ROTATED then
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE_ROTATED
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
if self.device:isZelda() then
|
|
|
|
|
if ev.value == UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED then
|
|
|
|
|
-- i.e., UR
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED then
|
|
|
|
|
-- i.e., CW
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
elseif ev.value == UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED then
|
|
|
|
|
-- i.e., UD
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT_ROTATED
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED then
|
|
|
|
|
-- i.e., CCW
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE_ROTATED
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if ev.value == DEVICE_ORIENTATION_PORTRAIT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_LEFT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_RIGHT then
|
|
|
|
|
-- i.e., UR
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_LANDSCAPE then
|
|
|
|
|
-- i.e., CW
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED_LEFT
|
|
|
|
|
or ev.value == DEVICE_ORIENTATION_PORTRAIT_ROTATED_RIGHT then
|
|
|
|
|
-- i.e., UD
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_PORTRAIT_ROTATED
|
|
|
|
|
screen_mode = 'portrait'
|
|
|
|
|
elseif ev.value == DEVICE_ORIENTATION_LANDSCAPE_ROTATED then
|
|
|
|
|
-- i.e., CCW
|
|
|
|
|
rotation_mode = framebuffer.ORIENTATION_LANDSCAPE_ROTATED
|
|
|
|
|
screen_mode = 'landscape'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local old_rotation_mode = self.device.screen:getRotationMode()
|
|
|
|
@ -749,7 +781,7 @@ function Input:handleOasisOrientationEv(ev)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- Accelerometer on the Forma, c.f., drivers/hwmon/mma8x5x.c
|
|
|
|
|
--- Accelerometer on the Forma/Libra
|
|
|
|
|
function Input:handleMiscEvNTX(ev)
|
|
|
|
|
local rotation_mode, screen_mode
|
|
|
|
|
if ev.code == C.MSC_RAW then
|
|
|
|
|