Autostandby: Fix wrong assumptions about instance liveness. (#6666)

Got instantiated multiple times, when our state is meant to be global.
Fixes #6647
reviewable/pr6680/r1 v2020.09
ezdiy 4 years ago committed by GitHub
parent 73b0c701ce
commit 2afec592f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -16,6 +16,8 @@ local _ = require("gettext")
local AutoStandby = WidgetContainer:new{
is_doc_only = false,
name = "autostandby",
-- static for all plugin instances
settings = LuaSettings:open(DataStorage:getSettingsDir() .. "/autostandby.lua"),
delay = 0,
lastInput = 0,
@ -23,6 +25,7 @@ local AutoStandby = WidgetContainer:new{
}
function AutoStandby:init()
logger.dbg("AutoStandby:init() instance=", tostring(self))
if not self.settings:has("filter") then
logger.dbg("AutoStandby: No settings found, initializing defaults")
self.settings.data = {
@ -61,39 +64,40 @@ end
-- We've received touch/key event, so delay stadby accordingly
function AutoStandby:onInputEvent()
logger.dbg("AutoStandby:onInputevent() instance=", tostring(self))
local config = self.settings.data
local t = os.time()
if t < self.lastInput + config.filter then
if t < AutoStandby.lastInput + config.filter then
-- packed too close together, ignore
logger.dbg("AutoStandby: input packed too close to previous one, ignoring")
return
end
-- Nuke past timer as we'll reschedule the allow (or not)
UIManager:unschedule(self.allow)
UIManager:unschedule(AutoStandby.allow)
if PowerD:getCapacityHW() <= config.bat then
-- battery is below threshold, so allow standby aggressively
logger.dbg("AutoStandby: battery below threshold, enabling aggressive standby")
self:allow()
return
elseif t > self.lastInput + config.max then
elseif t > AutoStandby.lastInput + config.max then
-- too far apart, so reset delay
logger.dbg("AutoStandby: input too far in future, resetting adaptive standby delay from", self.delay, "to", config.min)
self.delay = config.min
elseif t < self.lastInput + self.delay + config.win then
logger.dbg("AutoStandby: input too far in future, resetting adaptive standby delay from", AutoStandby.delay, "to", config.min)
AutoStandby.delay = config.min
elseif t < AutoStandby.lastInput + AutoStandby.delay + config.win then
-- otherwise widen the delay - "adaptive" - with frequent inputs, but don't grow beyonnd the max
self.delay = math.min((self.delay+1) * config.mul, config.max)
logger.dbg("AutoStandby: increasing standby delay to", self.delay)
AutoStandby.delay = math.min((AutoStandby.delay+1) * config.mul, config.max)
logger.dbg("AutoStandby: increasing standby delay to", AutoStandby.delay)
end -- equilibrium: when the event arrives beyond delay + win, but still below max, we keep the delay as-is
self.lastInput = t
AutoStandby.lastInput = t
if not self:isAllowedByConfig() then
-- all standbys forbidden, always prevent
self:prevent()
return
elseif self.delay == 0 then
elseif AutoStandby.delay == 0 then
-- If delay is 0 now, just allow straight
self:allow()
return
@ -101,21 +105,21 @@ function AutoStandby:onInputEvent()
-- otherwise prevent for a while for duration of the delay
self:prevent()
-- and schedule standby re-enable once delay expires
UIManager:scheduleIn(self.delay, self.allow, self)
UIManager:scheduleIn(AutoStandby.delay, AutoStandby.allow, AutoStandby)
end
-- Prevent standby (by timer)
function AutoStandby:prevent()
if not self.preventing then
self.preventing = true
if not AutoStandby.preventing then
AutoStandby.preventing = true
UIManager:preventStandby()
end
end
-- Allow standby (by timer)
function AutoStandby:allow()
if self.preventing then
self.preventing = false
if AutoStandby.preventing then
AutoStandby.preventing = false
UIManager:allowStandby()
end
end

Loading…
Cancel
Save