FreeDATA/modem/state_manager.py

81 lines
2.5 KiB
Python
Raw Normal View History

import time
2023-11-12 18:56:15 +00:00
import ujson as json
class STATES:
def __init__(self, statequeue):
self.modem_version = 0.0
# state related settings
self.statequeue = statequeue
2023-11-14 18:26:11 +00:00
self.newstate = None
self.last = time.time()
# modem related states
# not every state is needed to publish, yet
# TODO can we reduce them?
self.channel_busy = False
self.channel_busy_slot = [False, False, False, False, False]
self.is_codec2_traffic = False
2023-11-12 18:56:15 +00:00
self.is_modem_running = False
self.is_modem_busy = False
2023-11-12 22:22:53 +00:00
self.is_beacon_running = False
2023-11-13 19:26:27 +00:00
self.is_arq_state = False
self.is_arq_session = False
self.is_transmitting = False
2023-11-13 17:11:55 +00:00
self.audio_dbfs = 0
self.dxcallsign: bytes = b"ZZ9YY-0"
self.dxgrid: bytes = b"------"
self.heard_stations = []
2023-11-12 22:22:53 +00:00
self.arq_session_state = 'disconnected'
self.arq_speed_level = 0
self.arq_total_bytes = 0
self.arq_bits_per_second = 0
self.arq_bytes_per_minute = 0
self.arq_transmission_percent = 0
self.arq_compression_factor = 0
self.arq_speed_list = []
self.arq_seconds_until_timeout = 0
self.mesh_routing_table = []
self.radio_frequency = 0
self.radio_mode = None
self.radio_bandwidth = 0
self.radio_rf_power = 0
self.radio_strength = 0
2023-11-17 21:35:52 +00:00
def sendState (self):
currentState = self.getAsJSON(False)
self.statequeue.put(currentState)
return currentState
def sendStateUpdate (self):
self.statequeue.put(self.newstate)
2023-11-12 22:22:53 +00:00
def set(self, key, value):
setattr(self, key, value)
2023-11-14 18:26:11 +00:00
# only process data if changed
# but also send an update if more than a 'updateCadence' second(s) has lapsed
# Otherwise GUI can't tell if modem is active due to lack of state messages on startup
2023-11-17 21:35:52 +00:00
new_state = self.getAsJSON(True)
if new_state != self.newstate:
2023-11-14 18:26:11 +00:00
self.newstate = new_state
self.sendStateUpdate()
2023-11-17 21:35:52 +00:00
def getAsJSON(self, isChangedState):
msgtype = "state-change"
if (not isChangedState):
msgtype = "state"
2023-11-12 18:56:15 +00:00
return json.dumps({
2023-11-17 21:35:52 +00:00
"freedata-message": msgtype,
"channel_busy": self.channel_busy,
2023-11-12 18:56:15 +00:00
"is_codec2_traffic": self.is_codec2_traffic,
"is_modem_running": self.is_modem_running,
2023-11-12 22:22:53 +00:00
"is_beacon_running": self.is_beacon_running,
2023-11-12 18:56:15 +00:00
})