From d4fd0b9428c0f90c60c48957e072ce0b2f803dfa Mon Sep 17 00:00:00 2001 From: poire-z Date: Mon, 4 Sep 2017 21:05:05 +0200 Subject: [PATCH] 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 --- defaults.lua | 7 +- frontend/apps/filemanager/filemanager.lua | 1 + frontend/device/generic/device.lua | 3 + frontend/device/kobo/device.lua | 5 + frontend/device/kobo/powerd.lua | 127 ++++++++++++++++------ frontend/ui/uimanager.lua | 2 + reader.lua | 3 + 7 files changed, 110 insertions(+), 38 deletions(-) diff --git a/defaults.lua b/defaults.lua index 306ce2dec..972c56cf1 100644 --- a/defaults.lua +++ b/defaults.lua @@ -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' diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 6f36388a1..6c5cc8ec8 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -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() diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index 136b41cd9..87b050bc8 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -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 --]] diff --git a/frontend/device/kobo/device.lua b/frontend/device/kobo/device.lua index 2967e5b7b..45ca1ee15 100644 --- a/frontend/device/kobo/device.lua +++ b/frontend/device/kobo/device.lua @@ -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 diff --git a/frontend/device/kobo/powerd.lua b/frontend/device/kobo/powerd.lua index cdd89d582..2a7d70c31 100644 --- a/frontend/device/kobo/powerd.lua +++ b/frontend/device/kobo/powerd.lua @@ -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 diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index ce37d4146..b208d503d 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -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) diff --git a/reader.lua b/reader.lua index 664e0486f..2782ae429 100755 --- a/reader.lua +++ b/reader.lua @@ -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