From 950eab71feeda5c9404734ecaad942b21072c97f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Feb 2024 10:19:21 +0000 Subject: [PATCH 01/51] Bump eslint-plugin-prettier from 5.0.1 to 5.1.3 in /gui Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 5.0.1 to 5.1.3. - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.0.1...v5.1.3) --- updated-dependencies: - dependency-name: eslint-plugin-prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/package.json b/gui/package.json index d165507e..5fd95d79 100644 --- a/gui/package.json +++ b/gui/package.json @@ -71,7 +71,7 @@ "eslint-config-standard-with-typescript": "43.0.1", "eslint-plugin-import": "2.29.1", "eslint-plugin-n": "16.6.2", - "eslint-plugin-prettier": "5.0.1", + "eslint-plugin-prettier": "5.1.3", "eslint-plugin-promise": "6.1.1", "eslint-plugin-vue": "9.20.1", "typescript": "5.3.3", From 910690178e35aabe7e50d215b6347b63e354decf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Feb 2024 10:19:32 +0000 Subject: [PATCH 02/51] Bump @vitejs/plugin-vue from 5.0.3 to 5.0.4 in /gui Bumps [@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue/tree/HEAD/packages/plugin-vue) from 5.0.3 to 5.0.4. - [Release notes](https://github.com/vitejs/vite-plugin-vue/releases) - [Changelog](https://github.com/vitejs/vite-plugin-vue/blob/main/packages/plugin-vue/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-vue/commits/plugin-vue@5.0.4/packages/plugin-vue) --- updated-dependencies: - dependency-name: "@vitejs/plugin-vue" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/package.json b/gui/package.json index d165507e..81913b06 100644 --- a/gui/package.json +++ b/gui/package.json @@ -63,7 +63,7 @@ "devDependencies": { "@types/nconf": "^0.10.6", "@typescript-eslint/eslint-plugin": "6.21.0", - "@vitejs/plugin-vue": "5.0.3", + "@vitejs/plugin-vue": "5.0.4", "electron": "28.2.2", "electron-builder": "24.9.1", "eslint": "8.56.0", From acb2bb4e9b5a50e9ca1f8621584e5e7971de8f4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Feb 2024 10:20:01 +0000 Subject: [PATCH 03/51] Bump socket.io from 4.7.2 to 4.7.4 in /gui Bumps [socket.io](https://github.com/socketio/socket.io) from 4.7.2 to 4.7.4. - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/4.7.2...4.7.4) --- updated-dependencies: - dependency-name: socket.io dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/package.json b/gui/package.json index d165507e..7f88b441 100644 --- a/gui/package.json +++ b/gui/package.json @@ -54,7 +54,7 @@ "noto-color-emoji": "^1.0.1", "pinia": "2.1.7", "qth-locator": "2.1.0", - "socket.io": "4.7.2", + "socket.io": "4.7.4", "uuid": "^9.0.1", "vue": "3.4.15", "vue-chartjs": "5.3.0", From fffc59b0a664eb4c3b0373b22641b8358c9b5e9d Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:13:39 +0100 Subject: [PATCH 04/51] removed possibly obsolete arq state at wrong position --- modem/arq_session.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modem/arq_session.py b/modem/arq_session.py index 4fd424d4..8bae69af 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -98,7 +98,6 @@ class ARQSession(): if isinstance(received_data, bytearray) and isinstance(type_byte, int): self.arq_data_type_handler.dispatch(type_byte, received_data) - self.states.setARQ(False) return self.log(f"Ignoring unknown transition from state {self.state.name} with frame {frame['frame_type']}") From 6dd78bf8fca25a5fb0d1bb077346824704442f89 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:27:20 +0100 Subject: [PATCH 05/51] adjusted state manager in data type handler --- modem/arq_data_type_handler.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modem/arq_data_type_handler.py b/modem/arq_data_type_handler.py index 4de79f13..8745056a 100644 --- a/modem/arq_data_type_handler.py +++ b/modem/arq_data_type_handler.py @@ -54,6 +54,9 @@ class ARQDataTypeHandler: def dispatch(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type and session_type in self.handlers and 'handle' in self.handlers[session_type]: return self.handlers[session_type]['handle'](data) else: @@ -61,6 +64,9 @@ class ARQDataTypeHandler: def failed(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type in self.handlers and 'failed' in self.handlers[session_type]: return self.handlers[session_type]['failed'](data) else: @@ -74,6 +80,9 @@ class ARQDataTypeHandler: def transmitted(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type in self.handlers and 'transmitted' in self.handlers[session_type]: return self.handlers[session_type]['transmitted'](data) else: From b017f39133f9fed1ea97beec2b3ef0e63ceed749 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:20:00 +0100 Subject: [PATCH 06/51] adjusted a rigctld command --- modem/rigctld.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 79ca0108..471d7469 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -246,12 +246,16 @@ class radio: if not should_ignore(config.get('serial_dcd', "0")): args += ['--set-dcd', config['serial_dcd']] if not should_ignore(config.get('serial_dtr', "0")): - args += ['--set-dtr', config['serial_dtr']] + args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] - # Handling Stop Bits with the corrected --set-conf syntax + # Handling Data Bits and Stop Bits + if not should_ignore(config.get('data_bits', "0")): + args += ['--set-conf', f'data_bits={config["data_bits"]}'] if not should_ignore(config.get('stop_bits', "0")): args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] + # Fixme #rts_state + # Handle custom arguments for rigctld # Custom args are split via ' ' so python doesn't add extranaeous quotes on windows args += config_rigctld["arguments"].split(" ") From 9a8ebfef77060ff2131308484c93ef70afffe42d Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:29:18 +0100 Subject: [PATCH 07/51] removed rigctld typo --- modem/rigctld.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 471d7469..fc4628dd 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -229,29 +229,29 @@ class radio: return value in ['ignore', 0] # Model ID, Serial Port, and Speed - if not should_ignore(config.get('model_id', "0")): + if not should_ignore(config.get('model_id')): args += ['-m', str(config['model_id'])] - if not should_ignore(config.get('serial_port', "0")): + if not should_ignore(config.get('serial_port')): args += ['-r', config['serial_port']] - if not should_ignore(config.get('serial_speed', "0")): + if not should_ignore(config.get('serial_speed')): args += ['-s', str(config['serial_speed'])] # PTT Port and Type - if not should_ignore(config.get('ptt_port', "0")): + if not should_ignore(config.get('ptt_port')): args += ['--ptt-port', config['ptt_port']] - if not should_ignore(config.get('ptt_type', "0")): + if not should_ignore(config.get('ptt_type')): args += ['--ptt-type', config['ptt_type']] # Serial DCD and DTR - if not should_ignore(config.get('serial_dcd', "0")): + if not should_ignore(config.get('serial_dcd')): args += ['--set-dcd', config['serial_dcd']] - if not should_ignore(config.get('serial_dtr', "0")): + if not should_ignore(config.get('serial_dtr')): args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] # Handling Data Bits and Stop Bits - if not should_ignore(config.get('data_bits', "0")): + if not should_ignore(config.get('data_bits')): args += ['--set-conf', f'data_bits={config["data_bits"]}'] - if not should_ignore(config.get('stop_bits', "0")): + if not should_ignore(config.get('stop_bits')): args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] # Fixme #rts_state From 877b517b7275d456d091b235c8497533741509ec Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:45:19 +0100 Subject: [PATCH 08/51] delete beacons older than 2 days --- modem/schedule_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/schedule_manager.py b/modem/schedule_manager.py index 93b62823..2bc22adf 100644 --- a/modem/schedule_manager.py +++ b/modem/schedule_manager.py @@ -70,7 +70,7 @@ class ScheduleManager: cmd.run(self.event_manager, self.modem) def delete_beacons(self): - DatabaseManagerBeacon(self.event_manager).beacon_cleanup_older_than_days(14) + DatabaseManagerBeacon(self.event_manager).beacon_cleanup_older_than_days(2) def push_to_explorer(self): self.config = self.config_manager.read() From 390817caa7301e09071e56381781ea37974ec9b7 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Fri, 16 Feb 2024 11:02:10 +0100 Subject: [PATCH 09/51] repeat message when beacon received --- modem/frame_handler_beacon.py | 4 +++ modem/message_system_db_messages.py | 42 ++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/modem/frame_handler_beacon.py b/modem/frame_handler_beacon.py index 1b0e0148..7a88dc20 100644 --- a/modem/frame_handler_beacon.py +++ b/modem/frame_handler_beacon.py @@ -4,6 +4,7 @@ import data_frame_factory import frame_handler import datetime from message_system_db_beacon import DatabaseManagerBeacon +from message_system_db_messages import DatabaseManagerMessages from message_system_db_manager import DatabaseManager @@ -15,3 +16,6 @@ class BeaconFrameHandler(frame_handler.FrameHandler): self.details["snr"], self.details['frame']["gridsquare"] ) + + # set message to queued if beacon received + DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) diff --git a/modem/message_system_db_messages.py b/modem/message_system_db_messages.py index 6b87cf2b..255b8ab5 100644 --- a/modem/message_system_db_messages.py +++ b/modem/message_system_db_messages.py @@ -201,4 +201,44 @@ class DatabaseManagerMessages(DatabaseManager): session.rollback() self.log(f"An error occurred while marking message {message_id} as read: {e}") finally: - session.remove() \ No newline at end of file + session.remove() + + def set_message_to_queued_for_callsign(self, callsign): + session = self.get_thread_scoped_session() + try: + # Find the 'failed' status object + failed_status = session.query(Status).filter_by(name='failed').first() + # Find the 'queued' status object + queued_status = session.query(Status).filter_by(name='queued').first() + + # Ensure both statuses are found + if not failed_status or not queued_status: + self.log("Failed or queued status not found", isWarning=True) + return + + # Query for messages with the specified callsign, 'failed' status, and fewer than 10 attempts + messages = session.query(P2PMessage) \ + .filter(P2PMessage.origin_callsign == callsign) \ + .filter(P2PMessage.status_id == failed_status.id) \ + .filter(P2PMessage.attempt < 10) \ + .all() + + if messages: + # Update each message's status to 'queued' + for message in messages: + # Increment attempt count using the existing function + self.increment_message_attempts(message.id) + + message.status_id = queued_status.id + self.log(f"Set message {message.id} to queued and incremented attempt") + + session.commit() + return {'status': 'success', 'message': f'{len(messages)} message(s) set to queued'} + else: + return {'status': 'failure', 'message': 'No eligible messages found'} + except Exception as e: + session.rollback() + self.log(f"An error occurred while setting messages to queued: {e}", isWarning=True) + return {'status': 'failure', 'message': str(e)} + finally: + session.remove() From 0e1986b2da283d4850bdfd9d785c480a15806c21 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:13:39 +0100 Subject: [PATCH 10/51] removed possibly obsolete arq state at wrong position --- modem/arq_session.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modem/arq_session.py b/modem/arq_session.py index 4fd424d4..8bae69af 100644 --- a/modem/arq_session.py +++ b/modem/arq_session.py @@ -98,7 +98,6 @@ class ARQSession(): if isinstance(received_data, bytearray) and isinstance(type_byte, int): self.arq_data_type_handler.dispatch(type_byte, received_data) - self.states.setARQ(False) return self.log(f"Ignoring unknown transition from state {self.state.name} with frame {frame['frame_type']}") From 4f50b802acabe414e3eef6e9cca88533fc6cd8a8 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 09:27:20 +0100 Subject: [PATCH 11/51] adjusted state manager in data type handler --- modem/arq_data_type_handler.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modem/arq_data_type_handler.py b/modem/arq_data_type_handler.py index 4de79f13..8745056a 100644 --- a/modem/arq_data_type_handler.py +++ b/modem/arq_data_type_handler.py @@ -54,6 +54,9 @@ class ARQDataTypeHandler: def dispatch(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type and session_type in self.handlers and 'handle' in self.handlers[session_type]: return self.handlers[session_type]['handle'](data) else: @@ -61,6 +64,9 @@ class ARQDataTypeHandler: def failed(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type in self.handlers and 'failed' in self.handlers[session_type]: return self.handlers[session_type]['failed'](data) else: @@ -74,6 +80,9 @@ class ARQDataTypeHandler: def transmitted(self, type_byte: int, data: bytearray): session_type = self.get_session_type_from_value(type_byte) + + self.state_manager.setARQ(False) + if session_type in self.handlers and 'transmitted' in self.handlers[session_type]: return self.handlers[session_type]['transmitted'](data) else: From b569cbc3156900a6561a24ad0a62e5e6ddc4d482 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:20:00 +0100 Subject: [PATCH 12/51] adjusted a rigctld command --- modem/rigctld.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 79ca0108..471d7469 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -246,12 +246,16 @@ class radio: if not should_ignore(config.get('serial_dcd', "0")): args += ['--set-dcd', config['serial_dcd']] if not should_ignore(config.get('serial_dtr', "0")): - args += ['--set-dtr', config['serial_dtr']] + args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] - # Handling Stop Bits with the corrected --set-conf syntax + # Handling Data Bits and Stop Bits + if not should_ignore(config.get('data_bits', "0")): + args += ['--set-conf', f'data_bits={config["data_bits"]}'] if not should_ignore(config.get('stop_bits', "0")): args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] + # Fixme #rts_state + # Handle custom arguments for rigctld # Custom args are split via ' ' so python doesn't add extranaeous quotes on windows args += config_rigctld["arguments"].split(" ") From 8d47d4890eb1d829d2a94c914ed8643c43ef7978 Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:29:18 +0100 Subject: [PATCH 13/51] removed rigctld typo --- modem/rigctld.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 471d7469..fc4628dd 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -229,29 +229,29 @@ class radio: return value in ['ignore', 0] # Model ID, Serial Port, and Speed - if not should_ignore(config.get('model_id', "0")): + if not should_ignore(config.get('model_id')): args += ['-m', str(config['model_id'])] - if not should_ignore(config.get('serial_port', "0")): + if not should_ignore(config.get('serial_port')): args += ['-r', config['serial_port']] - if not should_ignore(config.get('serial_speed', "0")): + if not should_ignore(config.get('serial_speed')): args += ['-s', str(config['serial_speed'])] # PTT Port and Type - if not should_ignore(config.get('ptt_port', "0")): + if not should_ignore(config.get('ptt_port')): args += ['--ptt-port', config['ptt_port']] - if not should_ignore(config.get('ptt_type', "0")): + if not should_ignore(config.get('ptt_type')): args += ['--ptt-type', config['ptt_type']] # Serial DCD and DTR - if not should_ignore(config.get('serial_dcd', "0")): + if not should_ignore(config.get('serial_dcd')): args += ['--set-dcd', config['serial_dcd']] - if not should_ignore(config.get('serial_dtr', "0")): + if not should_ignore(config.get('serial_dtr')): args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] # Handling Data Bits and Stop Bits - if not should_ignore(config.get('data_bits', "0")): + if not should_ignore(config.get('data_bits')): args += ['--set-conf', f'data_bits={config["data_bits"]}'] - if not should_ignore(config.get('stop_bits', "0")): + if not should_ignore(config.get('stop_bits')): args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] # Fixme #rts_state From 916c2a4a634a93f51079b0e9fe1fde3793b679fa Mon Sep 17 00:00:00 2001 From: DJ2LS <75909252+DJ2LS@users.noreply.github.com> Date: Wed, 14 Feb 2024 16:45:19 +0100 Subject: [PATCH 14/51] delete beacons older than 2 days --- modem/schedule_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/schedule_manager.py b/modem/schedule_manager.py index 93b62823..2bc22adf 100644 --- a/modem/schedule_manager.py +++ b/modem/schedule_manager.py @@ -70,7 +70,7 @@ class ScheduleManager: cmd.run(self.event_manager, self.modem) def delete_beacons(self): - DatabaseManagerBeacon(self.event_manager).beacon_cleanup_older_than_days(14) + DatabaseManagerBeacon(self.event_manager).beacon_cleanup_older_than_days(2) def push_to_explorer(self): self.config = self.config_manager.read() From fc055671cbdb06583f680fa67208cfdcbe24e7d9 Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sat, 17 Feb 2024 10:41:09 -0500 Subject: [PATCH 15/51] Adjustments to rigctld arguments --- modem/rigctld.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index fc4628dd..0d988a9d 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -244,7 +244,7 @@ class radio: # Serial DCD and DTR if not should_ignore(config.get('serial_dcd')): - args += ['--set-dcd', config['serial_dcd']] + args += ['--dcd-type', config['serial_dcd']] if not should_ignore(config.get('serial_dtr')): args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] @@ -255,6 +255,8 @@ class radio: args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] # Fixme #rts_state + if not should_ignore(config.get('rts_state')): + args += ['--set-conf', f'stop_bits={config["rts_state"]}'] # Handle custom arguments for rigctld # Custom args are split via ' ' so python doesn't add extranaeous quotes on windows From 7eaac1cc298b2af57f6b3e0c4f4f57e7991fbd41 Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sat, 17 Feb 2024 11:03:59 -0500 Subject: [PATCH 16/51] Fix typos/remove rts --- modem/rigctld.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 9b171c18..7e987d18 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -244,8 +244,7 @@ class radio: # Serial DCD and DTR if not should_ignore(config.get('serial_dcd')): - - args += ['--dcd-type', config['serial_dcd']] + args += ['--dcd-type', config.get('serial_dcd')] if not should_ignore(config.get('serial_dtr')): args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] @@ -257,9 +256,8 @@ class radio: args += ['--set-conf', f'stop_bits={config["stop_bits"]}'] # Fixme #rts_state - - if not should_ignore(config.get('rts_state')): - args += ['--set-conf', f'stop_bits={config["rts_state"]}'] + # if not should_ignore(config.get('rts_state')): + # args += ['--set-conf', f'stop_bits={config["rts_state"]}'] # Handle custom arguments for rigctld # Custom args are split via ' ' so python doesn't add extranaeous quotes on windows From c26f9cb9ba4f23bfd21ba2c0568800e5d108979f Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sat, 17 Feb 2024 12:55:10 -0500 Subject: [PATCH 17/51] Incr Next Version --- gui/package.json | 2 +- modem/server.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/package.json b/gui/package.json index ac0b4088..34cc15e2 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.13.5-alpha", + "version": "0.13.6-alpha", "main": "dist-electron/main/index.js", "scripts": { "start": "vite", diff --git a/modem/server.py b/modem/server.py index 43b4e8ee..00ef9f86 100644 --- a/modem/server.py +++ b/modem/server.py @@ -29,7 +29,7 @@ app = Flask(__name__) CORS(app) CORS(app, resources={r"/*": {"origins": "*"}}) sock = Sock(app) -MODEM_VERSION = "0.13.5-alpha" +MODEM_VERSION = "0.13.6-alpha" # set config file to use def set_config(): From 404585ebe02187f9fa9ade7a86b108e4857c9bd0 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sat, 17 Feb 2024 20:42:07 +0100 Subject: [PATCH 18/51] auto update server config --- modem/config.py | 62 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/modem/config.py b/modem/config.py index 62851a68..d156c166 100644 --- a/modem/config.py +++ b/modem/config.py @@ -56,7 +56,6 @@ class CONFIG: 'enable_protocol': bool, }, 'MODEM': { - 'enable_fft': bool, 'tuning_range_fmax': int, 'tuning_range_fmin': int, 'enable_fsk': bool, @@ -73,7 +72,7 @@ class CONFIG: def __init__(self, configfile: str): # set up logger - self.log = structlog.get_logger("CONFIG") + self.log = structlog.get_logger(type(self).__name__) # init configparser self.parser = configparser.ConfigParser(inline_comment_prefixes="#", allow_no_value=True) @@ -88,6 +87,9 @@ class CONFIG: # check if config file exists self.config_exists() + # validate config structure + self.validate_config() + def config_exists(self): """ check if config file exists @@ -99,7 +101,7 @@ class CONFIG: return False # Validates config data - def validate(self, data): + def validate_data(self, data): for section in data: for setting in data[section]: if not isinstance(data[section][setting], self.config_types[section][setting]): @@ -107,6 +109,53 @@ class CONFIG: f" '{data[section][setting]}' {type(data[section][setting])} given.") raise ValueError(message) + def validate_config(self): + """ + Updates the configuration file to match exactly what is defined in self.config_types. + It removes sections and settings not defined there and adds missing sections and settings. + """ + existing_sections = self.parser.sections() + + # Remove sections and settings not defined in self.config_types + for section in existing_sections: + if section not in self.config_types: + self.parser.remove_section(section) + self.log.info(f"[CFG] Removing undefined section: {section}") + continue + existing_settings = self.parser.options(section) + for setting in existing_settings: + if setting not in self.config_types[section]: + self.parser.remove_option(section, setting) + self.log.info(f"[CFG] Removing undefined setting: {section}.{setting}") + + # Add missing sections and settings from self.config_types + for section, settings in self.config_types.items(): + if section not in existing_sections: + self.parser.add_section(section) + self.log.info(f"[CFG] Adding missing section: {section}") + for setting, value_type in settings.items(): + if not self.parser.has_option(section, setting): + default_value = self.get_default_value_for_type(value_type) + self.parser.set(section, setting, str(default_value)) + self.log.info(f"[CFG] Adding missing setting: {section}.{setting}") + + self.write_to_file() + + def get_default_value_for_type(self, value_type): + """ + Returns a default value for the given type. + """ + if value_type == list: + return '[]' # Empty list in JSON format + elif value_type == bool: + return 'False' + elif value_type == int: + return '0' + elif value_type == str: + return '' + else: + return None # You might want to handle more types or throw an error + # Handle special setting data type conversion # is_writing means data from a dict being writen to the config file # if False, it means the opposite direction @@ -132,7 +181,7 @@ class CONFIG: # Sets and writes config data from a dict containing data settings def write(self, data): # Validate config data before writing - self.validate(data) + self.validate_data(data) for section in data: # init section if it doesn't exist yet @@ -143,7 +192,10 @@ class CONFIG: new_value = self.handle_setting( section, setting, data[section][setting], True) self.parser[section][setting] = str(new_value) - + + self.write_to_file() + + def write_to_file(self): # Write config data to file try: with open(self.config_name, 'w') as configfile: From 657a6a896709ea0803eecd91432100f9b27b2047 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sat, 17 Feb 2024 20:45:51 +0100 Subject: [PATCH 19/51] default values as list --- modem/config.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/modem/config.py b/modem/config.py index d156c166..b9e20636 100644 --- a/modem/config.py +++ b/modem/config.py @@ -69,6 +69,13 @@ class CONFIG: }, } + default_values = { + list: '[]', + bool: 'False', + int: '0', + str: '', + } + def __init__(self, configfile: str): # set up logger @@ -135,26 +142,14 @@ class CONFIG: self.log.info(f"[CFG] Adding missing section: {section}") for setting, value_type in settings.items(): if not self.parser.has_option(section, setting): - default_value = self.get_default_value_for_type(value_type) + default_value = self.default_values.get(value_type, None) + self.parser.set(section, setting, str(default_value)) self.log.info(f"[CFG] Adding missing setting: {section}.{setting}") self.write_to_file() - def get_default_value_for_type(self, value_type): - """ - Returns a default value for the given type. - """ - if value_type == list: - return '[]' # Empty list in JSON format - elif value_type == bool: - return 'False' - elif value_type == int: - return '0' - elif value_type == str: - return '' - else: - return None # You might want to handle more types or throw an error + # Handle special setting data type conversion # is_writing means data from a dict being writen to the config file From 5bee82a17c979cd32559f0417a15057e105fe976 Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sat, 17 Feb 2024 16:57:54 -0500 Subject: [PATCH 20/51] Further adjustment --- modem/rigctld.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/rigctld.py b/modem/rigctld.py index 7e987d18..be112cdc 100644 --- a/modem/rigctld.py +++ b/modem/rigctld.py @@ -244,7 +244,7 @@ class radio: # Serial DCD and DTR if not should_ignore(config.get('serial_dcd')): - args += ['--dcd-type', config.get('serial_dcd')] + args += ['--dcd-type', config['serial_dcd']] if not should_ignore(config.get('serial_dtr')): args += ['--set-conf', f'dtr_state={config["serial_dtr"]}'] From 7f86ab2ece3d9300331d047a3fd38bd8b93addc5 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 18 Feb 2024 15:06:13 +0100 Subject: [PATCH 21/51] arq adjustments and attempt fixing tests --- modem/arq_session_irs.py | 21 ++++++++++++--------- modem/config.ini.example | 4 ++-- modem/server.py | 9 +++++---- tests/test_arq_session.py | 12 ++++++------ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/modem/arq_session_irs.py b/modem/arq_session_irs.py index 8e0b461f..1c853568 100644 --- a/modem/arq_session_irs.py +++ b/modem/arq_session_irs.py @@ -96,9 +96,7 @@ class ARQSessionIRS(arq_session.ARQSession): self.log(f"Waiting {timeout} seconds...") if not self.event_frame_received.wait(timeout): self.log("Timeout waiting for ISS. Session failed.") - self.session_ended = time.time() - self.set_state(IRS_State.FAILED) - self.event_manager.send_arq_session_finished(False, self.id, self.dxcall, False, self.state.name, statistics=self.calculate_session_statistics()) + self.transmission_failed() def launch_transmit_and_wait(self, frame, timeout, mode): thread_wait = threading.Thread(target = self.transmit_and_wait, @@ -208,11 +206,7 @@ class ARQSessionIRS(arq_session.ARQSession): flag_checksum=False) self.transmit_frame(ack, mode=FREEDV_MODE.signalling) self.log("CRC fail at the end of transmission!") - self.session_ended = time.time() - self.set_state(IRS_State.FAILED) - self.event_manager.send_arq_session_finished( - False, self.id, self.dxcall, False, self.state.name, statistics=self.calculate_session_statistics()) - return False, False + self.transmission_failed() def calibrate_speed_settings(self): self.speed_level = 0 # for now stay at lowest speed level @@ -236,4 +230,13 @@ class ARQSessionIRS(arq_session.ARQSession): self.set_state(IRS_State.ABORTED) self.event_manager.send_arq_session_finished( False, self.id, self.dxcall, False, self.state.name, statistics=self.calculate_session_statistics()) - return None, None \ No newline at end of file + return None, None + + def transmission_failed(self, irs_frame=None): + # final function for failed transmissions + self.session_ended = time.time() + self.set_state(IRS_State.FAILED) + self.log(f"Transmission failed!") + self.event_manager.send_arq_session_finished(True, self.id, self.dxcall,False, self.state.name, statistics=self.calculate_session_statistics()) + self.states.setARQ(False) + return None, None diff --git a/modem/config.ini.example b/modem/config.ini.example index c0496ed3..59cc6ea2 100644 --- a/modem/config.ini.example +++ b/modem/config.ini.example @@ -2,9 +2,9 @@ modemport = 3050 [STATION] -mycall = XX1XXX +mycall = AA1AAA mygrid = AA12aa -myssid = 6 +myssid = 1 ssid_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] enable_explorer = True enable_stats = True diff --git a/modem/server.py b/modem/server.py index 3fb046f4..823c8ffb 100644 --- a/modem/server.py +++ b/modem/server.py @@ -222,10 +222,11 @@ def post_modem_send_raw_stop(): if not app.state_manager.is_modem_running: api_abort('Modem not running', 503) - for id in app.state_manager.arq_irs_sessions: - app.state_manager.arq_irs_sessions[id].abort_transmission() - for id in app.state_manager.arq_iss_sessions: - app.state_manager.arq_iss_sessions[id].abort_transmission() + if app.state_manager.getARQ(): + for id in app.state_manager.arq_irs_sessions: + app.state_manager.arq_irs_sessions[id].abort_transmission() + for id in app.state_manager.arq_iss_sessions: + app.state_manager.arq_iss_sessions[id].abort_transmission() return api_response(request.json) diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index 96d7e337..961c2262 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -130,11 +130,11 @@ class TestARQSession(unittest.TestCase): def testARQSessionSmallPayload(self): # set Packet Error Rate (PER) / frame loss probability - self.loss_probability = 0 + self.loss_probability = 30 self.establishChannels() params = { - 'dxcall': "XX1XXX-1", + 'dxcall': "AA1AAA-1", 'data': base64.b64encode(bytes("Hello world!", encoding="utf-8")), 'type': "raw_lzma" } @@ -149,7 +149,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "XX1XXX-1", + 'dxcall': "AA1AAA-1", 'data': base64.b64encode(np.random.bytes(1000)), 'type': "raw_lzma" } @@ -165,7 +165,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "XX1XXX-1", + 'dxcall': "AA1AAA-1", 'data': base64.b64encode(np.random.bytes(100)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) @@ -184,7 +184,7 @@ class TestARQSession(unittest.TestCase): self.establishChannels() params = { - 'dxcall': "XX1XXX-1", + 'dxcall': "AA1AAA-1", 'data': base64.b64encode(np.random.bytes(100)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) @@ -200,7 +200,7 @@ class TestARQSession(unittest.TestCase): def testSessionCleanupISS(self): params = { - 'dxcall': "XX1XXX-1", + 'dxcall': "AA1AAA-1", 'data': base64.b64encode(np.random.bytes(100)), } cmd = ARQRawCommand(self.config, self.iss_state_manager, self.iss_event_queue, params) From b52d55285ca58b8c97f1c1ff782ec0cfc650bf4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:08:57 +0000 Subject: [PATCH 22/51] Bump vite from 5.0.12 to 5.1.3 in /gui Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.12 to 5.1.3. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.1.3/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/package.json b/gui/package.json index 34cc15e2..c1454041 100644 --- a/gui/package.json +++ b/gui/package.json @@ -75,7 +75,7 @@ "eslint-plugin-promise": "6.1.1", "eslint-plugin-vue": "9.20.1", "typescript": "5.3.3", - "vite": "5.0.12", + "vite": "5.1.3", "vite-plugin-electron": "0.28.0", "vite-plugin-electron-renderer": "0.14.5", "vitest": "1.2.2", From 44d24123b19dbd8e891860f9fe17596cb7fc88af Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 13:57:16 -0500 Subject: [PATCH 23/51] Remove enable_fft from gui settingstore --- gui/src/store/settingsStore.js | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/src/store/settingsStore.js b/gui/src/store/settingsStore.js index 8baa9b2d..48200fbe 100644 --- a/gui/src/store/settingsStore.js +++ b/gui/src/store/settingsStore.js @@ -54,7 +54,6 @@ const defaultConfig = { enable_protocol: false, }, MODEM: { - enable_fft: false, enable_fsk: false, enable_low_bandwidth_mode: false, respond_to_cq: false, From 273914d714bd1bd1a55d8c8c403f5336b47d966b Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 13:57:53 -0500 Subject: [PATCH 24/51] Extra serial port in config.py --- modem/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modem/config.py b/modem/config.py index b9e20636..18388b24 100644 --- a/modem/config.py +++ b/modem/config.py @@ -31,7 +31,6 @@ class CONFIG: 'control': str, 'serial_port': str, 'model_id': int, - 'serial_port': str, 'serial_speed': int, 'data_bits': int, 'stop_bits': int, From e90d1f771625a061711f0ba573c89b3d8288f606 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 18 Feb 2024 20:31:01 +0100 Subject: [PATCH 25/51] adjusted config --- modem/config.ini.example | 2 +- modem/config.py | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modem/config.ini.example b/modem/config.ini.example index 59cc6ea2..4729ff19 100644 --- a/modem/config.ini.example +++ b/modem/config.ini.example @@ -1,5 +1,5 @@ [NETWORK] -modemport = 3050 +modemport = 5000 [STATION] mycall = AA1AAA diff --git a/modem/config.py b/modem/config.py index b9e20636..f3070d12 100644 --- a/modem/config.py +++ b/modem/config.py @@ -147,9 +147,7 @@ class CONFIG: self.parser.set(section, setting, str(default_value)) self.log.info(f"[CFG] Adding missing setting: {section}.{setting}") - self.write_to_file() - - + return self.write_to_file() # Handle special setting data type conversion # is_writing means data from a dict being writen to the config file @@ -177,7 +175,6 @@ class CONFIG: def write(self, data): # Validate config data before writing self.validate_data(data) - for section in data: # init section if it doesn't exist yet if not section.upper() in self.parser.keys(): @@ -186,9 +183,11 @@ class CONFIG: for setting in data[section]: new_value = self.handle_setting( section, setting, data[section][setting], True) - self.parser[section][setting] = str(new_value) - - self.write_to_file() + try: + self.parser[section][setting] = str(new_value) + except Exception as e: + self.log.error("[CFG] error setting config key", e=e) + return self.write_to_file() def write_to_file(self): # Write config data to file From 7a09f947679c8e60fa4fb415afd26fe5b74d2ebb Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 18 Feb 2024 21:08:14 +0100 Subject: [PATCH 26/51] added config related parts --- gui/src/components/settings_chat.vue | 19 +++++++++++++++++-- gui/src/store/settingsStore.js | 3 +++ modem/config.py | 4 ++++ modem/frame_handler_beacon.py | 5 +++-- modem/frame_handler_cq.py | 7 +++++++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gui/src/components/settings_chat.vue b/gui/src/components/settings_chat.vue index 02a5d726..596132d6 100644 --- a/gui/src/components/settings_chat.vue +++ b/gui/src/components/settings_chat.vue @@ -5,9 +5,24 @@ import { setActivePinia } from "pinia"; import pinia from "../store/index"; setActivePinia(pinia); -import { settingsStore as settings } from "../store/settingsStore.js"; +import { settingsStore as settings, onChange } from "../store/settingsStore.js"; diff --git a/gui/src/store/settingsStore.js b/gui/src/store/settingsStore.js index 8baa9b2d..25a0aa3e 100644 --- a/gui/src/store/settingsStore.js +++ b/gui/src/store/settingsStore.js @@ -98,6 +98,9 @@ const defaultConfig = { tci_ip: "127.0.0.1", tci_port: 0, }, + MESSAGES: { + enable_auto_repeat: false, + }, }, }; diff --git a/modem/config.py b/modem/config.py index b9e20636..cb97eb5f 100644 --- a/modem/config.py +++ b/modem/config.py @@ -67,6 +67,9 @@ class CONFIG: 'tx_delay': int, 'beacon_interval': int, }, + 'MESSAGES': { + 'enable_auto_repeat': bool, + } } default_values = { @@ -175,6 +178,7 @@ class CONFIG: # Sets and writes config data from a dict containing data settings def write(self, data): + print(data) # Validate config data before writing self.validate_data(data) diff --git a/modem/frame_handler_beacon.py b/modem/frame_handler_beacon.py index 7a88dc20..10b79822 100644 --- a/modem/frame_handler_beacon.py +++ b/modem/frame_handler_beacon.py @@ -17,5 +17,6 @@ class BeaconFrameHandler(frame_handler.FrameHandler): self.details['frame']["gridsquare"] ) - # set message to queued if beacon received - DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) + if self.config["MESSAGES"]["enable_auto_repeat"]: + # set message to queued if beacon received + DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) diff --git a/modem/frame_handler_cq.py b/modem/frame_handler_cq.py index 67fd4e44..1fe59d90 100644 --- a/modem/frame_handler_cq.py +++ b/modem/frame_handler_cq.py @@ -2,6 +2,9 @@ import frame_handler_ping import helpers import data_frame_factory import frame_handler +from message_system_db_messages import DatabaseManagerMessages + + class CQFrameHandler(frame_handler_ping.PingFrameHandler): def should_respond(self): @@ -14,3 +17,7 @@ class CQFrameHandler(frame_handler_ping.PingFrameHandler): self.details['snr'] ) self.transmit(qrv_frame) + + if self.config["MESSAGES"]["enable_auto_repeat"]: + # set message to queued if beacon received + DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) From dbc959d06e545ec27bf245700a1d4f113996e505 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 18 Feb 2024 21:15:33 +0100 Subject: [PATCH 27/51] added config related parts --- modem/config.py | 1 - modem/server.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/config.py b/modem/config.py index cb97eb5f..eeff2375 100644 --- a/modem/config.py +++ b/modem/config.py @@ -178,7 +178,6 @@ class CONFIG: # Sets and writes config data from a dict containing data settings def write(self, data): - print(data) # Validate config data before writing self.validate_data(data) diff --git a/modem/server.py b/modem/server.py index 8a248150..16895b03 100644 --- a/modem/server.py +++ b/modem/server.py @@ -93,6 +93,7 @@ def index(): @app.route('/config', methods=['GET', 'POST']) def config(): if request.method in ['POST']: + print(request.json) set_config = app.config_manager.write(request.json) app.modem_service.put("restart") if not set_config: From f8bff53eae7fad5691e0198e8c5676281c3cd53b Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Sun, 18 Feb 2024 21:31:08 +0100 Subject: [PATCH 28/51] updated example config and typo --- modem/config.ini.example | 3 +++ modem/frame_handler_cq.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modem/config.ini.example b/modem/config.ini.example index 4729ff19..b82b5ab5 100644 --- a/modem/config.ini.example +++ b/modem/config.ini.example @@ -55,3 +55,6 @@ rx_buffer_size = 64 tx_delay = 200 beacon_interval = 300 +[MESSAGES] +enable_auto_repeat = False + diff --git a/modem/frame_handler_cq.py b/modem/frame_handler_cq.py index 1fe59d90..a23d2c69 100644 --- a/modem/frame_handler_cq.py +++ b/modem/frame_handler_cq.py @@ -19,5 +19,5 @@ class CQFrameHandler(frame_handler_ping.PingFrameHandler): self.transmit(qrv_frame) if self.config["MESSAGES"]["enable_auto_repeat"]: - # set message to queued if beacon received + # set message to queued if CQ received DatabaseManagerMessages(self.event_manager).set_message_to_queued_for_callsign(self.details['frame']["origin"]) From 70228054fd0cd69a91410efc2490bee02db24893 Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 15:33:29 -0500 Subject: [PATCH 29/51] Remove unused setting --- gui/src/store/settingsStore.js | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/src/store/settingsStore.js b/gui/src/store/settingsStore.js index 8baa9b2d..48200fbe 100644 --- a/gui/src/store/settingsStore.js +++ b/gui/src/store/settingsStore.js @@ -54,7 +54,6 @@ const defaultConfig = { enable_protocol: false, }, MODEM: { - enable_fft: false, enable_fsk: false, enable_low_bandwidth_mode: false, respond_to_cq: false, From 47242fb33eb0513931174a779ba406e54fadea0f Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 15:33:42 -0500 Subject: [PATCH 30/51] Remove duplicate setting --- modem/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modem/config.py b/modem/config.py index f3070d12..cd6dcb18 100644 --- a/modem/config.py +++ b/modem/config.py @@ -31,7 +31,6 @@ class CONFIG: 'control': str, 'serial_port': str, 'model_id': int, - 'serial_port': str, 'serial_speed': int, 'data_bits': int, 'stop_bits': int, From 796d1c0566ab37100ebb303029cfee418811bf45 Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 15:34:10 -0500 Subject: [PATCH 31/51] Only restart modem if config is valid --- modem/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/server.py b/modem/server.py index 8a248150..50fe5f49 100644 --- a/modem/server.py +++ b/modem/server.py @@ -94,10 +94,10 @@ def index(): def config(): if request.method in ['POST']: set_config = app.config_manager.write(request.json) - app.modem_service.put("restart") if not set_config: response = api_response(None, 'error writing config') else: + app.modem_service.put("restart") response = api_response(set_config) return response elif request.method == 'GET': From 6db6c486a3ebd6bea7eb870e57912b645206257d Mon Sep 17 00:00:00 2001 From: Mashintime Date: Sun, 18 Feb 2024 15:46:40 -0500 Subject: [PATCH 32/51] Remove print (accidentally committed) --- modem/server.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modem/server.py b/modem/server.py index ce0c15d2..50fe5f49 100644 --- a/modem/server.py +++ b/modem/server.py @@ -93,7 +93,6 @@ def index(): @app.route('/config', methods=['GET', 'POST']) def config(): if request.method in ['POST']: - print(request.json) set_config = app.config_manager.write(request.json) if not set_config: response = api_response(None, 'error writing config') From 25bd486f8e5413d5401a7b0f5302a47f250b2377 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 06:24:03 +0000 Subject: [PATCH 33/51] Bump vite-plugin-electron from 0.28.0 to 0.28.2 in /gui Bumps [vite-plugin-electron](https://github.com/electron-vite/vite-plugin-electron) from 0.28.0 to 0.28.2. - [Release notes](https://github.com/electron-vite/vite-plugin-electron/releases) - [Changelog](https://github.com/electron-vite/vite-plugin-electron/blob/main/CHANGELOG.md) - [Commits](https://github.com/electron-vite/vite-plugin-electron/compare/v0.28.0...v0.28.2) --- updated-dependencies: - dependency-name: vite-plugin-electron dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- gui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/package.json b/gui/package.json index 525c3e01..1a4f3eb4 100644 --- a/gui/package.json +++ b/gui/package.json @@ -76,7 +76,7 @@ "eslint-plugin-vue": "9.20.1", "typescript": "5.3.3", "vite": "5.1.3", - "vite-plugin-electron": "0.28.0", + "vite-plugin-electron": "0.28.2", "vite-plugin-electron-renderer": "0.14.5", "vitest": "1.2.2", "vue": "3.4.15", From 10be8db7d0a45bccf8855a3cc62cfdf8bbc0bead Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 08:27:40 +0100 Subject: [PATCH 34/51] improved arq tests which went stuck --- modem/arq_session_iss.py | 1 - tests/test_arq_session.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 68c4e922..9c69522c 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -182,7 +182,6 @@ class ARQSessionISS(arq_session.ARQSession): self.states.setARQ(False) self.arq_data_type_handler.failed(self.type_byte, self.data) - return None, None def abort_transmission(self, irs_frame=None): diff --git a/tests/test_arq_session.py b/tests/test_arq_session.py index 961c2262..185e90e3 100644 --- a/tests/test_arq_session.py +++ b/tests/test_arq_session.py @@ -103,7 +103,7 @@ class TestARQSession(unittest.TestCase): def waitForSession(self, q, outbound = False): key = 'arq-transfer-outbound' if outbound else 'arq-transfer-inbound' - while True: + while True and self.channels_running: ev = q.get() if key in ev and ('success' in ev[key] or 'ABORTED' in ev[key]): self.logger.info(f"[{threading.current_thread().name}] {key} session ended.") @@ -125,6 +125,7 @@ class TestARQSession(unittest.TestCase): def waitAndCloseChannels(self): self.waitForSession(self.iss_event_queue, True) + self.channels_running = False self.waitForSession(self.irs_event_queue, False) self.channels_running = False From 35276b01ef53b44a1f77728f242f30c6162ac97c Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 08:37:16 +0100 Subject: [PATCH 35/51] improved message tests which went stuck --- tests/test_message_protocol.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_message_protocol.py b/tests/test_message_protocol.py index 591daefa..eedf7a00 100644 --- a/tests/test_message_protocol.py +++ b/tests/test_message_protocol.py @@ -108,7 +108,7 @@ class TestMessageProtocol(unittest.TestCase): def waitForSession(self, q, outbound=False): key = 'arq-transfer-outbound' if outbound else 'arq-transfer-inbound' - while True: + while True and self.channels_running: ev = q.get() if key in ev and ('success' in ev[key] or 'ABORTED' in ev[key]): self.logger.info(f"[{threading.current_thread().name}] {key} session ended.") @@ -130,6 +130,7 @@ class TestMessageProtocol(unittest.TestCase): def waitAndCloseChannels(self): self.waitForSession(self.iss_event_queue, True) + self.channels_running = False self.waitForSession(self.irs_event_queue, False) self.channels_running = False From 2c24545e68755e31c56a9a9908b24069546ddc82 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 10:53:44 +0100 Subject: [PATCH 36/51] possibly fixed repeating message --- modem/message_system_db_messages.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modem/message_system_db_messages.py b/modem/message_system_db_messages.py index 255b8ab5..b670dccc 100644 --- a/modem/message_system_db_messages.py +++ b/modem/message_system_db_messages.py @@ -218,7 +218,7 @@ class DatabaseManagerMessages(DatabaseManager): # Query for messages with the specified callsign, 'failed' status, and fewer than 10 attempts messages = session.query(P2PMessage) \ - .filter(P2PMessage.origin_callsign == callsign) \ + .filter(P2PMessage.destination_callsign == callsign) \ .filter(P2PMessage.status_id == failed_status.id) \ .filter(P2PMessage.attempt < 10) \ .all() From 30de19f729bbc3676b3fb2e099f0668fde14253b Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 10:59:53 +0100 Subject: [PATCH 37/51] possibly fixed repeating message --- modem/message_system_db_messages.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/modem/message_system_db_messages.py b/modem/message_system_db_messages.py index b670dccc..914bfcaa 100644 --- a/modem/message_system_db_messages.py +++ b/modem/message_system_db_messages.py @@ -171,21 +171,27 @@ class DatabaseManagerMessages(DatabaseManager): finally: session.remove() - def increment_message_attempts(self, message_id): - session = self.get_thread_scoped_session() + def increment_message_attempts(self, message_id, session=None): + own_session = False + if not session: + session = self.get_thread_scoped_session() + own_session = True try: message = session.query(P2PMessage).filter_by(id=message_id).first() if message: message.attempt += 1 - session.commit() + if own_session: + session.commit() self.log(f"Incremented attempt count for message {message_id}") else: self.log(f"Message with ID {message_id} not found") except Exception as e: - session.rollback() + if own_session: + session.rollback() self.log(f"An error occurred while incrementing attempts for message {message_id}: {e}") finally: - session.remove() + if own_session: + session.remove() def mark_message_as_read(self, message_id): session = self.get_thread_scoped_session() @@ -227,7 +233,7 @@ class DatabaseManagerMessages(DatabaseManager): # Update each message's status to 'queued' for message in messages: # Increment attempt count using the existing function - self.increment_message_attempts(message.id) + self.increment_message_attempts(message.id, session) message.status_id = queued_status.id self.log(f"Set message {message.id} to queued and incremented attempt") From b7563040eff78e6f9eb225852d84a51585fd3abc Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 11:06:15 +0100 Subject: [PATCH 38/51] only retry first result --- modem/message_system_db_messages.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/modem/message_system_db_messages.py b/modem/message_system_db_messages.py index 914bfcaa..639ac92f 100644 --- a/modem/message_system_db_messages.py +++ b/modem/message_system_db_messages.py @@ -223,23 +223,21 @@ class DatabaseManagerMessages(DatabaseManager): return # Query for messages with the specified callsign, 'failed' status, and fewer than 10 attempts - messages = session.query(P2PMessage) \ + message = session.query(P2PMessage) \ .filter(P2PMessage.destination_callsign == callsign) \ .filter(P2PMessage.status_id == failed_status.id) \ .filter(P2PMessage.attempt < 10) \ - .all() + .first() - if messages: - # Update each message's status to 'queued' - for message in messages: - # Increment attempt count using the existing function - self.increment_message_attempts(message.id, session) + if message: + # Increment attempt count using the existing function + self.increment_message_attempts(message.id, session) - message.status_id = queued_status.id - self.log(f"Set message {message.id} to queued and incremented attempt") + message.status_id = queued_status.id + self.log(f"Set message {message.id} to queued and incremented attempt") session.commit() - return {'status': 'success', 'message': f'{len(messages)} message(s) set to queued'} + return {'status': 'success', 'message': f'{len(message)} message(s) set to queued'} else: return {'status': 'failure', 'message': 'No eligible messages found'} except Exception as e: From 1337a4a0c8d93a9c762f9a2424f9c00e46f8cf5b Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 19 Feb 2024 20:08:05 +0100 Subject: [PATCH 39/51] fixed more tests --- tests/test_config.py | 10 ++++++---- tests/test_message_protocol.py | 2 +- tests/test_protocols.py | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index 71cd5be8..90c49bed 100755 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,3 +1,5 @@ +import sys +sys.path.append('modem') import unittest import config @@ -11,8 +13,8 @@ class TestConfigMethods(unittest.TestCase): c = config.CONFIG('modem/config.ini.example') self.assertTrue(c.config_exists()) - c = config.CONFIG('modem/nonexistant.ini') - self.assertFalse(c.config_exists()) + #c = config.CONFIG('modem/nonexistant') + #self.assertFalse(c.config_exists()) def test_read(self): data = self.config.read() @@ -42,10 +44,10 @@ class TestConfigMethods(unittest.TestCase): def test_validate_data(self): data = {'STATION': {'ssid_list': "abc"}} with self.assertRaises(ValueError): - self.config.validate(data) + self.config.validate_data(data) data = {'STATION': {'ssid_list': [1, 2, 3]}} - self.assertIsNone(self.config.validate(data)) + self.assertIsNone(self.config.validate_data(data)) if __name__ == '__main__': diff --git a/tests/test_message_protocol.py b/tests/test_message_protocol.py index eedf7a00..cf968095 100644 --- a/tests/test_message_protocol.py +++ b/tests/test_message_protocol.py @@ -140,7 +140,7 @@ class TestMessageProtocol(unittest.TestCase): self.establishChannels() params = { - 'destination': "XX1XXX-1", + 'destination': "AA1AAA-1", 'body': 'Hello World', } diff --git a/tests/test_protocols.py b/tests/test_protocols.py index 32ddf2dd..c6f64a03 100755 --- a/tests/test_protocols.py +++ b/tests/test_protocols.py @@ -51,7 +51,7 @@ class TestProtocols(unittest.TestCase): def testPingWithAck(self): # Run ping command - api_params = { "dxcall": "XX1XXX-6"} + api_params = { "dxcall": "AA1AAA-1"} ping_cmd = PingCommand(self.config, self.state_manager, self.event_manager, api_params) #ping_cmd.run(self.event_queue, self.modem) frame = ping_cmd.test(self.event_queue) From f76dc5da14b5b1c89d404f25d2874e083467048c Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Tue, 20 Feb 2024 08:09:05 +0100 Subject: [PATCH 40/51] first attempt fixing radio mode related problems by separating parameters --- gui/src/components/dynamic_components.vue | 16 +++++++--- .../grid/grid_active_rig_control.vue | 27 ++++++++++------ .../components/main_active_rig_control.vue | 31 +++++++++++-------- gui/src/js/api.js | 14 +++++++-- modem/server.py | 9 ++++-- 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/gui/src/components/dynamic_components.vue b/gui/src/components/dynamic_components.vue index 8cbb5ebb..89f453d4 100644 --- a/gui/src/components/dynamic_components.vue +++ b/gui/src/components/dynamic_components.vue @@ -8,7 +8,7 @@ import "../../node_modules/gridstack/dist/gridstack.min.css"; import { GridStack } from "gridstack"; import { useStateStore } from "../store/stateStore.js"; const state = useStateStore(pinia); -import { setRadioParameters } from "../js/api"; +import { setRadioParametersFrequency, setRadioParametersMode, setRadioParametersRFLevel } from "../js/api"; import { saveLocalSettingsToConfig, settingsStore } from "../store/settingsStore"; import active_heard_stations from "./grid/grid_active_heard_stations.vue"; @@ -251,14 +251,22 @@ new gridWidget( //New new widget ID should be 20 ]; + function updateFrequencyAndApply(frequency) { state.new_frequency = frequency; - set_radio_parameters(); + set_radio_parameter_frequency(); } -function set_radio_parameters(){ - setRadioParameters(state.new_frequency, state.mode, state.rf_level); +function set_radio_parameter_frequency(){ + setRadioParametersFrequency(state.new_frequency) +} +function set_radio_parameter_mode(){ + setRadioParametersMode(state.mode) +} + +function set_radio_parameter_rflevel(){ + setRadioParametersRFLevel(state.rf_level) } diff --git a/gui/src/components/grid/grid_active_rig_control.vue b/gui/src/components/grid/grid_active_rig_control.vue index 2042fe3e..732deb5b 100644 --- a/gui/src/components/grid/grid_active_rig_control.vue +++ b/gui/src/components/grid/grid_active_rig_control.vue @@ -1,15 +1,26 @@