mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
This is a major overhaul of the hardware abstraction layer. A few notes: General platform distinction happens in frontend/device.lua which will delegate everything else to frontend/device/<platform_name>/device.lua which should extend frontend/device/generic/device.lua Screen handling is implemented in frontend/device/screen.lua which includes the *functionality* to support device specifics. Actually setting up the device specific functionality, however, is done in the device specific setup code in the relevant device.lua file. The same goes for input handling.
146 lines
3.9 KiB
Lua
146 lines
3.9 KiB
Lua
local util = require("ffi/util")
|
|
local DEBUG = require("dbg")
|
|
|
|
local function no() return false end
|
|
|
|
local Device = {
|
|
screen_saver_mode = false,
|
|
charging_mode = false,
|
|
survive_screen_saver = false,
|
|
model = nil,
|
|
powerd = nil,
|
|
screen = nil,
|
|
input = nil,
|
|
|
|
-- hardware feature tests: (these are functions!)
|
|
hasKeyboard = no,
|
|
hasKeys = no,
|
|
isTouchDevice = no,
|
|
hasFrontlight = no,
|
|
|
|
-- use these only as a last resort. We should abstract the functionality
|
|
-- and have device dependent implementations in the corresponting
|
|
-- device/<devicetype>/device.lua file
|
|
-- (these are functions!)
|
|
isKindle = no,
|
|
isKobo = no,
|
|
isAndroid = no,
|
|
isEmulator = no,
|
|
|
|
-- some devices have part of their screen covered by the bezel
|
|
viewport = nil,
|
|
}
|
|
|
|
function Device:new(o)
|
|
local o = o or {}
|
|
setmetatable(o, self)
|
|
self.__index = self
|
|
return o
|
|
end
|
|
|
|
function Device:init()
|
|
if not self.screen then
|
|
self.screen = require("device/generic/screen"):new{device = self}
|
|
end
|
|
if not self.input then
|
|
self.input = require("device/generic/input"):new{device = self}
|
|
end
|
|
if not self.powerd then
|
|
self.powerd = require("device/generic/powerd"):new{device = self}
|
|
end
|
|
|
|
if self.viewport then
|
|
self.screen:setViewport(self.viewport)
|
|
self.input:registerEventAdjustHook(
|
|
self.input.adjustTouchTranslate,
|
|
{x = 0 - self.viewport.x, y = 0 - self.viewport.y})
|
|
end
|
|
end
|
|
|
|
function Device:getPowerDevice()
|
|
return self.powerd
|
|
end
|
|
|
|
function Device:intoScreenSaver()
|
|
if self.charging_mode == false and self.screen_saver_mode == false then
|
|
self.screen:saveCurrentBB()
|
|
self.screen_saver_mode = true
|
|
end
|
|
end
|
|
|
|
function Device:outofScreenSaver()
|
|
if self.screen_saver_mode == true and self.charging_mode == false then
|
|
-- wait for native system update screen before we recover saved
|
|
-- Blitbuffer.
|
|
util.usleep(1500000)
|
|
self.screen:restoreFromSavedBB()
|
|
self.screen:refresh(0)
|
|
self.survive_screen_saver = true
|
|
end
|
|
self.screen_saver_mode = false
|
|
end
|
|
|
|
function Device:onPowerEvent(ev)
|
|
local Screensaver = require("ui/screensaver")
|
|
if (ev == "Power" or ev == "Suspend") and not self.screen_saver_mode then
|
|
local UIManager = require("ui/uimanager")
|
|
DEBUG("Suspending...")
|
|
-- always suspend in portrait mode
|
|
self.orig_rotation_mode = self.screen:getRotationMode()
|
|
self.screen:setRotationMode(0)
|
|
Screensaver:show()
|
|
self:prepareSuspend()
|
|
UIManager:scheduleIn(2, function() self:Suspend() end)
|
|
elseif (ev == "Power" or ev == "Resume") and self.screen_saver_mode then
|
|
DEBUG("Resuming...")
|
|
-- restore to previous rotation mode
|
|
self.screen:setRotationMode(self.orig_rotation_mode)
|
|
self:Resume()
|
|
Screensaver:close()
|
|
end
|
|
end
|
|
|
|
function Device:prepareSuspend()
|
|
if self.powerd and self.powerd.fl ~= nil then
|
|
-- in no case should the frontlight be turned on in suspend mode
|
|
self.powerd.fl:sleep()
|
|
end
|
|
self.screen:refresh(0)
|
|
self.screen_saver_mode = true
|
|
end
|
|
|
|
function Device:Suspend()
|
|
end
|
|
|
|
function Device:Resume()
|
|
self.screen:refresh(1)
|
|
self.screen_saver_mode = false
|
|
end
|
|
|
|
function Device:usbPlugIn()
|
|
if self.charging_mode == false and self.screen_saver_mode == false then
|
|
self.screen:saveCurrentBB()
|
|
end
|
|
self.charging_mode = true
|
|
end
|
|
|
|
function Device:usbPlugOut()
|
|
if self.charging_mode == true and self.screen_saver_mode == false then
|
|
self.screen:restoreFromSavedBB()
|
|
self.screen:refresh(0)
|
|
end
|
|
|
|
--@TODO signal filemanager for file changes 13.06 2012 (houqp)
|
|
self.charging_mode = false
|
|
end
|
|
|
|
--[[
|
|
prepare for application shutdown
|
|
--]]
|
|
function Device:exit()
|
|
require("ffi/input"):closeAll()
|
|
self.screen:close()
|
|
end
|
|
|
|
return Device
|