FreeDATA/freedata_server/flrig.py

192 lines
5.8 KiB
Python

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
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_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:
_result = self.server.rig.set_ptt(1) if state else self.server.rig.set_ptt(0)
except Exception as e:
self.logger.error(f"Set PTT 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()