diff --git a/config_webrx.py b/config_webrx.py index a3ea8c0..feeb787 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -130,34 +130,46 @@ sdrs = { "20m": { "name":"20m", "center_freq": 14150000, - "rf_gain": 40, + "rf_gain": 4, "samp_rate": 500000, "start_freq": 14070000, + "start_mod": "usb", + "antenna": "Antenna A" + }, + "30m": { + "name":"30m", + "center_freq": 10125000, + "rf_gain": 4, + "samp_rate": 250000, + "start_freq": 10142000, "start_mod": "usb" }, "40m": { "name":"40m", "center_freq": 7100000, - "rf_gain": 40, + "rf_gain": 4, "samp_rate": 500000, "start_freq": 7070000, - "start_mod": "usb" + "start_mod": "usb", + "antenna": "Antenna A" }, "80m": { "name":"80m", "center_freq": 3650000, - "rf_gain": 40, + "rf_gain": 4, "samp_rate": 500000, "start_freq": 3570000, - "start_mod": "usb" + "start_mod": "usb", + "antenna": "Antenna A" }, "49m": { "name": "49m Broadcast", "center_freq": 6000000, - "rf_gain": 40, + "rf_gain": 4, "samp_rate": 500000, "start_freq": 6070000, - "start_mod": "am" + "start_mod": "am", + "antenna": "Antenna A" } } }, diff --git a/owrx/config.py b/owrx/config.py index 8fb6513..558e343 100644 --- a/owrx/config.py +++ b/owrx/config.py @@ -32,7 +32,7 @@ class PropertyManager(object): return PropertyManager.sharedInstance def collect(self, *props): - return PropertyManager(dict((name, self.getProperty(name) if self.hasProperty(name) else Property()) for name in props)) + return PropertyManager({name: self.getProperty(name) if self.hasProperty(name) else Property() for name in props}) def __init__(self, properties = None): self.properties = {} diff --git a/owrx/connection.py b/owrx/connection.py index 95ce84f..029b8d4 100644 --- a/owrx/connection.py +++ b/owrx/connection.py @@ -81,7 +81,7 @@ class OpenWebRxClient(object): def setParams(self, params): # only the keys in the protected property manager can be overridden from the web - protected = self.sdr.getProps().collect("samp_rate", "center_freq", "rf_gain", "type") \ + protected = self.sdr.getProps().collect("samp_rate", "center_freq", "rf_gain", "type", "if_gain") \ .defaults(PropertyManager.getSharedInstance()) for key, value in params.items(): protected[key] = value diff --git a/owrx/source.py b/owrx/source.py index d331c71..47a685b 100644 --- a/owrx/source.py +++ b/owrx/source.py @@ -76,7 +76,7 @@ class SdrSource(object): self.props = props self.activateProfile() self.rtlProps = self.props.collect( - "type", "samp_rate", "nmux_memory", "center_freq", "ppm", "rf_gain", "lna_gain", "rf_amp" + "samp_rate", "nmux_memory", "center_freq", "ppm", "rf_gain", "lna_gain", "rf_amp", "antenna", "if_gain" ).defaults(PropertyManager.getSharedInstance()) def restart(name, value): @@ -92,9 +92,13 @@ class SdrSource(object): self.process = None self.modificationLock = threading.Lock() - # override these in subclasses as necessary - self.command = None - self.format_conversion = None + # override this in subclasses + def getCommand(self): + pass + + # override this in subclasses, if necessary + def getFormatConversion(self): + return None def activateProfile(self, id = None): profiles = self.props["profiles"] @@ -127,18 +131,13 @@ class SdrSource(object): props = self.rtlProps - start_sdr_command = self.command.format( - samp_rate = props["samp_rate"], - center_freq = props["center_freq"], - center_freq_mhz = props["center_freq"]/1e6, - ppm = props["ppm"], - rf_gain = props["rf_gain"], - lna_gain = props["lna_gain"], - rf_amp = props["rf_amp"] + start_sdr_command = self.getCommand().format( + **props.collect("samp_rate", "center_freq", "ppm", "rf_gain", "lna_gain", "rf_amp", "antenna", "if_gain").__dict__() ) - if self.format_conversion is not None: - start_sdr_command += " | " + self.format_conversion + format_conversion = self.getFormatConversion() + if format_conversion is not None: + start_sdr_command += " | " + format_conversion nmux_bufcnt = nmux_bufsize = 0 while nmux_bufsize < props["samp_rate"]/4: nmux_bufsize += 4096 @@ -230,31 +229,43 @@ class SdrSource(object): class RtlSdrSource(SdrSource): - def __init__(self, props, port): - super().__init__(props, port) - self.command = "rtl_sdr -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -" - self.format_conversion = "csdr convert_u8_f" + def getCommand(self): + return "rtl_sdr -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -" + + def getFormatConversion(self): + return "csdr convert_u8_f" class HackrfSource(SdrSource): - def __init__(self, props, port): - super().__init__(props, port) - self.command = "hackrf_transfer -s {samp_rate} -f {center_freq} -g {rf_gain} -l{lna_gain} -a{rf_amp} -r-" - self.format_conversion = "csdr convert_s8_f" + def getCommand(self): + return "hackrf_transfer -s {samp_rate} -f {center_freq} -g {rf_gain} -l{lna_gain} -a{rf_amp} -r-" + + def getFormatConversion(self): + return "csdr convert_s8_f" class SdrplaySource(SdrSource): - def __init__(self, props, port): - super().__init__(props, port) - self.command = "rx_sdr -F CF32 -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -" - self.format_conversion = None + def getCommand(self): + command = "rx_sdr -F CF32 -s {samp_rate} -f {center_freq} -p {ppm}" + gainMap = { "rf_gain" : "RFGR", "if_gain" : "IFGR"} + gains = [ "{0}={{{1}}}".format(gainMap[name], name) for (name, value) in self.rtlProps.collect("rf_gain", "if_gain").__dict__().items() if value is not None ] + if gains: + command += " -g {gains}".format(gains = ",".join(gains)) + if self.rtlProps["antenna"] is not None: + command += " -a \"{antenna}\"" + command += " -" + return command def sleepOnRestart(self): time.sleep(1) class AirspySource(SdrSource): - def __init__(self, props, port): - super().__init__(props, port) - self.command = "airspy_rx -f{center_freq_mhz} -r /dev/stdout -a{samp_rate} -g {rf_gain}" - self.format_conversion = "csdr convert_s16_f" + def getCommand(self): + frequency = self.props['center_freq'] / 1e6 + command = "airspy_rx" + command += " -f{0}".format(frequency) + command += " -r /dev/stdout -a{samp_rate} -g {rf_gain}" + return command + def getFormatConversion(self): + return "csdr convert_s16_f" class SpectrumThread(threading.Thread): def __init__(self, sdrSource):