mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
WIP ARQ - more fixes
This commit is contained in:
parent
b5268ec4f0
commit
a970f96165
|
@ -91,7 +91,7 @@ export function sendModemPing(dxcall) {
|
||||||
export function sendModemARQRaw(mycall, dxcall, data, uuid) {
|
export function sendModemARQRaw(mycall, dxcall, data, uuid) {
|
||||||
return apiPost("/modem/send_arq_raw", {
|
return apiPost("/modem/send_arq_raw", {
|
||||||
mycallsign: mycall,
|
mycallsign: mycall,
|
||||||
dxcallsign: dxcall,
|
dxcall: dxcall,
|
||||||
data: data,
|
data: data,
|
||||||
uuid: uuid,
|
uuid: uuid,
|
||||||
});
|
});
|
||||||
|
|
|
@ -54,7 +54,7 @@ class ARQSession():
|
||||||
def transmit_frame(self, frame: bytearray, mode='auto'):
|
def transmit_frame(self, frame: bytearray, mode='auto'):
|
||||||
self.log("Transmitting frame")
|
self.log("Transmitting frame")
|
||||||
if mode in ['auto']:
|
if mode in ['auto']:
|
||||||
self.get_mode_by_speed_level(self.speed_level)
|
mode = self.get_mode_by_speed_level(self.speed_level)
|
||||||
|
|
||||||
modem_queue_item = {
|
modem_queue_item = {
|
||||||
'mode': mode,
|
'mode': mode,
|
||||||
|
|
|
@ -100,6 +100,7 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
self.dx_snr.append(info_frame['snr'])
|
self.dx_snr.append(info_frame['snr'])
|
||||||
|
|
||||||
self.calibrate_speed_settings()
|
self.calibrate_speed_settings()
|
||||||
|
self.set_modem_listening_modes(self.speed_level)
|
||||||
info_ack = self.frame_factory.build_arq_session_info_ack(
|
info_ack = self.frame_factory.build_arq_session_info_ack(
|
||||||
self.id, self.total_crc, self.snr[0],
|
self.id, self.total_crc, self.snr[0],
|
||||||
self.speed_level, self.frames_per_burst)
|
self.speed_level, self.frames_per_burst)
|
||||||
|
@ -108,9 +109,17 @@ class ARQSessionIRS(arq_session.ARQSession):
|
||||||
|
|
||||||
def send_burst_nack(self):
|
def send_burst_nack(self):
|
||||||
self.calibrate_speed_settings()
|
self.calibrate_speed_settings()
|
||||||
|
self.set_modem_listening_modes(self.speed_level)
|
||||||
nack = self.frame_factory.build_arq_burst_ack(self.id, self.received_bytes, self.speed_level, self.frames_per_burst, self.snr[0])
|
nack = self.frame_factory.build_arq_burst_ack(self.id, self.received_bytes, self.speed_level, self.frames_per_burst, self.snr[0])
|
||||||
self.transmit_and_wait(nack)
|
self.transmit_and_wait(nack)
|
||||||
|
|
||||||
|
|
||||||
|
def set_modem_listening_modes(self, speed_level):
|
||||||
|
# TODO
|
||||||
|
# We want to set the modems listening modes somehow...
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
def process_incoming_data(self, frame):
|
def process_incoming_data(self, frame):
|
||||||
if frame['offset'] != self.received_bytes:
|
if frame['offset'] != self.received_bytes:
|
||||||
self.logger.info(f"Discarding data frame due to wrong offset", frame=self.frame_received)
|
self.logger.info(f"Discarding data frame due to wrong offset", frame=self.frame_received)
|
||||||
|
|
|
@ -17,10 +17,8 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
STATE_FAILED = 5
|
STATE_FAILED = 5
|
||||||
|
|
||||||
RETRIES_CONNECT = 3
|
RETRIES_CONNECT = 3
|
||||||
RETRIES_TRANSFER = 3
|
TIMEOUT_CONNECT_ACK = 7
|
||||||
|
TIMEOUT_TRANSFER = 3
|
||||||
TIMEOUT_CONNECT_ACK = 5
|
|
||||||
TIMEOUT_TRANSFER = 2
|
|
||||||
|
|
||||||
STATE_TRANSITION = {
|
STATE_TRANSITION = {
|
||||||
STATE_OPEN_SENT: {
|
STATE_OPEN_SENT: {
|
||||||
|
@ -81,7 +79,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.frames_per_burst = frame['frames_per_burst']
|
self.frames_per_burst = frame['frames_per_burst']
|
||||||
self.log(f"Frames per burst set to {self.frames_per_burst}")
|
self.log(f"Frames per burst set to {self.frames_per_burst}")
|
||||||
|
|
||||||
def send_info(self, open_ack_frame):
|
def send_info(self, frame):
|
||||||
info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data),
|
info_frame = self.frame_factory.build_arq_session_info(self.id, len(self.data),
|
||||||
helpers.get_crc_32(self.data),
|
helpers.get_crc_32(self.data),
|
||||||
self.snr[0])
|
self.snr[0])
|
||||||
|
@ -98,7 +96,7 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.set_state(self.STATE_ENDED)
|
self.set_state(self.STATE_ENDED)
|
||||||
self.log("All data transfered!")
|
self.log("All data transfered!")
|
||||||
return
|
return
|
||||||
|
print(self.SPEED_LEVEL_DICT[self.speed_level])
|
||||||
payload_size = self.get_data_payload_size()
|
payload_size = self.get_data_payload_size()
|
||||||
burst = []
|
burst = []
|
||||||
for f in range(0, self.frames_per_burst):
|
for f in range(0, self.frames_per_burst):
|
||||||
|
@ -109,5 +107,5 @@ class ARQSessionISS(arq_session.ARQSession):
|
||||||
self.id, self.confirmed_bytes, payload)
|
self.id, self.confirmed_bytes, payload)
|
||||||
burst.append(data_frame)
|
burst.append(data_frame)
|
||||||
|
|
||||||
self.launch_twr(burst, self.TIMEOUT_CONNECT_ACK, self.RETRIES_CONNECT, mode='auto')
|
self.launch_twr(burst, self.TIMEOUT_TRANSFER, self.RETRIES_CONNECT, mode='auto')
|
||||||
self.set_state(self.STATE_BURST_SENT)
|
self.set_state(self.STATE_BURST_SENT)
|
||||||
|
|
|
@ -7,8 +7,7 @@ from arq_session_iss import ARQSessionISS
|
||||||
class ARQRawCommand(TxCommand):
|
class ARQRawCommand(TxCommand):
|
||||||
|
|
||||||
def set_params_from_api(self, apiParams):
|
def set_params_from_api(self, apiParams):
|
||||||
print(apiParams)
|
self.dxcall = apiParams['dxcall']
|
||||||
self.dxcall = apiParams['dxcallsign']
|
|
||||||
if not api_validations.validate_freedata_callsign(self.dxcall):
|
if not api_validations.validate_freedata_callsign(self.dxcall):
|
||||||
self.dxcall = f"{self.dxcall}-0"
|
self.dxcall = f"{self.dxcall}-0"
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,6 @@ class DataFrameFactory:
|
||||||
}
|
}
|
||||||
|
|
||||||
def construct(self, frametype, content, frame_length = LENGTH_SIG1_FRAME):
|
def construct(self, frametype, content, frame_length = LENGTH_SIG1_FRAME):
|
||||||
|
|
||||||
frame_template = self.template_list[frametype.value]
|
frame_template = self.template_list[frametype.value]
|
||||||
|
|
||||||
if isinstance(frame_template["frame_length"], int):
|
if isinstance(frame_template["frame_length"], int):
|
||||||
|
@ -233,11 +232,13 @@ class DataFrameFactory:
|
||||||
|
|
||||||
def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:codec2.FREEDV_MODE):
|
def get_available_data_payload_for_mode(self, type: FR_TYPE, mode:codec2.FREEDV_MODE):
|
||||||
whole_frame_length = self.get_bytes_per_frame(mode)
|
whole_frame_length = self.get_bytes_per_frame(mode)
|
||||||
|
available = whole_frame_length - 2 # - CRC16
|
||||||
|
#available = available - 1 # - FRAME TYPE
|
||||||
|
|
||||||
available = whole_frame_length
|
|
||||||
for field, length in self.template_list[type.value].items():
|
for field, length in self.template_list[type.value].items():
|
||||||
if field != 'frame_length' and isinstance(length, int):
|
if field != 'frame_length' and isinstance(length, int):
|
||||||
available -= length
|
available -= length
|
||||||
|
|
||||||
return available
|
return available
|
||||||
|
|
||||||
def build_ping(self, destination):
|
def build_ping(self, destination):
|
||||||
|
|
|
@ -526,7 +526,7 @@ class Demodulator():
|
||||||
(self.sig1_datac13_buffer, self.RECEIVE_SIG1),
|
(self.sig1_datac13_buffer, self.RECEIVE_SIG1),
|
||||||
(self.dat0_datac1_buffer, self.RECEIVE_DATAC1),
|
(self.dat0_datac1_buffer, self.RECEIVE_DATAC1),
|
||||||
(self.dat0_datac3_buffer, self.RECEIVE_DATAC3),
|
(self.dat0_datac3_buffer, self.RECEIVE_DATAC3),
|
||||||
(self.dat0_datac4_buffer, RECEIVE_DATAC4),
|
(self.dat0_datac4_buffer, self.RECEIVE_DATAC4),
|
||||||
(self.fsk_ldpc_buffer_0, self.enable_fsk),
|
(self.fsk_ldpc_buffer_0, self.enable_fsk),
|
||||||
(self.fsk_ldpc_buffer_1, self.enable_fsk),
|
(self.fsk_ldpc_buffer_1, self.enable_fsk),
|
||||||
]:
|
]:
|
||||||
|
|
|
@ -280,6 +280,8 @@ class RF:
|
||||||
if mode in mode_transition:
|
if mode in mode_transition:
|
||||||
freedv = mode_transition[mode]
|
freedv = mode_transition[mode]
|
||||||
else:
|
else:
|
||||||
|
print("wrong mode.................")
|
||||||
|
print(mode)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Wait for some other thread that might be transmitting
|
# Wait for some other thread that might be transmitting
|
||||||
|
|
Loading…
Reference in a new issue