Automatically connect WIFI after Kobo has been resumed (#2215)

* Add bash scripts to control WIFI / IP, so we can share them with frontend/device/kobo/device.lua.

* add test cases
pull/2243/head
Hzj_jie 8 years ago committed by Qingping Hou
parent 95b571a4c7
commit da2c57f93a

@ -186,9 +186,7 @@ koboupdate: all
cd $(INSTALL_DIR)/kobo && tar -czhf ../KoboRoot.tgz mnt cd $(INSTALL_DIR)/kobo && tar -czhf ../KoboRoot.tgz mnt
cp resources/koreader.png $(INSTALL_DIR)/koreader.png cp resources/koreader.png $(INSTALL_DIR)/koreader.png
cp $(KOBO_DIR)/fmon/README.txt $(INSTALL_DIR)/README_kobo.txt cp $(KOBO_DIR)/fmon/README.txt $(INSTALL_DIR)/README_kobo.txt
cp $(KOBO_DIR)/koreader.sh $(INSTALL_DIR)/koreader cp $(KOBO_DIR)/*.sh $(INSTALL_DIR)/koreader
cp $(KOBO_DIR)/suspend.sh $(INSTALL_DIR)/koreader
cp $(KOBO_DIR)/nickel.sh $(INSTALL_DIR)/koreader
# create new package # create new package
cd $(INSTALL_DIR) && \ cd $(INSTALL_DIR) && \
zip -9 -r \ zip -9 -r \

@ -116,8 +116,13 @@ end
-- ONLY used for Kobo and PocketBook devices -- ONLY used for Kobo and PocketBook devices
function Device:onPowerEvent(ev) function Device:onPowerEvent(ev)
local Screensaver = require("ui/screensaver") local Screensaver = require("ui/screensaver")
local network_manager = require("ui/network/manager")
if (ev == "Power" or ev == "Suspend") and not self.screen_saver_mode then if (ev == "Power" or ev == "Suspend") and not self.screen_saver_mode then
self.powerd:beforeSuspend() self.powerd:beforeSuspend()
if network_manager.wifi_was_on then
network_manager:releaseIP()
network_manager:turnOffWifi()
end
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
-- flushing settings first in case the screensaver takes too long time -- flushing settings first in case the screensaver takes too long time
-- that flushing has no chance to run -- that flushing has no chance to run
@ -134,6 +139,9 @@ function Device:onPowerEvent(ev)
DEBUG("Resuming...") DEBUG("Resuming...")
local UIManager = require("ui/uimanager") local UIManager = require("ui/uimanager")
UIManager:unschedule(self.suspend) UIManager:unschedule(self.suspend)
if network_manager.wifi_was_on and G_reader_settings:nilOrTrue("auto_restore_wifi") then
network_manager.restoreWifiAsync()
end
self:resume() self:resume()
Screensaver:close() Screensaver:close()
-- restore to previous rotation mode -- restore to previous rotation mode

@ -2,25 +2,15 @@ local Generic = require("device/generic/device")
local TimeVal = require("ui/timeval") local TimeVal = require("ui/timeval")
local Geom = require("ui/geometry") local Geom = require("ui/geometry")
local dbg = require("dbg") local dbg = require("dbg")
local sleep = require("ffi/util").sleep
local _ = require("gettext") local _ = require("gettext")
local function yes() return true end local function yes() return true end
local function koboEnableWifi(toggle) local function koboEnableWifi(toggle)
if toggle == 1 then if toggle == 1 then
os.execute("/sbin/lsmod | grep -q sdio_wifi_pwr || /sbin/insmod /drivers/$PLATFORM/wifi/sdio_wifi_pwr.ko") os.execute("./enable-wifi.sh")
os.execute("/sbin/lsmod | grep -q dhd || /sbin/insmod /drivers/$PLATFORM/wifi/dhd.ko")
sleep(1)
os.execute("/sbin/ifconfig eth0 up")
os.execute("wlarm_le -i eth0 up")
os.execute("pidof wpa_supplicant >/dev/null || env -u LD_LIBRARY_PATH wpa_supplicant -s -ieth0 -O /var/run/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -B")
else else
os.execute("killall udhcpc default.script wpa_supplicant 2>/dev/null") os.execute("./disable-wifi.sh")
os.execute("wlarm_le -i eth0 down")
os.execute("ifconfig eth0 down")
os.execute("rmmod -r dhd")
os.execute("rmmod -r sdio_wifi_pwr")
end end
end end
@ -175,12 +165,15 @@ function Kobo:initNetworkManager(NetworkMgr)
"wpa_supplicant", {ctrl_interface = "/var/run/wpa_supplicant/eth0"}) "wpa_supplicant", {ctrl_interface = "/var/run/wpa_supplicant/eth0"})
function NetworkMgr:obtainIP() function NetworkMgr:obtainIP()
os.execute("env -u LD_LIBRARY_PATH /sbin/udhcpc -S -i eth0 -s /etc/udhcpc.d/default.script -t15 -T10 -A3 -b -q") os.execute("./obtain-ip.sh")
end end
function NetworkMgr:releaseIP() function NetworkMgr:releaseIP()
os.execute("pkill -9 -f '/bin/sh /etc/udhcpc.d/default.script';") os.execute("./release-ip.sh")
os.execute("/sbin/ifconfig eth0 0.0.0.0") end
function NetworkMgr:restoreWifiAsync()
os.execute("./restore-wifi-async.sh")
end end
end end

@ -28,6 +28,38 @@ function LuaSettings:delSetting(key)
self.data[key] = nil self.data[key] = nil
end end
function LuaSettings:has(key)
return self:readSetting(key) ~= nil
end
function LuaSettings:hasNot(key)
return self:readSetting(key) == nil
end
function LuaSettings:isTrue(key)
return string.lower(tostring(self:readSetting(key))) == "true"
end
function LuaSettings:nilOrTrue(key)
return self:hasNot(key) or self:isTrue(key)
end
function LuaSettings:flipNilOrTrue(key)
if self:nilOrTrue(key) then
self:saveSetting(key, false)
else
self:delSetting(key)
end
end
function LuaSettings:flipTrue(key)
if self:isTrue(key) then
self:delSetting(key)
else
self:saveSetting(key, true)
end
end
function LuaSettings:flush() function LuaSettings:flush()
local f_out = io.open(self.file, "w") local f_out = io.open(self.file, "w")
if f_out ~= nil then if f_out ~= nil then

@ -29,11 +29,7 @@ table.insert(common_settings, {
}) })
table.insert(common_settings, { table.insert(common_settings, {
text = _("Network"), text = _("Network"),
sub_item_table = { sub_item_table = NetworkMgr:getMenuTable()
NetworkMgr:getWifiMenuTable(),
NetworkMgr:getProxyMenuTable(),
NetworkMgr:getInfoMenuTable(),
}
}) })
table.insert(common_settings, { table.insert(common_settings, {
text = _("Screen"), text = _("Screen"),

@ -12,6 +12,7 @@ local NetworkMgr = {}
function NetworkMgr:init() function NetworkMgr:init()
self.nw_settings = LuaSettings:open(DataStorage:getSettingsDir().."/network.lua") self.nw_settings = LuaSettings:open(DataStorage:getSettingsDir().."/network.lua")
self.wifi_was_on = G_reader_settings:isTrue("wifi_was_on")
end end
-- Following methods are Device specific which need to be initialized in -- Following methods are Device specific which need to be initialized in
@ -25,12 +26,16 @@ function NetworkMgr:authenticateNetwork() end
function NetworkMgr:disconnectNetwork() end function NetworkMgr:disconnectNetwork() end
function NetworkMgr:obtainIP() end function NetworkMgr:obtainIP() end
function NetworkMgr:releaseIP() end function NetworkMgr:releaseIP() end
-- This function should unblockly call both turnOnWifi() and obtainIP().
function NetworkMgr:restoreWifiAsync() end
-- End of device specific methods -- End of device specific methods
function NetworkMgr:promptWifiOn(complete_callback) function NetworkMgr:promptWifiOn(complete_callback)
UIManager:show(ConfirmBox:new{ UIManager:show(ConfirmBox:new{
text = _("Do you want to turn on Wi-Fi?"), text = _("Do you want to turn on Wi-Fi?"),
ok_callback = function() ok_callback = function()
self.wifi_was_on = true
G_reader_settings:saveSetting("wifi_was_on", true)
self:turnOnWifi(complete_callback) self:turnOnWifi(complete_callback)
end, end,
}) })
@ -40,6 +45,8 @@ function NetworkMgr:promptWifiOff(complete_callback)
UIManager:show(ConfirmBox:new{ UIManager:show(ConfirmBox:new{
text = _("Do you want to turn off Wi-Fi?"), text = _("Do you want to turn off Wi-Fi?"),
ok_callback = function() ok_callback = function()
self.wifi_was_on = false
G_reader_settings:saveSetting("wifi_was_on", false)
self:turnOffWifi(complete_callback) self:turnOffWifi(complete_callback)
end, end,
}) })
@ -117,6 +124,15 @@ function NetworkMgr:getProxyMenuTable()
} }
end end
function NetworkMgr:getRestoreMenuTable()
return {
text = _("Automatically restore Wi-Fi connection after resume"),
checked_func = function() return G_reader_settings:nilOrTrue("auto_restore_wifi") end,
enabled_func = function() return Device:isKobo() end,
callback = function(menu) G_reader_settings:flipNilOrTrue("auto_restore_wifi") end,
}
end
function NetworkMgr:getInfoMenuTable() function NetworkMgr:getInfoMenuTable()
return { return {
text = _("Network info"), text = _("Network info"),
@ -135,6 +151,15 @@ function NetworkMgr:getInfoMenuTable()
} }
end end
function NetworkMgr:getMenuTable()
return {
self:getWifiMenuTable(),
self:getProxyMenuTable(),
self:getRestoreMenuTable(),
self:getInfoMenuTable(),
}
end
function NetworkMgr:showNetworkMenu(complete_callback) function NetworkMgr:showNetworkMenu(complete_callback)
local info = InfoMessage:new{text = _("Scanning…")} local info = InfoMessage:new{text = _("Scanning…")}
UIManager:show(info) UIManager:show(info)

@ -0,0 +1,11 @@
#!/bin/sh
# Disable wifi, and remove all modules.
killall udhcpc default.script wpa_supplicant 2>/dev/null
wlarm_le -i eth0 down
ifconfig eth0 down
rmmod -r dhd
rmmod -r sdio_wifi_pwr

@ -0,0 +1,12 @@
#!/bin/sh
# Load wifi modules and enable wifi.
lsmod | grep -q sdio_wifi_pwr || insmod /drivers/$PLATFORM/wifi/sdio_wifi_pwr.ko
lsmod | grep -q dhd || insmod /drivers/$PLATFORM/wifi/dhd.ko
sleep 1
ifconfig eth0 up
wlarm_le -i eth0 up
pidof wpa_supplicant >/dev/null || env -u LD_LIBRARY_PATH wpa_supplicant -s -ieth0 -O /var/run/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -B

@ -0,0 +1,4 @@
#!/bin/sh
# Use udhcpc to obtain IP.
env -u LD_LIBRARY_PATH udhcpc -S -i eth0 -s /etc/udhcpc.d/default.script -t15 -T10 -A3 -b -q

@ -0,0 +1,6 @@
#!/bin/sh
# Release IP and shutdown udhcpc.
pkill -9 -f '/bin/sh /etc/udhcpc.d/default.script'
ifconfig eth0 0.0.0.0

@ -0,0 +1,9 @@
#!/bin/sh
RestoreWifi() {
./enable-wifi.sh
./obtain-ip.sh
echo "[$(date)] Kobo Suspend: Restarted WiFi"
}
RestoreWifi &

@ -4,15 +4,6 @@ export PATH="${PATH}:/sbin:/usr/sbin"
echo "[$(date +'%x @ %X')] Kobo Suspend: Going to sleep . . ." echo "[$(date +'%x @ %X')] Kobo Suspend: Going to sleep . . ."
# NOTE: Sleep as little as possible here, sleeping has a tendency to make everything mysteriously hang... # NOTE: Sleep as little as possible here, sleeping has a tendency to make everything mysteriously hang...
# Disable wifi
if lsmod | grep -q sdio_wifi_pwr ; then
wlarm_le -i eth0 down
ifconfig eth0 down
rmmod -r dhd
rmmod -r sdio_wifi_pwr
echo "[$(date +'%x @ %X')] Kobo Suspend: Killed WiFi"
fi
# Depending on device/FW version, some kernels do not support wakeup_count, account for that # Depending on device/FW version, some kernels do not support wakeup_count, account for that
if [ -e "/sys/power/wakeup_count" ] ; then if [ -e "/sys/power/wakeup_count" ] ; then
#HAS_WAKEUP_COUNT="true" #HAS_WAKEUP_COUNT="true"

@ -0,0 +1,42 @@
describe("luasettings module", function()
local Settings
setup(function()
require("commonrequire")
Settings = require("frontend/luasettings"):open("this-is-not-a-valid-file")
end)
it("should handle undefined keys", function()
Settings:delSetting("abc")
assert.True(Settings:hasNot("abc"))
assert.True(Settings:nilOrTrue("abc"))
assert.False(Settings:isTrue("abc"))
Settings:saveSetting("abc", true)
assert.True(Settings:has("abc"))
assert.True(Settings:nilOrTrue("abc"))
assert.True(Settings:isTrue("abc"))
end)
it("should flip bool values", function()
Settings:delSetting("abc")
assert.True(Settings:hasNot("abc"))
Settings:flipNilOrTrue("abc")
assert.False(Settings:nilOrTrue("abc"))
assert.True(Settings:has("abc"))
assert.False(Settings:isTrue("abc"))
Settings:flipNilOrTrue("abc")
assert.True(Settings:nilOrTrue("abc"))
assert.True(Settings:hasNot("abc"))
assert.False(Settings:isTrue("abc"))
Settings:flipTrue("abc")
assert.True(Settings:has("abc"))
assert.True(Settings:isTrue("abc"))
assert.True(Settings:nilOrTrue("abc"))
Settings:flipTrue("abc")
assert.False(Settings:has("abc"))
assert.False(Settings:isTrue("abc"))
assert.True(Settings:nilOrTrue("abc"))
end)
end)
Loading…
Cancel
Save