diff --git a/gui/package.json b/gui/package.json index 4e2761a1..726620fc 100644 --- a/gui/package.json +++ b/gui/package.json @@ -32,57 +32,57 @@ }, "homepage": "https://freedata.app", "dependencies": { - "@electron/asar": "^3.2.7", - "@electron/notarize": "^2.1.0", - "@electron/universal": "^2.0.0", + "@electron/asar": "^3.2.8", + "@electron/notarize": "^2.2.0", + "@electron/universal": "^2.0.1", "@popperjs/core": "^2.11.8", - "@vueuse/electron": "^10.4.1", + "@vueuse/electron": "^10.7.0", "blob-util": "^2.0.2", - "bootstrap": "^5.3.1", - "bootstrap-icons": "^1.10.5", - "bootswatch": "^5.3.1", + "bootstrap": "^5.3.2", + "bootstrap-icons": "^1.11.2", + "bootswatch": "^5.3.2", "browser-image-compression": "^2.0.2", - "chart.js": "^4.3.3", + "chart.js": "^4.4.1", "chartjs-plugin-annotation": "^3.0.1", - "electron-log": "^5.0.0", - "electron-updater": "^6.1.6", - "emoji-picker-element": "^1.18.3", - "emoji-picker-element-data": "^1.4.0", + "electron-log": "^5.0.1", + "electron-updater": "^6.1.7", + "emoji-picker-element": "^1.20.1", + "emoji-picker-element-data": "^1.6.0", "file-saver": "^2.0.5", "gridstack": "^10.0.0", "mime": "^4.0.0", - "pinia": "^2.1.6", + "pinia": "^2.1.7", "pouchdb": "^8.0.1", "pouchdb-browser": "^8.0.1", "pouchdb-find": "^8.0.1", "pouchdb-upsert": "^2.2.0", "qth-locator": "^2.1.0", - "sass": "^1.66.1", + "sass": "^1.69.5", "socket.io": "^4.7.2", - "uuid": "^9.0.0", + "uuid": "^9.0.1", "vue": "^3.3.4", "vue-chartjs": "^5.2.0", "vuemoji-picker": "^0.2.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@vitejs/plugin-vue": "^4.4.0", - "electron": "^27.0.0", - "electron-builder": "^24.6.3", - "eslint": "^8.50.0", - "eslint-config-prettier": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@vitejs/plugin-vue": "^4.5.2", + "electron": "^27.1.3", + "electron-builder": "^24.9.1", + "eslint": "^8.55.0", + "eslint-config-prettier": "^9.1.0", "eslint-config-standard-with-typescript": "^40.0.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.1.0", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-n": "^16.3.1", + "eslint-plugin-prettier": "^5.0.1", "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-vue": "^9.17.0", - "typescript": "^5.2.2", - "vite": "^5.0.4", + "eslint-plugin-vue": "^9.19.2", + "typescript": "^5.3.3", + "vite": "^5.0.7", "vite-plugin-electron": "^0.15.4", "vite-plugin-electron-renderer": "^0.14.5", "vitest": "^0.34.6", "vue": "^3.3.4", - "vue-tsc": "^1.4.2" + "vue-tsc": "^1.8.25" } } diff --git a/modem/arq_session_iss.py b/modem/arq_session_iss.py index 544d5457..ffa33259 100644 --- a/modem/arq_session_iss.py +++ b/modem/arq_session_iss.py @@ -49,7 +49,7 @@ class ARQSessionISS(arq_session.ARQSession): self.thread.run() def connect(self): - self.state = self.STATE_CONNECTING + self.state = self.STATE_CONNECTING connect_frame = self.frame_factory.build_arq_session_connect(True, self.dxcall, self.id) @@ -69,7 +69,7 @@ class ARQSessionISS(arq_session.ARQSession): if self.state != self.STATE_CONNECTING: raise RuntimeError(f"ARQ Session: Received connection ACK while in state {self.state}") - self.speed_level = ack['speed_level'] + self.build_arq_data_framespeed_level = ack['speed_level'] self.event_connection_ack_received.set() # Sends the full payload in multiple frames @@ -84,6 +84,7 @@ class ARQSessionISS(arq_session.ARQSession): max_size = self.get_payload_size(self.speed_level) end_offset = min(len(self.data), max_size) frame_payload = self.data[offset:end_offset] + print(self.id) data_frame = self.frame_factory.build_arq_data_frame(self.id, n_frames_per_burst, max_size, n_frame, frame_payload) self.set_state(self.STATE_SENDING) if not self.send_arq(data_frame): diff --git a/modem/data_frame_factory.py b/modem/data_frame_factory.py index 365206b5..3a18db3d 100644 --- a/modem/data_frame_factory.py +++ b/modem/data_frame_factory.py @@ -132,7 +132,7 @@ class DataFrameFactory: "frame_length": "dynamic", "n_frames_per_burst": 1, "session_id": 1, - "payload": "dynamic", + "data": "dynamic", } # arq burst ack @@ -175,18 +175,19 @@ class DataFrameFactory: def construct(self, frametype, content, frame_length=LENGTH_SIG1_FRAME): # frame_length: can be set manually for data frames, whose length can be dynamic regarding corresponding mode - # data bursts have a frame type range of 01-50 if frametype in range(1, 50): - frame_template = self.template_list[frametype.value] + frame_template = self.template_list[frametype] frame = bytearray(frame_length) # override "dynamic" value of payload length - self.template_list[frame_template].payload = frame_length - 3 + self.template_list[frametype]["data"] = frame_length - 3 + frame[:1] = bytes([frametype]) else: frame_template = self.template_list[frametype.value] frame_length = frame_template["frame_length"] frame = bytearray(frame_length) + frame[:1] = bytes([frametype.value]) buffer_position = 1 for key, item_length in frame_template.items(): @@ -194,7 +195,6 @@ class DataFrameFactory: frame[buffer_position: buffer_position + item_length] = content[key] buffer_position += item_length - frame[:1] = bytes([frametype.value]) return frame def deconstruct(self, frame): @@ -212,7 +212,12 @@ class DataFrameFactory: for key, item_length in frame_template.items(): if key != "frame_length": - data = frame[buffer_position: buffer_position + item_length] + # data is always on the last payload slots + if item_length in ["dynamic"] and key in["data"]: + data = frame[buffer_position:] + item_length = len(data) + else: + data = frame[buffer_position: buffer_position + item_length] # Process the data based on the key if key in ["origin", "destination"]: @@ -319,9 +324,7 @@ class DataFrameFactory: return test_frame def build_arq_session_connect(self, isWideband, destination, session_id): - print(isWideband) - print(destination) - print(session_id) + payload = { "destination_crc": helpers.get_crc_24(destination), "origin_crc": helpers.get_crc_24(self.myfullcall), @@ -351,11 +354,11 @@ class DataFrameFactory: def build_arq_data_frame(self, session_id: bytes, n_frames_per_burst: int, max_size: int, n_frame: int, frame_payload: bytes): payload = { "n_frames_per_burst": bytes([n_frames_per_burst]), - "session_id": session_id, + "session_id": session_id.to_bytes(1, 'big'), "data": frame_payload } - return self.construct(FR_TYPE.FR_TYPE.BURST_01.value + n_frame, payload, frame_length=max_size) + return self.construct(FR_TYPE.BURST_01.value + (n_frame-1), payload, frame_length=max_size) def build_arq_burst_ack(self, session_id: bytes, snr: int, speed_level: int, len_arq_rx_frame_buffer: int): diff --git a/modem/frame_dispatcher.py b/modem/frame_dispatcher.py index b3a1a04f..f43b8a16 100644 --- a/modem/frame_dispatcher.py +++ b/modem/frame_dispatcher.py @@ -35,6 +35,7 @@ class DISPATCHER(): FR_TYPE.ARQ_CONNECTION_OPEN.value: {"class": ARQFrameHandler, "name": "ARQ OPEN SESSION"}, FR_TYPE.ARQ_STOP.value: {"class": ARQFrameHandler, "name": "ARQ STOP TX"}, FR_TYPE.BEACON.value: {"class": FrameHandler, "name": "BEACON"}, + FR_TYPE.BURST_01.value:{"class": ARQFrameHandler, "name": "BURST_01"}, FR_TYPE.BURST_ACK.value: {"class": FrameHandler, "name": "BURST ACK"}, FR_TYPE.BURST_NACK.value: {"class": FrameHandler, "name": "BURST NACK"}, FR_TYPE.CQ.value: {"class": CQFrameHandler, "name": "CQ"},