keep more parameters on the server side

This commit is contained in:
Jakob Ketterl
2020-04-26 18:45:41 +02:00
parent 449b3b3986
commit 26321ab68b
6 changed files with 106 additions and 123 deletions

View File

@ -11,7 +11,7 @@ from owrx.bookmarks import Bookmarks
from owrx.map import Map
from owrx.locator import Locator
from owrx.property import PropertyStack
from owrx.modes import Modes
from owrx.modes import Modes, DigitalMode
from multiprocessing import Queue
from queue import Full
from js8py import Js8Frame
@ -114,18 +114,18 @@ class OpenWebRxReceiverClient(Client):
receiver_info["locator"] = Locator.fromCoordinates(receiver_info["receiver_gps"])
self.write_receiver_details(receiver_info)
# TODO unsubscribe
receiver_details.wire(send_receiver_info)
send_receiver_info()
self.__sendProfiles()
features = FeatureDetector().feature_availability()
self.write_features(features)
modes = Modes.getModes()
self.write_modes(modes)
# TODO unsubscribe
receiver_details.wire(send_receiver_info)
send_receiver_info()
self.__sendProfiles()
CpuUsageThread.getSharedInstance().add_client(self)
def __sendProfiles(self):
@ -350,12 +350,23 @@ class OpenWebRxReceiverClient(Client):
}})
def write_modes(self, modes):
self.send({"type": "modes", "value": [{
"modulation": m.modulation,
"name": m.name,
"digimode": m.digimode,
"requirements": m.requirements
} for m in modes]})
def to_json(m):
res = {
"modulation": m.modulation,
"name": m.name,
"type": "digimode" if isinstance(m, DigitalMode) else "analog",
"requirements": m.requirements
}
if m.bandpass is not None:
res["bandpass"] = {
"low_cut": m.bandpass.low_cut,
"high_cut": m.bandpass.high_cut
}
if isinstance(m, DigitalMode):
res["underlying"] = m.underlying
return res
self.send({"type": "modes", "value": [to_json(m) for m in modes]})
class MapConnection(Client):

View File

@ -2,13 +2,19 @@ from owrx.feature import FeatureDetector
from functools import reduce
class Bandpass(object):
def __init__(self, low_cut, high_cut):
self.low_cut = low_cut
self.high_cut = high_cut
class Mode(object):
def __init__(self, modulation, name, requirements=None, service=False, digimode=False):
def __init__(self, modulation, name, bandpass: Bandpass = None, requirements=None, service=False):
self.modulation = modulation
self.name = name
self.digimode = digimode
self.requirements = requirements if requirements is not None else []
self.service = service
self.bandpass = bandpass
def is_available(self):
fd = FeatureDetector()
@ -20,26 +26,37 @@ class Mode(object):
return self.service
class AnalogMode(Mode):
pass
class DigitalMode(Mode):
def __init__(self, modulation, name, underlying, bandpass: Bandpass = None, requirements=None, service=False):
super().__init__(modulation, name, bandpass, requirements, service)
self.underlying = underlying
class Modes(object):
mappings = [
Mode("nfm", "FM"),
Mode("am", "AM"),
Mode("lsb", "LSB"),
Mode("usb", "USB"),
Mode("cw", "CW"),
Mode("dmr", "DMR", requirements=["digital_voice_digiham"]),
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),
AnalogMode("nfm", "FM", bandpass=Bandpass(-4000, 4000)),
AnalogMode("am", "AM", bandpass=Bandpass(-4000, 4000)),
AnalogMode("lsb", "LSB", bandpass=Bandpass(-3000, -300)),
AnalogMode("usb", "USB", bandpass=Bandpass(300, 3000)),
AnalogMode("cw", "CW", bandpass=Bandpass(700, 900)),
AnalogMode("dmr", "DMR", bandpass=Bandpass(-4000, 4000), requirements=["digital_voice_digiham"]),
AnalogMode("dstar", "DStar", bandpass=Bandpass(-3250, 3250), requirements=["digital_voice_dsd"]),
AnalogMode("nxdn", "NXDN", bandpass=Bandpass(-3250, 3250), requirements=["digital_voice_dsd"]),
AnalogMode("ysf", "YSF", bandpass=Bandpass(-4000, 4000), requirements=["digital_voice_digiham"]),
DigitalMode("bpsk31", "BPSK31", underlying=["usb"]),
DigitalMode("bpsk63", "BPSK63", underlying=["usb"]),
DigitalMode("ft8", "FT8", underlying=["usb"], requirements=["wsjt-x"], service=True),
DigitalMode("ft4", "FT4", underlying=["usb"], requirements=["wsjt-x"], service=True),
DigitalMode("jt65", "JT65", underlying=["usb"], requirements=["wsjt-x"], service=True),
DigitalMode("jt9", "JT9", underlying=["usb"], requirements=["wsjt-x"], service=True),
DigitalMode("wspr", "WSPR", underlying=["usb"], bandpass=Bandpass(1350, 1650), requirements=["wsjt-x"], service=True),
DigitalMode("js8", "JS8Call", underlying=["usb"], requirements=["js8call"], service=True),
DigitalMode("packet", "Packet", underlying=["nfm", "usb", "lsb"], requirements=["packet"], service=True),
DigitalMode("pocsag", "Pocsag", underlying=["nfm"], bandpass=Bandpass(-6000, 6000), requirements=["pocsag"])
]
@staticmethod