From 55e1aa58578c1164994795b3556b47631764d09f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 20 Jan 2021 16:46:29 +0100 Subject: [PATCH] use the property stack the way it's intended for better consistency --- owrx/connection.py | 92 +++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/owrx/connection.py b/owrx/connection.py index 62718a1..1fb08d4 100644 --- a/owrx/connection.py +++ b/owrx/connection.py @@ -135,7 +135,7 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): self.dsp = None self.sdr = None - self.sdrConfigSubs = [] + self.configSubs = [] self.connectionProperties = {} try: @@ -145,9 +145,8 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): self.close() raise - globalConfig = Config.get().filter(*OpenWebRxReceiverClient.global_config_keys) - self.globalConfigSub = globalConfig.wire(self.write_config) - self.write_config(globalConfig.__dict__()) + self.setupGlobalConfig() + self.stack = self.setupStack() self.setSdr() @@ -162,8 +161,47 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): CpuUsageThread.getSharedInstance().add_client(self) def __del__(self): - if hasattr(self, "globalConfigSub"): - self.globalConfigSub.cancel() + if hasattr(self, "configSubs"): + while self.configSubs: + self.configSubs.pop().cancel() + + def setupStack(self): + stack = PropertyStack() + # stack layer 0 reserved for sdr properties + # stack.addLayer(0, self.sdr.getProps()) + stack.addLayer(1, Config.get()) + configProps = stack.filter(*OpenWebRxReceiverClient.sdr_config_keys) + + def sendConfig(changes=None): + if changes is None: + config = configProps.__dict__() + else: + config = changes + if (changes is None or "start_freq" in changes or "center_freq" in changes) and "start_freq" in configProps and "center_freq" in configProps: + config["start_offset_freq"] = configProps["start_freq"] - configProps["center_freq"] + if (changes is None or "profile_id" in changes) and self.sdr is not None: + config["sdr_id"] = self.sdr.getId() + self.write_config(config) + + def sendBookmarks(changes=None): + cf = configProps["center_freq"] + srh = configProps["samp_rate"] / 2 + frequencyRange = (cf - srh, cf + srh) + self.write_dial_frequencies(Bandplan.getSharedInstance().collectDialFrequencies(frequencyRange)) + bookmarks = [b.__dict__() for b in Bookmarks.getSharedInstance().getBookmarks(frequencyRange)] + self.write_bookmarks(bookmarks) + + self.configSubs.append(configProps.wire(sendConfig)) + self.configSubs.append(stack.filter("center_freq", "samp_rate").wire(sendBookmarks)) + + # send initial config + sendConfig() + return stack + + def setupGlobalConfig(self): + globalConfig = Config.get().filter(*OpenWebRxReceiverClient.global_config_keys) + self.configSubs.append(globalConfig.wire(self.write_config)) + self.write_config(globalConfig.__dict__()) def onStateChange(self, state): if state == SdrSource.STATE_RUNNING: @@ -242,9 +280,6 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): self.stopDsp() - while self.sdrConfigSubs: - self.sdrConfigSubs.pop().cancel() - if self.sdr is not None: self.sdr.removeClient(self) @@ -259,37 +294,8 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): def handleSdrAvailable(self): self.getDsp().setProperties(self.connectionProperties) + self.stack.replaceLayer(0, self.sdr.getProps()) - stack = PropertyStack() - stack.addLayer(0, self.sdr.getProps()) - stack.addLayer(1, Config.get()) - configProps = stack.filter(*OpenWebRxReceiverClient.sdr_config_keys) - - def sendConfig(changes=None): - if changes is None: - config = configProps.__dict__() - else: - config = changes - if changes is None or "start_freq" in changes or "center_freq" in changes: - config["start_offset_freq"] = configProps["start_freq"] - configProps["center_freq"] - if changes is None or "profile_id" in changes: - config["sdr_id"] = self.sdr.getId() - self.write_config(config) - - def sendBookmarks(changes=None): - cf = configProps["center_freq"] - srh = configProps["samp_rate"] / 2 - frequencyRange = (cf - srh, cf + srh) - self.write_dial_frequencies(Bandplan.getSharedInstance().collectDialFrequencies(frequencyRange)) - bookmarks = [b.__dict__() for b in Bookmarks.getSharedInstance().getBookmarks(frequencyRange)] - self.write_bookmarks(bookmarks) - - self.sdrConfigSubs.append(configProps.wire(sendConfig)) - self.sdrConfigSubs.append(stack.filter("center_freq", "samp_rate").wire(sendBookmarks)) - - # send initial config - sendConfig() - sendBookmarks() self.__sendProfiles() self.sdr.addSpectrumClient(self) @@ -306,8 +312,6 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): self.stopDsp() CpuUsageThread.getSharedInstance().remove_client(self) ClientRegistry.getSharedInstance().removeClient(self) - while self.sdrConfigSubs: - self.sdrConfigSubs.pop().cancel() super().close() def stopDsp(self): @@ -325,11 +329,7 @@ class OpenWebRxReceiverClient(OpenWebRxClient, SdrSourceEventClient): keys = config["configurable_keys"] if not keys: return - # only the keys in the protected property manager can be overridden from the web - stack = PropertyStack() - stack.addLayer(0, self.sdr.getProps()) - stack.addLayer(1, config) - protected = stack.filter(*keys) + protected = self.stack.filter(*keys) for key, value in params.items(): try: protected[key] = value