diff --git a/horusgui/__init__.py b/horusgui/__init__.py index aa4cd15..91c67cc 100755 --- a/horusgui/__init__.py +++ b/horusgui/__init__.py @@ -1 +1 @@ -__version__ = "0.3.10" +__version__ = "0.3.11" diff --git a/horusgui/gui.py b/horusgui/gui.py index 4f83b35..1b9518f 100644 --- a/horusgui/gui.py +++ b/horusgui/gui.py @@ -18,6 +18,7 @@ import datetime import glob import logging import platform +import time import pyqtgraph as pg import numpy as np from queue import Queue @@ -68,6 +69,8 @@ telemetry_logger = None decoder_init = False +last_packet_time = None + # Rotator object rotator = None @@ -515,10 +518,14 @@ widgets["latestRawSentenceData"].setReadOnly(True) widgets["latestDecodedSentenceLabel"] = QtGui.QLabel("Latest Packet (Decoded):") widgets["latestDecodedSentenceData"] = QtGui.QLineEdit("NO DATA") widgets["latestDecodedSentenceData"].setReadOnly(True) +widgets["latestDecodedAgeLabel"] = QtGui.QLabel("Last Packet Age:") +widgets["latestDecodedAgeData"] = QtGui.QLabel("No packet yet!") w4_data.addWidget(widgets["latestRawSentenceLabel"], 0, 0, 1, 1) w4_data.addWidget(widgets["latestRawSentenceData"], 0, 1, 1, 6) w4_data.addWidget(widgets["latestDecodedSentenceLabel"], 1, 0, 1, 1) w4_data.addWidget(widgets["latestDecodedSentenceData"], 1, 1, 1, 6) +w4_data.addWidget(widgets["latestDecodedAgeLabel"], 2, 0, 1, 1) +w4_data.addWidget(widgets["latestDecodedAgeData"], 2, 1, 1, 2) d3_data.addWidget(w4_data) w4_position = pg.LayoutWidget() @@ -894,6 +901,7 @@ def add_stats_update(frame): def handle_new_packet(frame): """ Handle receipt of a newly decoded packet """ + global last_packet_time if len(frame.data) > 0: if type(frame.data) == bytes: @@ -940,6 +948,7 @@ def handle_new_packet(frame): # If we get here, the string is valid! widgets["latestRawSentenceData"].setText(f"{_packet} ({_snr:.1f} dB SNR)") widgets["latestDecodedSentenceData"].setText(f"{_packet}") + last_packet_time = time.time() # Upload the string to Sondehub Amateur sondehub_uploader.add(_decoded) @@ -965,6 +974,7 @@ def handle_new_packet(frame): widgets["latestRawSentenceData"].setText(f"{_packet} ({_snr:.1f} dB SNR)") widgets["latestDecodedSentenceData"].setText(_decoded['ukhas_str']) + last_packet_time = time.time() # Upload the string to Sondehub Amateur sondehub_uploader.add(_decoded) except Exception as e: @@ -1043,9 +1053,13 @@ def start_decoding(): Start decoding! (Or, stop decoding) """ - global widgets, audio_stream, fft_process, horus_modem, audio_devices, running, fft_update_queue, status_update_queue + global widgets, audio_stream, fft_process, horus_modem, audio_devices, running, fft_update_queue, status_update_queue, last_packet_time if not running: + # Reset last packet time + + last_packet_time = None + widgets['latestDecodedAgeData'].setText("No packet yet!") # Grab settings off widgets _dev_name = widgets["audioDeviceSelector"].currentText() if _dev_name != 'UDP Audio (127.0.0.1:7355)': @@ -1192,7 +1206,7 @@ def handle_log_update(log_update): # GUI Update Loop def processQueues(): """ Read in data from the queues, this decouples the GUI and async inputs somewhat. """ - global fft_update_queue, status_update_queue, decoder_init, widgets, args + global fft_update_queue, status_update_queue, decoder_init, widgets, args, running, last_packet_time while fft_update_queue.qsize() > 0: _data = fft_update_queue.get() @@ -1209,6 +1223,14 @@ def processQueues(): handle_log_update(_log) + if running: + if last_packet_time != None: + _time_delta = int(time.time() - last_packet_time) + _time_delta_seconds = int(_time_delta%60) + _time_delta_minutes = int((_time_delta/60) % 60) + _time_delta_hours = int((_time_delta/3600)) + widgets['latestDecodedAgeData'].setText(f"{_time_delta_hours:02d}:{_time_delta_minutes:02d}:{_time_delta_seconds:02d}") + # Try and force a re-draw. QtGui.QApplication.processEvents() diff --git a/pyproject.toml b/pyproject.toml index e586dc4..1326163 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "horusgui" -version = "0.3.9" +version = "0.3.11" description = "" authors = ["Mark Jessop "]