From 51f9e5202fa9f3fa265c5af2d8f5e39220bf11ac Mon Sep 17 00:00:00 2001 From: mbridak Date: Thu, 25 Jul 2024 13:33:36 -0700 Subject: [PATCH] Have VFO dock widget handle disconnect/reconnect events of the USB VFO knob more gracefully. --- README.md | 1 + not1mm/lib/version.py | 2 +- not1mm/vfo.py | 25 +++++++++++++++++++++---- pyproject.toml | 2 +- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 70942ed..b5e3c4f 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ generated, 'cause I'm lazy, list of those who've submitted PR's. ## Recent Changes +- [24-7-25-1] Have VFO dock widget handle disconnect/reconnect events of the USB VFO knob more gracefully. - [24-7-25] Updated application categories for the desktop file. - [24-7-25] Maybe let flrig send CW... Probably not. - [24-7-19] Use Qt's QSettings to store window and dockwidgets states. diff --git a/not1mm/lib/version.py b/not1mm/lib/version.py index efe59c2..fd5d2f9 100644 --- a/not1mm/lib/version.py +++ b/not1mm/lib/version.py @@ -1,3 +1,3 @@ """It's the version""" -__version__ = "24.7.25" +__version__ = "24.7.25.1" diff --git a/not1mm/vfo.py b/not1mm/vfo.py index d3bbe09..2ef1da2 100644 --- a/not1mm/vfo.py +++ b/not1mm/vfo.py @@ -39,6 +39,7 @@ class VfoWindow(QDockWidget): message_shown = False multicast_interface = None current_palette = None + device_reconnect = False def __init__(self): super().__init__() @@ -64,6 +65,7 @@ def __init__(self): self.poll_rig_timer = QtCore.QTimer() self.poll_rig_timer.timeout.connect(self.poll_radio) self.poll_rig_timer.start(500) + self.visibilityChanged.connect(self.window_state_changed) def setDarkMode(self, dark: bool) -> None: """Forces a darkmode palette.""" @@ -178,27 +180,37 @@ def discover_device(self) -> str: if "vfoknob" in data.decode().strip(): return device - def setup_serial(self) -> None: + def window_state_changed(self): + """Setup vfo knob if window is toggled on""" + + if self.isVisible(): + self.setup_serial() + + def setup_serial(self, supress_msg=False) -> None: """ Setup the device returned by discover_device() Or display message saying we didn't find one. """ + if not self.isVisible(): + return + device = self.discover_device() if device: try: self.pico = serial.Serial("/dev/serial/by-id/" + device, 115200) self.pico.timeout = 100 self.lcdNumber.setStyleSheet("QLCDNumber { color: white; }") + self.device_reconnect = True except OSError: - if self.message_shown is False: + if self.message_shown is False and supress_msg is False: self.message_shown = True self.show_message_box( "Unable to locate or open the VFO knob serial device." ) self.lcdNumber.setStyleSheet("QLCDNumber { color: red; }") else: - if self.message_shown is False: + if self.message_shown is False and supress_msg is False: self.message_shown = True self.show_message_box( "Unable to locate or open the VFO knob serial device." @@ -269,13 +281,14 @@ def poll_radio(self) -> None: return if vfo < 1700000 or vfo > 60000000: return - if vfo != self.old_vfo: + if vfo != self.old_vfo or self.device_reconnect is True: self.old_vfo = vfo logger.debug(f"{vfo}") self.showNumber(vfo) # self.lcdNumber.display(dnum) # app.processEvents() cmd = f"F {vfo}\r" + self.device_reconnect = False try: if self.pico: self.pico.write(cmd.encode()) @@ -302,10 +315,14 @@ def getwaiting(self) -> None: self.showNumber(result) # self.lcdNumber.display(result) # app.processEvents() + else: + self.setup_serial(supress_msg=True) except OSError: logger.critical("Unable to write to serial device.") + self.pico = None except AttributeError: logger.critical("Unable to write to serial device.") + self.pico = None # app.processEvents() def show_message_box(self, message: str) -> None: diff --git a/pyproject.toml b/pyproject.toml index c2ce9d4..b0068f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "not1mm" -version = "24.7.25" +version = "24.7.25.1" description = "NOT1MM Logger" readme = "README.md" requires-python = ">=3.9"