mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
Merge pull request #222 from DJ2LS/refactor_N2KIQ_codec2_allmodes
Remove allmodes (255) option from TNC.
This commit is contained in:
commit
c8eaad9ecd
|
@ -24,7 +24,6 @@ class FREEDV_MODE(Enum):
|
||||||
Enumeration for codec2 modes and names
|
Enumeration for codec2 modes and names
|
||||||
"""
|
"""
|
||||||
|
|
||||||
allmodes = 255
|
|
||||||
datac0 = 14
|
datac0 = 14
|
||||||
datac1 = 10
|
datac1 = 10
|
||||||
datac3 = 12
|
datac3 = 12
|
||||||
|
|
|
@ -25,6 +25,7 @@ import static
|
||||||
import structlog
|
import structlog
|
||||||
import ujson as json
|
import ujson as json
|
||||||
from exceptions import NoCallsign
|
from exceptions import NoCallsign
|
||||||
|
from codec2 import FREEDV_MODE
|
||||||
|
|
||||||
TESTMODE = False
|
TESTMODE = False
|
||||||
|
|
||||||
|
@ -84,17 +85,15 @@ class DATA:
|
||||||
|
|
||||||
# List of codec2 modes to use in "low bandwidth" mode.
|
# List of codec2 modes to use in "low bandwidth" mode.
|
||||||
self.mode_list_low_bw = [
|
self.mode_list_low_bw = [
|
||||||
codec2.FREEDV_MODE.datac0.value,
|
FREEDV_MODE.datac3.value,
|
||||||
codec2.FREEDV_MODE.datac3.value,
|
|
||||||
]
|
]
|
||||||
# List for time to wait for corresponding mode in seconds
|
# List for time to wait for corresponding mode in seconds
|
||||||
self.time_list_low_bw = [3, 7]
|
self.time_list_low_bw = [3, 7]
|
||||||
|
|
||||||
# List of codec2 modes to use in "high bandwidth" mode.
|
# List of codec2 modes to use in "high bandwidth" mode.
|
||||||
self.mode_list_high_bw = [
|
self.mode_list_high_bw = [
|
||||||
codec2.FREEDV_MODE.datac0.value,
|
FREEDV_MODE.datac3.value,
|
||||||
codec2.FREEDV_MODE.datac3.value,
|
FREEDV_MODE.datac1.value,
|
||||||
codec2.FREEDV_MODE.datac1.value,
|
|
||||||
]
|
]
|
||||||
# List for time to wait for corresponding mode in seconds
|
# List for time to wait for corresponding mode in seconds
|
||||||
self.time_list_high_bw = [3, 7, 8, 30]
|
self.time_list_high_bw = [3, 7, 8, 30]
|
||||||
|
@ -360,7 +359,7 @@ class DATA:
|
||||||
def enqueue_frame_for_tx(
|
def enqueue_frame_for_tx(
|
||||||
self,
|
self,
|
||||||
frame_to_tx: bytearray,
|
frame_to_tx: bytearray,
|
||||||
c2_mode=codec2.FREEDV_MODE.datac0.value,
|
c2_mode=FREEDV_MODE.datac0.value,
|
||||||
copies=1,
|
copies=1,
|
||||||
repeat_delay=0,
|
repeat_delay=0,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
@ -376,7 +375,7 @@ class DATA:
|
||||||
:param repeat_delay: Delay time before sending repeat frame, defaults to 0
|
:param repeat_delay: Delay time before sending repeat frame, defaults to 0
|
||||||
:type repeat_delay: int, optional
|
:type repeat_delay: int, optional
|
||||||
"""
|
"""
|
||||||
self.log.debug("[TNC] enqueue_frame_for_tx", c2_mode=c2_mode)
|
self.log.debug("[TNC] enqueue_frame_for_tx", c2_mode=FREEDV_MODE(c2_mode).name)
|
||||||
|
|
||||||
# Set the TRANSMITTING flag before adding an object to the transmit queue
|
# Set the TRANSMITTING flag before adding an object to the transmit queue
|
||||||
# TODO: This is not that nice, we could improve this somehow
|
# TODO: This is not that nice, we could improve this somehow
|
||||||
|
@ -676,7 +675,7 @@ class DATA:
|
||||||
|
|
||||||
if bof_position >= 0:
|
if bof_position >= 0:
|
||||||
payload = static.RX_FRAME_BUFFER[
|
payload = static.RX_FRAME_BUFFER[
|
||||||
bof_position + len(self.data_frame_bof): eof_position
|
bof_position + len(self.data_frame_bof) : eof_position
|
||||||
]
|
]
|
||||||
frame_length = int.from_bytes(payload[4:8], "big") # 4:8 4bytes
|
frame_length = int.from_bytes(payload[4:8], "big") # 4:8 4bytes
|
||||||
static.TOTAL_BYTES = frame_length
|
static.TOTAL_BYTES = frame_length
|
||||||
|
@ -703,7 +702,7 @@ class DATA:
|
||||||
|
|
||||||
# Extract raw data from buffer
|
# Extract raw data from buffer
|
||||||
payload = static.RX_FRAME_BUFFER[
|
payload = static.RX_FRAME_BUFFER[
|
||||||
bof_position + len(self.data_frame_bof): eof_position
|
bof_position + len(self.data_frame_bof) : eof_position
|
||||||
]
|
]
|
||||||
# Get the data frame crc
|
# Get the data frame crc
|
||||||
data_frame_crc = payload[:4] # 0:4 = 4 bytes
|
data_frame_crc = payload[:4] # 0:4 = 4 bytes
|
||||||
|
@ -741,7 +740,13 @@ class DATA:
|
||||||
# Re-code data_frame in base64, UTF-8 for JSON UI communication.
|
# Re-code data_frame in base64, UTF-8 for JSON UI communication.
|
||||||
base64_data = base64.b64encode(data_frame).decode("UTF-8")
|
base64_data = base64.b64encode(data_frame).decode("UTF-8")
|
||||||
static.RX_BUFFER.append(
|
static.RX_BUFFER.append(
|
||||||
[self.transmission_uuid, timestamp, static.DXCALLSIGN, static.DXGRID, base64_data]
|
[
|
||||||
|
self.transmission_uuid,
|
||||||
|
timestamp,
|
||||||
|
static.DXCALLSIGN,
|
||||||
|
static.DXGRID,
|
||||||
|
base64_data,
|
||||||
|
]
|
||||||
)
|
)
|
||||||
self.send_data_to_socket_queue(
|
self.send_data_to_socket_queue(
|
||||||
freedata="tnc-message",
|
freedata="tnc-message",
|
||||||
|
@ -787,8 +792,8 @@ class DATA:
|
||||||
self.log.warning(
|
self.log.warning(
|
||||||
"[TNC] ARQ | RX | DATA FRAME NOT SUCCESSFULLY RECEIVED!",
|
"[TNC] ARQ | RX | DATA FRAME NOT SUCCESSFULLY RECEIVED!",
|
||||||
e="wrong crc",
|
e="wrong crc",
|
||||||
expected=data_frame_crc,
|
expected=data_frame_crc.hex(),
|
||||||
received=data_frame_crc_received,
|
received=data_frame_crc_received.hex(),
|
||||||
overflows=static.BUFFER_OVERFLOW_COUNTER,
|
overflows=static.BUFFER_OVERFLOW_COUNTER,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -841,7 +846,11 @@ class DATA:
|
||||||
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
|
bytesperminute=static.ARQ_BYTES_PER_MINUTE,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.log.info("[TNC] | TX | DATACHANNEL", mode=mode, Bytes=static.TOTAL_BYTES)
|
self.log.info(
|
||||||
|
"[TNC] | TX | DATACHANNEL",
|
||||||
|
mode=FREEDV_MODE(mode).name,
|
||||||
|
Bytes=static.TOTAL_BYTES,
|
||||||
|
)
|
||||||
|
|
||||||
# Compress data frame
|
# Compress data frame
|
||||||
data_frame_compressed = zlib.compress(data_out)
|
data_frame_compressed = zlib.compress(data_out)
|
||||||
|
@ -857,7 +866,7 @@ class DATA:
|
||||||
|
|
||||||
# Append a crc at the beginning and end of file indicators
|
# Append a crc at the beginning and end of file indicators
|
||||||
frame_payload_crc = helpers.get_crc_32(data_out)
|
frame_payload_crc = helpers.get_crc_32(data_out)
|
||||||
self.log.debug("[TNC] frame payload CRC:", crc=frame_payload_crc)
|
self.log.debug("[TNC] frame payload CRC:", crc=frame_payload_crc.hex())
|
||||||
|
|
||||||
# Assemble the data frame
|
# Assemble the data frame
|
||||||
data_out = (
|
data_out = (
|
||||||
|
@ -876,13 +885,9 @@ class DATA:
|
||||||
while not self.data_frame_ack_received and static.ARQ_STATE:
|
while not self.data_frame_ack_received and static.ARQ_STATE:
|
||||||
# we have TX_N_MAX_RETRIES_PER_BURST attempts for sending a burst
|
# we have TX_N_MAX_RETRIES_PER_BURST attempts for sending a burst
|
||||||
for self.tx_n_retry_of_burst in range(TX_N_MAX_RETRIES_PER_BURST):
|
for self.tx_n_retry_of_burst in range(TX_N_MAX_RETRIES_PER_BURST):
|
||||||
# AUTO MODE SELECTION
|
|
||||||
# mode 255 == AUTO MODE
|
|
||||||
# force usage of selected mode
|
|
||||||
if mode != 255:
|
|
||||||
data_mode = mode
|
data_mode = mode
|
||||||
self.log.debug("[TNC] FIXED MODE:", mode=data_mode)
|
self.log.debug("[TNC] FIXED MODE:", mode=FREEDV_MODE(data_mode).name)
|
||||||
else:
|
|
||||||
# we are doing a modulo check of transmission retries of the actual burst
|
# we are doing a modulo check of transmission retries of the actual burst
|
||||||
# every 2nd retry which fails, decreases speedlevel by 1.
|
# every 2nd retry which fails, decreases speedlevel by 1.
|
||||||
# as soon as we received an ACK for the current burst, speed_level will increase
|
# as soon as we received an ACK for the current burst, speed_level will increase
|
||||||
|
@ -907,7 +912,7 @@ class DATA:
|
||||||
"[TNC] Speed-level:",
|
"[TNC] Speed-level:",
|
||||||
level=self.speed_level,
|
level=self.speed_level,
|
||||||
retry=self.tx_n_retry_of_burst,
|
retry=self.tx_n_retry_of_burst,
|
||||||
mode=data_mode,
|
mode=FREEDV_MODE(data_mode).name,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Payload information
|
# Payload information
|
||||||
|
@ -947,7 +952,7 @@ class DATA:
|
||||||
self.log.debug("[TNC] tempbuffer:", tempbuffer=tempbuffer)
|
self.log.debug("[TNC] tempbuffer:", tempbuffer=tempbuffer)
|
||||||
self.log.info(
|
self.log.info(
|
||||||
"[TNC] ARQ | TX | FRAMES",
|
"[TNC] ARQ | TX | FRAMES",
|
||||||
mode=data_mode,
|
mode=FREEDV_MODE(data_mode).name,
|
||||||
fpb=TX_N_FRAMES_PER_BURST,
|
fpb=TX_N_FRAMES_PER_BURST,
|
||||||
retry=self.tx_n_retry_of_burst,
|
retry=self.tx_n_retry_of_burst,
|
||||||
)
|
)
|
||||||
|
@ -1115,7 +1120,11 @@ class DATA:
|
||||||
self.burst_ack_snr = int.from_bytes(bytes(data_in[7:8]), "big")
|
self.burst_ack_snr = int.from_bytes(bytes(data_in[7:8]), "big")
|
||||||
self.speed_level = int.from_bytes(bytes(data_in[8:9]), "big")
|
self.speed_level = int.from_bytes(bytes(data_in[8:9]), "big")
|
||||||
static.ARQ_SPEED_LEVEL = self.speed_level
|
static.ARQ_SPEED_LEVEL = self.speed_level
|
||||||
self.log.debug("[TNC] burst_ack_received:", speed_level=self.speed_level)
|
self.log.debug(
|
||||||
|
"[TNC] burst_ack_received:",
|
||||||
|
speed_level=self.speed_level,
|
||||||
|
c2_mode=FREEDV_MODE(self.mode_list[self.speed_level]).name,
|
||||||
|
)
|
||||||
|
|
||||||
# Reset burst nack counter
|
# Reset burst nack counter
|
||||||
self.burst_nack_counter = 0
|
self.burst_nack_counter = 0
|
||||||
|
@ -1153,7 +1162,11 @@ 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")
|
||||||
static.ARQ_SPEED_LEVEL = self.speed_level
|
static.ARQ_SPEED_LEVEL = self.speed_level
|
||||||
self.burst_nack_counter += 1
|
self.burst_nack_counter += 1
|
||||||
self.log.debug("[TNC] burst_nack_received:", speed_level=self.speed_level)
|
self.log.debug(
|
||||||
|
"[TNC] burst_nack_received:",
|
||||||
|
speed_level=self.speed_level,
|
||||||
|
c2_mode=FREEDV_MODE(self.mode_list[self.speed_level]).name,
|
||||||
|
)
|
||||||
|
|
||||||
def frame_ack_received(self):
|
def frame_ack_received(self):
|
||||||
"""Received an ACK for a transmitted frame"""
|
"""Received an ACK for a transmitted frame"""
|
||||||
|
@ -1844,13 +1857,9 @@ class DATA:
|
||||||
|
|
||||||
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:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(ping_frame, c2_mode=FREEDV_MODE.fsk_ldpc_0.value)
|
||||||
ping_frame, c2_mode=codec2.FREEDV_MODE.fsk_ldpc_0.value
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(ping_frame, c2_mode=FREEDV_MODE.datac0.value)
|
||||||
ping_frame, c2_mode=codec2.FREEDV_MODE.datac0.value
|
|
||||||
)
|
|
||||||
|
|
||||||
def received_ping(self, data_in: bytes) -> None:
|
def received_ping(self, data_in: bytes) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -1879,7 +1888,7 @@ class DATA:
|
||||||
mycallsign=str(self.mycallsign, "UTF-8"),
|
mycallsign=str(self.mycallsign, "UTF-8"),
|
||||||
dxcallsign=str(static.DXCALLSIGN, "UTF-8"),
|
dxcallsign=str(static.DXCALLSIGN, "UTF-8"),
|
||||||
dxgrid=str(static.DXGRID, "UTF-8"),
|
dxgrid=str(static.DXGRID, "UTF-8"),
|
||||||
snr=str(static.SNR)
|
snr=str(static.SNR),
|
||||||
)
|
)
|
||||||
# check if callsign ssid override
|
# check if callsign ssid override
|
||||||
valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[1:4])
|
valid, mycallsign = helpers.check_callsign(self.mycallsign, data_in[1:4])
|
||||||
|
@ -1905,13 +1914,9 @@ class DATA:
|
||||||
|
|
||||||
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:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(ping_frame, c2_mode=FREEDV_MODE.fsk_ldpc_0.value)
|
||||||
ping_frame, c2_mode=codec2.FREEDV_MODE.fsk_ldpc_0.value
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(ping_frame, c2_mode=FREEDV_MODE.datac0.value)
|
||||||
ping_frame, c2_mode=codec2.FREEDV_MODE.datac0.value
|
|
||||||
)
|
|
||||||
|
|
||||||
def received_ping_ack(self, data_in: bytes) -> None:
|
def received_ping_ack(self, data_in: bytes) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -2030,7 +2035,7 @@ class DATA:
|
||||||
if static.ENABLE_FSK:
|
if static.ENABLE_FSK:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(
|
||||||
beacon_frame,
|
beacon_frame,
|
||||||
c2_mode=codec2.FREEDV_MODE.fsk_ldpc_0.value,
|
c2_mode=FREEDV_MODE.fsk_ldpc_0.value,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.enqueue_frame_for_tx(beacon_frame)
|
self.enqueue_frame_for_tx(beacon_frame)
|
||||||
|
@ -2108,9 +2113,7 @@ class DATA:
|
||||||
self.log.debug("[TNC] CQ Frame:", data=[cq_frame])
|
self.log.debug("[TNC] CQ Frame:", data=[cq_frame])
|
||||||
|
|
||||||
if static.ENABLE_FSK:
|
if static.ENABLE_FSK:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(cq_frame, c2_mode=FREEDV_MODE.fsk_ldpc_0.value)
|
||||||
cq_frame, c2_mode=codec2.FREEDV_MODE.fsk_ldpc_0.value
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
self.enqueue_frame_for_tx(cq_frame)
|
self.enqueue_frame_for_tx(cq_frame)
|
||||||
|
|
||||||
|
@ -2180,9 +2183,7 @@ class DATA:
|
||||||
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:
|
||||||
self.enqueue_frame_for_tx(
|
self.enqueue_frame_for_tx(qrv_frame, c2_mode=FREEDV_MODE.fsk_ldpc_0.value)
|
||||||
qrv_frame, c2_mode=codec2.FREEDV_MODE.fsk_ldpc_0.value
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
self.enqueue_frame_for_tx(qrv_frame)
|
self.enqueue_frame_for_tx(qrv_frame)
|
||||||
|
|
||||||
|
@ -2398,16 +2399,16 @@ class DATA:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# set modes we want to listen to
|
# set modes we want to listen to
|
||||||
if mode == codec2.FREEDV_MODE.datac1.value:
|
if mode == FREEDV_MODE.datac1.value:
|
||||||
modem.RECEIVE_DATAC1 = True
|
modem.RECEIVE_DATAC1 = True
|
||||||
self.log.debug("[TNC] Changing listening data mode", mode="datac1")
|
self.log.debug("[TNC] Changing listening data mode", mode="datac1")
|
||||||
elif mode == codec2.FREEDV_MODE.datac3.value:
|
elif mode == FREEDV_MODE.datac3.value:
|
||||||
modem.RECEIVE_DATAC3 = True
|
modem.RECEIVE_DATAC3 = True
|
||||||
self.log.debug("[TNC] Changing listening data mode", mode="datac3")
|
self.log.debug("[TNC] Changing listening data mode", mode="datac3")
|
||||||
elif mode == codec2.FREEDV_MODE.fsk_ldpc_1.value:
|
elif mode == FREEDV_MODE.fsk_ldpc_1.value:
|
||||||
modem.RECEIVE_FSK_LDPC_1 = True
|
modem.RECEIVE_FSK_LDPC_1 = True
|
||||||
self.log.debug("[TNC] Changing listening data mode", mode="fsk_ldpc_1")
|
self.log.debug("[TNC] Changing listening data mode", mode="fsk_ldpc_1")
|
||||||
elif mode == codec2.FREEDV_MODE.allmodes.value:
|
else:
|
||||||
modem.RECEIVE_DATAC1 = True
|
modem.RECEIVE_DATAC1 = True
|
||||||
modem.RECEIVE_DATAC3 = True
|
modem.RECEIVE_DATAC3 = True
|
||||||
modem.RECEIVE_FSK_LDPC_1 = True
|
modem.RECEIVE_FSK_LDPC_1 = True
|
||||||
|
@ -2556,5 +2557,7 @@ class DATA:
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
def send_test_frame(self) -> None:
|
def send_test_frame(self) -> None:
|
||||||
"""Send a test (type 12) frame"""
|
"""Send an empty test frame"""
|
||||||
self.enqueue_frame_for_tx(frame_to_tx=bytearray(126), c2_mode=12)
|
self.enqueue_frame_for_tx(
|
||||||
|
frame_to_tx=bytearray(126), c2_mode=FREEDV_MODE.datac3.value
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in a new issue