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
pull/3173/head
poire-z 7 years ago committed by Frans de Jonge
parent dbaea8c1c8
commit d4fd0b9428

@ -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

Loading…
Cancel
Save