fully-automatic mode panel generation
This commit is contained in:
parent
907787cfdc
commit
bb1b561c47
@ -166,48 +166,7 @@
|
|||||||
<select id="openwebrx-sdr-profiles-listbox" onchange="sdr_profile_changed();">
|
<select id="openwebrx-sdr-profiles-listbox" onchange="sdr_profile_changed();">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="openwebrx-panel-line openwebrx-panel-flex-line">
|
<div class="openwebrx-modes openwebrx-panel-line"></div>
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-nfm"
|
|
||||||
onclick="demodulator_analog_replace('nfm');">FM</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-am"
|
|
||||||
onclick="demodulator_analog_replace('am');">AM</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-lsb"
|
|
||||||
onclick="demodulator_analog_replace('lsb');">LSB</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-usb"
|
|
||||||
onclick="demodulator_analog_replace('usb');">USB</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-cw"
|
|
||||||
onclick="demodulator_analog_replace('cw');">CW</div>
|
|
||||||
</div>
|
|
||||||
<div class="openwebrx-panel-line openwebrx-panel-flex-line">
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-dmr"
|
|
||||||
style="display:none;" data-feature="digital_voice_digiham"
|
|
||||||
onclick="demodulator_analog_replace('dmr');">DMR</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-dstar"
|
|
||||||
style="display:none;" data-feature="digital_voice_dsd"
|
|
||||||
onclick="demodulator_analog_replace('dstar');">DStar</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-nxdn"
|
|
||||||
style="display:none;" data-feature="digital_voice_dsd"
|
|
||||||
onclick="demodulator_analog_replace('nxdn');">NXDN</div>
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-ysf"
|
|
||||||
style="display:none;" data-feature="digital_voice_digiham"
|
|
||||||
onclick="demodulator_analog_replace('ysf');">YSF</div>
|
|
||||||
</div>
|
|
||||||
<div class="openwebrx-panel-line openwebrx-panel-flex-line">
|
|
||||||
<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-dig" onclick="demodulator_digital_replace_last();">DIG</div>
|
|
||||||
<select id="openwebrx-secondary-demod-listbox" onchange="secondary_demod_listbox_changed();">
|
|
||||||
<option value="none"></option>
|
|
||||||
<option value="bpsk31">BPSK31</option>
|
|
||||||
<option value="bpsk63">BPSK63</option>
|
|
||||||
<option value="ft8" data-feature="wsjt-x">FT8</option>
|
|
||||||
<option value="wspr" data-feature="wsjt-x">WSPR</option>
|
|
||||||
<option value="jt65" data-feature="wsjt-x">JT65</option>
|
|
||||||
<option value="jt9" data-feature="wsjt-x">JT9</option>
|
|
||||||
<option value="ft4" data-feature="wsjt-x">FT4</option>
|
|
||||||
<option value="js8" data-feature="js8call">JS8Call</option>
|
|
||||||
<option value="packet" data-feature="packet">Packet</option>
|
|
||||||
<option value="pocsag" data-feature="pocsag">Pocsag</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="openwebrx-panel-line">
|
<div class="openwebrx-panel-line">
|
||||||
<div title="Mute on/off" id="openwebrx-mute-off" class="openwebrx-button" onclick="toggleMute();"><img src="static/gfx/openwebrx-speaker.png" class="openwebrx-sliderbtn-img" id="openwebrx-mute-img"></div>
|
<div title="Mute on/off" id="openwebrx-mute-off" class="openwebrx-button" onclick="toggleMute();"><img src="static/gfx/openwebrx-speaker.png" class="openwebrx-sliderbtn-img" id="openwebrx-mute-img"></div>
|
||||||
<input title="Volume" id="openwebrx-panel-volume" class="openwebrx-panel-slider" type="range" min="0" max="150" value="50" step="1" onchange="updateVolume()" oninput="updateVolume()">
|
<input title="Volume" id="openwebrx-panel-volume" class="openwebrx-panel-slider" type="range" min="0" max="150" value="50" step="1" onchange="updateVolume()" oninput="updateVolume()">
|
||||||
|
@ -3,19 +3,64 @@ var Modes = {
|
|||||||
features: {},
|
features: {},
|
||||||
setModes:function(json){
|
setModes:function(json){
|
||||||
this.modes = json.map(function(m){ return new Mode(m); });
|
this.modes = json.map(function(m){ return new Mode(m); });
|
||||||
|
this.updateModePanel();
|
||||||
},
|
},
|
||||||
setFeatures:function(features){
|
setFeatures:function(features){
|
||||||
this.features = features;
|
this.features = features;
|
||||||
|
this.updateModePanel();
|
||||||
},
|
},
|
||||||
findByModulation:function(modulation){
|
findByModulation:function(modulation){
|
||||||
matches = this.modes.filter(function(m) { return m.modulation === modulation; });
|
matches = this.modes.filter(function(m) { return m.modulation === modulation; });
|
||||||
if (matches.length) return matches[0]
|
if (matches.length) return matches[0]
|
||||||
|
},
|
||||||
|
updateModePanel:function() {
|
||||||
|
var available = this.modes.filter(function(m){ return m.isAvailable(); });
|
||||||
|
var normalModes = available.filter(function(m){ return !m.digimode; });
|
||||||
|
var digiModes = available.filter(function(m){ return m.digimode; });
|
||||||
|
|
||||||
|
var index = 0;
|
||||||
|
var arrayLength = normalModes.length;
|
||||||
|
var chunks = [];
|
||||||
|
|
||||||
|
|
||||||
|
for (index = 0; index < arrayLength; index += 5) {
|
||||||
|
chunks.push(normalModes.slice(index, index + 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
var html = []
|
||||||
|
|
||||||
|
html.push.apply(html, chunks.map(function(chunk){
|
||||||
|
return $(
|
||||||
|
'<div class="openwebrx-panel-line openwebrx-panel-flex-line">' +
|
||||||
|
chunk.map(function(m){
|
||||||
|
return '<div class="openwebrx-button openwebrx-demodulator-button"' +
|
||||||
|
'id="openwebrx-button-' + m.modulation + '"' +
|
||||||
|
'onclick="demodulator_analog_replace(\'' + m.modulation + '\');">' +
|
||||||
|
m.name + '</div>';
|
||||||
|
}).join('') +
|
||||||
|
'</div>');
|
||||||
|
}));
|
||||||
|
|
||||||
|
html.push($(
|
||||||
|
'<div class="openwebrx-panel-line openwebrx-panel-flex-line">' +
|
||||||
|
'<div class="openwebrx-button openwebrx-demodulator-button" id="openwebrx-button-dig" onclick="demodulator_digital_replace_last();">DIG</div>' +
|
||||||
|
'<select id="openwebrx-secondary-demod-listbox" onchange="secondary_demod_listbox_changed();">' +
|
||||||
|
'<option value="none"></option>' +
|
||||||
|
digiModes.map(function(m){
|
||||||
|
return '<option value="' + m.modulation + '">' + m.name + '</option>';
|
||||||
|
}).join('') +
|
||||||
|
'</select>' +
|
||||||
|
'</div>'
|
||||||
|
));
|
||||||
|
|
||||||
|
$("#openwebrx-panel-receiver").find(".openwebrx-modes").html(html);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var Mode = function(json){
|
var Mode = function(json){
|
||||||
this.modulation = json.modulation;
|
this.modulation = json.modulation;
|
||||||
this.name = json.name;
|
this.name = json.name;
|
||||||
|
this.digimode = json.digimode;
|
||||||
this.requirements = json.requirements;
|
this.requirements = json.requirements;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1123,6 +1123,7 @@ function on_ws_recv(evt) {
|
|||||||
break;
|
break;
|
||||||
case "features":
|
case "features":
|
||||||
var features = json['value'];
|
var features = json['value'];
|
||||||
|
Modes.setFeatures(features);
|
||||||
for (var feature in features) {
|
for (var feature in features) {
|
||||||
if (features.hasOwnProperty(feature)) {
|
if (features.hasOwnProperty(feature)) {
|
||||||
$('[data-feature="' + feature + '"]')[features[feature] ? "show" : "hide"]();
|
$('[data-feature="' + feature + '"]')[features[feature] ? "show" : "hide"]();
|
||||||
@ -1179,7 +1180,6 @@ function on_ws_recv(evt) {
|
|||||||
break;
|
break;
|
||||||
case 'modes':
|
case 'modes':
|
||||||
Modes.setModes(json['value']);
|
Modes.setModes(json['value']);
|
||||||
console.info(Modes);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.warn('received message of unknown type: ' + json['type']);
|
console.warn('received message of unknown type: ' + json['type']);
|
||||||
|
@ -353,6 +353,7 @@ class OpenWebRxReceiverClient(Client):
|
|||||||
self.send({"type": "modes", "value": [{
|
self.send({"type": "modes", "value": [{
|
||||||
"modulation": m.modulation,
|
"modulation": m.modulation,
|
||||||
"name": m.name,
|
"name": m.name,
|
||||||
|
"digimode": m.digimode,
|
||||||
"requirements": m.requirements
|
"requirements": m.requirements
|
||||||
} for m in modes]})
|
} for m in modes]})
|
||||||
|
|
||||||
|
@ -3,9 +3,10 @@ from functools import reduce
|
|||||||
|
|
||||||
|
|
||||||
class Mode(object):
|
class Mode(object):
|
||||||
def __init__(self, modulation, name, requirements=None, service=False):
|
def __init__(self, modulation, name, requirements=None, service=False, digimode=False):
|
||||||
self.modulation = modulation
|
self.modulation = modulation
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.digimode = digimode
|
||||||
self.requirements = requirements if requirements is not None else []
|
self.requirements = requirements if requirements is not None else []
|
||||||
self.service = service
|
self.service = service
|
||||||
|
|
||||||
@ -21,13 +22,24 @@ class Mode(object):
|
|||||||
|
|
||||||
class Modes(object):
|
class Modes(object):
|
||||||
mappings = [
|
mappings = [
|
||||||
Mode("ft8", "FT8", ["wsjt-x"], True),
|
Mode("nfm", "FM"),
|
||||||
Mode("ft4", "FT4", ["wsjt-x"], True),
|
Mode("am", "AM"),
|
||||||
Mode("jt65", "JT65", ["wsjt-x"], True),
|
Mode("lsb", "LSB"),
|
||||||
Mode("jt9", "JT9", ["wsjt-x"], True),
|
Mode("usb", "USB"),
|
||||||
Mode("wspr", "WSPR", ["wsjt-x"], True),
|
Mode("cw", "CW"),
|
||||||
Mode("packet", "Packet", ["packet"], True),
|
Mode("dmr", "DMR", requirements=["digital_voice_digiham"]),
|
||||||
Mode("js8", "JS8Call", ["js8call"], True),
|
Mode("dstar", "DStar", requirements=["digital_voice_dsd"]),
|
||||||
|
Mode("nxdn", "NXDN", requirements=["digital_voice_dsd"]),
|
||||||
|
Mode("ysf", "YSF", requirements=["digital_voice_digiham"]),
|
||||||
|
Mode("bpsk31", "BPSK31", digimode=True),
|
||||||
|
Mode("bpsk63", "BPSK63", digimode=True),
|
||||||
|
Mode("ft8", "FT8", requirements=["wsjt-x"], service=True, digimode=True),
|
||||||
|
Mode("ft4", "FT4", requirements=["wsjt-x"], service=True, digimode=True),
|
||||||
|
Mode("jt65", "JT65", requirements=["wsjt-x"], service=True, digimode=True),
|
||||||
|
Mode("jt9", "JT9", requirements=["wsjt-x"], service=True, digimode=True),
|
||||||
|
Mode("wspr", "WSPR", requirements=["wsjt-x"], service=True, digimode=True),
|
||||||
|
Mode("packet", "Packet", ["packet"], service=True, digimode=True),
|
||||||
|
Mode("js8", "JS8Call", requirements=["js8call"], service=True, digimode=True),
|
||||||
]
|
]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
Loading…
Reference in New Issue
Block a user