Merge branch 'server_rework' of github.com:jketterl/openwebrx into server_rework

This commit is contained in:
Jakob Ketterl 2019-06-07 15:49:43 +02:00
commit a38872b2d0
4 changed files with 62 additions and 39 deletions

View File

@ -130,34 +130,46 @@ sdrs = {
"20m": { "20m": {
"name":"20m", "name":"20m",
"center_freq": 14150000, "center_freq": 14150000,
"rf_gain": 40, "rf_gain": 4,
"samp_rate": 500000, "samp_rate": 500000,
"start_freq": 14070000, "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" "start_mod": "usb"
}, },
"40m": { "40m": {
"name":"40m", "name":"40m",
"center_freq": 7100000, "center_freq": 7100000,
"rf_gain": 40, "rf_gain": 4,
"samp_rate": 500000, "samp_rate": 500000,
"start_freq": 7070000, "start_freq": 7070000,
"start_mod": "usb" "start_mod": "usb",
"antenna": "Antenna A"
}, },
"80m": { "80m": {
"name":"80m", "name":"80m",
"center_freq": 3650000, "center_freq": 3650000,
"rf_gain": 40, "rf_gain": 4,
"samp_rate": 500000, "samp_rate": 500000,
"start_freq": 3570000, "start_freq": 3570000,
"start_mod": "usb" "start_mod": "usb",
"antenna": "Antenna A"
}, },
"49m": { "49m": {
"name": "49m Broadcast", "name": "49m Broadcast",
"center_freq": 6000000, "center_freq": 6000000,
"rf_gain": 40, "rf_gain": 4,
"samp_rate": 500000, "samp_rate": 500000,
"start_freq": 6070000, "start_freq": 6070000,
"start_mod": "am" "start_mod": "am",
"antenna": "Antenna A"
} }
} }
}, },

View File

@ -32,7 +32,7 @@ class PropertyManager(object):
return PropertyManager.sharedInstance return PropertyManager.sharedInstance
def collect(self, *props): 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): def __init__(self, properties = None):
self.properties = {} self.properties = {}

View File

@ -81,7 +81,7 @@ class OpenWebRxClient(object):
def setParams(self, params): def setParams(self, params):
# only the keys in the protected property manager can be overridden from the web # 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()) .defaults(PropertyManager.getSharedInstance())
for key, value in params.items(): for key, value in params.items():
protected[key] = value protected[key] = value

View File

@ -76,7 +76,7 @@ class SdrSource(object):
self.props = props self.props = props
self.activateProfile() self.activateProfile()
self.rtlProps = self.props.collect( 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()) ).defaults(PropertyManager.getSharedInstance())
def restart(name, value): def restart(name, value):
@ -92,9 +92,13 @@ class SdrSource(object):
self.process = None self.process = None
self.modificationLock = threading.Lock() self.modificationLock = threading.Lock()
# override these in subclasses as necessary # override this in subclasses
self.command = None def getCommand(self):
self.format_conversion = None pass
# override this in subclasses, if necessary
def getFormatConversion(self):
return None
def activateProfile(self, id = None): def activateProfile(self, id = None):
profiles = self.props["profiles"] profiles = self.props["profiles"]
@ -127,18 +131,13 @@ class SdrSource(object):
props = self.rtlProps props = self.rtlProps
start_sdr_command = self.command.format( start_sdr_command = self.getCommand().format(
samp_rate = props["samp_rate"], **props.collect("samp_rate", "center_freq", "ppm", "rf_gain", "lna_gain", "rf_amp", "antenna", "if_gain").__dict__()
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"]
) )
if self.format_conversion is not None: format_conversion = self.getFormatConversion()
start_sdr_command += " | " + self.format_conversion if format_conversion is not None:
start_sdr_command += " | " + format_conversion
nmux_bufcnt = nmux_bufsize = 0 nmux_bufcnt = nmux_bufsize = 0
while nmux_bufsize < props["samp_rate"]/4: nmux_bufsize += 4096 while nmux_bufsize < props["samp_rate"]/4: nmux_bufsize += 4096
@ -230,31 +229,43 @@ class SdrSource(object):
class RtlSdrSource(SdrSource): class RtlSdrSource(SdrSource):
def __init__(self, props, port): def getCommand(self):
super().__init__(props, port) return "rtl_sdr -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -"
self.command = "rtl_sdr -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -"
self.format_conversion = "csdr convert_u8_f" def getFormatConversion(self):
return "csdr convert_u8_f"
class HackrfSource(SdrSource): class HackrfSource(SdrSource):
def __init__(self, props, port): def getCommand(self):
super().__init__(props, port) return "hackrf_transfer -s {samp_rate} -f {center_freq} -g {rf_gain} -l{lna_gain} -a{rf_amp} -r-"
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 getFormatConversion(self):
return "csdr convert_s8_f"
class SdrplaySource(SdrSource): class SdrplaySource(SdrSource):
def __init__(self, props, port): def getCommand(self):
super().__init__(props, port) command = "rx_sdr -F CF32 -s {samp_rate} -f {center_freq} -p {ppm}"
self.command = "rx_sdr -F CF32 -s {samp_rate} -f {center_freq} -p {ppm} -g {rf_gain} -" gainMap = { "rf_gain" : "RFGR", "if_gain" : "IFGR"}
self.format_conversion = None 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): def sleepOnRestart(self):
time.sleep(1) time.sleep(1)
class AirspySource(SdrSource): class AirspySource(SdrSource):
def __init__(self, props, port): def getCommand(self):
super().__init__(props, port) frequency = self.props['center_freq'] / 1e6
self.command = "airspy_rx -f{center_freq_mhz} -r /dev/stdout -a{samp_rate} -g {rf_gain}" command = "airspy_rx"
self.format_conversion = "csdr convert_s16_f" 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): class SpectrumThread(threading.Thread):
def __init__(self, sdrSource): def __init__(self, sdrSource):