gluon-luci-wifi-config: add txpower setting

Fixes #219
This commit is contained in:
Matthias Schiffer 2015-05-04 04:34:23 +02:00
parent b76e1a9e48
commit 6fc1db3a70
4 changed files with 122 additions and 21 deletions

View File

@ -13,7 +13,7 @@ PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
define Package/gluon-luci-wifi-config define Package/gluon-luci-wifi-config
SECTION:=gluon SECTION:=gluon
CATEGORY:=Gluon CATEGORY:=Gluon
DEPENDS:=+gluon-luci-admin DEPENDS:=+gluon-luci-admin +libiwinfo-lua
TITLE:=UI for Wifi Settings TITLE:=UI for Wifi Settings
endef endef

View File

@ -1,13 +1,54 @@
local f, s, o
local uci = luci.model.uci.cursor() local uci = luci.model.uci.cursor()
local fs = require 'nixio.fs'
f = SimpleForm("wifi", translate("WLAN"))
local function find_phy_by_path(path)
for phy in fs.glob("/sys/devices/" .. path .. "/ieee80211/phy*") do
return phy:match("([^/]+)$")
end
end
local function find_phy_by_macaddr(macaddr)
local addr = macaddr:lower()
for file in fs.glob("/sys/class/ieee80211/*/macaddress") do
if luci.util.trim(fs.readfile(file)) == addr then
return file:match("([^/]+)/macaddress$")
end
end
end
local function txpower_list(iw)
local list = iw.txpwrlist or { }
local off = tonumber(iw.txpower_offset) or 0
local new = { }
local prev = -1
local _, val
for _, val in ipairs(list) do
local dbm = val.dbm + off
local mw = math.floor(10 ^ (dbm / 10))
if mw ~= prev then
prev = mw
table.insert(new, {
display_dbm = dbm,
display_mw = mw,
driver_dbm = val.dbm,
})
end
end
return new
end
local f = SimpleForm("wifi", translate("WLAN"))
f.template = "admin/expertmode" f.template = "admin/expertmode"
s = f:section(SimpleSection, nil, translate( local s = f:section(SimpleSection, nil, translate(
"You can enable or disable your node's client and mesh network " "You can enable or disable your node's client and mesh network "
.. "SSIDs here. Please don't disable the mesh network without " .. "SSIDs here. Please don't disable the mesh network without "
.. "a good reason, so other nodes can mesh with yours." .. "a good reason, so other nodes can mesh with yours.<br /><br />"
.. "It is also possible to configure the WLAN adapters transmission power "
.. "here. Please note that the transmission power values include the antenna gain "
.. "where available, but there are many devices for which the gain is unavailable or inaccurate."
)) ))
local radios = {} local radios = {}
@ -21,24 +62,56 @@ uci:foreach('wireless', 'wifi-device',
-- add a client and mesh checkbox for each interface -- add a client and mesh checkbox for each interface
for _, radio in ipairs(radios) do for _, radio in ipairs(radios) do
local hwmode = uci:get('wireless', radio, 'hwmode') local config = uci:get_all('wireless', radio)
local p local p
if hwmode == '11g' or hwmode == '11ng' then if config.hwmode == '11g' or config.hwmode == '11ng' then
p = f:section(SimpleSection, translate("2.4GHz WLAN")) p = f:section(SimpleSection, translate("2.4GHz WLAN"))
elseif hwmode == '11a' or hwmode == '11na' then elseif config.hwmode == '11a' or config.hwmode == '11na' then
p = f:section(SimpleSection, translate("5GHz WLAN")) p = f:section(SimpleSection, translate("5GHz WLAN"))
end end
if p then if p then
local o
--box for the client network --box for the client network
o = p:option(Flag, 'clientbox_' .. radio, translate("Enable client network")) o = p:option(Flag, radio .. '_client_enabled', translate("Enable client network"))
o.default = uci:get_bool('wireless', 'client_' .. radio, "disabled") and o.disabled or o.enabled o.default = uci:get_bool('wireless', 'client_' .. radio, "disabled") and o.disabled or o.enabled
o.rmempty = false o.rmempty = false
--box for the mesh network --box for the mesh network
o = p:option(Flag, 'meshbox_' .. radio, translate("Enable mesh network")) o = p:option(Flag, radio .. '_mesh_enabled', translate("Enable mesh network"))
o.default = uci:get_bool('wireless', 'mesh_' .. radio, "disabled") and o.disabled or o.enabled o.default = uci:get_bool('wireless', 'mesh_' .. radio, "disabled") and o.disabled or o.enabled
o.rmempty = false o.rmempty = false
local phy
if config.path then
phy = find_phy_by_path(config.path)
elseif config.macaddr then
phy = find_phy_by_path(config.macaddr)
end
if phy then
local iw = luci.sys.wifi.getiwinfo(phy)
if iw then
local txpowers = txpower_list(iw)
if #txpowers > 1 then
local tp = p:option(ListValue, radio .. '_txpower', translate("Transmission power"))
tp.rmempty = true
tp.default = uci:get('wireless', radio, 'txpower') or 'default'
tp:value('default', translate("(default)"))
table.sort(txpowers, function(a, b) return a.driver_dbm > b.driver_dbm end)
for _, entry in ipairs(txpowers) do
tp:value(entry.driver_dbm, "%i dBm (%i mW)" % {entry.display_dbm, entry.display_mw})
end
end
end
end
end end
end end
@ -50,20 +123,25 @@ function f.handle(self, state, data)
for _, radio in ipairs(radios) do for _, radio in ipairs(radios) do
local clientdisabled = 0 local clientdisabled = 0
local meshdisabled = 0 if data[radio .. '_client_enabled'] == '0' then
-- get and invert the data from the boxes
if data["clientbox_"..radio] == '0' then
clientdisabled = 1 clientdisabled = 1
end end
-- write the data to the config file
uci:set('wireless', 'client_' .. radio, "disabled", clientdisabled) uci:set('wireless', 'client_' .. radio, "disabled", clientdisabled)
if data["meshbox_"..radio] == '0' then local meshdisabled = 0
if data[radio .. '_client_enabled'] == '0' then
meshdisabled = 1 meshdisabled = 1
end end
uci:set('wireless', 'mesh_' .. radio, "disabled", meshdisabled) uci:set('wireless', 'mesh_' .. radio, "disabled", meshdisabled)
if data[radio .. '_txpower'] then
if data[radio .. '_txpower'] == 'default' then
uci:delete('wireless', radio, 'txpower')
else
uci:set('wireless', radio, 'txpower', data[radio .. '_txpower'])
end
end
end end
uci:save('wireless') uci:save('wireless')

View File

@ -10,6 +10,9 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "(default)"
msgstr "(Standard)"
msgid "2.4GHz WLAN" msgid "2.4GHz WLAN"
msgstr "2,4GHz-WLAN" msgstr "2,4GHz-WLAN"
@ -22,11 +25,22 @@ msgstr "Client-Netz aktivieren"
msgid "Enable mesh network" msgid "Enable mesh network"
msgstr "Mesh-Netz aktivieren" msgstr "Mesh-Netz aktivieren"
msgid "Transmission power"
msgstr "Sendeleistung"
msgid "" msgid ""
"You can enable or disable your node's client and mesh network SSIDs here. " "You can enable or disable your node's client and mesh network SSIDs here. "
"Please don't disable the mesh network without a good reason, so other nodes " "Please don't disable the mesh network without a good reason, so other nodes "
"can mesh with yours." "can mesh with yours.<br /><br />It is also possible to configure the WLAN "
"adapters transmission power here. Please note that the transmission power "
"values include the antenna gain where available, but there are many devices "
"for which the gain is unavailable or inaccurate."
msgstr "" msgstr ""
"In diesem Abschnitt hast du die Möglichkeit, die SSIDs des Client- und des " "In diesem Abschnitt hast du die Möglichkeit, die SSIDs des Client- und "
"Mesh-Netzes zu aktivieren bzw. deaktivieren. Bitte lass die SSID des Mesh-" "des Mesh-Netzes zu aktivieren bzw. deaktivieren. Bitte lass die SSID des "
"Netzes aktiviert, damit sich andere Knoten mit deinem verbinden können." "Mesh-Netzes aktiviert, damit sich andere Knoten mit deinem verbinden "
"können.<br /><br />"
"Außerdem kann hier die Sendeleistung des WLAN-Adapters konfiguriert werden. "
"Wenn möglich, ist in den Werten der Sendeleistung der Antennengewinn "
"enthalten; diese Werte sind allerdings für viele Geräte nicht verfügbar oder "
"fehlerhaft."

View File

@ -1,6 +1,9 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "(default)"
msgstr ""
msgid "2.4GHz WLAN" msgid "2.4GHz WLAN"
msgstr "" msgstr ""
@ -13,8 +16,14 @@ msgstr ""
msgid "Enable mesh network" msgid "Enable mesh network"
msgstr "" msgstr ""
msgid "Transmission power"
msgstr ""
msgid "" msgid ""
"You can enable or disable your node's client and mesh network SSIDs here. " "You can enable or disable your node's client and mesh network SSIDs here. "
"Please don't disable the mesh network without a good reason, so other nodes " "Please don't disable the mesh network without a good reason, so other nodes "
"can mesh with yours." "can mesh with yours.<br /><br />It is also possible to configure the WLAN "
"adapters transmission power here. Please note that the transmission power "
"values include the antenna gain where available, but there are many devices "
"for which the gain is unavailable or inaccurate."
msgstr "" msgstr ""