From 3cb329b379e4865415af22c153bff3e17d964577 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 24 Mar 2024 21:39:44 +0100 Subject: [PATCH] check for max bandwidth on session open --- gui/package.json | 2 +- modem/arq_session.py | 11 +++++------ modem/arq_session_irs.py | 10 +++++++++- modem/arq_session_iss.py | 3 ++- modem/data_frame_factory.py | 6 ++++-- modem/server.py | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/gui/package.json b/gui/package.json index 86b33123..3c062837 100644 --- a/gui/package.json +++ b/gui/package.json @@ -2,7 +2,7 @@ "name": "FreeDATA", "description": "FreeDATA Client application for connecting to FreeDATA server", "private": true, - "version": "0.14.4-alpha", + "version": "0.14.5-alpha", "main": "dist-electron/main/index.js", "scripts": { "start": "vite", diff --git a/modem/arq_session.py b/modem/arq_session.py index 9b8eab38..a6cfcf8b 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -164,8 +164,9 @@ class ARQSession: return stats - def get_appropriate_speed_level(self, snr): - maximum_bandwidth = self.config['MODEM']['maximum_bandwidth'] + def get_appropriate_speed_level(self, snr, maximum_bandwidth=None): + if maximum_bandwidth is None: + maximum_bandwidth = self.config['MODEM']['maximum_bandwidth'] # Adjust maximum_bandwidth based on special conditions or invalid configurations if maximum_bandwidth == 0: @@ -176,9 +177,7 @@ class ARQSession: appropriate_speed_level = min(self.SPEED_LEVEL_DICT.keys()) for level, details in self.SPEED_LEVEL_DICT.items(): - if snr >= details['min_snr'] and details['bandwidth'] <= maximum_bandwidth: - # Update appropriate_speed_level to the current level if it meets both SNR and bandwidth criteria - if level > appropriate_speed_level: - appropriate_speed_level = level + if snr >= details['min_snr'] and details['bandwidth'] <= maximum_bandwidth and level > appropriate_speed_level: + appropriate_speed_level = level return appropriate_speed_level diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index df8feb3f..92bf0d83 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -76,6 +76,8 @@ class ARQSessionIRS(arq_session.ARQSession): self.received_bytes = 0 self.received_crc = None + self.maximum_bandwidth = 0 + self.abort = False def all_data_received(self): @@ -98,6 +100,12 @@ class ARQSessionIRS(arq_session.ARQSession): thread_wait.start() def send_open_ack(self, open_frame): + self.maximum_bandwidth = open_frame['maximum_bandwidth'] + # check for maximum bandwidth. If ISS bandwidth is higher than own, then use own + if open_frame['maximum_bandwidth'] > self.config['MODEM']['maximum_bandwidth']: + self.maximum_bandwidth = self.config['MODEM']['maximum_bandwidth'] + + self.event_manager.send_arq_session_new( False, self.id, self.dxcall, 0, self.state.name) ack_frame = self.frame_factory.build_arq_session_open_ack( @@ -211,7 +219,7 @@ class ARQSessionIRS(arq_session.ARQSession): received_speed_level = 0 latest_snr = self.snr if self.snr else -10 - appropriate_speed_level = self.get_appropriate_speed_level(latest_snr) + appropriate_speed_level = self.get_appropriate_speed_level(latest_snr, self.maximum_bandwidth) modes_to_decode = {} # Log the latest SNR, current, appropriate speed levels, and the previous speed level diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 52ef9626..12f91d93 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -104,9 +104,10 @@ class ARQSessionISS(arq_session.ARQSession): twr.start() def start(self): + maximum_bandwidth = self.config['MODEM']['maximum_bandwidth'] self.event_manager.send_arq_session_new( True, self.id, self.dxcall, self.total_length, self.state.name) - session_open_frame = self.frame_factory.build_arq_session_open(self.dxcall, self.id) + session_open_frame = self.frame_factory.build_arq_session_open(self.dxcall, self.id, maximum_bandwidth) self.launch_twr(session_open_frame, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode=FREEDV_MODE.signalling) self.set_state(ISS_State.OPEN_SENT) diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 2acc837c..cdd69362 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -98,6 +98,7 @@ class DataFrameFactory: "destination_crc": 3, "origin": 6, "session_id": 1, + "maximum_bandwidth": 2, } self.template_list[FR_TYPE.ARQ_SESSION_OPEN_ACK.value] = { @@ -219,7 +220,7 @@ class DataFrameFactory: elif key in ["session_id", "speed_level", "frames_per_burst", "version", - "offset", "total_length", "state", "type"]: + "offset", "total_length", "state", "type", "maximum_bandwidth"]: extracted_data[key] = int.from_bytes(data, 'big') elif key in ["snr"]: @@ -328,11 +329,12 @@ class DataFrameFactory: test_frame[:1] = bytes([FR_TYPE.TEST_FRAME.value]) return test_frame - def build_arq_session_open(self, destination, session_id): + def build_arq_session_open(self, destination, session_id, maximum_bandwidth): payload = { "destination_crc": helpers.get_crc_24(destination), "origin": helpers.callsign_to_bytes(self.myfullcall), "session_id": session_id.to_bytes(1, 'big'), + "maximum_bandwidth": maximum_bandwidth.to_bytes(2, 'big'), } return self.construct(FR_TYPE.ARQ_SESSION_OPEN, payload) diff --git a/modem/server.py b/modem/server.py index d2bd669d..dde5de07 100644 --- a/modem/server.py +++ b/modem/server.py @@ -33,7 +33,7 @@ from schedule_manager import ScheduleManager app = Flask(__name__) CORS(app, resources={r"/*": {"origins": "*"}}) sock = Sock(app) -MODEM_VERSION = "0.14.4-alpha" +MODEM_VERSION = "0.14.5-alpha" # set config file to use def set_config():