mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
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
This commit is contained in:
4
Makefile
4
Makefile
@@ -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)
|
||||
|
||||
11
platform/kobo/disable-wifi.sh
Normal file
11
platform/kobo/disable-wifi.sh
Normal file
@@ -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
|
||||
12
platform/kobo/enable-wifi.sh
Normal file
12
platform/kobo/enable-wifi.sh
Normal file
@@ -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
platform/kobo/nickel.sh
Normal file → Executable file
0
platform/kobo/nickel.sh
Normal file → Executable file
4
platform/kobo/obtain-ip.sh
Normal file
4
platform/kobo/obtain-ip.sh
Normal file
@@ -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
|
||||
6
platform/kobo/release-ip.sh
Normal file
6
platform/kobo/release-ip.sh
Normal file
@@ -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
|
||||
9
platform/kobo/restore-wifi-async.sh
Normal file
9
platform/kobo/restore-wifi-async.sh
Normal file
@@ -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"
|
||||
|
||||
42
spec/unit/luasettings_spec.lua
Normal file
42
spec/unit/luasettings_spec.lua
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user