import xmlrpc.client import threading import time import logging class radio: def __init__(self, ctx): self.ctx = ctx self.logger = logging.getLogger(__name__) self.host = self.ctx.config_manager.config["FLRIG"]["ip"] self.port = self.ctx.config_manager.config["FLRIG"]["port"] self.poll_interval = 1.0 self.server = None self.connected = False self.parameters = { 'frequency': '---', 'mode': '---', 'alc': '---', 'strength': '---', 'bandwidth': '---', 'rf': '---', 'ptt': False, 'tuner': False, 'swr': '---' } self._stop_event = threading.Event() self._thread = threading.Thread(target=self._poll_loop, daemon=True) self._thread.start() def connect(self, **kwargs): try: self.server = xmlrpc.client.ServerProxy(f"http://{self.host}:{self.port}") self.connected = True self.logger.info("Connected to FLRig") self.ctx.state_manager.set_radio("radio_status", True) return True except Exception as e: self.logger.error(f"FLRig connection failed: {e}") self.connected = False self.server = None self.ctx.state_manager.set_radio("radio_status", False) return False def disconnect(self, **kwargs): self.logger.info("Disconnected from FLRig") self.connected = False self.server = None self.ctx.state_manager.set_radio("radio_status", False) return True def _poll_loop(self): while not self._stop_event.is_set(): if not self.connected: self.connect() if self.connected: try: self.get_frequency() self.get_mode() self.get_rf() self.get_ptt() self.get_swr() self.get_frequency() self.get_mode() self.get_level() except Exception as e: self.logger.warning(f"Polling error: {e}") self.connected = False self.server = None time.sleep(self.poll_interval) def get_frequency(self): self.parameters['frequency'] = self.server.rig.get_vfo() return self.parameters['frequency'] def get_rf(self): current_power_level = self.server.rig.get_power() max_power_level = self.server.rig.get_maxpwr() power_percentage = (int(current_power_level) / int(max_power_level)) * 100 self.parameters['rf'] = round(power_percentage, 0) return self.parameters['rf'] def set_frequency(self, frequency): self.parameters['frequency'] = frequency if self.connected: try: self.server.main.set_frequency(float(frequency)) except Exception as e: self.logger.error(f"Set frequency failed: {e}") self.connected = False def get_mode(self): self.parameters['mode'] = self.server.rig.get_mode() return self.parameters['mode'] def set_mode(self, mode): self.parameters['mode'] = mode if self.connected: try: self.server.rig.set_mode(mode) except Exception as e: self.logger.error(f"Set mode failed: {e}") self.connected = False def get_level(self): self.parameters['strength'] = self.server.rig.get_smeter() def get_alc(self): return None def get_meter(self): return None def get_bandwidth(self): return self.parameters['bandwidth'] def set_bandwidth(self, bandwidth): if self.connected: try: self.server.rig.set_bandwidth(int(bandwidth)) except Exception as e: self.logger.error(f"Set bandwidth failed: {e}") self.connected = False def set_rf_level(self, rf): if self.connected: try: # Get max power from rig max_power = self.server.rig.get_maxpwr() # Calculate absolute power in watts (rounded to int) power_watts = int((float(rf) / 100) * float(max_power)) # Set power level in watts self.server.rig.set_power(power_watts) except Exception as e: self.logger.error(f"Set RF level failed: {e}") self.connected = False def get_strength(self): return self.parameters['strength'] def get_tuner(self): return self.parameters['tuner'] def set_tuner(self, state): self.parameters['tuner'] = state return None def get_swr(self): self.parameters['swr'] = self.server.rig.get_swrmeter() return self.parameters['swr'] def get_ptt(self): self.parameters['ptt'] = self.server.rig.get_ptt() return self.parameters['ptt'] def set_ptt(self, state): self.parameters['ptt'] = state if self.connected: try: if state: result = self.server.rig.set_ptt(1) else: result = self.server.rig.set_ptt(0) except Exception as e: self.logger.error(f"Set PTT failed: {e}") return state def set_tuner(self, state): self.parameters['ptt'] = state if self.connected: try: self.server.rig.tune(state) except Exception as e: self.logger.error(f"Set Tune failed: {e}") return state def get_status(self): return self.connected def get_parameters(self): return self.parameters def close_rig(self): self.logger.info("Closing FLRig interface") self._stop_event.set() self._thread.join() def stop_service(self): self.close_rig()