From dc03639cad10dec0e665c49135c09944c97f4f94 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 25 Oct 2020 16:53:18 +0100 Subject: [PATCH 01/41] add source for rf103 (experimental) --- owrx/command.py | 2 +- owrx/feature.py | 4 ++++ owrx/source/rf103.py | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 owrx/source/rf103.py diff --git a/owrx/command.py b/owrx/command.py index 87ae711..0559b72 100644 --- a/owrx/command.py +++ b/owrx/command.py @@ -76,4 +76,4 @@ class Option(CommandMapping): class Argument(CommandMapping): def map(self, value): - return value + return str(value) diff --git a/owrx/feature.py b/owrx/feature.py index c3d7259..88cf6fb 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -68,6 +68,7 @@ class FeatureDetector(object): "red_pitaya": ["soapy_connector", "soapy_red_pitaya"], "radioberry": ["soapy_connector", "soapy_radioberry"], "fcdpp": ["soapy_connector", "soapy_fcdpp"], + "rf103": ["rf103_sdr"], # optional features and their requirements "digital_voice_digiham": ["digiham", "sox"], "digital_voice_dsd": ["dsd", "sox", "digiham"], @@ -492,3 +493,6 @@ class FeatureDetector(object): [OpenWebRX wiki](https://github.com/jketterl/openwebrx/wiki/DRM-demodulator-notes). """ return self.command_is_runnable("dream --help", 0) + + def has_rf103_sdr(self): + return self.command_is_runnable("rf103_sdr") diff --git a/owrx/source/rf103.py b/owrx/source/rf103.py new file mode 100644 index 0000000..db06d23 --- /dev/null +++ b/owrx/source/rf103.py @@ -0,0 +1,15 @@ +from owrx.source.direct import DirectSource +from owrx.command import Option +import time + + +class Rf103Source(DirectSource): + def getCommandMapper(self): + return super().getCommandMapper().setBase("rf103_sdr -i /home/jakob/workspace/RF103/rx888.img").setMappings({ + "samp_rate": Option("-s"), + "center_freq": Option("-f"), + "attenuation": Option("-a"), + }) + + def sleepOnRestart(self): + time.sleep(1) From 781b4383d67957012a7941abc90e258f17286026 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 23 Nov 2020 15:26:01 +0100 Subject: [PATCH 02/41] remove port flag and turn rtltcp_compat into an option --- owrx/source/__init__.py | 5 +---- owrx/source/connector.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/owrx/source/__init__.py b/owrx/source/__init__.py index c71c5a3..cf5e198 100644 --- a/owrx/source/__init__.py +++ b/owrx/source/__init__.py @@ -59,10 +59,7 @@ class SdrSource(ABC): self.activateProfile() self.wireEvents() - if "port" in props and props["port"] is not None: - self.port = props["port"] - else: - self.port = getAvailablePort() + self.port = getAvailablePort() self.monitor = None self.clients = [] self.spectrumClients = [] diff --git a/owrx/source/connector.py b/owrx/source/connector.py index f28da98..47eec5d 100644 --- a/owrx/source/connector.py +++ b/owrx/source/connector.py @@ -23,7 +23,7 @@ class ConnectorSource(SdrSource): "controlPort": Option("-c"), "device": Option("-d"), "iqswap": Flag("-i"), - "rtltcp_compat": Flag("-r"), + "rtltcp_compat": Option("-r"), "ppm": Option("-P"), "rf_gain": Option("-g"), } From d72f2d9e5cdc42b2945fb066b6b6e874e69147ba Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 23 Nov 2020 15:34:44 +0100 Subject: [PATCH 03/41] update changelog --- CHANGELOG.md | 1 + debian/changelog | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af01871..4abf764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ **unreleased** - Introduced `squelch_auto_margin` config option that allows configuring the auto squelch level +- Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors **0.20.0** - Added the ability to sign multiple keys in a single request, thus enabling multiple users to claim a single receiver diff --git a/debian/changelog b/debian/changelog index 7357723..31272e1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,8 @@ openwebrx (0.21.0) UNRELEASED; urgency=low * Introduced `squelch_auto_margin` config option that allows configuring the auto squelch level + * Removed `port` configuration option; `rtltcp_compat` takes the port number + with the new connectors -- Jakob Ketterl Sun, 11 Oct 2020 21:12:00 +0000 From b5d56eaec2fc754a1df9909d0e8fcee0de025134 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 27 Nov 2020 18:39:10 +0100 Subject: [PATCH 04/41] update to use new sddc_connector --- owrx/feature.py | 6 +++--- owrx/source/rf103.py | 15 +++------------ 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/owrx/feature.py b/owrx/feature.py index 867f510..cd4d02e 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -68,7 +68,7 @@ class FeatureDetector(object): "red_pitaya": ["soapy_connector", "soapy_red_pitaya"], "radioberry": ["soapy_connector", "soapy_radioberry"], "fcdpp": ["soapy_connector", "soapy_fcdpp"], - "rf103": ["rf103_sdr"], + "rf103": ["sddc_connector"], "hpsdr": ["hpsdr_connector"], # optional features and their requirements "digital_voice_digiham": ["digiham", "sox"], @@ -495,8 +495,8 @@ class FeatureDetector(object): """ return self.command_is_runnable("dream --help", 0) - def has_rf103_sdr(self): - return self.command_is_runnable("rf103_sdr") + def has_sddc_connector(self): + return self.command_is_runnable("sddc_connector") def has_hpsdr_connector(self): """ diff --git a/owrx/source/rf103.py b/owrx/source/rf103.py index db06d23..e263250 100644 --- a/owrx/source/rf103.py +++ b/owrx/source/rf103.py @@ -1,15 +1,6 @@ -from owrx.source.direct import DirectSource -from owrx.command import Option -import time +from owrx.source.connector import ConnectorSource -class Rf103Source(DirectSource): +class Rf103Source(ConnectorSource): def getCommandMapper(self): - return super().getCommandMapper().setBase("rf103_sdr -i /home/jakob/workspace/RF103/rx888.img").setMappings({ - "samp_rate": Option("-s"), - "center_freq": Option("-f"), - "attenuation": Option("-a"), - }) - - def sleepOnRestart(self): - time.sleep(1) + return super().getCommandMapper().setBase("sddc_connector") From 74be25f656ef53af447941367a7628dcc79ce65e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 27 Nov 2020 18:49:33 +0100 Subject: [PATCH 05/41] rename all occurences to SDDC --- owrx/feature.py | 7 ++++++- owrx/source/{rf103.py => sddc.py} | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) rename owrx/source/{rf103.py => sddc.py} (80%) diff --git a/owrx/feature.py b/owrx/feature.py index cd4d02e..5bf614f 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -68,7 +68,7 @@ class FeatureDetector(object): "red_pitaya": ["soapy_connector", "soapy_red_pitaya"], "radioberry": ["soapy_connector", "soapy_radioberry"], "fcdpp": ["soapy_connector", "soapy_fcdpp"], - "rf103": ["sddc_connector"], + "sddc": ["sddc_connector"], "hpsdr": ["hpsdr_connector"], # optional features and their requirements "digital_voice_digiham": ["digiham", "sox"], @@ -496,6 +496,11 @@ class FeatureDetector(object): return self.command_is_runnable("dream --help", 0) def has_sddc_connector(self): + """ + The sddc_connector allows connectivity with SDR devices powered by libsddc, e.g. RX666, RX888, HF103. + + You can find more information [here](https://github.com/jketterl/sddc_connector). + """ return self.command_is_runnable("sddc_connector") def has_hpsdr_connector(self): diff --git a/owrx/source/rf103.py b/owrx/source/sddc.py similarity index 80% rename from owrx/source/rf103.py rename to owrx/source/sddc.py index e263250..58e7380 100644 --- a/owrx/source/rf103.py +++ b/owrx/source/sddc.py @@ -1,6 +1,6 @@ from owrx.source.connector import ConnectorSource -class Rf103Source(ConnectorSource): +class SddcSource(ConnectorSource): def getCommandMapper(self): return super().getCommandMapper().setBase("sddc_connector") From e4cf95856e83cee23a436214ee23c13a98ccecfc Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sat, 28 Nov 2020 22:11:12 +0100 Subject: [PATCH 06/41] update connectors --- docker/scripts/install-connectors.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/scripts/install-connectors.sh b/docker/scripts/install-connectors.sh index 33390e1..9307fff 100755 --- a/docker/scripts/install-connectors.sh +++ b/docker/scripts/install-connectors.sh @@ -24,7 +24,8 @@ apt-get update apt-get -y install --no-install-recommends $BUILD_PACKAGES git clone https://github.com/jketterl/owrx_connector.git -cmakebuild owrx_connector 0.3.0 +# latest develop as of 2020-11-28 (c++ refactoring) +cmakebuild owrx_connector 8c7982f1f91bb38f359126725de64a5875221898 apt-get -y purge --autoremove $BUILD_PACKAGES apt-get clean From 8b89d1e062212370ed06794d4706fcd2f280c87e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 29 Nov 2020 16:01:35 +0100 Subject: [PATCH 07/41] update changelog --- CHANGELOG.md | 2 ++ debian/changelog | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4abf764..d99f12f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ **unreleased** - Introduced `squelch_auto_margin` config option that allows configuring the auto squelch level - Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors +- New devices supported: + - BBRF103 / RX666 / RX888 devices supported by libsddc **0.20.0** - Added the ability to sign multiple keys in a single request, thus enabling multiple users to claim a single receiver diff --git a/debian/changelog b/debian/changelog index 31272e1..1e8e81e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ openwebrx (0.21.0) UNRELEASED; urgency=low auto squelch level * Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors + * New devices supported: + - BBRF103 / RX666 / RX888 devices supported by libsddc -- Jakob Ketterl Sun, 11 Oct 2020 21:12:00 +0000 From 0614637342ac6f6e41dca569b6c227a77df291d1 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 30 Nov 2020 00:34:44 +0100 Subject: [PATCH 08/41] add eb200 support --- CHANGELOG.md | 1 + debian/changelog | 1 + owrx/feature.py | 13 +++++++++++-- owrx/source/eb200.py | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 owrx/source/eb200.py diff --git a/CHANGELOG.md b/CHANGELOG.md index d99f12f..c94d039 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors - New devices supported: - BBRF103 / RX666 / RX888 devices supported by libsddc + - Devices using the EB200 protocol **0.20.0** - Added the ability to sign multiple keys in a single request, thus enabling multiple users to claim a single receiver diff --git a/debian/changelog b/debian/changelog index 1e8e81e..3990ebd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,7 @@ openwebrx (0.21.0) UNRELEASED; urgency=low with the new connectors * New devices supported: - BBRF103 / RX666 / RX888 devices supported by libsddc + - Devices using the EB200 protocol -- Jakob Ketterl Sun, 11 Oct 2020 21:12:00 +0000 diff --git a/owrx/feature.py b/owrx/feature.py index 5bf614f..39c6c20 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -70,6 +70,7 @@ class FeatureDetector(object): "fcdpp": ["soapy_connector", "soapy_fcdpp"], "sddc": ["sddc_connector"], "hpsdr": ["hpsdr_connector"], + "eb200": ["eb200_connector"], # optional features and their requirements "digital_voice_digiham": ["digiham", "sox"], "digital_voice_dsd": ["dsd", "sox", "digiham"], @@ -256,7 +257,7 @@ class FeatureDetector(object): ) def _check_connector(self, command): - required_version = LooseVersion("0.3") + required_version = LooseVersion("0.4") owrx_connector_version_regex = re.compile("^owrx-connector version (.*)$") @@ -501,7 +502,7 @@ class FeatureDetector(object): You can find more information [here](https://github.com/jketterl/sddc_connector). """ - return self.command_is_runnable("sddc_connector") + return self._check_connector("sddc_connector") def has_hpsdr_connector(self): """ @@ -509,3 +510,11 @@ class FeatureDetector(object): (https://github.com/jancona/hpsdrconnector). """ return self.command_is_runnable("hpsdrconnector -h") + + def has_eb200_connector(self): + """ + To use radios supporting the EB200 radios, you need to install the eb200_connector. + + You can find more information [here](https://github.com/jketterl/eb200_connector). + """ + return self._check_connector("eb200_connector") \ No newline at end of file diff --git a/owrx/source/eb200.py b/owrx/source/eb200.py new file mode 100644 index 0000000..026237c --- /dev/null +++ b/owrx/source/eb200.py @@ -0,0 +1,14 @@ +from owrx.source.connector import ConnectorSource +from owrx.command import Argument + + +class Eb200Source(ConnectorSource): + def getCommandMapper(self): + return ( + super() + .getCommandMapper() + .setBase("eb200_connector") + .setMappings({ + "remote": Argument(), + }) + ) From daf2848c4dbde1edf97011d9974a2de0e64fde3d Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 30 Nov 2020 13:24:25 +0100 Subject: [PATCH 09/41] increase package dependency version --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 0c2fcd5..6f23ff9 100644 --- a/debian/control +++ b/debian/control @@ -10,7 +10,7 @@ Vcs-Git: https://github.com/jketterl/openwebrx.git Package: openwebrx Architecture: all -Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.3), python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} +Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.4), python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, soapysdr-tools Description: multi-user web sdr Open source, multi-user SDR receiver with a web interface \ No newline at end of file From a8bd13f7e6a918661c88b1d146b680ae4a15bf4d Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 30 Nov 2020 17:13:03 +0100 Subject: [PATCH 10/41] increase bandwidth for packet to 12.5kHz --- owrx/modes.py | 8 +++++++- owrx/service/__init__.py | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/owrx/modes.py b/owrx/modes.py index 166373c..3e607eb 100644 --- a/owrx/modes.py +++ b/owrx/modes.py @@ -62,7 +62,13 @@ class Modes(object): ), DigitalMode("js8", "JS8Call", underlying=["usb"], requirements=["js8call"], service=True), DigitalMode( - "packet", "Packet", underlying=["nfm", "usb", "lsb"], requirements=["packet"], service=True, squelch=False + "packet", + "Packet", + underlying=["nfm", "usb", "lsb"], + bandpass=Bandpass(-6250, 6250), + requirements=["packet"], + service=True, + squelch=False, ), DigitalMode( "pocsag", diff --git a/owrx/service/__init__.py b/owrx/service/__init__.py index 98cf557..8ca2e3f 100644 --- a/owrx/service/__init__.py +++ b/owrx/service/__init__.py @@ -252,7 +252,7 @@ class ServiceHandler(SdrSourceEventClient): d.set_center_freq(center_freq) if mode == "packet": d.set_demodulator("nfm") - d.set_bpf(-4000, 4000) + d.set_bpf(-6250, 6250) elif mode == "wspr": d.set_demodulator("usb") # WSPR only samples between 1400 and 1600 Hz From b3fbf89f57e573ba8a7033e444e750a372a259df Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 30 Nov 2020 18:10:34 +0100 Subject: [PATCH 11/41] remove OSM fallback since it's broken --- htdocs/map.js | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/htdocs/map.js b/htdocs/map.js index 0d447e2..69be2ca 100644 --- a/htdocs/map.js +++ b/htdocs/map.js @@ -223,26 +223,14 @@ case "config": var config = json.value; if (!map) $.getScript("https://maps.googleapis.com/maps/api/js?key=" + config.google_maps_api_key).done(function(){ - var mapTypeId = config.google_maps_api_key ? 'roadmap' : 'OSM'; - map = new google.maps.Map($('.openwebrx-map')[0], { center: { lat: config.receiver_gps.lat, lng: config.receiver_gps.lon }, zoom: 5, - mapTypeId: mapTypeId }); - map.mapTypes.set("OSM", new google.maps.ImageMapType({ - getTileUrl: function(coord, zoom) { - return "https://maps.wikimedia.org/osm-intl/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; - }, - tileSize: new google.maps.Size(256, 256), - name: "OpenStreetMap", - maxZoom: 18 - })); - $.getScript("static/lib/nite-overlay.js").done(function(){ nite.init(map); setInterval(function() { nite.refresh() }, 10000); // every 10s From 8710a2a1d34508d8f9427ec0e5b5a81b56f4b0fa Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 30 Nov 2020 18:30:33 +0100 Subject: [PATCH 12/41] update version and changelog --- CHANGELOG.md | 3 +++ debian/changelog | 6 ++++++ owrx/version.py | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c4e9db..453141a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +**0.20.1** +- Remove broken OSM map fallback + **0.20.0** - Added the ability to sign multiple keys in a single request, thus enabling multiple users to claim a single receiver on receiverbook.de diff --git a/debian/changelog b/debian/changelog index e0c9239..b2e2435 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +openwebrx (0.20.1) buster focal; urgency=low + + * Remove broken OSM map fallback + + -- Jakob Ketterl Mon, 30 Nov 2020 17:29:00 +0000 + openwebrx (0.20.0) buster focal; urgency=low * Added the ability to sign multiple keys in a single request, thus enabling diff --git a/owrx/version.py b/owrx/version.py index cd89792..7b33bd5 100644 --- a/owrx/version.py +++ b/owrx/version.py @@ -1,5 +1,5 @@ from distutils.version import LooseVersion -_versionstring = "0.20.0" +_versionstring = "0.20.1" looseversion = LooseVersion(_versionstring) openwebrx_version = "v{0}".format(looseversion) From 46b7660e2d5a2de720f7a8cecfbf6fce4d1c0d9c Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 1 Dec 2020 14:14:52 +0100 Subject: [PATCH 13/41] add long flag mapping for eb200 --- owrx/source/eb200.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/owrx/source/eb200.py b/owrx/source/eb200.py index 026237c..a234a59 100644 --- a/owrx/source/eb200.py +++ b/owrx/source/eb200.py @@ -1,5 +1,5 @@ from owrx.source.connector import ConnectorSource -from owrx.command import Argument +from owrx.command import Argument, Flag class Eb200Source(ConnectorSource): @@ -9,6 +9,7 @@ class Eb200Source(ConnectorSource): .getCommandMapper() .setBase("eb200_connector") .setMappings({ + "long": Flag("-l"), "remote": Argument(), }) ) From 2022c53fada4485e51233e9f08fc335149e0dac8 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 1 Dec 2020 17:41:17 +0100 Subject: [PATCH 14/41] make soapysdr-tools a hard dependency; recommend eb200_connector --- debian/control | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index 6f23ff9..e7fb065 100644 --- a/debian/control +++ b/debian/control @@ -10,7 +10,7 @@ Vcs-Git: https://github.com/jketterl/openwebrx.git Package: openwebrx Architecture: all -Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.4), python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} -Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, soapysdr-tools +Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.4), soapysdr-tools, python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} +Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, eb200-connector Description: multi-user web sdr Open source, multi-user SDR receiver with a web interface \ No newline at end of file From b380187453ca1289bc7786c2fc5844a2c42906cd Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 1 Dec 2020 21:39:22 +0100 Subject: [PATCH 15/41] add docker build for eb200 devices --- docker.sh | 2 +- docker/Dockerfiles/Dockerfile-eb200 | 12 +++++++ docker/scripts/install-connectors.sh | 4 +-- docker/scripts/install-dependencies-eb200.sh | 33 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 docker/Dockerfiles/Dockerfile-eb200 create mode 100755 docker/scripts/install-dependencies-eb200.sh diff --git a/docker.sh b/docker.sh index eda1ad0..1be3001 100755 --- a/docker.sh +++ b/docker.sh @@ -2,7 +2,7 @@ set -euo pipefail ARCH=$(uname -m) -IMAGES="openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-airspy openwebrx-rtlsdr-soapy openwebrx-plutosdr openwebrx-limesdr openwebrx-soapyremote openwebrx-perseus openwebrx-fcdpp openwebrx-radioberry openwebrx-uhd openwebrx-redpitaya openwebrx-rtltcp openwebrx-full openwebrx" +IMAGES="openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-airspy openwebrx-rtlsdr-soapy openwebrx-plutosdr openwebrx-limesdr openwebrx-soapyremote openwebrx-perseus openwebrx-fcdpp openwebrx-radioberry openwebrx-uhd openwebrx-redpitaya openwebrx-rtltcp openwebrx-eb200 openwebrx-full openwebrx" ALL_ARCHS="x86_64 armv7l aarch64" TAG=${TAG:-"latest"} ARCHTAG="$TAG-$ARCH" diff --git a/docker/Dockerfiles/Dockerfile-eb200 b/docker/Dockerfiles/Dockerfile-eb200 new file mode 100644 index 0000000..f2f5181 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-eb200 @@ -0,0 +1,12 @@ +ARG ARCHTAG +FROM openwebrx-base:$ARCHTAG + +COPY docker/scripts/install-connectors.sh \ + docker/scripts/install-dependencies-eb200.sh / + +RUN /install-connectors.sh &&\ + rm /install-connectors.sh && \ + /install-dependencies-eb200.sh && \ + rm /install-dependencies-eb200.sh + +COPY . /opt/openwebrx diff --git a/docker/scripts/install-connectors.sh b/docker/scripts/install-connectors.sh index 9307fff..be76988 100755 --- a/docker/scripts/install-connectors.sh +++ b/docker/scripts/install-connectors.sh @@ -24,8 +24,8 @@ apt-get update apt-get -y install --no-install-recommends $BUILD_PACKAGES git clone https://github.com/jketterl/owrx_connector.git -# latest develop as of 2020-11-28 (c++ refactoring) -cmakebuild owrx_connector 8c7982f1f91bb38f359126725de64a5875221898 +# latest develop as of 2020-11-28 (int32 samples; debhelper) +cmakebuild owrx_connector 87a2fcc54e221aad71ec0700737ca7f385c388de apt-get -y purge --autoremove $BUILD_PACKAGES apt-get clean diff --git a/docker/scripts/install-dependencies-eb200.sh b/docker/scripts/install-dependencies-eb200.sh new file mode 100755 index 0000000..ce0aba1 --- /dev/null +++ b/docker/scripts/install-dependencies-eb200.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -euxo pipefail +export MAKEFLAGS="-j4" + +function cmakebuild() { + cd $1 + if [[ ! -z "${2:-}" ]]; then + git checkout $2 + fi + mkdir build + cd build + cmake .. + make + make install + cd ../.. + rm -rf $1 +} + +cd /tmp + +STATIC_PACKAGES="" +BUILD_PACKAGES="git cmake make gcc g++ pkg-config" + +apt-get update +apt-get -y install --no-install-recommends $STATIC_PACKAGES $BUILD_PACKAGES + +git clone https://github.com/jketterl/eb200_connector.git +# latest from develop as of 2020-12-01 +cmakebuild eb200_connector 9c8313770c1072df72d2fdb85307ca206c29c60a + +apt-get -y purge --autoremove $BUILD_PACKAGES +apt-get clean +rm -rf /var/lib/apt/lists/* From 7ad5ca03b0d6b1c2cef859d6365d5b7efc4ebdcc Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 1 Dec 2020 21:42:20 +0100 Subject: [PATCH 16/41] add eb200 to full build --- docker/Dockerfiles/Dockerfile-full | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfiles/Dockerfile-full b/docker/Dockerfiles/Dockerfile-full index 3a38c9f..3462848 100644 --- a/docker/Dockerfiles/Dockerfile-full +++ b/docker/Dockerfiles/Dockerfile-full @@ -20,6 +20,7 @@ RUN /install-dependencies-rtlsdr.sh &&\ /install-dependencies-uhd.sh &&\ /install-dependencies-redpitaya.sh &&\ /install-connectors.sh &&\ + /install-dependencies-eb200.sh &&\ rm /install-dependencies-*.sh &&\ rm /install-lib.*.patch && \ rm /install-connectors.sh From 1894ed50d14d71d134a685009e3b224a61578b0b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 1 Dec 2020 23:33:05 +0100 Subject: [PATCH 17/41] add hpsdrconnector docker build --- docker/Dockerfiles/Dockerfile-full | 1 + docker/Dockerfiles/Dockerfile-hpsdr | 9 ++++ docker/scripts/install-dependencies-hpsdr.sh | 46 ++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 docker/Dockerfiles/Dockerfile-hpsdr create mode 100755 docker/scripts/install-dependencies-hpsdr.sh diff --git a/docker/Dockerfiles/Dockerfile-full b/docker/Dockerfiles/Dockerfile-full index 3462848..b68d18a 100644 --- a/docker/Dockerfiles/Dockerfile-full +++ b/docker/Dockerfiles/Dockerfile-full @@ -19,6 +19,7 @@ RUN /install-dependencies-rtlsdr.sh &&\ /install-dependencies-radioberry.sh &&\ /install-dependencies-uhd.sh &&\ /install-dependencies-redpitaya.sh &&\ + /install-dependencies-hpsdr.sh &&\ /install-connectors.sh &&\ /install-dependencies-eb200.sh &&\ rm /install-dependencies-*.sh &&\ diff --git a/docker/Dockerfiles/Dockerfile-hpsdr b/docker/Dockerfiles/Dockerfile-hpsdr new file mode 100644 index 0000000..96d58b9 --- /dev/null +++ b/docker/Dockerfiles/Dockerfile-hpsdr @@ -0,0 +1,9 @@ +ARG ARCHTAG +FROM openwebrx-base:$ARCHTAG + +COPY docker/scripts/install-dependencies-hpsdr.sh / + +RUN /install-dependencies-hpsdr.sh &&\ + rm /install-dependencies-hpsdr.sh + +COPY . /opt/openwebrx diff --git a/docker/scripts/install-dependencies-hpsdr.sh b/docker/scripts/install-dependencies-hpsdr.sh new file mode 100755 index 0000000..f1c0bed --- /dev/null +++ b/docker/scripts/install-dependencies-hpsdr.sh @@ -0,0 +1,46 @@ +#!/bin/bash +set -euxo pipefail +export MAKEFLAGS="-j4" + +BUILD_PACKAGES="git wget" + +apt-get update +apt-get -y install --no-install-recommends $BUILD_PACKAGES + +pushd /tmp + +ARCH=$(uname -m) +GOVERSION=1.15.5 + +case ${ARCH} in + x86_64) + PACKAGE=go${GOVERSION}.linux-amd64.tar.gz + ;; + armv*) + PACKAGE=go${GOVERSION}.linux-armv6l.tar.gz + ;; + aarch64) + PACKAGE=go${GOVERSION}.linux-arm64.tar.gz + ;; +esac + +wget https://golang.org/dl/${PACKAGE} +tar xfz $PACKAGE + +git clone https://github.com/jancona/hpsdrconnector.git +pushd hpsdrconnector +git checkout v0.4.2 +/tmp/go/bin/go build +install -m 0755 hpsdrconnector /usr/local/bin + +popd + +rm -rf hpsdrconnector +rm -rf go +rm $PACKAGE + +popd + +apt-get -y purge --autoremove $BUILD_PACKAGES +apt-get clean +rm -rf /var/lib/apt/lists/* From 00d496086e11163dec5e8e4d6c1ca767fb82dc23 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 2 Dec 2020 16:50:14 +0100 Subject: [PATCH 18/41] add gcc as it seems to be required on arm (?) --- docker/scripts/install-dependencies-hpsdr.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/install-dependencies-hpsdr.sh b/docker/scripts/install-dependencies-hpsdr.sh index f1c0bed..b6c97c1 100755 --- a/docker/scripts/install-dependencies-hpsdr.sh +++ b/docker/scripts/install-dependencies-hpsdr.sh @@ -2,7 +2,7 @@ set -euxo pipefail export MAKEFLAGS="-j4" -BUILD_PACKAGES="git wget" +BUILD_PACKAGES="git wget gcc" apt-get update apt-get -y install --no-install-recommends $BUILD_PACKAGES From e6cbe6ffc8c2a2e0465a77d04fd124faab12c274 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 2 Dec 2020 16:51:52 +0100 Subject: [PATCH 19/41] add hpsdr build --- debian/control | 2 +- docker.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/control b/debian/control index e7fb065..a946b32 100644 --- a/debian/control +++ b/debian/control @@ -11,6 +11,6 @@ Vcs-Git: https://github.com/jketterl/openwebrx.git Package: openwebrx Architecture: all Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.4), soapysdr-tools, python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} -Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, eb200-connector +Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, eb200-connector, hpsdrconnector Description: multi-user web sdr Open source, multi-user SDR receiver with a web interface \ No newline at end of file diff --git a/docker.sh b/docker.sh index 1be3001..1583af6 100755 --- a/docker.sh +++ b/docker.sh @@ -2,7 +2,7 @@ set -euo pipefail ARCH=$(uname -m) -IMAGES="openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-airspy openwebrx-rtlsdr-soapy openwebrx-plutosdr openwebrx-limesdr openwebrx-soapyremote openwebrx-perseus openwebrx-fcdpp openwebrx-radioberry openwebrx-uhd openwebrx-redpitaya openwebrx-rtltcp openwebrx-eb200 openwebrx-full openwebrx" +IMAGES="openwebrx-rtlsdr openwebrx-sdrplay openwebrx-hackrf openwebrx-airspy openwebrx-rtlsdr-soapy openwebrx-plutosdr openwebrx-limesdr openwebrx-soapyremote openwebrx-perseus openwebrx-fcdpp openwebrx-radioberry openwebrx-uhd openwebrx-redpitaya openwebrx-rtltcp openwebrx-eb200 openwebrx-hpsdr openwebrx-full openwebrx" ALL_ARCHS="x86_64 armv7l aarch64" TAG=${TAG:-"latest"} ARCHTAG="$TAG-$ARCH" From 2b6456168e4d844a775ca2e8fcd61708d83bac73 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 2 Dec 2020 17:59:24 +0100 Subject: [PATCH 20/41] add libc6-dev for header files --- docker/scripts/install-dependencies-hpsdr.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/install-dependencies-hpsdr.sh b/docker/scripts/install-dependencies-hpsdr.sh index b6c97c1..03ff176 100755 --- a/docker/scripts/install-dependencies-hpsdr.sh +++ b/docker/scripts/install-dependencies-hpsdr.sh @@ -2,7 +2,7 @@ set -euxo pipefail export MAKEFLAGS="-j4" -BUILD_PACKAGES="git wget gcc" +BUILD_PACKAGES="git wget gcc libc6-dev" apt-get update apt-get -y install --no-install-recommends $BUILD_PACKAGES From 49ec66e27c99dd5f2b338497f724f7d3be0302a9 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 2 Dec 2020 23:35:37 +0100 Subject: [PATCH 21/41] add hpsdr change log notice --- CHANGELOG.md | 1 + debian/changelog | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 329834a..c8ecf6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ - Introduced `squelch_auto_margin` config option that allows configuring the auto squelch level - Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors - New devices supported: + - HPSDR devices (Hermes Lite 2) - BBRF103 / RX666 / RX888 devices supported by libsddc - Devices using the EB200 protocol diff --git a/debian/changelog b/debian/changelog index 81a61b8..1bef262 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,9 @@ openwebrx (0.21.0) UNRELEASED; urgency=low * Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors * New devices supported: - - BBRF103 / RX666 / RX888 devices supported by libsddc - - Devices using the EB200 protocol + - HPSDR devices (Hermes Lite 2) (`"type": "hpsdr"`) + - BBRF103 / RX666 / RX888 devices supported by libsddc (`"type": "sddc"`) + - Devices using the EB200 protocol (`"type": "eb200"`) -- Jakob Ketterl Sun, 11 Oct 2020 21:12:00 +0000 From 9a8c0ce442c30797286371be84e7dcdf3f9c948e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Wed, 2 Dec 2020 23:36:30 +0100 Subject: [PATCH 22/41] update list of device types in config --- config_webrx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_webrx.py b/config_webrx.py index 0bb707f..c9f0939 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -117,7 +117,7 @@ Note: if you experience audio underruns while CPU usage is 100%, you can: # Currently supported types of sdr receivers: # "rtl_sdr", "rtl_sdr_soapy", "sdrplay", "hackrf", "airspy", "airspyhf", "fifi_sdr", # "perseussdr", "lime_sdr", "pluto_sdr", "soapy_remote", "hpsdr", "red_pitaya", "uhd", -# "radioberry", "fcdpp", "rtl_tcp" +# "radioberry", "fcdpp", "rtl_tcp", "sddc", "eb200" # For more details on specific types, please checkout the wiki: # https://github.com/jketterl/openwebrx/wiki/Supported-Hardware#sdr-devices From e6ea3832fc2ea0b7933f6e878644d0ec089e2a03 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 4 Dec 2020 00:11:47 +0100 Subject: [PATCH 23/41] add aprs-symbols debian package --- config_webrx.py | 2 +- debian/control | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config_webrx.py b/config_webrx.py index c9f0939..5858075 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -326,7 +326,7 @@ aprs_igate_password = "" aprs_igate_beacon = False # path to the aprs symbols repository (get it here: https://github.com/hessu/aprs-symbols) -aprs_symbols_path = "/opt/aprs-symbols/png" +aprs_symbols_path = "/usr/share/aprs-symbols/png" # === PSK Reporter setting === # enable this if you want to upload all ft8, ft4 etc spots to pskreporter.info diff --git a/debian/control b/debian/control index a946b32..3538a8d 100644 --- a/debian/control +++ b/debian/control @@ -11,6 +11,6 @@ Vcs-Git: https://github.com/jketterl/openwebrx.git Package: openwebrx Architecture: all Depends: adduser, python3 (>= 3.5), python3-pkg-resources, csdr (>= 0.17), netcat, owrx-connector (>= 0.4), soapysdr-tools, python3-js8py (>= 0.1), ${python3:Depends}, ${misc:Depends} -Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, eb200-connector, hpsdrconnector +Recommends: digiham (>= 0.3), dsd (>= 1.7), sox, direwolf (>= 1.4), wsjtx, eb200-connector, hpsdrconnector, aprs-symbols Description: multi-user web sdr Open source, multi-user SDR receiver with a web interface \ No newline at end of file From c4ed481ce20e69f0f9aed9ed78f8c1524933f70a Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 4 Dec 2020 00:12:51 +0100 Subject: [PATCH 24/41] update aprs-symbols location for docker --- docker/scripts/install-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index a86aa56..22ee454 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -107,7 +107,7 @@ rm -rf dream rm dream-2.1.1-svn808.tar.gz git clone https://github.com/hessu/aprs-symbols /opt/aprs-symbols -pushd /opt/aprs-symbols +pushd /usr/share/aprs-symbols git checkout 5c2abe2658ee4d2563f3c73b90c6f59124839802 popd From e2fa293c74cedd1c15c4368c328cf323d7eba9cf Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Fri, 4 Dec 2020 00:39:05 +0100 Subject: [PATCH 25/41] fix paths --- docker/scripts/install-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index 22ee454..f2763e1 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -106,7 +106,7 @@ popd rm -rf dream rm dream-2.1.1-svn808.tar.gz -git clone https://github.com/hessu/aprs-symbols /opt/aprs-symbols +git clone https://github.com/hessu/aprs-symbols /usr/share/aprs-symbols pushd /usr/share/aprs-symbols git checkout 5c2abe2658ee4d2563f3c73b90c6f59124839802 popd From a3fd9319317048e3394ba2a2d2f87cc5ba37c393 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 00:21:46 +0100 Subject: [PATCH 26/41] demodulate digimodes starting at 0 Hz --- owrx/modes.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/owrx/modes.py b/owrx/modes.py index 3e607eb..4e9a3a8 100644 --- a/owrx/modes.py +++ b/owrx/modes.py @@ -53,14 +53,14 @@ class Modes(object): AnalogMode("drm", "DRM", bandpass=Bandpass(-5000, 5000), requirements=["drm"], squelch=False), 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("ft8", "FT8", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["wsjt-x"], service=True), + DigitalMode("ft4", "FT4", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["wsjt-x"], service=True), + DigitalMode("jt65", "JT65", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["wsjt-x"], service=True), + DigitalMode("jt9", "JT9", underlying=["usb"], bandpass=Bandpass(0, 3000), 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("js8", "JS8Call", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["js8call"], service=True), DigitalMode( "packet", "Packet", From bee6ddc843d2cb600fd7bc8f4afddfe484a0dbb5 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 00:36:20 +0100 Subject: [PATCH 27/41] use information from the mode registry to set up services --- csdr/csdr.py | 3 +++ owrx/modes.py | 14 ++++++++++++ owrx/service/__init__.py | 49 ++++++++++++++++++++++------------------ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/csdr/csdr.py b/csdr/csdr.py index db7c2fc..5ac7925 100644 --- a/csdr/csdr.py +++ b/csdr/csdr.py @@ -656,6 +656,9 @@ class dsp(object): def get_operating_freq(self): return self.center_freq + self.offset_freq + def set_bandpass(self, bandpass): + self.set_bpf(bandpass.low_cut, bandpass.high_cut) + def set_bpf(self, low_cut, high_cut): self.low_cut = low_cut self.high_cut = high_cut diff --git a/owrx/modes.py b/owrx/modes.py index 4e9a3a8..91fd268 100644 --- a/owrx/modes.py +++ b/owrx/modes.py @@ -24,6 +24,12 @@ class Mode(object): def is_service(self): return self.service + def get_bandpass(self): + return self.bandpass + + def get_modulation(self): + return self.modulation + class AnalogMode(Mode): pass @@ -36,6 +42,14 @@ class DigitalMode(Mode): super().__init__(modulation, name, bandpass, requirements, service, squelch) self.underlying = underlying + def get_bandpass(self): + if self.bandpass is not None: + return self.bandpass + return Modes.findByModulation(self.underlying[0]).get_bandpass() + + def get_modulation(self): + return Modes.findByModulation(self.underlying[0]).get_modulation() + class Modes(object): mappings = [ diff --git a/owrx/service/__init__.py b/owrx/service/__init__.py index 8ca2e3f..ccd8107 100644 --- a/owrx/service/__init__.py +++ b/owrx/service/__init__.py @@ -155,18 +155,15 @@ class ServiceHandler(SdrSourceEventClient): ) else: for group in groups: - frequencies = sorted([f["frequency"] for f in group]) - min = frequencies[0] - max = frequencies[-1] - cf = (min + max) / 2 - bw = max - min + cf = self.get_center_frequency(group) + bw = self.get_bandwidth(group) + logger.debug(bw) logger.debug( "group center frequency: {0}, bandwidth: {1}".format(cf, bw) ) resampler_props = PropertyLayer() resampler_props["center_freq"] = cf - # TODO the + 24000 is a temporary fix since the resampling optimizer does not account for required bandwidths - resampler_props["samp_rate"] = bw + 24000 + resampler_props["samp_rate"] = bw resampler = Resampler(resampler_props, self.source) resampler.start() @@ -180,6 +177,23 @@ class ServiceHandler(SdrSourceEventClient): # resampler goes in after the services since it must not be shutdown as long as the services are still running self.services.append(resampler) + def get_min_max(self, group): + frequencies = sorted(group, key=lambda f: f["frequency"]) + lowest = frequencies[0] + min = lowest["frequency"] + Modes.findByModulation(lowest["mode"]).get_bandpass().low_cut + highest = frequencies[-1] + max = highest["frequency"] + Modes.findByModulation(highest["mode"]).get_bandpass().high_cut + return min, max + + def get_center_frequency(self, group): + min, max = self.get_min_max(group) + return (min + max) / 2 + + def get_bandwidth(self, group): + minFreq, maxFreq = self.get_min_max(group) + # minimum bandwidth for a resampler: 25kHz + return max(maxFreq - minFreq, 25000) + def optimizeResampling(self, freqs, bandwidth): freqs = sorted(freqs, key=lambda f: f["frequency"]) distances = [ @@ -203,12 +217,10 @@ class ServiceHandler(SdrSourceEventClient): previous = split groups.append([f for f in freqs if previous < f["frequency"]]) - def get_bandwitdh(group): - freqs = sorted([f["frequency"] for f in group]) - # the group will process the full BW once, plus the reduced BW once for each group member - return bandwidth + len(group) * (freqs[-1] - freqs[0] + 24000) + def get_total_bandwidth(group): + return bandwidth + len(group) * self.get_bandwidth(group) - total_bandwidth = sum([get_bandwitdh(group) for group in groups]) + total_bandwidth = sum([get_total_bandwidth(group) for group in groups]) return { "num_splits": num_splits, "total_bandwidth": total_bandwidth, @@ -250,16 +262,9 @@ class ServiceHandler(SdrSourceEventClient): center_freq = source.getProps()["center_freq"] d.set_offset_freq(frequency - center_freq) d.set_center_freq(center_freq) - if mode == "packet": - d.set_demodulator("nfm") - d.set_bpf(-6250, 6250) - elif mode == "wspr": - d.set_demodulator("usb") - # WSPR only samples between 1400 and 1600 Hz - d.set_bpf(1350, 1650) - else: - d.set_demodulator("usb") - d.set_bpf(0, 3000) + modeObject = Modes.findByModulation(mode) + d.set_demodulator(modeObject.get_modulation()) + d.set_bandpass(modeObject.get_bandpass()) d.set_secondary_demodulator(mode) d.set_audio_compression("none") d.set_samp_rate(source.getProps()["samp_rate"]) From 6f46e4d376e6beceaad91c9439bb30c4bc854e7f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 00:42:48 +0100 Subject: [PATCH 28/41] remove debugging --- owrx/service/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/owrx/service/__init__.py b/owrx/service/__init__.py index ccd8107..5984050 100644 --- a/owrx/service/__init__.py +++ b/owrx/service/__init__.py @@ -157,7 +157,6 @@ class ServiceHandler(SdrSourceEventClient): for group in groups: cf = self.get_center_frequency(group) bw = self.get_bandwidth(group) - logger.debug(bw) logger.debug( "group center frequency: {0}, bandwidth: {1}".format(cf, bw) ) From 8e760a0fccffe227aa5979a8c1d579a9d2d02993 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 00:43:45 +0100 Subject: [PATCH 29/41] use new direwolf 1.6 --- docker/scripts/install-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index f2763e1..f047769 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -69,7 +69,7 @@ mv /wsjtx.patch ${WSJT_DIR} cmakebuild ${WSJT_DIR} rm ${WSJT_TGZ} -git clone --depth 1 -b 1.5 https://github.com/wb2osz/direwolf.git +git clone --depth 1 -b 1.6 https://github.com/wb2osz/direwolf.git cd direwolf # hamlib is present (necessary for the wsjt-x and js8call builds) and would be used, but there's no real need. # by setting enable_hamlib we prevent direwolf from linking to it, and it can be stripped at the end of the script. From 8c105b0c40acbf499a8f1e2b0981f4afdb8b090e Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 01:44:14 +0100 Subject: [PATCH 30/41] fix direwolf build (uses cmake now) --- docker/Dockerfiles/Dockerfile-base | 1 + docker/files/direwolf/direwolf-hamlib.patch | 20 ++++++++++++++++++++ docker/scripts/install-dependencies.sh | 10 +++++++--- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 docker/files/direwolf/direwolf-hamlib.patch diff --git a/docker/Dockerfiles/Dockerfile-base b/docker/Dockerfiles/Dockerfile-base index 59b380d..c338dc0 100644 --- a/docker/Dockerfiles/Dockerfile-base +++ b/docker/Dockerfiles/Dockerfile-base @@ -4,6 +4,7 @@ COPY docker/files/js8call/js8call-hamlib.patch \ docker/files/wsjtx/wsjtx.patch \ docker/files/wsjtx/wsjtx-hamlib.patch \ docker/files/dream/dream.patch \ + docker/files/direwolf/direwolf-hamlib.patch \ docker/scripts/install-dependencies.sh / RUN /install-dependencies.sh && \ rm /install-dependencies.sh && \ diff --git a/docker/files/direwolf/direwolf-hamlib.patch b/docker/files/direwolf/direwolf-hamlib.patch new file mode 100644 index 0000000..2347c24 --- /dev/null +++ b/docker/files/direwolf/direwolf-hamlib.patch @@ -0,0 +1,20 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9e710f5..da90b43 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -257,13 +257,8 @@ else() + set(GPSD_LIBRARIES "") + endif() + +-find_package(hamlib) +-if(HAMLIB_FOUND) +- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_HAMLIB") +-else() +- set(HAMLIB_INCLUDE_DIRS "") +- set(HAMLIB_LIBRARIES "") +-endif() ++set(HAMLIB_INCLUDE_DIRS "") ++set(HAMLIB_LIBRARIES "") + + if(LINUX) + find_package(ALSA REQUIRED) diff --git a/docker/scripts/install-dependencies.sh b/docker/scripts/install-dependencies.sh index f047769..338201c 100755 --- a/docker/scripts/install-dependencies.sh +++ b/docker/scripts/install-dependencies.sh @@ -72,10 +72,14 @@ rm ${WSJT_TGZ} git clone --depth 1 -b 1.6 https://github.com/wb2osz/direwolf.git cd direwolf # hamlib is present (necessary for the wsjt-x and js8call builds) and would be used, but there's no real need. -# by setting enable_hamlib we prevent direwolf from linking to it, and it can be stripped at the end of the script. -make enable_hamlib= +# this patch prevents direwolf from linking to it, and it can be stripped at the end of the script. +patch -Np1 < /direwolf-hamlib.patch +mkdir build +cd build +cmake .. +make make install -cd .. +cd ../.. rm -rf direwolf # strip lots of generic documentation that will never be read inside a docker container rm /usr/local/share/doc/direwolf/*.pdf From cbdb14396677755faefa9e39001dbebfc94d928f Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Sun, 6 Dec 2020 23:24:57 +0100 Subject: [PATCH 31/41] allow 25kHz packet when manually adjusting --- htdocs/lib/Demodulator.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/lib/Demodulator.js b/htdocs/lib/Demodulator.js index a1f3798..de6f3c5 100644 --- a/htdocs/lib/Demodulator.js +++ b/htdocs/lib/Demodulator.js @@ -11,6 +11,8 @@ Filter.prototype.getLimits = function() { max_bw = 80000; } else if (this.demodulator.get_modulation() === 'drm') { max_bw = 100000; + } else if (this.demodulator.get_secondary_demod() === 'packet') { + max_bw = 12500; } else { max_bw = (audioEngine.getOutputRate() / 2) - 1; } From 71c649b016c10d81736ca829a0bf6d17c94cb713 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 11:52:46 +0100 Subject: [PATCH 32/41] add and definitions for VLF bands including frequencies for FST4/FST4W --- bands.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/bands.json b/bands.json index f216d5e..ad7cc8c 100644 --- a/bands.json +++ b/bands.json @@ -1,4 +1,22 @@ [ + { + "name": "2190m", + "lower_bound": 135700, + "upper_bound": 137800, + "frequencies": { + "fst4": 136000, + "fst4w": 136000 + } + }, + { + "name": "630m", + "lower_bound": 472000, + "upper_bound": 479000, + "frequencies": { + "fst4": 474200, + "fst4w": 474200 + } + }, { "name": "160m", "lower_bound": 1810000, @@ -9,7 +27,9 @@ "wspr": 1836600, "jt65": 1838000, "jt9": 1839000, - "js8": 1842000 + "js8": 1842000, + "fst4": 1839000, + "fst4w": 1836800 } }, { From ac4401175f3f6e806c54cb1d13fda1aa4a9c263b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 11:56:01 +0100 Subject: [PATCH 33/41] add FST4 and FST4W modes --- csdr/csdr.py | 24 ++++++++------- owrx/modes.py | 2 ++ owrx/wsjt.py | 81 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/csdr/csdr.py b/csdr/csdr.py index 5ac7925..b6d4453 100644 --- a/csdr/csdr.py +++ b/csdr/csdr.py @@ -29,7 +29,7 @@ import math from functools import partial from owrx.kiss import KissClient, DirewolfConfig -from owrx.wsjt import Ft8Profile, WsprProfile, Jt9Profile, Jt65Profile, Ft4Profile +from owrx.wsjt import Ft8Profile, WsprProfile, Jt9Profile, Jt65Profile, Ft4Profile, Fst4Profile, Fst4wProfile from owrx.js8 import Js8Profiles from owrx.audio import AudioChopper @@ -412,19 +412,23 @@ class dsp(object): if self.isWsjtMode(): smd = self.get_secondary_demodulator() - chopper_profile = None + chopper_profiles = None if smd == "ft8": - chopper_profile = Ft8Profile() + chopper_profiles = [Ft8Profile()] elif smd == "wspr": - chopper_profile = WsprProfile() + chopper_profiles = [WsprProfile()] elif smd == "jt65": - chopper_profile = Jt65Profile() + chopper_profiles = [Jt65Profile()] elif smd == "jt9": - chopper_profile = Jt9Profile() + chopper_profiles = [Jt9Profile()] elif smd == "ft4": - chopper_profile = Ft4Profile() - if chopper_profile is not None: - chopper = AudioChopper(self, self.secondary_process_demod.stdout, chopper_profile) + chopper_profiles = [Ft4Profile()] + elif smd == "fst4": + chopper_profiles = Fst4Profile.getEnabledProfiles() + elif smd == "fst4w": + chopper_profiles = Fst4wProfile.getEnabledProfiles() + if chopper_profiles is not None and len(chopper_profiles): + chopper = AudioChopper(self, self.secondary_process_demod.stdout, *chopper_profiles) chopper.start() self.output.send_output("wsjt_demod", chopper.read) elif self.isJs8(): @@ -566,7 +570,7 @@ class dsp(object): def isWsjtMode(self, demodulator=None): if demodulator is None: demodulator = self.get_secondary_demodulator() - return demodulator in ["ft8", "wspr", "jt65", "jt9", "ft4"] + return demodulator in ["ft8", "wspr", "jt65", "jt9", "ft4", "fst4", "fst4w"] def isJs8(self, demodulator = None): if demodulator is None: diff --git a/owrx/modes.py b/owrx/modes.py index 91fd268..0d1561f 100644 --- a/owrx/modes.py +++ b/owrx/modes.py @@ -74,6 +74,8 @@ class Modes(object): DigitalMode( "wspr", "WSPR", underlying=["usb"], bandpass=Bandpass(1350, 1650), requirements=["wsjt-x"], service=True ), + DigitalMode("fst4", "FST4", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["wsjt-x"], service=True), + DigitalMode("fst4w", "FST4W", underlying=["usb"], bandpass=Bandpass(1350, 1650), requirements=["wsjt-x"], service=True), DigitalMode("js8", "JS8Call", underlying=["usb"], bandpass=Bandpass(0, 3000), requirements=["js8call"], service=True), DigitalMode( "packet", diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 0ba8160..60df558 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -85,8 +85,52 @@ class Ft4Profile(WsjtProfile): return ["jt9", "--ft4", "-d", str(self.decoding_depth("ft4")), file] +class Fst4Profile(WsjtProfile): + availableIntervals = [15, 30, 60, 120, 300, 900, 1800] + + def __init__(self, interval): + self.interval = interval + + def getInterval(self): + return self.interval + + def getFileTimestampFormat(self): + return "%y%m%d_%H%M%S" + + def decoder_commandline(self, file): + return ["jt9", "--fst4", "-b", "FST4-{0}".format(self.interval), "-d", str(self.decoding_depth("fst4")), file] + + @staticmethod + def getEnabledProfiles(): + config = Config.get() + profiles = config["fst4_enabled_intervals"] if "fst4_enabled_intervals" in config else [] + return [Fst4Profile(i) for i in profiles if i in Fst4Profile.availableIntervals] + + +class Fst4wProfile(WsjtProfile): + availableIntervals = [120, 300, 900, 1800] + + def __init__(self, interval): + self.interval = interval + + def getInterval(self): + return self.interval + + def getFileTimestampFormat(self): + return "%y%m%d_%H%M%S" + + def decoder_commandline(self, file): + return ["jt9", "--fst4w", "-b", "FST4W-{0}".format(self.interval), "-d", str(self.decoding_depth("fst4w")), file] + + @staticmethod + def getEnabledProfiles(): + config = Config.get() + profiles = config["fst4w_enabled_intervals"] if "fst4w_enabled_intervals" in config else [] + return [Fst4Profile(i) for i in profiles if i in Fst4Profile.availableIntervals] + + class WsjtParser(Parser): - modes = {"~": "FT8", "#": "JT65", "@": "JT9", "+": "FT4"} + modes = {"~": "FT8", "#": "JT65", "@": "JT9", "+": "FT4", "`": "FST4"} def parse(self, messages): for data in messages: @@ -115,7 +159,7 @@ class WsjtParser(Parser): PskReporter.getSharedInstance().spot(out) self.handler.write_wsjt_message(out) - except ValueError: + except (ValueError, IndexError): logger.exception("error while parsing wsjt message") def pushDecode(self, mode): @@ -139,6 +183,8 @@ class WsjtParser(Parser): class Decoder(ABC): + locator_pattern = re.compile(".*\\s([A-Z0-9]+)\\s([A-R]{2}[0-9]{2})$") + def parse_timestamp(self, instring, dateformat): ts = datetime.strptime(instring, dateformat) return int( @@ -149,23 +195,36 @@ class Decoder(ABC): def parse(self, msg, dial_freq): pass + def parseMessage(self, msg): + m = Decoder.locator_pattern.match(msg) + if m is None: + return {} + # this is a valid locator in theory, but it's somewhere in the arctic ocean, near the north pole, so it's very + # likely this just means roger roger goodbye. + if m.group(2) == "RR73": + return {"callsign": m.group(1)} + return {"callsign": m.group(1), "locator": m.group(2)} + class Jt9Decoder(Decoder): - locator_pattern = re.compile(".*\\s([A-Z0-9]+)\\s([A-R]{2}[0-9]{2})$") - def parse(self, msg, dial_freq): # ft8 sample # '222100 -15 -0.0 508 ~ CQ EA7MJ IM66' # jt65 sample # '2352 -7 0.4 1801 # R0WAS R2ABM KO85' # '0003 -4 0.4 1762 # CQ R2ABM KO85' + # fst4 sample + # '**** -23 0.6 3023 ` <...> <...> R 591631 BI53PV' modes = list(WsjtParser.modes.keys()) if msg[19] in modes: dateformat = "%H%M" else: dateformat = "%H%M%S" - timestamp = self.parse_timestamp(msg[0 : len(dateformat)], dateformat) - msg = msg[len(dateformat) + 1 :] + try: + timestamp = self.parse_timestamp(msg[0 : len(dateformat)], dateformat) + except ValueError: + timestamp = None + msg = msg[len(dateformat) + 1:] modeChar = msg[14:15] mode = WsjtParser.modes[modeChar] if modeChar in WsjtParser.modes else "unknown" wsjt_msg = msg[17:53].strip() @@ -181,16 +240,6 @@ class Jt9Decoder(Decoder): result.update(self.parseMessage(wsjt_msg)) return result - def parseMessage(self, msg): - m = Jt9Decoder.locator_pattern.match(msg) - if m is None: - return {} - # this is a valid locator in theory, but it's somewhere in the arctic ocean, near the north pole, so it's very - # likely this just means roger roger goodbye. - if m.group(2) == "RR73": - return {"callsign": m.group(1)} - return {"callsign": m.group(1), "locator": m.group(2)} - class WsprDecoder(Decoder): wspr_splitter_pattern = re.compile("([A-Z0-9]*)\\s([A-R]{2}[0-9]{2})\\s([0-9]+)") From af4923c741dc31f666b18ff2b16d775c964594c3 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 11:56:21 +0100 Subject: [PATCH 34/41] enable reporting of FST4/FST4W to pskreporter --- owrx/pskreporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owrx/pskreporter.py b/owrx/pskreporter.py index 981ecc8..c3182b7 100644 --- a/owrx/pskreporter.py +++ b/owrx/pskreporter.py @@ -30,7 +30,7 @@ class PskReporter(object): sharedInstance = None creationLock = threading.Lock() interval = 300 - supportedModes = ["FT8", "FT4", "JT9", "JT65", "JS8"] + supportedModes = ["FT8", "FT4", "JT9", "JT65", "FST4", "FST4W", "JS8"] @staticmethod def getSharedInstance(): From 22a2bd1de1f2d96d4c629f83eba5cee0b346c671 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 11:57:34 +0100 Subject: [PATCH 35/41] default config for FST4/FST4W intervals --- config_webrx.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_webrx.py b/config_webrx.py index 5858075..e6d6970 100644 --- a/config_webrx.py +++ b/config_webrx.py @@ -306,6 +306,14 @@ wsjt_decoding_depth = 3 # jt65 seems to be somewhat prone to erroneous decodes, this setting handles that to some extent wsjt_decoding_depths = {"jt65": 1} +# FST4 can be transmitted in different intervals. This setting determines which intervals will be decoded. +# available values (in seconds): 15, 30, 60, 120, 300, 900, 1800 +fst4_enabled_intervals = [15, 30] + +# FST4W can be transmitted in different intervals. This setting determines which intervals will be decoded. +# available values (in seconds): 120, 300, 900, 1800 +fst4w_enabled_intervals = [120, 300] + # JS8 comes in different speeds: normal, slow, fast, turbo. This setting controls which ones are enabled. js8_enabled_profiles = ["normal", "slow"] # JS8 decoding depth; higher value will get more results, but will also consume more cpu From 917884b5f57b5e71d953ed3efd9cf85f0d2a754b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 11:59:43 +0100 Subject: [PATCH 36/41] add changelog message --- CHANGELOG.md | 1 + debian/changelog | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8ecf6a..8456653 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ **unreleased** - Introduced `squelch_auto_margin` config option that allows configuring the auto squelch level - Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors +- Added support for new WSJT-X modes FST4 and FST4W (only available with WSJT-X 2.3) - New devices supported: - HPSDR devices (Hermes Lite 2) - BBRF103 / RX666 / RX888 devices supported by libsddc diff --git a/debian/changelog b/debian/changelog index 1bef262..c7dc727 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,8 @@ openwebrx (0.21.0) UNRELEASED; urgency=low auto squelch level * Removed `port` configuration option; `rtltcp_compat` takes the port number with the new connectors + * Added support for new WSJT-X modes FST4 and FST4W (only available with + WSJT-X 2.3) * New devices supported: - HPSDR devices (Hermes Lite 2) (`"type": "hpsdr"`) - BBRF103 / RX666 / RX888 devices supported by libsddc (`"type": "sddc"`) From 05ca541a8e78f61295437c54f6560c06bfd18817 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Mon, 7 Dec 2020 20:29:22 +0100 Subject: [PATCH 37/41] fix jt9 parameters --- owrx/wsjt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 60df558..737beb7 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -98,7 +98,7 @@ class Fst4Profile(WsjtProfile): return "%y%m%d_%H%M%S" def decoder_commandline(self, file): - return ["jt9", "--fst4", "-b", "FST4-{0}".format(self.interval), "-d", str(self.decoding_depth("fst4")), file] + return ["jt9", "--fst4", "-p", str(self.interval), "-d", str(self.decoding_depth("fst4")), file] @staticmethod def getEnabledProfiles(): @@ -120,7 +120,7 @@ class Fst4wProfile(WsjtProfile): return "%y%m%d_%H%M%S" def decoder_commandline(self, file): - return ["jt9", "--fst4w", "-b", "FST4W-{0}".format(self.interval), "-d", str(self.decoding_depth("fst4w")), file] + return ["jt9", "--fst4w", "-p", str(self.interval), "-d", str(self.decoding_depth("fst4w")), file] @staticmethod def getEnabledProfiles(): From 603c3df1b6d72b56d0398148f2c9ba4b2d51bfc6 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 8 Dec 2020 00:00:21 +0100 Subject: [PATCH 38/41] fix fst4(w) filenames --- owrx/wsjt.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 737beb7..9070f9d 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -95,7 +95,9 @@ class Fst4Profile(WsjtProfile): return self.interval def getFileTimestampFormat(self): - return "%y%m%d_%H%M%S" + if self.interval < 60: + return "%y%m%d_%H%M%S" + return "%y%m%d_%H%M" def decoder_commandline(self, file): return ["jt9", "--fst4", "-p", str(self.interval), "-d", str(self.decoding_depth("fst4")), file] @@ -117,7 +119,9 @@ class Fst4wProfile(WsjtProfile): return self.interval def getFileTimestampFormat(self): - return "%y%m%d_%H%M%S" + if self.interval < 60: + return "%y%m%d_%H%M%S" + return "%y%m%d_%H%M" def decoder_commandline(self, file): return ["jt9", "--fst4w", "-p", str(self.interval), "-d", str(self.decoding_depth("fst4w")), file] From 519155a12f6d6a27b18ab4e24cc578f1dda5296b Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 8 Dec 2020 00:01:00 +0100 Subject: [PATCH 39/41] fix "R" callsign problem --- owrx/wsjt.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 9070f9d..123b5cb 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -187,7 +187,7 @@ class WsjtParser(Parser): class Decoder(ABC): - locator_pattern = re.compile(".*\\s([A-Z0-9]+)\\s([A-R]{2}[0-9]{2})$") + locator_pattern = re.compile(".*\\s([A-Z0-9]{2,})(\\sR)?\\s([A-R]{2}[0-9]{2})$") def parse_timestamp(self, instring, dateformat): ts = datetime.strptime(instring, dateformat) @@ -205,9 +205,9 @@ class Decoder(ABC): return {} # this is a valid locator in theory, but it's somewhere in the arctic ocean, near the north pole, so it's very # likely this just means roger roger goodbye. - if m.group(2) == "RR73": + if m.group(3) == "RR73": return {"callsign": m.group(1)} - return {"callsign": m.group(1), "locator": m.group(2)} + return {"callsign": m.group(1), "locator": m.group(3)} class Jt9Decoder(Decoder): From efac5b04490fa29288fd64c85223b96a94e61086 Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 8 Dec 2020 00:28:34 +0100 Subject: [PATCH 40/41] change job decoder error handling so errors reflect in metrics --- owrx/audio.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/owrx/audio.py b/owrx/audio.py index 330b88b..89956fd 100644 --- a/owrx/audio.py +++ b/owrx/audio.py @@ -194,10 +194,11 @@ class AudioWriter(object): try: rc = decoder.wait(timeout=10) if rc != 0: - logger.warning("decoder return code: %i", rc) + raise RuntimeError("decoder return code: {0}".format(rc)) except subprocess.TimeoutExpired: logger.warning("subprocess (pid=%i}) did not terminate correctly; sending kill signal.", decoder.pid) decoder.kill() + raise def start(self): (self.wavefilename, self.wavefile) = self.getWaveFile() From 3291dbe8d26d1e2f57bd2cf0f4a150619d7c24dc Mon Sep 17 00:00:00 2001 From: Jakob Ketterl Date: Tue, 8 Dec 2020 01:06:21 +0100 Subject: [PATCH 41/41] fix fst4w profile --- owrx/wsjt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/owrx/wsjt.py b/owrx/wsjt.py index 123b5cb..cb9c15e 100644 --- a/owrx/wsjt.py +++ b/owrx/wsjt.py @@ -130,7 +130,7 @@ class Fst4wProfile(WsjtProfile): def getEnabledProfiles(): config = Config.get() profiles = config["fst4w_enabled_intervals"] if "fst4w_enabled_intervals" in config else [] - return [Fst4Profile(i) for i in profiles if i in Fst4Profile.availableIntervals] + return [Fst4wProfile(i) for i in profiles if i in Fst4wProfile.availableIntervals] class WsjtParser(Parser):