diff --git a/not1mm/__main__.py b/not1mm/__main__.py index 2836927..0904e9f 100644 --- a/not1mm/__main__.py +++ b/not1mm/__main__.py @@ -1710,6 +1710,15 @@ def closeEvent(self, _event) -> None: self.settings.setValue("windowState", self.saveState()) self.settings.sync() + try: # Shutdown the radio thread. + if self.radio_thread.isRunning(): + self.rig_control.time_to_quit = True + self.radio_thread.quit() + self.radio_thread.wait(1000) + + except (RuntimeError, AttributeError): + ... + cmd = {} cmd["cmd"] = "HALT" cmd["station"] = platform.node() @@ -2661,7 +2670,7 @@ def readpreferences(self) -> None: self.rig_control.poll_callback.connect(self.poll_radio) self.radio_thread.start() - if self.pref.get("userigctld", False): + elif self.pref.get("userigctld", False): logger.debug( "Using rigctld: %s", f"{self.pref.get('CAT_ip')} {self.pref.get('CAT_port')}", @@ -2676,6 +2685,17 @@ def readpreferences(self) -> None: self.radio_thread.finished.connect(self.rig_control.deleteLater) self.rig_control.poll_callback.connect(self.poll_radio) self.radio_thread.start() + else: + self.rig_control = Radio( + "fake", + self.pref.get("CAT_ip", "127.0.0.1"), + int(self.pref.get("CAT_port", 0000)), + ) + self.rig_control.moveToThread(self.radio_thread) + self.radio_thread.started.connect(self.rig_control.run) + self.radio_thread.finished.connect(self.rig_control.deleteLater) + self.rig_control.poll_callback.connect(self.poll_radio) + self.radio_thread.start() self.cw = None if ( @@ -3077,17 +3097,18 @@ def callsign_changed(self) -> None: self.show_help_dialog() self.clearinputs() return - if stripped_text == "TEST": - result = self.database.get_calls_and_bands() - cmd = {} - cmd["cmd"] = "WORKED" - cmd["station"] = platform.node() - cmd["worked"] = result - self.multicast_interface.send_as_json(cmd) - self.clearinputs() - return + # if stripped_text == "TEST": + # result = self.database.get_calls_and_bands() + # cmd = {} + # cmd["cmd"] = "WORKED" + # cmd["station"] = platform.node() + # cmd["worked"] = result + # self.multicast_interface.send_as_json(cmd) + # self.clearinputs() + # return if self.is_floatable(stripped_text): self.change_freq(stripped_text) + self.clearinputs() return cmd = {} @@ -3125,6 +3146,11 @@ def change_freq(self, stripped_text: str) -> None: vfo = float(stripped_text) vfo = int(vfo * 1000) + + if self.rig_control: + self.rig_control.set_vfo(vfo) + return + band = getband(str(vfo)) self.set_band_indicator(band) self.radio_state["vfoa"] = vfo @@ -3132,9 +3158,7 @@ def change_freq(self, stripped_text: str) -> None: self.contact["Band"] = get_logged_band(str(vfo)) self.set_window_title() self.clearinputs() - if self.rig_control: - self.rig_control.set_vfo(vfo) - return + cmd = {} cmd["cmd"] = "RADIO_STATE" cmd["station"] = platform.node() @@ -3168,10 +3192,11 @@ def change_mode(self, mode: str) -> None: if self.rig_control.interface == "flrig": self.cwspeed_spinbox_changed() self.rig_control.cat.set_flrig_cw_send(True) - self.setmode("CW") - self.radio_state["mode"] = "CW" - band = getband(str(self.radio_state.get("vfoa", "0.0"))) - self.set_band_indicator(band) + else: + self.setmode("CW") + self.radio_state["mode"] = "CW" + band = getband(str(self.radio_state.get("vfoa", "0.0"))) + self.set_band_indicator(band) self.set_window_title() self.clearinputs() self.read_cw_macros() @@ -3193,11 +3218,12 @@ def change_mode(self, mode: str) -> None: self.radio_state["mode"] = "USB" else: self.radio_state["mode"] = "LSB" - if self.rig_control: + if self.rig_control and self.rig_control.online: self.rig_control.set_mode(self.radio_state.get("mode")) - self.setmode("SSB") - band = getband(str(self.radio_state.get("vfoa", "0.0"))) - self.set_band_indicator(band) + else: + self.setmode("SSB") + band = getband(str(self.radio_state.get("vfoa", "0.0"))) + self.set_band_indicator(band) self.set_window_title() self.clearinputs() self.read_cw_macros() diff --git a/not1mm/lib/cat_interface.py b/not1mm/lib/cat_interface.py index 7aee564..2734a52 100644 --- a/not1mm/lib/cat_interface.py +++ b/not1mm/lib/cat_interface.py @@ -71,6 +71,15 @@ def __init__(self, interface: str, host: str, port: int) -> None: self.host = host self.port = port self.online = False + self.fake_radio = { + "vfo": "14032000", + "mode": "CW", + "bw": "500", + "power": "100", + "modes": ["CW", "USB", "LSB", "RTTY"], + "ptt": False, + } + if self.interface == "flrig": target = f"http://{host}:{port}" logger.debug("%s", target) @@ -84,8 +93,11 @@ def __init__(self, interface: str, host: str, port: int) -> None: http.client.BadStatusLine, ): self.online = False - if self.interface == "rigctld": + elif self.interface == "rigctld": self.__initialize_rigctrld() + elif self.interface == "fake": + self.online = True + return def __initialize_rigctrld(self): try: @@ -121,8 +133,7 @@ def sendcw(self, texttosend): logger.debug(f"{texttosend=} {self.interface=}") if self.interface == "flrig": self.sendcwxmlrpc(texttosend) - return - if self.interface == "rigctld": + elif self.interface == "rigctld": self.sendcwrigctl(texttosend) def sendcwrigctl(self, texttosend): @@ -200,10 +211,12 @@ def get_vfo(self) -> str: vfo = "" if self.interface == "flrig": vfo = self.__getvfo_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": vfo = self.__getvfo_rigctld() if "RPRT -" in vfo: vfo = "" + else: + vfo = self.fake_radio.get("vfo", "") return vfo def __getvfo_flrig(self) -> str: @@ -243,8 +256,10 @@ def get_mode(self) -> str: mode = "" if self.interface == "flrig": mode = self.__getmode_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": mode = self.__getmode_rigctld() + else: + mode = self.fake_radio.get("mode") return mode def __getmode_flrig(self) -> str: @@ -291,9 +306,10 @@ def get_bw(self): """Get current vfo bandwidth""" if self.interface == "flrig": return self.__getbw_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__getbw_rigctld() - return False + else: + return self.fake_radio.get("bw") def __getbw_flrig(self): """return bandwidth""" @@ -336,9 +352,10 @@ def get_power(self): """Get power level from rig""" if self.interface == "flrig": return self.__getpower_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__getpower_rigctld() - return False + else: + return self.fake_radio.get("power", "100") def __getpower_flrig(self): try: @@ -371,7 +388,7 @@ def get_ptt(self): """Get PTT state""" if self.interface == "flrig": return self.__getptt_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__getptt_rigctld() return False @@ -411,8 +428,10 @@ def get_mode_list(self): "Get a list of modes supported by the radio" if self.interface == "flrig": return self.__get_mode_list_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__get_mode_list_rigctld() + else: + return self.fake_radio.get("modes") return False def __get_mode_list_flrig(self): @@ -455,8 +474,11 @@ def set_vfo(self, freq: str) -> bool: try: if self.interface == "flrig": return self.__setvfo_flrig(freq) - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__setvfo_rigctld(freq) + else: + self.fake_radio["vfo"] = str(freq) + return True except ValueError: ... return False @@ -497,9 +519,11 @@ def set_mode(self, mode: str) -> bool: """Sets the radios mode""" if self.interface == "flrig": return self.__setmode_flrig(mode) - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__setmode_rigctld(mode) - return False + else: + self.fake_radio["mode"] = mode + return True def __setmode_flrig(self, mode: str) -> bool: """Sets the radios mode""" @@ -539,9 +563,11 @@ def set_power(self, power): """Sets the radios power""" if self.interface == "flrig": return self.__setpower_flrig(power) - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__setpower_rigctld(power) - return False + else: + self.fake_radio["power"] = str(power) + return True def __setpower_flrig(self, power): try: @@ -573,9 +599,11 @@ def ptt_on(self): """turn ptt on/off""" if self.interface == "flrig": return self.__ptt_on_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__ptt_on_rigctld() - return False + else: + self.fake_radio["ptt"] = True + return True def __ptt_on_rigctld(self): """Toggle PTT state on""" @@ -618,9 +646,11 @@ def ptt_off(self): """turn ptt on/off""" if self.interface == "flrig": return self.__ptt_off_flrig() - if self.interface == "rigctld": + elif self.interface == "rigctld": return self.__ptt_off_rigctld() - return False + else: + self.fake_radio["ptt"] = False + return True def __ptt_off_rigctld(self): """Toggle PTT state off""" diff --git a/not1mm/radio.py b/not1mm/radio.py index 8bc746e..edec758 100644 --- a/not1mm/radio.py +++ b/not1mm/radio.py @@ -47,6 +47,7 @@ def __init__(self, interface: str, host: str, port: int) -> None: def run(self): try: self.cat = CAT(self.interface, self.host, self.port) + self.online = self.cat.online self.modes = self.cat.get_mode_list() except ConnectionResetError: ... @@ -116,17 +117,19 @@ def set_vfo(self, vfo): if self.cat: self.cat.set_vfo(vfo) - try: - self.poll_callback.emit( - { - "vfoa": self.vfoa, - "mode": self.mode, - "bw": self.bw, - "online": self.online, - } - ) - except RuntimeError: - ... + + self.poll_time = datetime.datetime.now() + # try: + # self.poll_callback.emit( + # { + # "vfoa": str(self.vfoa), + # "mode": self.mode, + # "bw": self.bw, + # "online": self.online, + # } + # ) + # except RuntimeError: + # ... def set_mode(self, mode): self.mode = mode @@ -134,17 +137,18 @@ def set_mode(self, mode): if self.cat: self.cat.set_mode(mode) - try: - self.poll_callback.emit( - { - "vfoa": self.vfoa, - "mode": self.mode, - "bw": self.bw, - "online": self.online, - } - ) - except RuntimeError: - ... + self.poll_time = datetime.datetime.now() + # try: + # self.poll_callback.emit( + # { + # "vfoa": str(self.vfoa), + # "mode": self.mode, + # "bw": self.bw, + # "online": self.online, + # } + # ) + # except RuntimeError: + # ... def get_modes(self): """get list of modes"""