mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
WIP ARQ - removed fsk
This commit is contained in:
parent
b3519eef56
commit
7394e8b31b
|
@ -93,29 +93,6 @@ class Demodulator():
|
||||||
self.dat0_datac4_nin = \
|
self.dat0_datac4_nin = \
|
||||||
self.init_codec2_mode(codec2.FREEDV_MODE.datac4.value, None)
|
self.init_codec2_mode(codec2.FREEDV_MODE.datac4.value, None)
|
||||||
|
|
||||||
|
|
||||||
# FSK LDPC - 0
|
|
||||||
self.fsk_ldpc_freedv_0, \
|
|
||||||
self.fsk_ldpc_bytes_per_frame_0, \
|
|
||||||
self.fsk_ldpc_bytes_out_0, \
|
|
||||||
self.fsk_ldpc_buffer_0, \
|
|
||||||
self.fsk_ldpc_nin_0 = \
|
|
||||||
self.init_codec2_mode(
|
|
||||||
codec2.FREEDV_MODE.fsk_ldpc.value,
|
|
||||||
codec2.api.FREEDV_MODE_FSK_LDPC_0_ADV
|
|
||||||
)
|
|
||||||
|
|
||||||
# FSK LDPC - 1
|
|
||||||
self.fsk_ldpc_freedv_1, \
|
|
||||||
self.fsk_ldpc_bytes_per_frame_1, \
|
|
||||||
self.fsk_ldpc_bytes_out_1, \
|
|
||||||
self.fsk_ldpc_buffer_1, \
|
|
||||||
self.fsk_ldpc_nin_1 = \
|
|
||||||
self.init_codec2_mode(
|
|
||||||
codec2.FREEDV_MODE.fsk_ldpc.value,
|
|
||||||
codec2.api.FREEDV_MODE_FSK_LDPC_1_ADV
|
|
||||||
)
|
|
||||||
|
|
||||||
def init_codec2_mode(self, mode, adv):
|
def init_codec2_mode(self, mode, adv):
|
||||||
"""
|
"""
|
||||||
Init codec2 and return some important parameters
|
Init codec2 and return some important parameters
|
||||||
|
@ -128,21 +105,11 @@ class Demodulator():
|
||||||
Returns:
|
Returns:
|
||||||
c2instance, bytes_per_frame, bytes_out, audio_buffer, nin
|
c2instance, bytes_per_frame, bytes_out, audio_buffer, nin
|
||||||
"""
|
"""
|
||||||
if adv:
|
|
||||||
# FSK Long-distance Parity Code 1 - data frames
|
|
||||||
c2instance = ctypes.cast(
|
|
||||||
codec2.api.freedv_open_advanced(
|
|
||||||
codec2.FREEDV_MODE.fsk_ldpc.value,
|
|
||||||
ctypes.byref(adv),
|
|
||||||
),
|
|
||||||
ctypes.c_void_p,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
|
|
||||||
# create codec2 instance
|
# create codec2 instance
|
||||||
c2instance = ctypes.cast(
|
c2instance = ctypes.cast(
|
||||||
codec2.api.freedv_open(mode), ctypes.c_void_p
|
codec2.api.freedv_open(mode), ctypes.c_void_p
|
||||||
)
|
)
|
||||||
|
|
||||||
# set tuning range
|
# set tuning range
|
||||||
codec2.api.freedv_set_tuning_range(
|
codec2.api.freedv_set_tuning_range(
|
||||||
|
@ -191,37 +158,25 @@ class Demodulator():
|
||||||
self.stream = stream
|
self.stream = stream
|
||||||
|
|
||||||
# Start decoder threads
|
# Start decoder threads
|
||||||
if self.enable_fsk:
|
audio_thread_signalling_datac13 = threading.Thread(
|
||||||
audio_thread_fsk_ldpc0 = threading.Thread(
|
target=self.audio_signalling_datac13, name="AUDIO_THREAD DATAC13 - 0", daemon=True
|
||||||
target=self.audio_fsk_ldpc_0, name="AUDIO_THREAD FSK LDPC0", daemon=True
|
)
|
||||||
)
|
audio_thread_signalling_datac13.start()
|
||||||
audio_thread_fsk_ldpc0.start()
|
|
||||||
|
|
||||||
audio_thread_fsk_ldpc1 = threading.Thread(
|
audio_thread_dat0_datac1 = threading.Thread(
|
||||||
target=self.audio_fsk_ldpc_1, name="AUDIO_THREAD FSK LDPC1", daemon=True
|
target=self.audio_dat0_datac1, name="AUDIO_THREAD DATAC1", daemon=True
|
||||||
)
|
)
|
||||||
audio_thread_fsk_ldpc1.start()
|
audio_thread_dat0_datac1.start()
|
||||||
|
|
||||||
else:
|
audio_thread_dat0_datac3 = threading.Thread(
|
||||||
audio_thread_signalling_datac13 = threading.Thread(
|
target=self.audio_dat0_datac3, name="AUDIO_THREAD DATAC3", daemon=True
|
||||||
target=self.audio_signalling_datac13, name="AUDIO_THREAD DATAC13 - 0", daemon=True
|
)
|
||||||
)
|
audio_thread_dat0_datac3.start()
|
||||||
audio_thread_signalling_datac13.start()
|
|
||||||
|
|
||||||
audio_thread_dat0_datac1 = threading.Thread(
|
audio_thread_dat0_datac4 = threading.Thread(
|
||||||
target=self.audio_dat0_datac1, name="AUDIO_THREAD DATAC1", daemon=True
|
target=self.audio_dat0_datac4, name="AUDIO_THREAD DATAC4", daemon=True
|
||||||
)
|
)
|
||||||
audio_thread_dat0_datac1.start()
|
audio_thread_dat0_datac4.start()
|
||||||
|
|
||||||
audio_thread_dat0_datac3 = threading.Thread(
|
|
||||||
target=self.audio_dat0_datac3, name="AUDIO_THREAD DATAC3", daemon=True
|
|
||||||
)
|
|
||||||
audio_thread_dat0_datac3.start()
|
|
||||||
|
|
||||||
audio_thread_dat0_datac4 = threading.Thread(
|
|
||||||
target=self.audio_dat0_datac4, name="AUDIO_THREAD DATAC4", daemon=True
|
|
||||||
)
|
|
||||||
audio_thread_dat0_datac4.start()
|
|
||||||
|
|
||||||
def audio_signalling_datac13(self) -> None:
|
def audio_signalling_datac13(self) -> None:
|
||||||
"""Receive data encoded with datac13 - 0"""
|
"""Receive data encoded with datac13 - 0"""
|
||||||
|
@ -271,29 +226,6 @@ class Demodulator():
|
||||||
"dat0-datac3"
|
"dat0-datac3"
|
||||||
)
|
)
|
||||||
|
|
||||||
def audio_fsk_ldpc_0(self) -> None:
|
|
||||||
"""Receive data encoded with FSK + LDPC0"""
|
|
||||||
self.fsk_ldpc_nin_0 = self.demodulate_audio(
|
|
||||||
self.fsk_ldpc_buffer_0,
|
|
||||||
self.fsk_ldpc_nin_0,
|
|
||||||
self.fsk_ldpc_freedv_0,
|
|
||||||
self.fsk_ldpc_bytes_out_0,
|
|
||||||
self.fsk_ldpc_bytes_per_frame_0,
|
|
||||||
self.FSK_LDPC0_STATE,
|
|
||||||
"fsk_ldpc0",
|
|
||||||
)
|
|
||||||
|
|
||||||
def audio_fsk_ldpc_1(self) -> None:
|
|
||||||
"""Receive data encoded with FSK + LDPC1"""
|
|
||||||
self.fsk_ldpc_nin_1 = self.demodulate_audio(
|
|
||||||
self.fsk_ldpc_buffer_1,
|
|
||||||
self.fsk_ldpc_nin_1,
|
|
||||||
self.fsk_ldpc_freedv_1,
|
|
||||||
self.fsk_ldpc_bytes_out_1,
|
|
||||||
self.fsk_ldpc_bytes_per_frame_1,
|
|
||||||
self.FSK_LDPC1_STATE,
|
|
||||||
"fsk_ldpc1",
|
|
||||||
)
|
|
||||||
|
|
||||||
def sd_input_audio_callback(self, indata: np.ndarray, frames: int, time, status) -> None:
|
def sd_input_audio_callback(self, indata: np.ndarray, frames: int, time, status) -> None:
|
||||||
x = np.frombuffer(indata, dtype=np.int16)
|
x = np.frombuffer(indata, dtype=np.int16)
|
||||||
|
@ -316,8 +248,6 @@ class Demodulator():
|
||||||
(self.dat0_datac1_buffer, self.RECEIVE_DATAC1, 2),
|
(self.dat0_datac1_buffer, self.RECEIVE_DATAC1, 2),
|
||||||
(self.dat0_datac3_buffer, self.RECEIVE_DATAC3, 3),
|
(self.dat0_datac3_buffer, self.RECEIVE_DATAC3, 3),
|
||||||
(self.dat0_datac4_buffer, self.RECEIVE_DATAC4, 4),
|
(self.dat0_datac4_buffer, self.RECEIVE_DATAC4, 4),
|
||||||
(self.fsk_ldpc_buffer_0, self.enable_fsk, 5),
|
|
||||||
(self.fsk_ldpc_buffer_1, self.enable_fsk, 6),
|
|
||||||
]:
|
]:
|
||||||
if (audiobuffer.nbuffer + length_x) > audiobuffer.size:
|
if (audiobuffer.nbuffer + length_x) > audiobuffer.size:
|
||||||
self.buffer_overflow_counter[index] += 1
|
self.buffer_overflow_counter[index] += 1
|
||||||
|
@ -487,8 +417,6 @@ class Demodulator():
|
||||||
(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, self.RECEIVE_DATAC4),
|
(self.dat0_datac4_buffer, self.RECEIVE_DATAC4),
|
||||||
(self.fsk_ldpc_buffer_0, self.enable_fsk),
|
|
||||||
(self.fsk_ldpc_buffer_1, self.enable_fsk),
|
|
||||||
]:
|
]:
|
||||||
if (
|
if (
|
||||||
not (data_buffer.nbuffer + length_x) > data_buffer.size
|
not (data_buffer.nbuffer + length_x) > data_buffer.size
|
||||||
|
@ -520,8 +448,6 @@ class Demodulator():
|
||||||
(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, self.RECEIVE_DATAC4),
|
(self.dat0_datac4_buffer, self.RECEIVE_DATAC4),
|
||||||
(self.fsk_ldpc_buffer_0, self.enable_fsk),
|
|
||||||
(self.fsk_ldpc_buffer_1, self.enable_fsk),
|
|
||||||
]:
|
]:
|
||||||
if (
|
if (
|
||||||
not (data_buffer.nbuffer + length_x) > data_buffer.size
|
not (data_buffer.nbuffer + length_x) > data_buffer.size
|
||||||
|
@ -545,7 +471,6 @@ class Demodulator():
|
||||||
codec2.api.freedv_set_frames_per_burst(self.dat0_datac1_freedv, frames_per_burst)
|
codec2.api.freedv_set_frames_per_burst(self.dat0_datac1_freedv, frames_per_burst)
|
||||||
codec2.api.freedv_set_frames_per_burst(self.dat0_datac3_freedv, frames_per_burst)
|
codec2.api.freedv_set_frames_per_burst(self.dat0_datac3_freedv, frames_per_burst)
|
||||||
codec2.api.freedv_set_frames_per_burst(self.dat0_datac4_freedv, frames_per_burst)
|
codec2.api.freedv_set_frames_per_burst(self.dat0_datac4_freedv, frames_per_burst)
|
||||||
codec2.api.freedv_set_frames_per_burst(self.fsk_ldpc_freedv_0, frames_per_burst)
|
|
||||||
|
|
||||||
def calculate_snr(self, freedv: ctypes.c_void_p) -> float:
|
def calculate_snr(self, freedv: ctypes.c_void_p) -> float:
|
||||||
"""
|
"""
|
||||||
|
@ -627,4 +552,3 @@ class Demodulator():
|
||||||
codec2.api.freedv_set_sync(self.dat0_datac1_freedv, 0)
|
codec2.api.freedv_set_sync(self.dat0_datac1_freedv, 0)
|
||||||
codec2.api.freedv_set_sync(self.dat0_datac3_freedv, 0)
|
codec2.api.freedv_set_sync(self.dat0_datac3_freedv, 0)
|
||||||
codec2.api.freedv_set_sync(self.dat0_datac4_freedv, 0)
|
codec2.api.freedv_set_sync(self.dat0_datac4_freedv, 0)
|
||||||
codec2.api.freedv_set_sync(self.fsk_ldpc_freedv_0, 0)
|
|
||||||
|
|
|
@ -339,16 +339,10 @@ class RF:
|
||||||
|
|
||||||
# Create modulation for all frames in the list
|
# Create modulation for all frames in the list
|
||||||
for frame in frames:
|
for frame in frames:
|
||||||
|
|
||||||
# Write preamble to txbuffer
|
# Write preamble to txbuffer
|
||||||
# codec2 fsk preamble may be broken -
|
codec2.api.freedv_rawdatapreambletx(freedv, mod_out_preamble)
|
||||||
# at least it sounds like that, so we are disabling it for testing
|
txbuffer += bytes(mod_out_preamble)
|
||||||
if self.MODE not in [
|
|
||||||
codec2.FREEDV_MODE.fsk_ldpc_0.value,
|
|
||||||
codec2.FREEDV_MODE.fsk_ldpc_1.value,
|
|
||||||
]:
|
|
||||||
# Write preamble to txbuffer
|
|
||||||
codec2.api.freedv_rawdatapreambletx(freedv, mod_out_preamble)
|
|
||||||
txbuffer += bytes(mod_out_preamble)
|
|
||||||
|
|
||||||
# Create buffer for data
|
# Create buffer for data
|
||||||
# Use this if CRC16 checksum is required (DATAc1-3)
|
# Use this if CRC16 checksum is required (DATAc1-3)
|
||||||
|
@ -373,16 +367,10 @@ class RF:
|
||||||
codec2.api.freedv_rawdatatx(freedv, mod_out, data)
|
codec2.api.freedv_rawdatatx(freedv, mod_out, data)
|
||||||
txbuffer += bytes(mod_out)
|
txbuffer += bytes(mod_out)
|
||||||
|
|
||||||
# codec2 fsk postamble may be broken -
|
# Write postamble to txbuffer
|
||||||
# at least it sounds like that, so we are disabling it for testing
|
codec2.api.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
||||||
if self.MODE not in [
|
# Append postamble to txbuffer
|
||||||
codec2.FREEDV_MODE.fsk_ldpc_0.value,
|
txbuffer += bytes(mod_out_postamble)
|
||||||
codec2.FREEDV_MODE.fsk_ldpc_1.value,
|
|
||||||
]:
|
|
||||||
# Write postamble to txbuffer
|
|
||||||
codec2.api.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
|
||||||
# Append postamble to txbuffer
|
|
||||||
txbuffer += bytes(mod_out_postamble)
|
|
||||||
|
|
||||||
# Add delay to end of frames
|
# Add delay to end of frames
|
||||||
samples_delay = int(self.MODEM_SAMPLE_RATE * (repeat_delay / 1000)) # type: ignore
|
samples_delay = int(self.MODEM_SAMPLE_RATE * (repeat_delay / 1000)) # type: ignore
|
||||||
|
@ -514,8 +502,6 @@ class RF:
|
||||||
self.freedv_datac3_tx = codec2.open_instance(codec2.FREEDV_MODE.datac3.value)
|
self.freedv_datac3_tx = codec2.open_instance(codec2.FREEDV_MODE.datac3.value)
|
||||||
self.freedv_datac4_tx = codec2.open_instance(codec2.FREEDV_MODE.datac4.value)
|
self.freedv_datac4_tx = codec2.open_instance(codec2.FREEDV_MODE.datac4.value)
|
||||||
self.freedv_datac13_tx = codec2.open_instance(codec2.FREEDV_MODE.datac13.value)
|
self.freedv_datac13_tx = codec2.open_instance(codec2.FREEDV_MODE.datac13.value)
|
||||||
self.freedv_ldpc0_tx = codec2.open_instance(codec2.FREEDV_MODE.fsk_ldpc_0.value)
|
|
||||||
self.freedv_ldpc1_tx = codec2.open_instance(codec2.FREEDV_MODE.fsk_ldpc_1.value)
|
|
||||||
|
|
||||||
def init_data_threads(self):
|
def init_data_threads(self):
|
||||||
worker_received = threading.Thread(
|
worker_received = threading.Thread(
|
||||||
|
|
Loading…
Reference in a new issue