2
0
mirror of https://github.com/koreader/koreader synced 2024-11-16 06:12:56 +00:00

A few Kindle fixes (#4394)

* Implement isWifiOn on Kindle (fix #4380)
* Ensure frontlight intensity is properly restored on resume on Kindle. (fix #Fix #4392)
Only actually matters when the frontlight is *off*.
This commit is contained in:
NiLuJe 2018-12-10 22:10:35 +01:00 committed by GitHub
parent 8f77de8481
commit f020b1264a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 12 deletions

View File

@ -16,6 +16,30 @@ local function kindleEnableWifi(toggle)
end
end
local function isWifiUp()
-- NOTE: Pilfered from Cervantes, c.f., #4380
-- Possibly simpler and more compatible than the lipc approach ;).
local file = io.open("/sys/class/net/wlan0/carrier", "rb")
if not file then return 0 end
local status = tonumber(file:read("*all")) or 0
file:close()
return status
--[[
local status = 0
local haslipc, lipc = pcall(require, "liblipclua")
local lipc_handle = nil
if haslipc and lipc then
lipc_handle = lipc.init("com.github.koreader.networkmgr")
end
if lipc_handle then
status = lipc_handle:get_int_property("com.lab126.wifid", "enable")
lipc_handle:close()
end
return status
--]]
end
--[[
Test if a kindle device has Special Offers
--]]
@ -62,6 +86,10 @@ function Kindle:initNetworkManager(NetworkMgr)
NetworkMgr.turnOffWifi = function()
kindleEnableWifi(0)
end
NetworkMgr.isWifiOn = function()
return 1 == isWifiUp()
end
end
function Kindle:supportsScreensaver()

View File

@ -21,18 +21,24 @@ function KindlePowerD:frontlightIntensityHW()
if self.lipc_handle ~= nil then
return self.lipc_handle:get_int_property("com.lab126.powerd", "flIntensity")
else
-- NOTE: This fallback is of dubious use, as it will NOT match our expected [fl_min..fl_max] range,
-- each model has a specific curve.
return self:_readFLIntensity()
end
end
function KindlePowerD:setIntensityHW(intensity)
if self.lipc_handle ~= nil and intensity > 0 then
-- NOTE: This means we *require* a working lipc handle to set the FL:
-- it knows what the UI values should map to for the specific hardware much better than us.
if self.lipc_handle ~= nil then
-- NOTE: We want to bypass setIntensity's shenanigans and simply restore the light as-is
self.lipc_handle:set_int_property(
"com.lab126.powerd", "flIntensity", intensity)
else
-- NOTE: when intensity is 0, We want to really kill the light, so do it manually
-- (asking lipc to set it to 0 would in fact set it to 1)...
end
if intensity == 0 then
-- NOTE: when intensity is 0, we want to *really* kill the light, so do it manually
-- (asking lipc to set it to 0 would in fact set it to 1 on most Kindles).
-- We do *both* to make the fl restore on resume less jarring on devices where lipc 0 != off.
os.execute("echo -n ".. intensity .." > " .. self.fl_intensity_file)
end
end
@ -70,12 +76,16 @@ function KindlePowerD:afterResume()
if not self.device.hasFrontlight() then
return
end
local UIManager = require("ui/uimanager")
if self:isFrontlightOn() then
-- Kindle stock software should turn on the front light automatically. The follow statement
-- ensure the consistency of intensity.
self:turnOnFrontlightHW()
-- The Kindle framework should turn the front light back on automatically.
-- The following statement ensures consistency of intensity, but should basically always be redundant,
-- since we set intensity via lipc and not sysfs ;).
-- NOTE: This is race-y, and we want to *lose* the race, hence the use of the scheduler (c.f., #4392)
UIManager:tickAfterNext(function() self:turnOnFrontlightHW() end)
else
self:turnOffFrontlightHW()
-- But in the off case, we *do* use sysfs, so this one actually matters.
UIManager:tickAfterNext(function() self:turnOffFrontlightHW() end)
end
end

View File

@ -232,18 +232,20 @@ describe("device module", function()
assert.is.same(kindle_dev.powerd.fl_intensity, 12)
kindle_dev.powerd:setIntensity(5)
assert.stub(os.execute).was_called_with(
"echo -n 5 > /sys/class/backlight/max77696-bl/brightness")
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
kindle_dev.powerd:toggleFrontlight()
assert.stub(os.execute).was_called_with(
"echo -n 0 > /sys/class/backlight/max77696-bl/brightness")
-- Here be shenanigans: we don't override powerd's fl_intensity when we turn the light off,
-- so that we can properly turn it back on at the previous intensity ;)
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
-- But if we were to cat /sys/class/backlight/max77696-bl/brightness, it should now be 0.
kindle_dev.powerd:toggleFrontlight()
assert.stub(os.execute).was_called_with(
"echo -n 5 > /sys/class/backlight/max77696-bl/brightness")
assert.is.same(kindle_dev.powerd.fl_intensity, 5)
-- And /sys/class/backlight/max77696-bl/brightness is now !0
-- (exact value is HW-dependent, each model has a different curve, we let lipc do the work for us).
end)
it("oasis should interpret orientation event", function()