mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
frontlight on kobo: a few fixes (#3163)
* frontlight on kobo: a few fixes Rewritten to not update NickelConf on every change, and never if KOBO_SYNC_BRIGHTNESS_WITH_NICKEL = false. Reintroduce global settings frontlight_intensity and is_frontlight_on to keep level and state across koreader sessions. Fix a few of the remaining issues on kobo light. Ensure settings are saved when rebooting/powering off from File browser. * Ensure untoggle works when starting with light off
This commit is contained in:
@@ -170,9 +170,10 @@ SEARCH_SERIES = true
|
||||
SEARCH_PATH = true
|
||||
|
||||
-- Light parameter for Kobo
|
||||
KOBO_LIGHT_ON_START = -2 -- -1, -2 or 0-100. -1 leaves light as it
|
||||
-- is, -2 uses 'Kobo eReader.conf', other
|
||||
-- sets light on start/wake up
|
||||
KOBO_LIGHT_ON_START = -2 -- -1, -2 or 0-100.
|
||||
-- -1 uses previous koreader session saved brightness
|
||||
-- -2 uses 'Kobo eReader.conf' brighness,
|
||||
-- other sets light on start to a fix brighness
|
||||
KOBO_SYNC_BRIGHTNESS_WITH_NICKEL = true -- Save brightness set in KOreader
|
||||
-- with nickel's 'Kobo eReader.conf'
|
||||
|
||||
|
||||
@@ -362,6 +362,7 @@ end
|
||||
|
||||
function FileManager:onClose()
|
||||
logger.dbg("close filemanager")
|
||||
G_reader_settings:flush()
|
||||
UIManager:close(self)
|
||||
if self.onExit then
|
||||
self:onExit()
|
||||
|
||||
@@ -166,6 +166,9 @@ function Device:initNetworkManager() end
|
||||
|
||||
function Device:supportsScreensaver() return false end
|
||||
|
||||
-- Device specific method if any setting needs being saved
|
||||
function Device:saveSettings() end
|
||||
|
||||
--[[
|
||||
prepare for application shutdown
|
||||
--]]
|
||||
|
||||
@@ -491,6 +491,11 @@ function Kobo:resume()
|
||||
end
|
||||
end
|
||||
|
||||
function Kobo:saveSettings()
|
||||
-- save frontlight state to G_reader_settings (and NickelConf if needed)
|
||||
self.powerd:saveSettings()
|
||||
end
|
||||
|
||||
function Kobo:powerOff()
|
||||
os.execute("poweroff")
|
||||
end
|
||||
|
||||
@@ -4,6 +4,11 @@ local NickelConf = require("device/kobo/nickel_conf")
|
||||
local batt_state_folder =
|
||||
"/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/"
|
||||
|
||||
-- Here, we only deal with the real hw intensity.
|
||||
-- Dealing with toggling and remembering/restoring
|
||||
-- previous intensity when toggling/untoggling is done
|
||||
-- by BasePowerD.
|
||||
|
||||
local KoboPowerD = BasePowerD:new{
|
||||
fl_min = 0, fl_max = 100,
|
||||
fl = nil,
|
||||
@@ -14,28 +19,63 @@ local KoboPowerD = BasePowerD:new{
|
||||
|
||||
-- TODO: Remove KOBO_LIGHT_ON_START
|
||||
function KoboPowerD:_syncKoboLightOnStart()
|
||||
local new_intensity = nil
|
||||
local is_frontlight_on = nil
|
||||
local kobo_light_on_start = tonumber(KOBO_LIGHT_ON_START)
|
||||
if kobo_light_on_start then
|
||||
local new_intensity
|
||||
local is_frontlight_on
|
||||
if kobo_light_on_start > 0 then
|
||||
new_intensity = math.min(kobo_light_on_start, 100)
|
||||
is_frontlight_on = true
|
||||
elseif kobo_light_on_start == 0 then
|
||||
new_intensity = 0
|
||||
is_frontlight_on = false
|
||||
elseif kobo_light_on_start == -2 then
|
||||
return
|
||||
elseif kobo_light_on_start == -2 then -- get values from NickelConf
|
||||
new_intensity = NickelConf.frontLightLevel.get()
|
||||
is_frontlight_on = NickelConf.frontLightState:get()
|
||||
if is_frontlight_on == nil then
|
||||
-- this device does not support frontlight toggle,
|
||||
-- we set the value based on frontlight intensity.
|
||||
if new_intensity > 0 then
|
||||
is_frontlight_on = true
|
||||
else
|
||||
is_frontlight_on = false
|
||||
end
|
||||
end
|
||||
if is_frontlight_on == false and new_intensity == 0 then
|
||||
-- frontlight was toggled off in nickel, and we have no
|
||||
-- level-before-toggle-off (firmware without "FrontLightState"):
|
||||
-- use the one from koreader settings
|
||||
new_intensity = G_reader_settings:readSetting("frontlight_intensity")
|
||||
end
|
||||
else -- if kobo_light_on_start == -1 or other unexpected value then
|
||||
-- TODO(Hzj-jie): Read current frontlight states from OS.
|
||||
return
|
||||
-- As we can't read value from the OS or hardware, use last values
|
||||
-- stored in koreader settings
|
||||
new_intensity = G_reader_settings:readSetting("frontlight_intensity")
|
||||
is_frontlight_on = G_reader_settings:readSetting("is_frontlight_on")
|
||||
end
|
||||
NickelConf.frontLightLevel.set(new_intensity)
|
||||
NickelConf.frontLightState.set(is_frontlight_on)
|
||||
end
|
||||
|
||||
if new_intensity ~= nil then
|
||||
self.hw_intensity = new_intensity
|
||||
end
|
||||
if is_frontlight_on ~= nil then
|
||||
-- will only be used to give initial state to BasePowerD:_decideFrontlightState()
|
||||
self.initial_is_fl_on = is_frontlight_on
|
||||
end
|
||||
|
||||
-- In any case frontlight is off, ensure intensity is non-zero so untoggle works
|
||||
if self.initial_is_fl_on == false and self.hw_intensity == 0 then
|
||||
self.hw_intensity = 1
|
||||
end
|
||||
end
|
||||
|
||||
function KoboPowerD:init()
|
||||
-- Default values in case self:_syncKoboLightOnStart() does not find
|
||||
-- any previously saved setting (and for unit tests where it will
|
||||
-- not be called)
|
||||
self.hw_intensity = 20
|
||||
self.initial_is_fl_on = true
|
||||
|
||||
if self.device.hasFrontlight() then
|
||||
local kobolight = require("ffi/kobolight")
|
||||
local ok, light = pcall(kobolight.open)
|
||||
@@ -46,42 +86,59 @@ function KoboPowerD:init()
|
||||
end
|
||||
end
|
||||
|
||||
function KoboPowerD:_syncIntensity(intensity)
|
||||
if NickelConf.frontLightLevel.get() ~= intensity then
|
||||
NickelConf.frontLightLevel.set(intensity)
|
||||
end
|
||||
end
|
||||
|
||||
function KoboPowerD:_syncNickelConf()
|
||||
if not KOBO_SYNC_BRIGHTNESS_WITH_NICKEL then return end
|
||||
if NickelConf.frontLightState.get() == nil then
|
||||
self:_syncIntensity(self:frontlightIntensity())
|
||||
else
|
||||
if NickelConf.frontLightState.get() ~= self:isFrontlightOn() then
|
||||
NickelConf.frontLightState.set(self:isFrontlightOn())
|
||||
function KoboPowerD:saveSettings()
|
||||
-- Store BasePowerD values into settings (and not our hw_intensity, so
|
||||
-- that if frontlight was toggled off, we save and restore the previous
|
||||
-- untoggled intensity and toggle state at next startup)
|
||||
local cur_intensity = self.fl_intensity
|
||||
local cur_is_fl_on = self.is_fl_on
|
||||
-- Save intensity to koreader settings
|
||||
G_reader_settings:saveSetting("frontlight_intensity", cur_intensity)
|
||||
G_reader_settings:saveSetting("is_frontlight_on", cur_is_fl_on)
|
||||
-- And to "Kobo eReader.conf" if needed
|
||||
if KOBO_SYNC_BRIGHTNESS_WITH_NICKEL then
|
||||
if NickelConf.frontLightState.get() ~= nil then
|
||||
if NickelConf.frontLightState.get() ~= cur_is_fl_on then
|
||||
NickelConf.frontLightState.set(cur_is_fl_on)
|
||||
end
|
||||
else -- no support for frontlight state
|
||||
if not cur_is_fl_on then -- if toggled off, save intensity as 0
|
||||
cur_intensity = self.fl_min
|
||||
end
|
||||
end
|
||||
if NickelConf.frontLightLevel.get() ~= cur_intensity then
|
||||
NickelConf.frontLightLevel.set(cur_intensity)
|
||||
end
|
||||
self:_syncIntensity(self.fl_intensity)
|
||||
end
|
||||
end
|
||||
|
||||
function KoboPowerD:frontlightIntensityHW()
|
||||
return NickelConf.frontLightLevel.get()
|
||||
return self.hw_intensity
|
||||
end
|
||||
|
||||
function KoboPowerD:isFrontlightOnHW()
|
||||
local result = NickelConf.frontLightState.get()
|
||||
if result == nil then
|
||||
return self.fl_intensity > 0
|
||||
if self.initial_is_fl_on ~= nil then -- happens only once after init()
|
||||
-- give initial state to BasePowerD, which will
|
||||
-- reset our self.hw_intensity to 0 if self.initial_is_fl_on is false
|
||||
local ret = self.initial_is_fl_on
|
||||
self.initial_is_fl_on = nil
|
||||
return ret
|
||||
end
|
||||
return result
|
||||
return self.hw_intensity > 0
|
||||
end
|
||||
|
||||
function KoboPowerD:turnOffFrontlightHW() self:_setIntensity(0) end
|
||||
function KoboPowerD:turnOffFrontlightHW()
|
||||
self:_setIntensity(0) -- will call setIntensityHW(0)
|
||||
end
|
||||
|
||||
function KoboPowerD:setIntensityHW(intensity)
|
||||
if self.fl == nil then return end
|
||||
self.fl:setBrightness(intensity)
|
||||
self:_syncNickelConf()
|
||||
self.hw_intensity = intensity
|
||||
-- Now that we have set intensity, we need to let BasePowerD
|
||||
-- know about possibly changed frontlight state (if we came
|
||||
-- from light toggled off to some intensity > 0).
|
||||
self:_decideFrontlightState()
|
||||
end
|
||||
|
||||
function KoboPowerD:getCapacityHW()
|
||||
@@ -94,16 +151,16 @@ end
|
||||
|
||||
-- Turn off front light before suspend.
|
||||
function KoboPowerD:beforeSuspend()
|
||||
self:turnOffFrontlightHW()
|
||||
if self.fl == nil then return end
|
||||
-- just turn off frontlight without remembering its state
|
||||
self.fl:setBrightness(0)
|
||||
end
|
||||
|
||||
-- Restore front light state after resume.
|
||||
function KoboPowerD:afterResume()
|
||||
if KOBO_LIGHT_ON_START and tonumber(KOBO_LIGHT_ON_START) > -1 then
|
||||
self:setIntensity(math.min(KOBO_LIGHT_ON_START, 100))
|
||||
elseif self:isFrontlightOn() then
|
||||
self:turnOnFrontlightHW()
|
||||
end
|
||||
if self.fl == nil then return end
|
||||
-- just re-set it to self.hw_intensity that we haven't change on Suspend
|
||||
self.fl:setBrightness(self.hw_intensity)
|
||||
end
|
||||
|
||||
return KoboPowerD
|
||||
|
||||
@@ -55,6 +55,7 @@ function UIManager:init()
|
||||
require("ui/screensaver"):show("poweroff", _("Powered off"))
|
||||
Screen:refreshFull()
|
||||
UIManager:nextTick(function()
|
||||
Device:saveSettings()
|
||||
self:broadcastEvent(Event:new("Close"))
|
||||
Device:powerOff()
|
||||
end)
|
||||
@@ -65,6 +66,7 @@ function UIManager:init()
|
||||
require("ui/screensaver"):show("reboot", _("Rebooting..."))
|
||||
Screen:refreshFull()
|
||||
UIManager:nextTick(function()
|
||||
Device:saveSettings()
|
||||
self:broadcastEvent(Event:new("Close"))
|
||||
Device:reboot()
|
||||
end)
|
||||
|
||||
@@ -190,6 +190,9 @@ local function exitReader()
|
||||
local ReaderActivityIndicator =
|
||||
require("apps/reader/modules/readeractivityindicator")
|
||||
|
||||
-- Save any device settings before closing G_reader_settings
|
||||
Device:saveSettings()
|
||||
|
||||
G_reader_settings:close()
|
||||
|
||||
-- Close lipc handles
|
||||
|
||||
Reference in New Issue
Block a user