FM
diff --git a/htdocs/openwebrx.css b/htdocs/openwebrx.css
index e2c1c44..620b711 100644
--- a/htdocs/openwebrx.css
+++ b/htdocs/openwebrx.css
@@ -790,10 +790,7 @@ img.openwebrx-mirror-img
transition: width 500ms, left 500ms;
}
-#openwebrx-secondary-demod-listbox
-{
- width: 201px;
- height: 27px;
+.openwebrx-panel select {
border-radius: 5px;
background-color: #373737;
color: White;
@@ -805,16 +802,27 @@ img.openwebrx-mirror-img
border-color: transparent;
border-width: 0px;
-moz-appearance: none;
- padding-left:3px;
}
-#openwebrx-secondary-demod-listbox option
-{
+.openwebrx-panel select option {
border-width: 0px;
background-color: #373737;
color: White;
}
+#openwebrx-secondary-demod-listbox
+{
+ width: 201px;
+ height: 27px;
+ padding-left:3px;
+}
+
+#openwebrx-sdr-profiles-listbox {
+ width: 100%;
+ font-size: 10pt;
+ height: 27px;
+}
+
#openwebrx-cursor-blink
{
animation: cursor-blink 1s infinite;
diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js
index 2d622b0..d378ef4 100644
--- a/htdocs/openwebrx.js
+++ b/htdocs/openwebrx.js
@@ -1208,6 +1208,12 @@ function on_ws_recv(evt)
var server_cpu_usage = json.value;
progressbar_set(e("openwebrx-bar-server-cpu"),server_cpu_usage/100,"Server CPU [" + server_cpu_usage + "%]",server_cpu_usage>85);
break;
+ case "profiles":
+ var listbox = e("openwebrx-sdr-profiles-listbox");
+ listbox.innerHTML = json.value.map(function(profile){
+ return '
";
+ }).join("");
+ break;
default:
console.warn('received message of unknown type: ' + json.type);
}
@@ -2749,3 +2755,8 @@ function secondary_demod_waterfall_set_zoom(low_cut, high_cut)
secondary_demod_canvases.map((x)=>{$(x).css("left",secondary_demod_canvas_left+"px").css("width",secondary_demod_canvas_width+"px");});
secondary_demod_update_channel_freq_from_event();
}
+
+function sdr_profile_changed() {
+ value = $('#openwebrx-sdr-profiles-listbox').val();
+ ws.send(JSON.stringify({ type:"selectprofile", params:{ profile:value }}));
+}
diff --git a/owrx/controllers.py b/owrx/controllers.py
index b18dfe9..239ee72 100644
--- a/owrx/controllers.py
+++ b/owrx/controllers.py
@@ -83,6 +83,9 @@ class OpenWebRxClient(object):
receiver_details = dict((key, pm.getPropertyValue(key)) for key in receiver_keys)
self.write_receiver_details(receiver_details)
+ profiles = [{"name": s.getName() + " " + p["name"], "id":sid + "|" + pid} for (sid, s) in SdrService.getSources().items() for (pid, p) in s.getProfiles().items()]
+ self.write_profiles(profiles)
+
CpuUsageThread.getSharedInstance().add_client(self)
def sendConfig(self, key, value):
@@ -149,6 +152,8 @@ class OpenWebRxClient(object):
self.conn.send({"type":"config","value":cfg})
def write_receiver_details(self, details):
self.conn.send({"type":"receiver_details","value":details})
+ def write_profiles(self, profiles):
+ self.conn.send({"type":"profiles","value":profiles})
class WebSocketMessageHandler(object):
def __init__(self):
@@ -187,6 +192,11 @@ class WebSocketMessageHandler(object):
if message["type"] == "setsdr":
if "params" in message:
self.client.setSdr(message["params"]["sdr"])
+ if message["type"] == "selectprofile":
+ if "params" in message and "profile" in message["params"]:
+ profile = message["params"]["profile"].split("|")
+ self.client.setSdr(profile[0])
+ self.client.sdr.activateProfile(profile[1])
else:
print("received message without type: {0}".format(message))
diff --git a/owrx/source.py b/owrx/source.py
index 4584520..650c15b 100644
--- a/owrx/source.py
+++ b/owrx/source.py
@@ -52,16 +52,24 @@ class SdrService(object):
if id is None:
# TODO: configure default sdr in config? right now it will pick the first one off the list.
id = list(SdrService.sdrProps.keys())[0]
- if not id in SdrService.sources:
- props = SdrService.sdrProps[id]
- className = ''.join(x for x in props["type"].title() if x.isalnum()) + "Source"
- cls = getattr(sys.modules[__name__], className)
- SdrService.sources[id] = cls(props, SdrService.getNextPort())
- return SdrService.sources[id]
+ sources = SdrService.getSources()
+ return sources[id]
+ @staticmethod
+ def getSources():
+ SdrService.loadProps()
+ for id in SdrService.sdrProps.keys():
+ if not id in SdrService.sources:
+ props = SdrService.sdrProps[id]
+ className = ''.join(x for x in props["type"].title() if x.isalnum()) + "Source"
+ cls = getattr(sys.modules[__name__], className)
+ SdrService.sources[id] = cls(props, SdrService.getNextPort())
+ return SdrService.sources
+
class SdrSource(object):
def __init__(self, props, port):
self.props = props
+ self.activateProfile()
self.rtlProps = self.props.collect(
"type", "samp_rate", "nmux_memory", "center_freq", "ppm", "rf_gain", "lna_gain", "rf_amp"
).defaults(PropertyManager.getSharedInstance())
@@ -85,6 +93,23 @@ class SdrSource(object):
self.command = None
self.format_conversion = None
+ def activateProfile(self, id = None):
+ profiles = self.props["profiles"]
+ if id is None:
+ id = list(profiles.keys())[0]
+ print("activating profile {0}".format(id))
+ profile = profiles[id]
+ for (key, value) in profile.items():
+ # skip the name, that would overwrite the source name.
+ if key == "name": continue
+ self.props[key] = value
+
+ def getProfiles(self):
+ return self.props["profiles"]
+
+ def getName(self):
+ return self.props["name"]
+
def getProps(self):
return self.props