modules/admin-full: rework hwmode/htmode/channel selection

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
This commit is contained in:
Jo-Philipp Wich 2014-10-26 17:44:50 +01:00
parent 636fb470e7
commit 89f270466c
2 changed files with 192 additions and 76 deletions

View file

@ -169,12 +169,31 @@ if found_sta then
ch.value = translatef("Locked to channel %d used by: %s",
found_sta.channel, table.concat(found_sta.names, ", "))
else
ch = s:taboption("general", Value, "channel", translate("Channel"))
ch:value("auto", translate("auto"))
for _, f in ipairs(iw and iw.freqlist or { }) do
if not f.restricted then
ch:value(f.channel, "%i (%.3f GHz)" %{ f.channel, f.mhz / 1000 })
end
ch = s:taboption("general", Value, "_mode_freq", '<br />'..translate("Operating frequency"))
ch.hwmodes = iw.hwmodelist
ch.freqlist = iw.freqlist
ch.template = "cbi/wireless_modefreq"
function ch.cfgvalue(self, section)
return {
m:get(section, "hwmode") or "",
m:get(section, "channel") or "auto",
m:get(section, "htmode") or ""
}
end
function ch.formvalue(self, section)
return {
m:formvalue(self:cbid(section) .. ".band") or (iw.hwmodelist.g and "11g" or "11a"),
m:formvalue(self:cbid(section) .. ".channel") or "auto",
m:formvalue(self:cbid(section) .. ".htmode") or ""
}
end
function ch.write(self, section, value)
m:set(section, "hwmode", value[1])
m:set(section, "channel", value[2])
m:set(section, "htmode", value[3])
end
end
@ -196,45 +215,6 @@ if hwtype == "mac80211" then
end
end
mode = s:taboption("advanced", ListValue, "hwmode", translate("Band"))
if hw_modes.ac then
if hw_modes.ac then mode:value("11a", "5GHz (802.11n+ac)") end
htmode = s:taboption("advanced", ListValue, "htmode", translate("VHT mode (802.11ac)"))
htmode:value("", translate("disabled"))
htmode:value("VHT20", "20MHz")
htmode:value("VHT40", "40MHz")
htmode:value("VHT80", "80MHz")
elseif hw_modes.n then
if hw_modes.g then mode:value("11g", "2.4GHz (802.11g+n)") end
if hw_modes.a then mode:value("11a", "5GHz (802.11a+n)") end
htmode = s:taboption("advanced", ListValue, "htmode", translate("HT mode (802.11n)"))
htmode:value("", translate("disabled"))
htmode:value("HT20", "20MHz")
htmode:value("HT40", "40MHz")
function mode.cfgvalue(...)
local v = Value.cfgvalue(...)
if v == "11na" then
return "11a"
elseif v == "11ng" then
return "11g"
end
return v
end
noscan = s:taboption("advanced", Flag, "noscan", translate("Force 40MHz mode"),
translate("Always use 40MHz channels even if the secondary channel overlaps. Using this option does not comply with IEEE 802.11n-2009!"))
noscan:depends("htmode", "HT40")
noscan.default = noscan.disabled
else
if hw_modes.g then mode:value("11g", "2.4GHz (802.11g)") end
if hw_modes.a then mode:value("11a", "5GHz (802.11a)") end
end
local cl = iw and iw.countrylist
if cl and #cl > 0 then
cc = s:taboption("advanced", ListValue, "country", translate("Country Code"), translate("Use ISO/IEC 3166 alpha2 country codes."))
@ -285,16 +265,6 @@ if hwtype == "atheros" then
%{ p.display_dbm, p.display_mw })
end
mode = s:taboption("advanced", ListValue, "hwmode", translate("Mode"))
mode:value("", translate("auto"))
if hw_modes.b then mode:value("11b", "802.11b") end
if hw_modes.g then mode:value("11g", "802.11g") end
if hw_modes.a then mode:value("11a", "802.11a") end
if hw_modes.g then mode:value("11bg", "802.11b+g") end
if hw_modes.g then mode:value("11gst", "802.11g + Turbo") end
if hw_modes.a then mode:value("11ast", "802.11a + Turbo") end
mode:value("fh", translate("Frequency Hopping"))
s:taboption("advanced", Flag, "diversity", translate("Diversity")).rmempty = false
if not nsantenna then
@ -352,27 +322,6 @@ if hwtype == "broadcom" then
%{ p.display_dbm, p.display_mw })
end
mode = s:taboption("advanced", ListValue, "hwmode", translate("Mode"))
if hw_modes.n then
if hw_modes.g then mode:value("11ng", "802.11g+n") end
if hw_modes.a then mode:value("11na", "802.11a+n") end
mode:value("11n", "802.11n")
htmode = s:taboption("advanced", ListValue, "htmode", translate("HT mode (802.11n)"))
htmode:depends("hwmode", "11n")
htmode:depends("hwmode", "11ng")
htmode:depends("hwmode", "11na")
htmode:value("HT20", "20MHz")
htmode:value("HT40-", translate("40MHz 2nd channel below"))
htmode:value("HT40+", translate("40MHz 2nd channel above"))
end
if hw_modes.a then mode:value("11a", "802.11a") end
if hw_modes.b and hw_modes.g then mode:value("11bg", "802.11b+g") end
if hw_modes.b then mode:value("11b", "802.11b") end
if hw_modes.g then mode:value("11g", "802.11g") end
if hw_modes.g then mode:value("11gst", "802.11g Turbo") end
if hw_modes.g then mode:value("11lrs", "802.11g Limited Rate Support") end
ant1 = s:taboption("advanced", ListValue, "txantenna", translate("Transmitter Antenna"))
ant1.widget = "radio"
ant1:depends("diversity", "")

View file

@ -0,0 +1,167 @@
<%+cbi/valueheader%>
<script type="text/javascript">
var freqlist = <%= luci.http.write_json(self.freqlist) %>;
var hwmodes = <%= luci.http.write_json(self.hwmodes) %>;
var channels = {
'11g': [
'auto', 'auto', true
],
'11a': [
'auto', 'auto', true
]
};
for (var i = 0; i < freqlist.length; i++)
channels[(freqlist[i].mhz > 2484) ? '11a' : '11g'].push(
freqlist[i].channel,
'%d (%d MHz)'.format(freqlist[i].channel, freqlist[i].mhz),
!freqlist[i].restricted
);
var modes = [
'', 'Legacy', true,
'n', 'N', hwmodes.n,
'ac', 'AC', hwmodes.ac
];
var htmodes = {
'': [
'', '-', true
],
'n': [
'HT20', '20 MHz', true,
'HT40', '40 MHz', true
],
'ac': [
'VHT20', '20 MHz', true,
'VHT40', '40 MHz', true,
'VHT80', '80 MHz', true,
'VHT160', '160 MHz', true
]
};
var bands = {
'': [
'11g', '2.4 GHz', (channels['11g'].length > 3),
'11a', '5 GHz', (channels['11a'].length > 3)
],
'n': [
'11g', '2.4 GHz', (channels['11g'].length > 3),
'11a', '5 GHz', (channels['11a'].length > 3)
],
'ac': [
'11a', '5 GHz', true
]
};
function cbi_set_values(sel, vals)
{
if (sel.vals)
sel.vals.selected = sel.selectedIndex;
while (sel.options[0])
sel.remove(0);
for (var i = 0; vals && i < vals.length; i += 3)
{
if (!vals[i+2])
continue;
var opt = document.createElement('option');
opt.value = vals[i+0];
opt.text = vals[i+1];
sel.add(opt);
}
if (!isNaN(vals.selected))
sel.selectedIndex = vals.selected;
sel.parentNode.style.display = (sel.options.length <= 1) ? 'none' : '';
sel.vals = vals;
}
function cbi_toggle_wifi_mode(id)
{
cbi_toggle_wifi_htmode(id);
cbi_toggle_wifi_band(id);
}
function cbi_toggle_wifi_htmode(id)
{
var mode = document.getElementById(id + '.mode');
var bwdt = document.getElementById(id + '.htmode');
cbi_set_values(bwdt, htmodes[mode.value]);
}
function cbi_toggle_wifi_band(id)
{
var mode = document.getElementById(id + '.mode');
var band = document.getElementById(id + '.band');
cbi_set_values(band, bands[mode.value]);
cbi_toggle_wifi_channel(id);
}
function cbi_toggle_wifi_channel(id)
{
var band = document.getElementById(id + '.band');
var chan = document.getElementById(id + '.channel');
cbi_set_values(chan, channels[band.value]);
}
function cbi_init_wifi(id)
{
var mode = document.getElementById(id + '.mode');
var band = document.getElementById(id + '.band');
var chan = document.getElementById(id + '.channel');
var bwdt = document.getElementById(id + '.htmode');
cbi_set_values(mode, modes);
if (/VHT20|VHT40|VHT80|VHT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
mode.value = 'ac';
else if (/HT20|HT40/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
mode.value = 'n';
else
mode.value = '';
cbi_toggle_wifi_mode(id);
if (/a/.test(<%= luci.http.write_json(self.map:get(section, "hwmode")) %>))
band.value = '11a';
else
band.value = '11g';
cbi_toggle_wifi_band(id);
bwdt.value = <%= luci.http.write_json(self.map:get(section, "htmode")) %>;
chan.value = <%= luci.http.write_json(self.map:get(section, "channel")) %>;
}
</script>
<label style="float:left; margin-right:3px">
<%:Mode%><br />
<select style="width:auto" id="<%= cbid %>.mode" name="<%= cbid %>.mode" onchange="cbi_toggle_wifi_mode('<%= cbid %>')"></select>
</label>
<label style="float:left; margin-right:3px">
<%:Band%><br />
<select style="width:auto" id="<%= cbid %>.band" name="<%= cbid %>.band" onchange="cbi_toggle_wifi_band('<%= cbid %>')"></select>
</label>
<label style="float:left; margin-right:3px">
<%:Channel%><br />
<select style="width:auto" id="<%= cbid %>.channel" name="<%= cbid %>.channel"></select>
</label>
<label style="float:left; margin-right:3px">
<%:Width%><br />
<select style="width:auto" id="<%= cbid %>.htmode" name="<%= cbid %>.htmode"></select>
</label>
<br style="clear:left" />
<script type="text/javascript">cbi_init_wifi('<%= cbid %>');</script>
<%+cbi/valuefooter%>