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
cp resources/koreader.png $(INSTALL_DIR)/koreader.png
cp $(KOBO_DIR)/fmon/README.txt $(INSTALL_DIR)/README_kobo.txt
cp $(KOBO_DIR)/koreader.sh $(INSTALL_DIR)/koreader
cp $(KOBO_DIR)/suspend.sh $(INSTALL_DIR)/koreader
cp $(KOBO_DIR)/nickel.sh $(INSTALL_DIR)/koreader
cp $(KOBO_DIR)/*.sh $(INSTALL_DIR)/koreader
# create new package
cd $(INSTALL_DIR) && \
zip -9 -r \

@ -116,8 +116,13 @@ end
-- ONLY used for Kobo and PocketBook devices
function Device:onPowerEvent(ev)
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
self.powerd:beforeSuspend()
if network_manager.wifi_was_on then
network_manager:releaseIP()
network_manager:turnOffWifi()
end
local UIManager = require("ui/uimanager")
-- flushing settings first in case the screensaver takes too long time
-- that flushing has no chance to run
@ -134,6 +139,9 @@ function Device:onPowerEvent(ev)
DEBUG("Resuming...")
local UIManager = require("ui/uimanager")
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()
Screensaver:close()
-- restore to previous rotation mode

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

@ -28,6 +28,38 @@ function LuaSettings:delSetting(key)
self.data[key] = nil
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()
local f_out = io.open(self.file, "w")
if f_out ~= nil then

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

@ -12,6 +12,7 @@ local NetworkMgr = {}
function NetworkMgr:init()
self.nw_settings = LuaSettings:open(DataStorage:getSettingsDir().."/network.lua")
self.wifi_was_on = G_reader_settings:isTrue("wifi_was_on")
end
-- 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:obtainIP() end
function NetworkMgr:releaseIP() end
-- This function should unblockly call both turnOnWifi() and obtainIP().
function NetworkMgr:restoreWifiAsync() end
-- End of device specific methods
function NetworkMgr:promptWifiOn(complete_callback)
UIManager:show(ConfirmBox:new{
text = _("Do you want to turn on Wi-Fi?"),
ok_callback = function()
self.wifi_was_on = true
G_reader_settings:saveSetting("wifi_was_on", true)
self:turnOnWifi(complete_callback)
end,
})
@ -40,6 +45,8 @@ function NetworkMgr:promptWifiOff(complete_callback)
UIManager:show(ConfirmBox:new{
text = _("Do you want to turn off Wi-Fi?"),
ok_callback = function()
self.wifi_was_on = false
G_reader_settings:saveSetting("wifi_was_on", false)
self:turnOffWifi(complete_callback)
end,
})
@ -117,6 +124,15 @@ function NetworkMgr:getProxyMenuTable()
}
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()
return {
text = _("Network info"),
@ -135,6 +151,15 @@ function NetworkMgr:getInfoMenuTable()
}
end
function NetworkMgr:getMenuTable()
return {
self:getWifiMenuTable(),
self:getProxyMenuTable(),
self:getRestoreMenuTable(),
self:getInfoMenuTable(),
}
end
function NetworkMgr:showNetworkMenu(complete_callback)
local info = InfoMessage:new{text = _("Scanning…")}
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 . . ."
# 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
if [ -e "/sys/power/wakeup_count" ] ; then
#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