Merge pull request #337 from DJ2LS/ls-arq

small arq improvements
This commit is contained in:
DJ2LS 2023-01-26 14:22:23 +01:00 committed by GitHub
commit 9f48948705
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 47 deletions

View file

@ -14,7 +14,7 @@ import threading
import time import time
import uuid import uuid
import lzma import lzma
from random import randrange# , randbytes from random import randrange
import codec2 import codec2
import helpers import helpers
@ -237,6 +237,23 @@ class DATA:
while True: while True:
data = self.data_queue_transmit.get() data = self.data_queue_transmit.get()
# if we are already in ARQ_STATE lets wait with processing data
# this should avoid weird toggle states where both stations
# stuck in IRS
#
# send transmission queued information once
if static.ARQ_STATE:
self.log.debug(f"[TNC] TX DISPATCHER - waiting with processing command ", arq_state=static.ARQ_STATE)
self.send_data_to_socket_queue(
freedata="tnc-message",
command=data[0],
status="queued",
)
# now stay in while loop until state released
while static.ARQ_STATE:
threading.Event().wait(0.01)
# Dispatch commands known to command_dispatcher # Dispatch commands known to command_dispatcher
if data[0] in self.command_dispatcher: if data[0] in self.command_dispatcher:
self.log.debug(f"[TNC] TX {self.command_dispatcher[data[0]][1]}...") self.log.debug(f"[TNC] TX {self.command_dispatcher[data[0]][1]}...")
@ -466,8 +483,6 @@ class DATA:
ack_frame = bytearray(self.length_sig1_frame) ack_frame = bytearray(self.length_sig1_frame)
ack_frame[:1] = bytes([FR_TYPE.BURST_ACK.value]) ack_frame[:1] = bytes([FR_TYPE.BURST_ACK.value])
# ack_frame[1:4] = static.DXCALLSIGN_CRC
# ack_frame[4:7] = static.MYCALLSIGN_CRC
ack_frame[1:2] = self.session_id ack_frame[1:2] = self.session_id
ack_frame[2:3] = helpers.snr_to_bytes(snr) ack_frame[2:3] = helpers.snr_to_bytes(snr)
ack_frame[3:4] = bytes([int(self.speed_level)]) ack_frame[3:4] = bytes([int(self.speed_level)])
@ -477,12 +492,12 @@ class DATA:
while static.CHANNEL_BUSY and time.time() < channel_busy_timeout: while static.CHANNEL_BUSY and time.time() < channel_busy_timeout:
threading.Event().wait(0.01) threading.Event().wait(0.01)
# Transmit frame # Transmit frame
self.enqueue_frame_for_tx([ack_frame], c2_mode=FREEDV_MODE.sig1.value) self.enqueue_frame_for_tx([ack_frame], c2_mode=FREEDV_MODE.sig1.value)
# reset burst timeout in case we had to wait too long # reset burst timeout in case we had to wait too long
self.burst_last_received = time.time() self.burst_last_received = time.time()
def send_data_ack_frame(self, snr) -> None: def send_data_ack_frame(self, snr) -> None:
"""Build and send ACK frame for received DATA frame""" """Build and send ACK frame for received DATA frame"""
@ -490,10 +505,6 @@ class DATA:
ack_frame[:1] = bytes([FR_TYPE.FR_ACK.value]) ack_frame[:1] = bytes([FR_TYPE.FR_ACK.value])
ack_frame[1:2] = self.session_id ack_frame[1:2] = self.session_id
ack_frame[2:3] = helpers.snr_to_bytes(snr) ack_frame[2:3] = helpers.snr_to_bytes(snr)
# ack_frame[1:4] = static.DXCALLSIGN_CRC
# ack_frame[4:7] = static.MYCALLSIGN_CRC
# ack_frame[7:8] = bytes([int(snr)])
# ack_frame[8:9] = bytes([int(self.speed_level)])
# wait while timeout not reached and our busy state is busy # wait while timeout not reached and our busy state is busy
channel_busy_timeout = time.time() + 5 channel_busy_timeout = time.time() + 5
@ -528,9 +539,6 @@ class DATA:
rpt_frame = bytearray(self.length_sig1_frame) rpt_frame = bytearray(self.length_sig1_frame)
rpt_frame[:1] = bytes([FR_TYPE.FR_REPEAT.value]) rpt_frame[:1] = bytes([FR_TYPE.FR_REPEAT.value])
rpt_frame[1:2] = self.session_id rpt_frame[1:2] = self.session_id
# rpt_frame[1:4] = static.DXCALLSIGN_CRC
# rpt_frame[4:7] = static.MYCALLSIGN_CRC
# rpt_frame[7:13] = missing_frames
self.log.info("[TNC] ARQ | RX | Requesting", frames=missing_frames) self.log.info("[TNC] ARQ | RX | Requesting", frames=missing_frames)
# Transmit frame # Transmit frame
@ -542,8 +550,6 @@ class DATA:
nack_frame = bytearray(self.length_sig1_frame) nack_frame = bytearray(self.length_sig1_frame)
nack_frame[:1] = bytes([FR_TYPE.FR_NACK.value]) nack_frame[:1] = bytes([FR_TYPE.FR_NACK.value])
nack_frame[1:2] = self.session_id nack_frame[1:2] = self.session_id
# nack_frame[1:4] = static.DXCALLSIGN_CRC
# nack_frame[4:7] = static.MYCALLSIGN_CRC
nack_frame[2:3] = helpers.snr_to_bytes(snr) nack_frame[2:3] = helpers.snr_to_bytes(snr)
nack_frame[3:4] = bytes([int(self.speed_level)]) nack_frame[3:4] = bytes([int(self.speed_level)])
@ -559,6 +565,7 @@ class DATA:
self.enqueue_frame_for_tx([nack_frame], c2_mode=FREEDV_MODE.sig1.value, copies=6, repeat_delay=0) self.enqueue_frame_for_tx([nack_frame], c2_mode=FREEDV_MODE.sig1.value, copies=6, repeat_delay=0)
# reset burst timeout in case we had to wait too long # reset burst timeout in case we had to wait too long
self.burst_last_received = time.time() self.burst_last_received = time.time()
def send_burst_nack_frame_watchdog(self, snr: bytes) -> None: def send_burst_nack_frame_watchdog(self, snr: bytes) -> None:
"""Build and send NACK frame for watchdog timeout""" """Build and send NACK frame for watchdog timeout"""
@ -570,8 +577,6 @@ class DATA:
nack_frame = bytearray(self.length_sig1_frame) nack_frame = bytearray(self.length_sig1_frame)
nack_frame[:1] = bytes([FR_TYPE.BURST_NACK.value]) nack_frame[:1] = bytes([FR_TYPE.BURST_NACK.value])
nack_frame[1:2] = self.session_id nack_frame[1:2] = self.session_id
# nack_frame[1:4] = static.DXCALLSIGN_CRC
# nack_frame[4:7] = static.MYCALLSIGN_CRC
nack_frame[2:3] = helpers.snr_to_bytes(snr) nack_frame[2:3] = helpers.snr_to_bytes(snr)
nack_frame[3:4] = bytes([int(self.speed_level)]) nack_frame[3:4] = bytes([int(self.speed_level)])
@ -662,6 +667,7 @@ class DATA:
self.log.debug("[TNC] static.RX_BURST_BUFFER", buffer=static.RX_BURST_BUFFER) self.log.debug("[TNC] static.RX_BURST_BUFFER", buffer=static.RX_BURST_BUFFER)
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -795,6 +801,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
finished=static.ARQ_SECONDS_UNTIL_FINISH, finished=static.ARQ_SECONDS_UNTIL_FINISH,
@ -1014,6 +1021,7 @@ class DATA:
nacks=self.frame_nack_counter, nacks=self.frame_nack_counter,
duration=duration, duration=duration,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
data=data_frame, data=data_frame,
) )
@ -1059,6 +1067,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
finished=static.ARQ_SECONDS_UNTIL_FINISH, finished=static.ARQ_SECONDS_UNTIL_FINISH,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
@ -1148,8 +1157,6 @@ class DATA:
arqheader[:1] = bytes([FR_TYPE.BURST_01.value]) arqheader[:1] = bytes([FR_TYPE.BURST_01.value])
arqheader[1:2] = bytes([n_frames_per_burst]) arqheader[1:2] = bytes([n_frames_per_burst])
arqheader[2:3] = self.session_id arqheader[2:3] = self.session_id
# arqheader[2:5] = static.DXCALLSIGN_CRC
# arqheader[5:8] = static.MYCALLSIGN_CRC
bufferposition_end = bufferposition + payload_per_frame - len(arqheader) bufferposition_end = bufferposition + payload_per_frame - len(arqheader)
@ -1254,6 +1261,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
finished=static.ARQ_SECONDS_UNTIL_FINISH, finished=static.ARQ_SECONDS_UNTIL_FINISH,
irs_snr=self.burst_ack_snr, irs_snr=self.burst_ack_snr,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
@ -1280,6 +1288,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
finished=static.ARQ_SECONDS_UNTIL_FINISH, finished=static.ARQ_SECONDS_UNTIL_FINISH,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
@ -1302,6 +1311,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
) )
@ -1332,8 +1342,9 @@ class DATA:
""" """
# Process data only if we are in ARQ and BUSY state # Process data only if we are in ARQ and BUSY state
if static.ARQ_STATE: if static.ARQ_STATE:
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, self.dxcallsign,
static.DXGRID, static.DXGRID,
"DATA-CHANNEL", "DATA-CHANNEL",
static.SNR, static.SNR,
@ -1382,6 +1393,7 @@ class DATA:
"""Received an ACK for a transmitted frame""" """Received an ACK for a transmitted frame"""
# Process data only if we are in ARQ and BUSY state # Process data only if we are in ARQ and BUSY state
if static.ARQ_STATE: if static.ARQ_STATE:
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -1416,6 +1428,7 @@ class DATA:
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
) )
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -1431,6 +1444,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
) )
@ -1449,6 +1463,7 @@ class DATA:
""" """
# Only process data if we are in ARQ and BUSY state # Only process data if we are in ARQ and BUSY state
if static.ARQ_STATE and static.TNC_STATE == "BUSY": if static.ARQ_STATE and static.TNC_STATE == "BUSY":
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -1588,7 +1603,6 @@ class DATA:
static.ARQ_SESSION_STATE = "connecting" static.ARQ_SESSION_STATE = "connecting"
# create a random session id # create a random session id
# self.session_id = randbytes(1)
self.session_id = np.random.bytes(1) self.session_id = np.random.bytes(1)
connection_frame = bytearray(self.length_sig0_frame) connection_frame = bytearray(self.length_sig0_frame)
@ -1688,7 +1702,7 @@ class DATA:
# check if callsign ssid override # check if callsign ssid override
valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[2:5]) valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[2:5])
self.mycallsign = mycallsign self.mycallsign = mycallsign
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -1765,6 +1779,7 @@ class DATA:
_valid_session = helpers.check_session_id(self.session_id, bytes(data_in[1:2])) _valid_session = helpers.check_session_id(self.session_id, bytes(data_in[1:2]))
if (_valid_crc or _valid_session) and static.ARQ_SESSION_STATE not in ["disconnected"]: if (_valid_crc or _valid_session) and static.ARQ_SESSION_STATE not in ["disconnected"]:
static.ARQ_SESSION_STATE = "disconnected" static.ARQ_SESSION_STATE = "disconnected"
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -1803,8 +1818,6 @@ class DATA:
connection_frame = bytearray(self.length_sig0_frame) connection_frame = bytearray(self.length_sig0_frame)
connection_frame[:1] = bytes([FR_TYPE.ARQ_SESSION_HB.value]) connection_frame[:1] = bytes([FR_TYPE.ARQ_SESSION_HB.value])
connection_frame[1:2] = self.session_id connection_frame[1:2] = self.session_id
# connection_frame[1:4] = static.DXCALLSIGN_CRC
# connection_frame[4:7] = static.MYCALLSIGN_CRC
self.send_data_to_socket_queue( self.send_data_to_socket_queue(
freedata="tnc-message", freedata="tnc-message",
@ -1829,6 +1842,7 @@ class DATA:
_valid_session = helpers.check_session_id(self.session_id, bytes(data_in[1:2])) _valid_session = helpers.check_session_id(self.session_id, bytes(data_in[1:2]))
if _valid_crc or _valid_session and static.ARQ_SESSION_STATE in ["connected", "connecting"]: if _valid_crc or _valid_session and static.ARQ_SESSION_STATE in ["connected", "connecting"]:
self.log.debug("[TNC] Received session heartbeat") self.log.debug("[TNC] Received session heartbeat")
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
self.dxcallsign, self.dxcallsign,
static.DXGRID, static.DXGRID,
@ -2036,6 +2050,7 @@ class DATA:
uuid=self.transmission_uuid, uuid=self.transmission_uuid,
percent=static.ARQ_TRANSMISSION_PERCENT, percent=static.ARQ_TRANSMISSION_PERCENT,
bytesperminute=static.ARQ_BYTES_PER_MINUTE, bytesperminute=static.ARQ_BYTES_PER_MINUTE,
compression=static.ARQ_COMPRESSION_FACTOR,
mycallsign=str(self.mycallsign, 'UTF-8'), mycallsign=str(self.mycallsign, 'UTF-8'),
dxcallsign=str(self.dxcallsign, 'UTF-8'), dxcallsign=str(self.dxcallsign, 'UTF-8'),
) )
@ -2162,7 +2177,7 @@ class DATA:
# Update modes we are listening to # Update modes we are listening to
self.set_listening_modes(True, True, self.mode_list[self.speed_level]) self.set_listening_modes(True, True, self.mode_list[self.speed_level])
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -2208,8 +2223,6 @@ class DATA:
connection_frame = bytearray(self.length_sig0_frame) connection_frame = bytearray(self.length_sig0_frame)
connection_frame[:1] = frametype connection_frame[:1] = frametype
connection_frame[1:2] = self.session_id connection_frame[1:2] = self.session_id
# connection_frame[1:4] = static.DXCALLSIGN_CRC
# connection_frame[4:7] = static.MYCALLSIGN_CRC
connection_frame[8:9] = bytes([self.speed_level]) connection_frame[8:9] = bytes([self.speed_level])
# For checking protocol version on the receiving side # For checking protocol version on the receiving side
@ -2275,7 +2288,7 @@ class DATA:
self.speed_level = int.from_bytes(bytes(data_in[8:9]), "big") self.speed_level = int.from_bytes(bytes(data_in[8:9]), "big")
self.log.debug("[TNC] speed level selected for given SNR", speed_level=self.speed_level) self.log.debug("[TNC] speed level selected for given SNR", speed_level=self.speed_level)
# self.speed_level = len(self.mode_list) - 1 # self.speed_level = len(self.mode_list) - 1
static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
static.DXCALLSIGN, static.DXCALLSIGN,
static.DXGRID, static.DXGRID,
@ -2389,7 +2402,6 @@ class DATA:
) )
static.DXGRID = b'------' static.DXGRID = b'------'
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
dxcallsign, dxcallsign,
static.DXGRID, static.DXGRID,
@ -2414,7 +2426,7 @@ class DATA:
ping_frame[:1] = bytes([FR_TYPE.PING_ACK.value]) ping_frame[:1] = bytes([FR_TYPE.PING_ACK.value])
ping_frame[1:4] = static.DXCALLSIGN_CRC ping_frame[1:4] = static.DXCALLSIGN_CRC
ping_frame[4:7] = static.MYCALLSIGN_CRC ping_frame[4:7] = static.MYCALLSIGN_CRC
ping_frame[7:13] = static.MYGRID ping_frame[7:11] = helpers.encode_grid(static.MYGRID.decode("UTF-8"))
ping_frame[13:14] = helpers.snr_to_bytes(static.SNR) ping_frame[13:14] = helpers.snr_to_bytes(static.SNR)
if static.ENABLE_FSK: if static.ENABLE_FSK:
@ -2435,8 +2447,7 @@ class DATA:
_valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[1:4]) _valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[1:4])
if _valid: if _valid:
# static.DXCALLSIGN_CRC = bytes(data_in[4:7]) static.DXGRID = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8")
static.DXGRID = bytes(data_in[7:13]).rstrip(b"\x00")
dxsnr = helpers.snr_from_bytes(data_in[13:14]) dxsnr = helpers.snr_from_bytes(data_in[13:14])
self.send_data_to_socket_queue( self.send_data_to_socket_queue(
freedata="tnc-message", freedata="tnc-message",
@ -2444,7 +2455,7 @@ class DATA:
uuid=str(uuid.uuid4()), uuid=str(uuid.uuid4()),
timestamp=int(time.time()), timestamp=int(time.time()),
dxgrid=str(static.DXGRID, "UTF-8"), dxgrid=str(static.DXGRID, "UTF-8"),
dxcallsign = str(self.dxcallsign, "UTF-8"), dxcallsign = str(static.DXCALLSIGN, "UTF-8"),
mycallsign=str(mycallsign, "UTF-8"), mycallsign=str(mycallsign, "UTF-8"),
snr=str(static.SNR), snr=str(static.SNR),
dxsnr=str(dxsnr) dxsnr=str(dxsnr)
@ -2563,7 +2574,7 @@ class DATA:
beacon_frame = bytearray(self.length_sig0_frame) beacon_frame = bytearray(self.length_sig0_frame)
beacon_frame[:1] = bytes([FR_TYPE.BEACON.value]) beacon_frame[:1] = bytes([FR_TYPE.BEACON.value])
beacon_frame[1:7] = helpers.callsign_to_bytes(self.mycallsign) beacon_frame[1:7] = helpers.callsign_to_bytes(self.mycallsign)
beacon_frame[7:13] = static.MYGRID beacon_frame[7:11] = helpers.encode_grid(static.MYGRID.decode("UTF-8"))
self.log.info("[TNC] ENABLE FSK", state=static.ENABLE_FSK) self.log.info("[TNC] ENABLE FSK", state=static.ENABLE_FSK)
if static.ENABLE_FSK: if static.ENABLE_FSK:
@ -2595,15 +2606,14 @@ class DATA:
""" """
# here we add the received station to the heard stations buffer # here we add the received station to the heard stations buffer
beacon_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) beacon_callsign = helpers.bytes_to_callsign(bytes(data_in[1:7]))
dxgrid = bytes(data_in[7:13]).rstrip(b"\x00") static.DXGRID = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8")
self.send_data_to_socket_queue( self.send_data_to_socket_queue(
freedata="tnc-message", freedata="tnc-message",
beacon="received", beacon="received",
uuid=str(uuid.uuid4()), uuid=str(uuid.uuid4()),
timestamp=int(time.time()), timestamp=int(time.time()),
dxcallsign=str(beacon_callsign, "UTF-8"), dxcallsign=str(beacon_callsign, "UTF-8"),
dxgrid=str(dxgrid, "UTF-8"), dxgrid=str(static.DXGRID, "UTF-8"),
snr=str(static.SNR), snr=str(static.SNR),
) )
@ -2611,13 +2621,13 @@ class DATA:
"[TNC] BEACON RCVD [" "[TNC] BEACON RCVD ["
+ str(beacon_callsign, "UTF-8") + str(beacon_callsign, "UTF-8")
+ "][" + "]["
+ str(dxgrid, "UTF-8") + str(static.DXGRID, "UTF-8")
+ "] ", + "] ",
snr=static.SNR, snr=static.SNR,
) )
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
beacon_callsign, beacon_callsign,
dxgrid, static.DXGRID,
"BEACON", "BEACON",
static.SNR, static.SNR,
static.FREQ_OFFSET, static.FREQ_OFFSET,
@ -2665,7 +2675,8 @@ class DATA:
# here we add the received station to the heard stations buffer # here we add the received station to the heard stations buffer
dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7]))
self.log.debug("[TNC] received_cq:", dxcallsign=dxcallsign) self.log.debug("[TNC] received_cq:", dxcallsign=dxcallsign)
dxgrid = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8") static.DXGRID = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8")
self.send_data_to_socket_queue( self.send_data_to_socket_queue(
freedata="tnc-message", freedata="tnc-message",
cq="received", cq="received",
@ -2677,13 +2688,13 @@ class DATA:
"[TNC] CQ RCVD [" "[TNC] CQ RCVD ["
+ str(dxcallsign, "UTF-8") + str(dxcallsign, "UTF-8")
+ "][" + "]["
+ str(dxgrid, "UTF-8") + str(static.DXGRID, "UTF-8")
+ "] ", + "] ",
snr=static.SNR, snr=static.SNR,
) )
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
dxcallsign, dxcallsign,
dxgrid, static.DXGRID,
"CQ CQ CQ", "CQ CQ CQ",
static.SNR, static.SNR,
static.FREQ_OFFSET, static.FREQ_OFFSET,
@ -2735,7 +2746,7 @@ class DATA:
""" """
# here we add the received station to the heard stations buffer # here we add the received station to the heard stations buffer
dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7])) dxcallsign = helpers.bytes_to_callsign(bytes(data_in[1:7]))
dxgrid = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8") static.DXGRID = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8")
dxsnr = helpers.snr_from_bytes(data_in[11:12]) dxsnr = helpers.snr_from_bytes(data_in[11:12])
combined_snr = f"{static.SNR}/{dxsnr}" combined_snr = f"{static.SNR}/{dxsnr}"
@ -2744,7 +2755,7 @@ class DATA:
freedata="tnc-message", freedata="tnc-message",
qrv="received", qrv="received",
dxcallsign=str(dxcallsign, "UTF-8"), dxcallsign=str(dxcallsign, "UTF-8"),
dxgrid=str(dxgrid, "UTF-8"), dxgrid=str(static.DXGRID, "UTF-8"),
snr=str(static.SNR), snr=str(static.SNR),
dxsnr=str(dxsnr) dxsnr=str(dxsnr)
) )
@ -2753,14 +2764,14 @@ class DATA:
"[TNC] QRV RCVD [" "[TNC] QRV RCVD ["
+ str(dxcallsign, "UTF-8") + str(dxcallsign, "UTF-8")
+ "][" + "]["
+ str(dxgrid, "UTF-8") + str(static.DXGRID, "UTF-8")
+ "] ", + "] ",
snr=static.SNR, snr=static.SNR,
dxsnr=dxsnr dxsnr=dxsnr
) )
helpers.add_to_heard_stations( helpers.add_to_heard_stations(
dxcallsign, dxcallsign,
dxgrid, static.DXGRID,
"QRV", "QRV",
combined_snr, combined_snr,
static.FREQ_OFFSET, static.FREQ_OFFSET,

View file

@ -25,7 +25,6 @@ import sys
import threading import threading
import time import time
import wave import wave
import helpers import helpers
import static import static
import structlog import structlog
@ -470,10 +469,20 @@ def process_tnc_commands(data):
if received_json["type"] == "arq" and received_json["command"] == "send_raw": if received_json["type"] == "arq" and received_json["command"] == "send_raw":
static.BEACON_PAUSE = True static.BEACON_PAUSE = True
# we need to warn if already in arq state
if static.ARQ_STATE:
command_response("send_raw", False)
log.warning(
"[SCK] Send raw command execution warning",
e="already in arq state",
i="command queued",
command=received_json,
)
try: try:
if not static.ARQ_SESSION: if not static.ARQ_SESSION:
dxcallsign = received_json["parameter"][0]["dxcallsign"] dxcallsign = received_json["parameter"][0]["dxcallsign"]
# additional step for beeing sure our callsign is correctly # additional step for being sure our callsign is correctly
# in case we are not getting a station ssid # in case we are not getting a station ssid
# then we are forcing a station ssid = 0 # then we are forcing a station ssid = 0
dxcallsign = helpers.callsign_to_bytes(dxcallsign) dxcallsign = helpers.callsign_to_bytes(dxcallsign)
@ -504,7 +513,7 @@ def process_tnc_commands(data):
except Exception: except Exception:
# 15 == self.session_connect_max_retries # 15 == self.session_connect_max_retries
attempts = 15 attempts = 10
# check if transmission uuid provided else set no-uuid # check if transmission uuid provided else set no-uuid
try: try: