diff --git a/freedvtnc2/__main__.py b/freedvtnc2/__main__.py
index 5b1ce78..f33983d 100644
--- a/freedvtnc2/__main__.py
+++ b/freedvtnc2/__main__.py
@@ -7,6 +7,8 @@ from . import tnc
import time
from . import rigctl
import traceback
+from prompt_toolkit.formatted_text import HTML, to_formatted_text
+
logging.basicConfig()
if __name__ == '__main__':
@@ -48,13 +50,14 @@ if __name__ == '__main__':
shell = None
def __init__(self):
super().__init__()
- self.log_buffer = []
+ self.log_buffer = ""
def emit(self, record):
- msg = [
- (f"class:log.{record.levelname.lower()}.name", record.name),
- (f"class:log.{record.levelname.lower()}.module", f":{record.module}:"),
- (f"class:log.{record.levelname.lower()}.msg", f":{record.msg}\n")
- ]
+ if record.name == "root" and record.module == "__main__":
+ msg = HTML(f"{{}}\n").format(record.msg).value
+ else:
+ msg = HTML(f"{{}}").format(record.name).value
+ msg += HTML(f":{{}}").format(record.module).value
+ msg += HTML(f": {{}}\n").format(record.msg,).value
if options.no_cli:
print(self.format(record))
@@ -89,7 +92,7 @@ if __name__ == '__main__':
)
else:
modem_tx = FreeDVTX(modem=options.mode, max_packets_combined=options.max_packets_combined)
-
+ logging.info(f"Initialised TX FreeDV Modem - version: {modem_tx.modem.version} mode: {modem_tx.modem.modem_name}")
def tx(data):
try:
logging.debug(f"Sending {str(data)}")
@@ -114,16 +117,14 @@ if __name__ == '__main__':
# ignoring debug messages - this is the only place where we have this issues - if we add more threaded output
# we should move this into a dedicated function
if not options.no_cli:
- shell.add_text([
- ("class:chat.callsign", f"<{call.decode()}>"),
- ("class:chat.message",f"{message.decode()}\n")
- ]
+ shell.add_text(
+ HTML("<{}> {}\n").format(call.decode(), message.decode()).value
)
else:
print(f"\n<{call.decode()}> {message.decode()}")
if options.follow and data.mode != modem_tx.modem.modem_name:
- logging.info(f"Switching to {data.mode}")
+ logging.info(f"Follow mode active. Switching to {data.mode}")
modem_tx.set_mode(modem=data.mode)
except:
logging.critical(
@@ -132,14 +133,20 @@ if __name__ == '__main__':
if options.pts:
tnc_interface = tnc.KissInterface(tx)
+ logging.info(f"Initialised KISS TNC PTS Interface at {tnc_interface.ttyname}")
else:
tnc_interface = tnc.KissTCPInterface(tx, port=options.kiss_tcp_port, address=options.kiss_tcp_address)
-
+ logging.info(f"Initialised KISS TNC TCP Interface at {options.kiss_tcp_address}:{options.kiss_tcp_port}")
+
+
+
def inhibit(state):
if "output_device" in locals():
output_device.inhibit = state
modem_rx = FreeDVRX(callback=rx, progress=progress, inhibit=inhibit)
+ for rx_modem in modem_rx.modems:
+ logging.info(f"Initialised RX FreeDV Modem - version: {modem_tx.modem.version} mode: {rx_modem.modem_name}")
input_device_name_or_id = options.input_device
output_device_name_or_id = options.output_device
@@ -152,6 +159,7 @@ if __name__ == '__main__':
if options.rigctld_port != 0:
rig = rigctl.Rigctld(hostname=options.rigctld_host, port=options.rigctld_port)
+ logging.info(f"Initialised Rigctl at {options.rigctld_host}:{options.rigctld_port}")
ptt_trigger = rig.ptt_enable
ptt_release = rig.ptt_disable
else:
@@ -159,6 +167,7 @@ if __name__ == '__main__':
ptt_release = None
input_device = audio.InputDevice(modem_rx.write, modem_rx.sample_rate, name_or_id=input_device_name_or_id)
+ logging.info(f"Initialised Input Audio: {input_device.device.name}")
output_device = audio.OutputDevice(
modem_rx.sample_rate,
modem = modem_tx,
@@ -169,10 +178,13 @@ if __name__ == '__main__':
ptt_off_delay_ms=options.ptt_off_delay_ms,
db=options.output_volume
)
+ logging.info(f"Initialised Output Audio: {output_device.device.name}")
try:
if not options.no_cli:
- shell = FreeDVShell(modem_rx, modem_tx, output_device, input_device, p, options, log_handler.log_buffer)
+ logging.debug(f"Starting shell")
+ shell = FreeDVShell(modem_rx, modem_tx
+ , output_device, input_device, p, options, log_handler.log_buffer)
log_handler.shell = shell
shell.run()
else:
diff --git a/freedvtnc2/modem.py b/freedvtnc2/modem.py
index a7ae8e5..b59972c 100644
--- a/freedvtnc2/modem.py
+++ b/freedvtnc2/modem.py
@@ -40,6 +40,10 @@ class Modem():
lib.freedv_set_frames_per_burst(self.modem, 1)
+ @property
+ def version(self) -> int:
+ return lib.freedv_get_version()
+
@property
def nin(self) -> int:
"""
diff --git a/freedvtnc2/shell.py b/freedvtnc2/shell.py
index 763af7e..d6a1e66 100644
--- a/freedvtnc2/shell.py
+++ b/freedvtnc2/shell.py
@@ -126,6 +126,8 @@ class FreeDVShellCommands():
def do_send_string(self, arg):
"Sends string over the modem"
+ if not arg:
+ return "Usage: send_string meow"
self.output_device.write(Packet(arg.encode()))
return "Queued for sending"
@@ -236,10 +238,12 @@ class FreeDVShell():
("log.warning", 'bold'),
("log.warning.name", 'bold #ffff00'),
("log.warning.module", 'bold #ffff00'),
+ ("log.error.name", 'bold #ff0000'),
+ ("log.error.module", 'bold #ff0000'),
("log.critical.name", 'bold #ff0000'),
("log.critical.module", 'bold #ff0000'),
("log.critical.msg", 'bold #ff0000'),
- ("log.chat.callsign", 'bold #00ff00'),
+ ("chat.callsign", 'bold #00ff00'),
]
)
def __init__(self, modem_rx: FreeDVRX, modem_tx: FreeDVTX, output_device: audio.OutputDevice, input_device: audio.InputDevice, parser: configargparse.ArgParser, options: argparse.Namespace, logs:str):
@@ -257,24 +261,17 @@ class FreeDVShell():
input_processors=[FormatText()]
)
- self.logs = []
+ self.logs = ""
self.add_text(logs)
- def add_text(self, text: list[tuple]):
+ def add_text(self, text: str):
self.logs += text
- out_html = ""
- for log in self.logs:
-
- for line in re.split('(\n)', log[1]):
- if line == "\n":
- out_html += "\n"
- else:
- out_html += f"<{log[0].replace('class:','')}>{line}{log[0].replace('class:','')}>"
+ # out_html += f"<{log[0].replace('class:','')}>{line}{log[0].replace('class:','')}>"
self.log_text_area.buffer.document = Document(
- text=out_html, cursor_position=len(out_html)
+ text=self.logs, cursor_position=len(self.logs)
)
@@ -286,7 +283,7 @@ class FreeDVShell():
def accept(buff):
try:
- self.add_text([("class:userinput", f"> {input_field.text}\n")])
+ self.add_text(HTML("> {}\n").format(input_field.text).value)
command, arg = input_field.text.split(" ", 1)
except ValueError:
@@ -308,8 +305,8 @@ class FreeDVShell():
output = traceback.format_exc() + "\n"
except Exception:
output = "Invalid command. Valid commands: " + ", ".join(self.shell_commands.commands) + "\n"
-
- self.add_text([("class:commandoutput", output)])
+ for line in output.split("\n"):
+ self.add_text(HTML("{}\n").format(line).value)
input_field = TextArea(
height=3,