From 92b62c907a6cd3e1b2424fd9c693e41220987869 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 4 Jan 2014 21:38:07 +0800 Subject: [PATCH 1/5] refactoring frontlight device to more generic power device --- frontend/apps/filemanager/filemanagermenu.lua | 2 +- frontend/ui/device.lua | 38 ++++----- frontend/ui/device/basefrontlight.lua | 25 ------ frontend/ui/device/basepowerd.lua | 55 +++++++++++++ frontend/ui/device/kindlefrontlight.lua | 37 --------- frontend/ui/device/kindlepowerd.lua | 82 +++++++++++++++++++ frontend/ui/device/kobofrontlight.lua | 26 ------ frontend/ui/device/kobopowerd.lua | 26 ++++++ frontend/ui/reader/readerfrontlight.lua | 22 ++--- frontend/ui/readerui.lua | 2 +- frontend/ui/uimanager.lua | 2 +- reader.lua | 8 +- 12 files changed, 200 insertions(+), 125 deletions(-) delete mode 100644 frontend/ui/device/basefrontlight.lua create mode 100644 frontend/ui/device/basepowerd.lua delete mode 100644 frontend/ui/device/kindlefrontlight.lua create mode 100644 frontend/ui/device/kindlepowerd.lua delete mode 100644 frontend/ui/device/kobofrontlight.lua create mode 100644 frontend/ui/device/kobopowerd.lua diff --git a/frontend/apps/filemanager/filemanagermenu.lua b/frontend/apps/filemanager/filemanagermenu.lua index 6f8bc67f0..8b4c668d5 100644 --- a/frontend/apps/filemanager/filemanagermenu.lua +++ b/frontend/apps/filemanager/filemanagermenu.lua @@ -65,7 +65,7 @@ function FileManagerMenu:setUpdateItemTable() end }) - if Device:getFrontlight() ~= nil then + if Device:hasFrontlight() then ReaderFrontLight:addToMainMenu(self.tab_item_table) end diff --git a/frontend/ui/device.lua b/frontend/ui/device.lua index 1665cfc7c..b5674e528 100644 --- a/frontend/ui/device.lua +++ b/frontend/ui/device.lua @@ -1,6 +1,6 @@ -local KindleFrontLight = require("ui/device/kindlefrontlight") -local KoboFrontLight = require("ui/device/kobofrontlight") -local BaseFrontLight = require("ui/device/basefrontlight") +local KindlePowerD = require("ui/device/kindlepowerd") +local KoboPowerD = require("ui/device/kobopowerd") +local BasePowerD = require("ui/device/basepowerd") local Screen = require("ui/device/screen") -- util -- lfs @@ -12,7 +12,7 @@ local Device = { touch_dev = nil, model = nil, firmware_rev = nil, - frontlight = nil, + powerd = nil, has_no_keyboard = nil, is_touch_device = nil, has_front_light = nil, @@ -166,9 +166,9 @@ function Device:outofScreenSaver() end function Device:prepareSuspend() -- currently only used for kobo devices - local fl = self:getFrontlight() - if fl ~= nil then - fl.fl:sleep() + local powerd = self:getPowerDevice() + if powerd ~= nil then + powerd.fl:sleep() end self.screen:refresh(0) self.screen_saver_mode = true @@ -181,9 +181,9 @@ end function Device:Resume() -- currently only used for kobo devices os.execute("echo 0 > /sys/power/state-extended") self.screen:refresh(0) - local fl = self:getFrontlight() - if fl ~= nil then - fl.fl:restore() + local powerd = self:getPowerDevice() + if powerd ~= nil then + powerd.fl:restore() end self.screen_saver_mode = false end @@ -215,20 +215,20 @@ function Device:usbPlugOut() self.charging_mode = false end -function Device:getFrontlight() - if self.frontlight ~= nil then - return self.frontlight - elseif self:hasFrontlight() then +function Device:getPowerDevice() + if self.powerd ~= nil then + return self.powerd + else local model = self:getModel() - if model == "KindlePaperWhite" or model == "KindlePaperWhite2" then - self.frontlight = KindleFrontLight:new() + if model == "KindleTouch" or model == "KindlePaperWhite" or model == "KindlePaperWhite2" then + self.powerd = KindlePowerD:new{model = model} elseif self:isKobo() then - self.frontlight = KoboFrontLight:new() + self.powerd = KoboPowerD:new() else -- emulated FrontLight - self.frontlight = BaseFrontLight:new() + self.powerd = BasePowerD:new() end end - return self.frontlight + return self.powerd end return Device diff --git a/frontend/ui/device/basefrontlight.lua b/frontend/ui/device/basefrontlight.lua deleted file mode 100644 index 444b661a1..000000000 --- a/frontend/ui/device/basefrontlight.lua +++ /dev/null @@ -1,25 +0,0 @@ -local BaseFrontLight = { - min = 1, max = 10, - intensity = nil, -} - -function BaseFrontLight:new(o) - local o = o or {} - setmetatable(o, self) - self.__index = self - if o.init then o:init() end - return o -end - -function BaseFrontLight:init() end -function BaseFrontLight:toggle() end -function BaseFrontLight:setIntensityHW() end - -function BaseFrontLight:setIntensity(intensity) - intensity = intensity < self.min and self.min or intensity - intensity = intensity > self.max and self.max or intensity - self.intensity = intensity - self:setIntensityHW() -end - -return BaseFrontLight diff --git a/frontend/ui/device/basepowerd.lua b/frontend/ui/device/basepowerd.lua new file mode 100644 index 000000000..6fe44df70 --- /dev/null +++ b/frontend/ui/device/basepowerd.lua @@ -0,0 +1,55 @@ +local BasePowerD = { + fl_min = 0, -- min frontlight intensity + fl_max = 10, -- max frontlight intensity + flIntensity = nil, -- frontlight intensity + battCapacity = nil, -- battery capacity + model = nil -- device model +} + +function BasePowerD:new(o) + local o = o or {} + setmetatable(o, self) + self.__index = self + if o.init then o:init() end + return o +end + +function BasePowerD:init() end +function BasePowerD:toggleFrontlight() end +function BasePowerD:setIntensityHW() end +function BasePowerD:getCapacityHW() end +function BasePowerD:isChargingHW() end +function BasePowerD:suspendHW() end +function BasePowerD:wakeUpHW() end + +function BasePowerD:read_int_file(file) + local f = io.open(file, "r") + local sysint = tonumber(f:read("*all"):match("%d+")) + f:close() + return sysint +end + +function BasePowerD:setIntensity(intensity) + intensity = intensity < self.fl_min and self.fl_min or intensity + intensity = intensity > self.fl_max and self.fl_max or intensity + self.flIntensity = intensity + self:setIntensityHW() +end + +function BasePowerD:getCapacity() + return self:getCapacityHW() +end + +function BasePowerD:isCharging() + return self:isChargingHW() +end + +function BasePowerD:suspend() + return self:suspendHW() +end + +function BasePowerD:wakeUp() + return self:wakeUpHW() +end + +return BasePowerD diff --git a/frontend/ui/device/kindlefrontlight.lua b/frontend/ui/device/kindlefrontlight.lua deleted file mode 100644 index 5315b16f2..000000000 --- a/frontend/ui/device/kindlefrontlight.lua +++ /dev/null @@ -1,37 +0,0 @@ -local BaseFrontLight = require("ui/device/basefrontlight") --- liblipclua, see require below - -local KindleFrontLight = BaseFrontLight:new{ - min = 0, max = 24, - -- FIXME: Check how to handle this on the PW2, initial reports on IRC suggest that this isn't possible anymore - kpw_fl = "/sys/devices/system/fl_tps6116x/fl_tps6116x0/fl_intensity", - intensity = nil, - lipc_handle = nil, -} - -function KindleFrontLight:init() - require "liblipclua" - self.lipc_handle = lipc.init("com.github.koreader") - if self.lipc_handle then - self.intensity = self.lipc_handle:get_int_property("com.lab126.powerd", "flIntensity") - end -end - -function KindleFrontLight:toggle() - local f = io.open(self.kpw_fl, "r") - local sysint = tonumber(f:read("*all"):match("%d+")) - f:close() - if sysint == 0 then - self:setIntensity(self.intensity) - else - os.execute("echo -n 0 > " .. self.kpw_fl) - end -end - -function KindleFrontLight:setIntensityHW() - if self.lipc_handle ~= nil then - self.lipc_handle:set_int_property("com.lab126.powerd", "flIntensity", self.intensity) - end -end - -return KindleFrontLight diff --git a/frontend/ui/device/kindlepowerd.lua b/frontend/ui/device/kindlepowerd.lua new file mode 100644 index 000000000..1b2452dd2 --- /dev/null +++ b/frontend/ui/device/kindlepowerd.lua @@ -0,0 +1,82 @@ +local BasePowerD = require("ui/device/basepowerd") +-- liblipclua, see require below + +local KindlePowerD = BasePowerD:new{ + fl_min = 0, fl_max = 24, + -- FIXME: Check how to handle this on the PW2, initial reports on IRC suggest that this isn't possible anymore + kpw_frontlight = "/sys/devices/system/fl_tps6116x/fl_tps6116x0/fl_intensity", + kt_kpw_capacity = "/sys/devices/system/yoshi_battery/yoshi_battery0/battery_capacity", + kpw_charging = "/sys/devices/platform/aplite_charger.0/charging", + kt_charging = "/sys/devices/platform/fsl-usb2-udc/charging", + + flIntensity = nil, + battCapacity = nil, + isCharging = nil, + lipc_handle = nil, +} + +function KindlePowerD:new(o) + local o = o or {} + setmetatable(o, self) + self.__index = self + if o.init then o:init(o.model) end + return o +end + +function KindlePowerD:init(model) + local lipc = require("liblipclua") + if lipc then + self.lipc_handle = lipc.init("com.github.koreader") + end + + if model == "KindleTouch" then + self.batt_capacity_file = self.kt_kpw_capacity + self.is_charging_file = self.kt_charging + elseif model == "KindlePaperWhite" or model == "KindlePaperWhite2" then + self.fl_intensity_file = self.kpw_frontlight + self.batt_capacity_file = self.kt_kpw_capacity + self.is_charging_file = self.kpw_charging + end + if self.lipc_handle then + self.flIntensity = self.lipc_handle:get_int_property("com.lab126.powerd", "flIntensity") + else + self.flIntensity = self:read_int_file(self.fl_intensity_file) + end +end + +function KindlePowerD:toggleFrontlight() + local sysint = self:read_int_file(self.fl_intensity_file) + if sysint == 0 then + self:setIntensity(self.flIntensity) + else + os.execute("echo -n 0 > " .. self.fl_intensity_file) + end +end + +function KindlePowerD:setIntensityHW() + if self.lipc_handle ~= nil then + self.lipc_handle:set_int_property("com.lab126.powerd", "flIntensity", self.flIntensity) + else + os.execute("echo -n ".. self.flIntensity .." > " .. self.fl_intensity_file) + end +end + +function KindlePowerD:getCapacityHW() + if self.lipc_handle ~= nil then + self.battCapacity = self.lipc_handle:get_int_property("com.lab126.powerd", "battLevel") + else + self.battCapacity = self:read_int_file(self.batt_capacity_file) + end + return self.battCapacity +end + +function KindlePowerD:isChargingHW() + if self.lipc_handle ~= nil then + self.isCharging = self.lipc_handle:get_int_property("com.lab126.powerd", "isCharging") + else + self.isCharging = self:read_int_file(self.is_charging_file) + end + return self.isCharging +end + +return KindlePowerD diff --git a/frontend/ui/device/kobofrontlight.lua b/frontend/ui/device/kobofrontlight.lua deleted file mode 100644 index 436f5cc36..000000000 --- a/frontend/ui/device/kobofrontlight.lua +++ /dev/null @@ -1,26 +0,0 @@ -local BaseFrontLight = require("ui/device/basefrontlight") - -local KoboFrontLight = BaseFrontLight:new{ - min = 1, max = 100, - intensity = 20, - restore_settings = true, - fl = nil, -} - -function KoboFrontLight:init() - self.fl = kobolight.open() -end - -function KoboFrontLight:toggle() - if self.fl ~= nil then - self.fl:toggle() - end -end - -function KoboFrontLight:setIntensityHW() - if self.fl ~= nil then - self.fl:setBrightness(self.intensity) - end -end - -return KoboFrontLight diff --git a/frontend/ui/device/kobopowerd.lua b/frontend/ui/device/kobopowerd.lua new file mode 100644 index 000000000..eeda50d47 --- /dev/null +++ b/frontend/ui/device/kobopowerd.lua @@ -0,0 +1,26 @@ +local BasePowerD = require("ui/device/basepowerd") + +local KoboPowerD = BasePowerD:new{ + fl_min = 1, fl_max = 100, + flIntensity = 20, + restore_settings = true, + fl = nil, +} + +function KoboPowerD:init() + self.fl = kobolight.open() +end + +function KoboPowerD:toggleFrontlight() + if self.fl ~= nil then + self.fl:toggle() + end +end + +function KoboPowerD:setIntensityHW() + if self.fl ~= nil then + self.fl:setBrightness(self.flIntensity) + end +end + +return KoboPowerD diff --git a/frontend/ui/reader/readerfrontlight.lua b/frontend/ui/reader/readerfrontlight.lua index 6addd2072..8e149e126 100644 --- a/frontend/ui/reader/readerfrontlight.lua +++ b/frontend/ui/reader/readerfrontlight.lua @@ -13,7 +13,7 @@ local ReaderFrontLight = InputContainer:new{ } function ReaderFrontLight:init() - if Device:getFrontlight() ~= nil then + if Device:isTouchDevice() then self.ges_events = { Adjust = { GestureRange:new{ @@ -32,21 +32,21 @@ function ReaderFrontLight:init() end function ReaderFrontLight:onAdjust(arg, ges) - local fl = Device:getFrontlight() - if fl.intensity ~= nil then + local powerd = Device:getPowerDevice() + if powerd.intensity ~= nil then local rel_proportion = ges.distance / Screen:getWidth() local delta_int = self.steps[math.ceil(#self.steps*rel_proportion)] or self.steps[#self.steps] local msg = nil if ges.direction == "north" then msg = _("Increase front light intensity to ") - fl:setIntensity(fl.intensity + delta_int) + powerd:setIntensity(powerd.intensity + delta_int) elseif ges.direction == "south" then msg = _("Decrease front light intensity to ") - fl:setIntensity(fl.intensity - delta_int) + powerd:setIntensity(powerd.intensity - delta_int) end if msg ~= nil then UIManager:show(Notification:new{ - text = msg..fl.intensity, + text = msg..powerd.intensity, timeout = 1 }) end @@ -65,10 +65,10 @@ function ReaderFrontLight:addToMainMenu(tab_item_table) end function ReaderFrontLight:onShowFlDialog() - local fl = Device:getFrontlight() + local powerd = Device:getPowerDevice() self.fl_dialog = InputDialog:new{ title = _("Frontlight Level"), - input_hint = ("(%d - %d)"):format(fl.min, fl.max), + input_hint = ("(%d - %d)"):format(powerd.fl_min, powerd.fl_max), buttons = { { { @@ -76,7 +76,7 @@ function ReaderFrontLight:onShowFlDialog() enabled = true, callback = function() self.fl_dialog.input:setText("") - fl:toggle() + powerd:toggleFrontlight() end, }, { @@ -107,14 +107,14 @@ end function ReaderFrontLight:close() self.fl_dialog:onClose() - G_reader_settings:saveSetting("frontlight_intensity", Device:getFrontlight().intensity) + G_reader_settings:saveSetting("frontlight_intensity", Device:getPowerDevice().flIntensity) UIManager:close(self.fl_dialog) end function ReaderFrontLight:fldialIntensity() local number = tonumber(self.fl_dialog:getInputText()) if number ~= nil then - Device:getFrontlight():setIntensity(number) + Device:getPowerDevice():setIntensity(number) end end diff --git a/frontend/ui/readerui.lua b/frontend/ui/readerui.lua index 2fd306546..dbbe9228d 100644 --- a/frontend/ui/readerui.lua +++ b/frontend/ui/readerui.lua @@ -139,7 +139,7 @@ function ReaderUI:init() } table.insert(self.active_widgets, reader_ss) -- frontlight controller - if Device:getFrontlight() then + if Device:hasFrontlight() then table.insert(self, ReaderFrontLight:new{ dialog = self.dialog, view = self[1], diff --git a/frontend/ui/uimanager.lua b/frontend/ui/uimanager.lua index 442c697b2..c383237ba 100644 --- a/frontend/ui/uimanager.lua +++ b/frontend/ui/uimanager.lua @@ -288,7 +288,7 @@ function UIManager:run() elseif input_event == "NotCharging" then Device:usbPlugOut() elseif input_event == "Light" then - Device:getFrontlight():toggle() + Device:getPowerDevice():toggleFrontlight() elseif (input_event == "Power" and not Device.screen_saver_mode) or input_event == "Suspend" then local InfoMessage = require("ui/widget/infomessage") diff --git a/reader.lua b/reader.lua index f2ef5b5e0..03859c327 100755 --- a/reader.lua +++ b/reader.lua @@ -161,11 +161,11 @@ local last_file = G_reader_settings:readSetting("lastfile") --87712cf0e43fed624f8a9f610be42b1fe174b9fe do - local fl = Device:getFrontlight() - if fl and fl.restore_settings then + local powerd = Device:getPowerDevice() + if powerd and powerd.restore_settings then local intensity = G_reader_settings:readSetting("frontlight_intensity") - intensity = intensity or fl.intensity - fl:setIntensity(intensity) + intensity = intensity or powerd.flIntensity + powerd:setIntensity(intensity) end end From 4d1df962f5ff230a77321ae926ab4965f20db3a5 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 4 Jan 2014 22:15:23 +0800 Subject: [PATCH 2/5] cache battery level in BasePowerD Since we need to pull it frequently but usually it doesn't change that often. --- frontend/ui/device/basepowerd.lua | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/ui/device/basepowerd.lua b/frontend/ui/device/basepowerd.lua index 6fe44df70..20f26cafe 100644 --- a/frontend/ui/device/basepowerd.lua +++ b/frontend/ui/device/basepowerd.lua @@ -3,7 +3,10 @@ local BasePowerD = { fl_max = 10, -- max frontlight intensity flIntensity = nil, -- frontlight intensity battCapacity = nil, -- battery capacity - model = nil -- device model + model = nil, -- device model + + capacity_pulled_count = 0, + capacity_cached_count = 10, } function BasePowerD:new(o) @@ -37,7 +40,13 @@ function BasePowerD:setIntensity(intensity) end function BasePowerD:getCapacity() - return self:getCapacityHW() + if capacity_pulled_count == capacity_cached_count then + capacity_pulled_count = 0 + return self:getCapacityHW() + else + capacity_pulled_count = capacity_pulled_count + 1 + return self.battCapacity or self:getCapacityHW() + end end function BasePowerD:isCharging() From a6e885e77d014519d5faf7da704ad2a76538098a Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 4 Jan 2014 22:30:36 +0800 Subject: [PATCH 3/5] show battery icon in crereader page header --- frontend/document/credocument.lua | 5 +++++ frontend/ui/reader/readerrolling.lua | 13 +++++++++++++ koreader-base | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index a7e557e68..84c050d20 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -297,6 +297,11 @@ function CreDocument:setVisiblePageCount(new_count) self._document:setVisiblePageCount(new_count) end +function CreDocument:setBatteryState(state) + DEBUG("CreDocument: set battery state", state) + self._document:setBatteryState(state) +end + function CreDocument:register(registry) registry:addProvider("txt", "application/txt", self) registry:addProvider("epub", "application/epub", self) diff --git a/frontend/ui/reader/readerrolling.lua b/frontend/ui/reader/readerrolling.lua index ef87224f4..c915dc213 100644 --- a/frontend/ui/reader/readerrolling.lua +++ b/frontend/ui/reader/readerrolling.lua @@ -204,10 +204,12 @@ end function ReaderRolling:onPosUpdate(new_pos) self.current_pos = new_pos + self:updateBatteryState() end function ReaderRolling:onPageUpdate(new_page) self.current_page = new_page + self:updateBatteryState() end function ReaderRolling:onGotoPercent(percent) @@ -345,4 +347,15 @@ function ReaderRolling:onGotoPage(number) return true end +function ReaderRolling:updateBatteryState() + DEBUG("update battery state") + if self.view.view_mode == "page" then + local powerd = Device:getPowerDevice() + local state = powerd:isCharging() and -1 or powerd:getCapacity() + if state then + self.ui.document:setBatteryState(state) + end + end +end + return ReaderRolling diff --git a/koreader-base b/koreader-base index bf3ef2a6c..5c2afc4f9 160000 --- a/koreader-base +++ b/koreader-base @@ -1 +1 @@ -Subproject commit bf3ef2a6c9002a665b8c224632eba744e6147fe0 +Subproject commit 5c2afc4f9f40b51ebe0ee86c9ba200859559e5f9 From 35538fe544de16dd84266e24f3eb965c76334837 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 4 Jan 2014 23:22:46 +0800 Subject: [PATCH 4/5] fix isCharging name conflict --- frontend/ui/device/kindlepowerd.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/ui/device/kindlepowerd.lua b/frontend/ui/device/kindlepowerd.lua index 1b2452dd2..ce9e4a1bb 100644 --- a/frontend/ui/device/kindlepowerd.lua +++ b/frontend/ui/device/kindlepowerd.lua @@ -11,7 +11,7 @@ local KindlePowerD = BasePowerD:new{ flIntensity = nil, battCapacity = nil, - isCharging = nil, + is_charging = nil, lipc_handle = nil, } @@ -72,11 +72,11 @@ end function KindlePowerD:isChargingHW() if self.lipc_handle ~= nil then - self.isCharging = self.lipc_handle:get_int_property("com.lab126.powerd", "isCharging") + self.is_charging = self.lipc_handle:get_int_property("com.lab126.powerd", "isCharging") else - self.isCharging = self:read_int_file(self.is_charging_file) + self.is_charging = self:read_int_file(self.is_charging_file) end - return self.isCharging + return self.is_charging == 1 end return KindlePowerD From 7dbd437d1e550df6b1b9f9be4a1cf907ac42f44d Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 5 Jan 2014 00:29:41 +0800 Subject: [PATCH 5/5] add battery status pulling functions in KoboPowerD Status files found at http://www.mobileread.com/forums/showpost.php?p=1750642&postcount=9. --- frontend/ui/device/kobopowerd.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frontend/ui/device/kobopowerd.lua b/frontend/ui/device/kobopowerd.lua index eeda50d47..cfdecf7c0 100644 --- a/frontend/ui/device/kobopowerd.lua +++ b/frontend/ui/device/kobopowerd.lua @@ -5,6 +5,11 @@ local KoboPowerD = BasePowerD:new{ flIntensity = 20, restore_settings = true, fl = nil, + + batt_capacity_file = "/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/capacity", + is_charging_file = "/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/charge_now", + battCapacity = nil, + is_charging = nil, } function KoboPowerD:init() @@ -23,4 +28,14 @@ function KoboPowerD:setIntensityHW() end end +function KoboPowerD:getCapacityHW() + self.battCapacity = self:read_int_file(self.batt_capacity_file) + return self.battCapacity +end + +function KoboPowerD:isChargingHW() + self.is_charging = self:read_int_file(self.is_charging_file) + return self.is_charging == 1 +end + return KoboPowerD