From 21027f672c61d574f8222c71acbc30f50d701ef3 Mon Sep 17 00:00:00 2001 From: Jim Ancona Date: Mon, 23 Oct 2023 15:45:19 -0400 Subject: [PATCH] Allow configuration of HPSDR connector for multiple radios --- owrx/source/hpsdr.py | 48 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/owrx/source/hpsdr.py b/owrx/source/hpsdr.py index 71cb6912..d7334a29 100644 --- a/owrx/source/hpsdr.py +++ b/owrx/source/hpsdr.py @@ -1,11 +1,10 @@ from owrx.source.connector import ConnectorSource, ConnectorDeviceDescription -from owrx.command import Option +from owrx.command import Option, Flag from owrx.form.error import ValidationError -from owrx.form.input import Input, NumberInput, TextInput +from owrx.form.input import Input, NumberInput, TextInput, CheckboxInput from owrx.form.input.validator import RangeValidator from typing import List -# In order to use an HPSDR radio, you must install hpsdrconnector from https://github.com/jancona/hpsdrconnector # These are the command line options available: # --frequency uint # Tune to specified frequency in Hz (default 7100000) @@ -17,10 +16,17 @@ from typing import List # Use the specified samplerate: one of 48000, 96000, 192000, 384000 (default 96000) # --debug # Emit debug log messages on stdout +# --serverPort uint +# Server port for this radio (default 7300) # -# If you omit `remote` from config_webrx.py, hpsdrconnector will use the HPSDR discovery protocol -# to find radios on your local network and will connect to the first radio it discovered. - +# If a remote IP address is not set, the connector will use the HPSDR discovery protocol +# to find radios on the local network and will connect to the first radio it discovers. +# If there is more than one HPSDR radio on the network, the IP address of the desired radio +# should always be specified. +# To use multiple HPSDR radios, each radio should have its IP address and a unique server port +# specfied. For example: +# Radio 1: (Remote IP: 192.168.1.11, Server port: 7300) +# Radio 2: (Remote IP: 192.168.1.22, Server port: 7301) class HpsdrSource(ConnectorSource): def getCommandMapper(self): @@ -34,6 +40,8 @@ class HpsdrSource(ConnectorSource): "samp_rate": Option("--samplerate"), "remote": Option("--radio"), "rf_gain": Option("--gain"), + "server_port": Option("--serverPort"), + "debug": Flag("--debug"), } ) ) @@ -41,7 +49,12 @@ class HpsdrSource(ConnectorSource): class RemoteInput(TextInput): def __init__(self): super().__init__( - "remote", "Remote IP", infotext="Remote IP address to connect to." + "remote", + "Remote IP", + infotext=( + "HPSDR radio IP address. If it is not set, the connector will connect to the first radio it discovers. " + "If there is more than one HPSDR radio on the network, IP addresses of the desired radios should always be specified." + ) ) class HpsdrDeviceDescription(ConnectorDeviceDescription): @@ -51,11 +64,26 @@ class HpsdrDeviceDescription(ConnectorDeviceDescription): def getInputs(self) -> List[Input]: return super().getInputs() + [ RemoteInput(), - NumberInput("rf_gain", "LNA Gain", "LNA gain between 0 (-12dB) and 60 (48dB)", validator=RangeValidator(0, 60)), - ] + NumberInput( + "rf_gain", + "LNA Gain", + "LNA gain between 0 (-12dB) and 60 (48dB) (default 20)", + validator=RangeValidator(0, 60) + ), + CheckboxInput( + "debug", + "Show connector debugging messages in the log" + ), + NumberInput( + "server_port", + "Server port", + ("Radio server port (default 7300). When using multiple radios, each must be on a separate port, " + "e.g. 7300 for the first, 7301 for the second.") + ), + ] def getDeviceOptionalKeys(self): - return list(filter(lambda x : x not in ["rtltcp_compat", "iqswap"], super().getDeviceOptionalKeys())) + ["remote"] + return list(filter(lambda x : x not in ["rtltcp_compat", "iqswap"], super().getDeviceOptionalKeys())) + ["remote","debug","server_port"] def getProfileOptionalKeys(self): return list(filter(lambda x : x != "iqswap", super().getProfileOptionalKeys()))