diff --git a/frontend/device/kindle/device.lua b/frontend/device/kindle/device.lua index 761690467..2477ece08 100644 --- a/frontend/device/kindle/device.lua +++ b/frontend/device/kindle/device.lua @@ -422,11 +422,8 @@ local KindleOasis3 = Kindle:new{ isZelda = yes, isTouchDevice = yes, hasFrontlight = yes, - --- @fixme: Requires a proper KindleOasis3.init, notably with the right warmth_intensity_file entry. - --[[ hasNaturalLight = yes, hasNaturalLightMixer = yes, - --]] hasKeys = yes, hasGSensor = yes, display_dpi = 300, @@ -827,9 +824,81 @@ function KindleOasis2:init() self.input.open("fake_events") end --- For now, assume that the KOA3 doesn't do anything differently than the KOA2. ---- @fixme: That means, possibly among other things, that frontlight warmth needs to be implemented. -KindleOasis3.init = KindleOasis2.init +function KindleOasis3:init() + self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = logger.dbg} + self.powerd = require("device/kindle/powerd"):new{ + device = self, + fl_intensity_file = "/sys/class/backlight/lm3697-bl1/brightness", + warmth_intensity_file = "/sys/class/backlight/lm3697-bl0/brightness", + batt_capacity_file = "/sys/class/power_supply/max77796-battery/capacity", + is_charging_file = "/sys/class/power_supply/max77796-charger/charging", + } + + self.input = require("device/input"):new{ + device = self, + + -- Top, Bottom (yes, it's the reverse than on non-Oasis devices) + event_map = { + [104] = "RPgFwd", + [109] = "RPgBack", + } + } + + + --- @fixme When starting KOReader with the device upside down ("D"), touch input is registered wrong + -- (i.e., probably upside down). + -- If it's started upright ("U"), everything's okay, and turning it upside down after that works just fine. + -- See #2206 & #2209 for the original KOA implementation, which obviously doesn't quite cut it here... + -- See also + -- NOTE: It'd take some effort to actually start KOReader while in a LANDSCAPE orientation, + -- since they're only exposed inside the stock reader, and not the Home/KUAL Booklets. + local haslipc, lipc = pcall(require, "liblipclua") + if haslipc and lipc then + local lipc_handle = lipc.init("com.github.koreader.screen") + if lipc_handle then + local orientation_code = lipc_handle:get_string_property( + "com.lab126.winmgr", "accelerometer") + local rotation_mode = 0 + if orientation_code then + if orientation_code == "U" then + rotation_mode = self.screen.ORIENTATION_PORTRAIT + elseif orientation_code == "R" then + rotation_mode = self.screen.ORIENTATION_LANDSCAPE + elseif orientation_code == "D" then + rotation_mode = self.screen.ORIENTATION_PORTRAIT_ROTATED + elseif orientation_code == "L" then + rotation_mode = self.screen.ORIENTATION_LANDSCAPE_ROTATED + end + end + + if rotation_mode > 0 then + self.screen.native_rotation_mode = rotation_mode + self.screen.cur_rotation_mode = rotation_mode + end + + lipc_handle:close() + end + end + + Kindle.init(self) + + self.input:registerEventAdjustHook(self.input.adjustKindleOasisOrientation) + + self.input.open(self.touch_dev) + self.input.open("/dev/input/by-path/platform-gpio-keys-event") + + -- Get accelerometer device by looking for EV=d + local std_out = io.popen("grep -e 'Handlers\\|EV=' /proc/bus/input/devices | grep -B1 'EV=d' | grep -o 'event[0-9]\\{1,2\\}'", "r") + if std_out then + local rotation_dev = std_out:read("*line") + std_out:close() + if rotation_dev then + self.input.open("/dev/input/"..rotation_dev) + end + end + + self.input.open("fake_events") +end function KindleBasic2:init() self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = logger.dbg}