From 5d5f949a156fb2656f3be8ce601ba8298d4b87c3 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Tue, 18 Nov 2025 11:59:01 +0100 Subject: [PATCH] Added wifi connection option to RNode settings --- sbapp/main.py | 78 ++++++++++++++++------------------- sbapp/sideband/core.py | 2 + sbapp/ui/layouts.py | 93 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 122 insertions(+), 51 deletions(-) diff --git a/sbapp/main.py b/sbapp/main.py index 088ccab..e18a46b 100644 --- a/sbapp/main.py +++ b/sbapp/main.py @@ -4533,58 +4533,40 @@ class SidebandApp(MDApp): self.root.ids.screen_manager.transition = self.slide_transition def hardware_rnode_save(self): - try: - self.sideband.config["hw_rnode_frequency"] = int(float(self.hardware_rnode_screen.ids.hardware_rnode_frequency.text)*1000000) - except: - pass + try: self.sideband.config["hw_rnode_frequency"] = int(float(self.hardware_rnode_screen.ids.hardware_rnode_frequency.text)*1000000) + except: pass - try: - self.sideband.config["hw_rnode_bandwidth"] = int(float(self.hardware_rnode_screen.ids.hardware_rnode_bandwidth.text)*1000) - except: - pass + try: self.sideband.config["hw_rnode_bandwidth"] = int(float(self.hardware_rnode_screen.ids.hardware_rnode_bandwidth.text)*1000) + except: pass - try: - self.sideband.config["hw_rnode_tx_power"] = int(self.hardware_rnode_screen.ids.hardware_rnode_txpower.text) - except: - pass + try: self.sideband.config["hw_rnode_tx_power"] = int(self.hardware_rnode_screen.ids.hardware_rnode_txpower.text) + except: pass - try: - self.sideband.config["hw_rnode_spreading_factor"] = int(self.hardware_rnode_screen.ids.hardware_rnode_spreadingfactor.text) - except: - pass + try: self.sideband.config["hw_rnode_spreading_factor"] = int(self.hardware_rnode_screen.ids.hardware_rnode_spreadingfactor.text) + except: pass - try: - self.sideband.config["hw_rnode_coding_rate"] = int(self.hardware_rnode_screen.ids.hardware_rnode_codingrate.text) - except: - pass + try: self.sideband.config["hw_rnode_coding_rate"] = int(self.hardware_rnode_screen.ids.hardware_rnode_codingrate.text) + except: pass - try: - self.sideband.config["hw_rnode_atl_short"] = float(self.hardware_rnode_screen.ids.hardware_rnode_atl_short.text) - except: - self.sideband.config["hw_rnode_atl_short"] = None + try: self.sideband.config["hw_rnode_atl_short"] = float(self.hardware_rnode_screen.ids.hardware_rnode_atl_short.text) + except: self.sideband.config["hw_rnode_atl_short"] = None - try: - self.sideband.config["hw_rnode_atl_long"] = float(self.hardware_rnode_screen.ids.hardware_rnode_atl_long.text) - except: - self.sideband.config["hw_rnode_atl_long"] = None + try: self.sideband.config["hw_rnode_atl_long"] = float(self.hardware_rnode_screen.ids.hardware_rnode_atl_long.text) + except: self.sideband.config["hw_rnode_atl_long"] = None - if self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.text == "": - self.sideband.config["hw_rnode_beaconinterval"] = None + if self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.text == "": self.sideband.config["hw_rnode_beaconinterval"] = None else: - try: - self.sideband.config["hw_rnode_beaconinterval"] = int(self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.text) - except: - pass + try: self.sideband.config["hw_rnode_beaconinterval"] = int(self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.text) + except: pass - if self.hardware_rnode_screen.ids.hardware_rnode_beacondata.text == "": - self.sideband.config["hw_rnode_beacondata"] = None - else: - self.sideband.config["hw_rnode_beacondata"] = self.hardware_rnode_screen.ids.hardware_rnode_beacondata.text + if self.hardware_rnode_screen.ids.hardware_rnode_beacondata.text == "": self.sideband.config["hw_rnode_beacondata"] = None + else: self.sideband.config["hw_rnode_beacondata"] = self.hardware_rnode_screen.ids.hardware_rnode_beacondata.text - if self.hardware_rnode_screen.ids.hardware_rnode_bt_device.text == "": - self.sideband.config["hw_rnode_bt_device"] = None - else: - self.sideband.config["hw_rnode_bt_device"] = self.hardware_rnode_screen.ids.hardware_rnode_bt_device.text + if self.hardware_rnode_screen.ids.hardware_rnode_bt_device.text == "": self.sideband.config["hw_rnode_bt_device"] = None + else: self.sideband.config["hw_rnode_bt_device"] = self.hardware_rnode_screen.ids.hardware_rnode_bt_device.text + + if self.hardware_rnode_screen.ids.hardware_rnode_tcp_host.text == "": self.sideband.config["hw_rnode_tcp_host"] = None + else: self.sideband.config["hw_rnode_tcp_host"] = self.hardware_rnode_screen.ids.hardware_rnode_tcp_host.text self.sideband.save_configuration() @@ -4724,6 +4706,12 @@ class SidebandApp(MDApp): self.sideband.save_configuration() + def hardware_rnode_tcp_toggle_action(self, sender=None, event=None): + if sender.active: self.sideband.config["hw_rnode_tcp"] = True + else: self.sideband.config["hw_rnode_tcp"] = False + + self.sideband.save_configuration() + def hardware_rnode_init(self, sender=None): if not self.hardware_rnode_ready: if not self.root.ids.screen_manager.has_screen("hardware_rnode_screen"): @@ -4773,6 +4761,8 @@ class SidebandApp(MDApp): t_btd = str(self.sideband.config["hw_rnode_bt_device"]) else: t_btd = "" + if self.sideband.config["hw_rnode_tcp_host"] != None: t_th = str(self.sideband.config["hw_rnode_tcp_host"]) + else: t_th = "" if self.sideband.config["hw_rnode_atl_short"] != None: t_ats = str(self.sideband.config["hw_rnode_atl_short"]) else: @@ -4784,6 +4774,7 @@ class SidebandApp(MDApp): self.hardware_rnode_screen.ids.hardware_rnode_bluetooth.active = self.sideband.config["hw_rnode_bluetooth"] self.hardware_rnode_screen.ids.hardware_rnode_ble.active = self.sideband.config["hw_rnode_ble"] + self.hardware_rnode_screen.ids.hardware_rnode_tcp.active = self.sideband.config["hw_rnode_tcp"] self.hardware_rnode_screen.ids.hardware_rnode_framebuffer.active = self.sideband.config["hw_rnode_enable_framebuffer"] self.hardware_rnode_screen.ids.hardware_rnode_frequency.text = t_freq self.hardware_rnode_screen.ids.hardware_rnode_bandwidth.text = t_bw @@ -4793,6 +4784,7 @@ class SidebandApp(MDApp): self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.text = t_bi self.hardware_rnode_screen.ids.hardware_rnode_beacondata.text = t_bd self.hardware_rnode_screen.ids.hardware_rnode_bt_device.text = t_btd + self.hardware_rnode_screen.ids.hardware_rnode_tcp_host.text = t_th self.hardware_rnode_screen.ids.hardware_rnode_atl_short.text = t_ats self.hardware_rnode_screen.ids.hardware_rnode_atl_long.text = t_atl self.hardware_rnode_screen.ids.hardware_rnode_frequency.bind(focus=focus_save) @@ -4803,6 +4795,7 @@ class SidebandApp(MDApp): self.hardware_rnode_screen.ids.hardware_rnode_beaconinterval.bind(focus=focus_save) self.hardware_rnode_screen.ids.hardware_rnode_beacondata.bind(focus=focus_save) self.hardware_rnode_screen.ids.hardware_rnode_bt_device.bind(focus=focus_save) + self.hardware_rnode_screen.ids.hardware_rnode_tcp_host.bind(focus=focus_save) self.hardware_rnode_screen.ids.hardware_rnode_frequency.bind(on_text_validate=save_connectivity) self.hardware_rnode_screen.ids.hardware_rnode_bandwidth.bind(on_text_validate=save_connectivity) self.hardware_rnode_screen.ids.hardware_rnode_txpower.bind(on_text_validate=save_connectivity) @@ -4815,6 +4808,7 @@ class SidebandApp(MDApp): self.hardware_rnode_screen.ids.hardware_rnode_bluetooth.bind(active=self.hardware_rnode_bt_toggle_action) self.hardware_rnode_screen.ids.hardware_rnode_ble.bind(active=self.hardware_rnode_ble_toggle_action) self.hardware_rnode_screen.ids.hardware_rnode_framebuffer.bind(active=self.hardware_rnode_framebuffer_toggle_action) + self.hardware_rnode_screen.ids.hardware_rnode_tcp.bind(active=self.hardware_rnode_tcp_toggle_action) self.hardware_rnode_ready = True diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py index f95ea7d..8adf170 100644 --- a/sbapp/sideband/core.py +++ b/sbapp/sideband/core.py @@ -680,8 +680,10 @@ class SidebandCore(): if not "hw_rnode_beacondata" in self.config: self.config["hw_rnode_beacondata"] = None if not "hw_rnode_bluetooth" in self.config: self.config["hw_rnode_bluetooth"] = False if not "hw_rnode_ble" in self.config: self.config["hw_rnode_ble"] = False + if not "hw_rnode_tcp" in self.config: self.config["hw_rnode_tcp"] = False if not "hw_rnode_enable_framebuffer" in self.config: self.config["hw_rnode_enable_framebuffer"] = False if not "hw_rnode_bt_device" in self.config: self.config["hw_rnode_bt_device"] = None + if not "hw_rnode_tcp_host" in self.config: self.config["hw_rnode_tcp_host"] = None if not "hw_rnode_atl_short" in self.config: self.config["hw_rnode_atl_short"] = None if not "hw_rnode_atl_long" in self.config: self.config["hw_rnode_atl_long"] = None diff --git a/sbapp/ui/layouts.py b/sbapp/ui/layouts.py index e457b64..bcd2329 100644 --- a/sbapp/ui/layouts.py +++ b/sbapp/ui/layouts.py @@ -2589,8 +2589,8 @@ MDScreen: MDBoxLayout: orientation: "horizontal" size_hint_y: None - padding: [0,dp(14),dp(24),dp(48)] - height: dp(86) + padding: [0,dp(14),dp(24),dp(0)] + height: dp(48) MDLabel: text: "Control RNode Display" @@ -2602,13 +2602,71 @@ MDScreen: active: False MDLabel: - text: "Bluetooth Settings\\n" + text: "•" + font_style: "H6" + text_size: self.size + halign: "center" + size_hint_y: None + height: self.texture_size[1] + padding: [0, dp(2+14), 0, dp(22+24)] + + MDLabel: + text: "WiFi & Ethernet Connection\\n" + font_style: "H6" + + MDLabel: + id: hardware_rnode_info_wifi + markup: True + text: "If your device is hosting or connected to a WiFi network, you can connect it by entering its IP address or hostname below." + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + + MDBoxLayout: + orientation: "horizontal" + size_hint_y: None + padding: [0,dp(12),dp(24),dp(0)] + height: dp(36) + + MDLabel: + text: "Connect using WiFi" + font_style: "H6" + + MDSwitch: + id: hardware_rnode_tcp + pos_hint: {"center_y": 0.3} + active: False + + MDBoxLayout: + orientation: "vertical" + # spacing: "24dp" + size_hint_y: None + height: self.minimum_height + # padding: [dp(0), dp(0), dp(0), dp(35)] + + MDTextField: + id: hardware_rnode_tcp_host + hint_text: "RNode IP address or hostname" + text: "" + font_size: dp(24) + + MDLabel: + text: "•" + font_style: "H6" + text_size: self.size + halign: "center" + size_hint_y: None + height: self.texture_size[1] + padding: [0, dp(2+14), 0, dp(22+24)] + + MDLabel: + text: "Bluetooth Connection\\n" font_style: "H6" MDLabel: id: hardware_rnode_info markup: True - text: "If you enable connection via Bluetooth, Sideband will attempt to connect to any available and paired RNodes over Bluetooth. If your RNode uses BLE (ESP32-S3 and nRF devices) instead of classic Bluetooth, enable the [i]Device requires BLE[/i] option as well." + text: "If you enable connection via Bluetooth, Sideband will attempt to connect to any available and paired RNodes over Bluetooth.\\n\\nIf your RNode uses BLE (ESP32-S3 and nRF devices) instead of classic Bluetooth, enable the [i]Device requires BLE[/i] option as well." size_hint_y: None text_size: self.width, None height: self.texture_size[1] @@ -2631,8 +2689,8 @@ MDScreen: MDBoxLayout: orientation: "horizontal" size_hint_y: None - padding: [0,0,dp(24),dp(0)] - height: dp(48) + padding: [0,0,dp(24),dp(48)] + height: dp(86) MDLabel: text: "Device requires BLE" @@ -2643,10 +2701,14 @@ MDScreen: pos_hint: {"center_y": 0.3} active: False + MDLabel: + text: "Bluetooth Pairing\\n" + font_style: "H6" + MDLabel: id: hardware_rnode_info markup: True - text: "You must first pair the RNode with your device for this to work. To put an RNode into pairing mode, hold down the multi-function user button for more than 5 seconds, and release it. The display will indicate pairing mode.You can then pair the device using the Bluetooth settings of your device, or by pressing the pairing button below. On older Android versions, the in-app scanning and pairing may not work. In this case, use the Bluetooth settings of your device to scan and pair.\\n" + text: "To put an RNode into pairing mode, hold down the multi-function user button for more than 5 seconds, and release it. The display will indicate pairing mode. If the in-app pairing does not find any devices, use the Bluetooth settings of your device to scan and pair.\\n" size_hint_y: None text_size: self.width, None height: self.texture_size[1] @@ -2674,12 +2736,16 @@ MDScreen: spacing: "24dp" size_hint_y: None height: self.minimum_height - padding: [dp(0), dp(0), dp(0), dp(12)] + padding: [dp(0), dp(0), dp(0), dp(12+24)] + + MDLabel: + text: "Preffered Bluetooth Device\\n" + font_style: "H6" MDLabel: id: hardware_rnode_info markup: True - text: "By default, Sideband will connect to the first available RNode that is paired. If you want to always use a specific RNode, you can enter its name in the Preferred RNode Device Name field below, for example \\"RNode A8EB\\"." + text: "Sideband will connect to the first available RNode that is paired. If you want to always use a specific RNode, you can enter its name here, for example \\"RNode A8EB\\"." size_hint_y: None text_size: self.width, None height: self.texture_size[1] @@ -2697,6 +2763,15 @@ MDScreen: text: "" font_size: dp(24) + MDLabel: + text: "•" + font_style: "H6" + text_size: self.size + halign: "center" + size_hint_y: None + height: self.texture_size[1] + padding: [0, dp(2+14), 0, dp(22)] + MDLabel: text: "\\n\\nDevice Bluetooth Control\\n" font_style: "H6"