diff --git a/frontend/device/input.lua b/frontend/device/input.lua index bfe9878a4..949975a55 100644 --- a/frontend/device/input.lua +++ b/frontend/device/input.lua @@ -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 +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 +-- 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