From f8753f77eca44b4659880c9acd38f011911c0684 Mon Sep 17 00:00:00 2001 From: xssfox Date: Tue, 25 Mar 2025 22:39:20 +1100 Subject: [PATCH] user configurable baudrate --- tx/PacketTX.py | 9 ++++++++- tx/radio_wrappers.py | 46 +++++++++++++++++++++++++++++++++++------- tx/tx_picamera2_gps.py | 9 ++++++++- tx/tx_test_images.py | 9 ++++++++- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/tx/PacketTX.py b/tx/PacketTX.py index 8a47b4b..eb79b10 100644 --- a/tx/PacketTX.py +++ b/tx/PacketTX.py @@ -600,12 +600,18 @@ if __name__ == "__main__": parser.add_argument("--rfm98w-i2s", default=None, type=int, help="If set, configure a RFM98W on this SPI device number. Using I2S") parser.add_argument("--audio-device", default="hw:CARD=i2smaster,DEV=0", type=str, help="Alsa device string. Sets the audio device for rfm98w-i2s mode. (Default: hw:CARD=i2smaster,DEV=0)") parser.add_argument("--frequency", default=443.500, type=float, help="Transmit Frequency (MHz). (Default: 443.500 MHz)") - parser.add_argument("--baudrate", default=115200, type=int, help="Wenet TX baud rate. (Default: 115200).") + parser.add_argument("--baudrate", default=None, type=int, help="Wenet TX baud rate. (Default: 115200 for uart and 96000 for I2S).") parser.add_argument("--serial_port", default="/dev/ttyAMA0", type=str, help="Serial Port for modulation.") parser.add_argument("--tx_power", default=17, type=int, help="Transmit power in dBm (Default: 17 dBm, 50mW. Allowed values: 2-17)") parser.add_argument("-v", "--verbose", action='store_true', default=False, help="Show additional debug info.") args = parser.parse_args() + if args.baudrate == None: + if args.rfm98w: + args.baudrate = 115200 + elif args.rfm98w_i2s: + args.baudrate = 96000 + if args.verbose: logging_level = logging.DEBUG else: @@ -627,6 +633,7 @@ if __name__ == "__main__": elif args.rfm98w_i2s is not None: radio = RFM98W_I2S( spidevice = args.rfm98w_i2s, + baudrate = args.baudrate, frequency = args.frequency, audio_device= args.audio_device, tx_power_dbm = args.tx_power diff --git a/tx/radio_wrappers.py b/tx/radio_wrappers.py index e531340..8967a77 100644 --- a/tx/radio_wrappers.py +++ b/tx/radio_wrappers.py @@ -283,19 +283,44 @@ class RFM98W_I2S(RFM98W): def __init__( self, spidevice=0, + baudrate=96000, frequency=443.500, audio_device="hw:CARD=i2smaster,DEV=0", tx_power_dbm=17, reinit_count=5000 ): - # fixed baudrate for the moment - super().__init__(spidevice,frequency,96000,tx_power_dbm,reinit_count,led=5) # can't use 21 for LED as I2S is there - - - self.channels = 2 + self.audio_width = 2 # bytes self.audio_rate = 48000 - self.bytes_per_bit = ((self.audio_rate * self.channels * self.audio_width) // self.baudrate) + self.channels = 2 + + audio_rates = [8000,16000,22050,44100,48000,96000,176400,192000] + logging.debug(f"Searching - {baudrate}") + for self.audio_rate in audio_rates: + self.audio_bit_rate = self.audio_rate * self.channels * (self.audio_width*8) + self.bytes_per_bit = self.audio_bit_rate//baudrate//8 + try: + actual_rf_bitrate = self.audio_bit_rate/(self.bytes_per_bit*8) + except ZeroDivisionError: + logging.debug(f"NO - {self.audio_rate}") + continue + if (self.audio_bit_rate/baudrate)%8 != 0: + logging.debug(f"NO - {self.audio_rate} RF bitrate = {actual_rf_bitrate}") + else: + logging.debug(f"RF bitrate = {actual_rf_bitrate}") + logging.debug(self.audio_rate) + logging.debug(self.bytes_per_bit) + break + else: + raise ValueError("Baudrate not suitable for soundcard.") + + + # fixed baudrate for the moment + super().__init__(spidevice,frequency,baudrate,tx_power_dbm,reinit_count,led=5) # can't use 21 for LED as I2S is there + + + + if ( ((self.audio_rate * self.channels * self.audio_width * 8) / self.baudrate)%8 !=0 @@ -504,7 +529,7 @@ if __name__ == '__main__': parser.add_argument("--rfm98w-i2s", default=None, type=int, help="If set, configure a RFM98W on this SPI device number. Using I2S") parser.add_argument("--audio-device", default="hw:CARD=i2smaster,DEV=0", type=str, help="Sets the audio device for rfm98w-i2s mode.") parser.add_argument("--frequency", default=443.500, type=float, help="Transmit Frequency (MHz). (Default: 443.500 MHz)") - parser.add_argument("--baudrate", default=115200, type=int, help="Wenet TX baud rate. (Default: 115200).") + parser.add_argument("--baudrate", default=None, type=int, help="Wenet TX baud rate. (Default: 115200 for uart and 96000 for I2S).") parser.add_argument("--serial_port", default="/dev/ttyAMA0", type=str, help="Serial Port for modulation.") parser.add_argument("--tx_power", default=17, type=int, help="Transmit power in dBm (Default: 17 dBm, 50mW. Allowed values: 2-17)") parser.add_argument("--shutdown", default=False, action="store_true", help="Shutdown Transmitter after configuration.") @@ -512,6 +537,12 @@ if __name__ == '__main__': parser.add_argument("-v", "--verbose", action='store_true', default=False, help="Show additional debug info.") args = parser.parse_args() + if args.baudrate == None: + if args.rfm98w: + args.baudrate = 115200 + elif args.rfm98w_i2s: + args.baudrate = 96000 + if args.verbose: logging_level = logging.DEBUG else: @@ -533,6 +564,7 @@ if __name__ == '__main__': elif args.rfm98w_i2s is not None: radio = RFM98W_I2S( spidevice = args.rfm98w, + baudrate = args.baudrate, frequency = args.frequency, audio_device= args.audio_device, tx_power_dbm = args.tx_power diff --git a/tx/tx_picamera2_gps.py b/tx/tx_picamera2_gps.py index a9ea2d1..8f0304c 100644 --- a/tx/tx_picamera2_gps.py +++ b/tx/tx_picamera2_gps.py @@ -28,7 +28,7 @@ parser.add_argument("--rfm98w", default=0, type=int, help="If set, configure a R parser.add_argument("--rfm98w-i2s", default=None, type=int, help="If set, configure a RFM98W on this SPI device number. Using I2S") parser.add_argument("--audio-device", default="hw:CARD=i2smaster,DEV=0", type=str, help="Alsa device string. Sets the audio device for rfm98w-i2s mode. (Default: hw:CARD=i2smaster,DEV=0)") parser.add_argument("--frequency", default=443.500, type=float, help="Transmit Frequency (MHz). (Default: 443.500 MHz)") -parser.add_argument("--baudrate", default=115200, type=int, help="Wenet TX baud rate. (Default: 115200).") +parser.add_argument("--baudrate", default=None, type=int, help="Wenet TX baud rate. (Default: 115200 for uart and 96000 for I2S).") parser.add_argument("--serial_port", default="/dev/ttyAMA0", type=str, help="Serial Port for modulation.") parser.add_argument("--tx_power", default=17, type=int, help="Transmit power in dBm (Default: 17 dBm, 50mW. Allowed values: 2-17)") parser.add_argument("--vflip", action='store_true', default=False, help="Flip captured image vertically.") @@ -45,6 +45,12 @@ parser.add_argument("--image_delay", type=float, default=1.0, help="Delay time b parser.add_argument("-v", "--verbose", action='store_true', default=False, help="Show additional debug info.") args = parser.parse_args() +if args.baudrate == None: + if args.rfm98w: + args.baudrate = 115200 + elif args.rfm98w_i2s: + args.baudrate = 96000 + if args.verbose: logging_level = logging.DEBUG else: @@ -72,6 +78,7 @@ if args.rfm98w is not None: elif args.rfm98w_i2s is not None: radio = RFM98W_I2S( spidevice = args.rfm98w_i2s, + baudrate = args.baudrate, frequency = args.frequency, audio_device= args.audio_device, tx_power_dbm = args.tx_power diff --git a/tx/tx_test_images.py b/tx/tx_test_images.py index 2fc05b5..28428d9 100644 --- a/tx/tx_test_images.py +++ b/tx/tx_test_images.py @@ -43,12 +43,18 @@ parser.add_argument("--rfm98w", default=None, type=int, help="If set, configure parser.add_argument("--rfm98w-i2s", default=None, type=int, help="If set, configure a RFM98W on this SPI device number. Using I2S") parser.add_argument("--audio-device", default="hw:CARD=i2smaster,DEV=0", type=str, help="Alsa device string. Sets the audio device for rfm98w-i2s mode. (Default: hw:CARD=i2smaster,DEV=0)") parser.add_argument("--frequency", default=443.500, type=float, help="Transmit Frequency (MHz). (Default: 443.500 MHz)") -parser.add_argument("--baudrate", default=115200, type=int, help="Wenet TX baud rate. (Default: 115200).") +parser.add_argument("--baudrate", default=None, type=int, help="Wenet TX baud rate. (Default: 115200 for uart and 96000 for I2S).") parser.add_argument("--serial_port", default="/dev/ttyAMA0", type=str, help="Serial Port for modulation.") parser.add_argument("--tx_power", default=17, type=int, help="Transmit power in dBm (Default: 17 dBm, 50mW. Allowed values: 2-17)") parser.add_argument("-v", "--verbose", action='store_true', default=False, help="Show additional debug info.") args = parser.parse_args() +if args.baudrate == None: + if args.rfm98w: + args.baudrate = 115200 + elif args.rfm98w_i2s: + args.baudrate = 96000 + if args.verbose: logging_level = logging.DEBUG else: @@ -71,6 +77,7 @@ elif args.rfm98w_i2s is not None: radio = RFM98W_I2S( spidevice = args.rfm98w_i2s, frequency = args.frequency, + baudrate = args.baudrate, audio_device= args.audio_device, tx_power_dbm = args.tx_power )