mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
WIP adding arq data frame
This commit is contained in:
parent
5842519e2a
commit
9b820f6562
4 changed files with 46 additions and 41 deletions
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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,6 +212,11 @@ class DataFrameFactory:
|
|||
|
||||
for key, item_length in frame_template.items():
|
||||
if key != "frame_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
|
||||
|
@ -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):
|
||||
|
|
|
@ -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"},
|
||||
|
|
Loading…
Reference in a new issue