mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
small waterfall improvement
This commit is contained in:
parent
0aef902807
commit
0f72cb8f8a
166
tnc/modem.py
166
tnc/modem.py
|
@ -197,11 +197,7 @@ class RF():
|
||||||
self.datac0_buffer.push(x)
|
self.datac0_buffer.push(x)
|
||||||
self.datac1_buffer.push(x)
|
self.datac1_buffer.push(x)
|
||||||
self.datac3_buffer.push(x)
|
self.datac3_buffer.push(x)
|
||||||
|
self.fft_data += bytes(x)
|
||||||
# refill fft_data buffer so we can plot a fft
|
|
||||||
if len(self.fft_data) < 1024:
|
|
||||||
self.fft_data += bytes(x)
|
|
||||||
|
|
||||||
|
|
||||||
if self.modoutqueue.empty():
|
if self.modoutqueue.empty():
|
||||||
data_out48k = bytes(self.AUDIO_FRAMES_PER_BUFFER_TX*2*2)
|
data_out48k = bytes(self.AUDIO_FRAMES_PER_BUFFER_TX*2*2)
|
||||||
|
@ -213,15 +209,7 @@ class RF():
|
||||||
# --------------------------------------------------------------------------------------------------------
|
# --------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
def transmit(self, mode, repeats, repeat_delay, frames):
|
def transmit(self, mode, repeats, repeat_delay, frames):
|
||||||
#print(mode)
|
|
||||||
#mode = codec2.freedv_get_mode_value_by_name(mode)
|
|
||||||
#print(mode)
|
|
||||||
|
|
||||||
#state_before_transmit = static.CHANNEL_STATE
|
|
||||||
#static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# open codec2 instance
|
# open codec2 instance
|
||||||
#self.MODE = codec2.freedv_get_mode_value_by_name(mode)
|
#self.MODE = codec2.freedv_get_mode_value_by_name(mode)
|
||||||
|
@ -311,146 +299,6 @@ class RF():
|
||||||
self.c_lib.freedv_close(freedv)
|
self.c_lib.freedv_close(freedv)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
def transmit_signalling(self, data_out, count):
|
|
||||||
state_before_transmit = static.CHANNEL_STATE
|
|
||||||
static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
|
||||||
|
|
||||||
mod_out = create_string_buffer(self.datac0_n_tx_modem_samples * 2)
|
|
||||||
mod_out_preamble = create_string_buffer(self.datac0_n_tx_preamble_modem_samples * 2)
|
|
||||||
mod_out_postamble = create_string_buffer(self.datac0_n_tx_postamble_modem_samples * 2)
|
|
||||||
|
|
||||||
buffer = bytearray(self.datac0_payload_per_frame)
|
|
||||||
# set buffersize to length of data which will be send
|
|
||||||
buffer[:len(data_out)] = data_out
|
|
||||||
|
|
||||||
crc = ctypes.c_ushort(self.c_lib.freedv_gen_crc16(bytes(buffer), self.datac0_payload_per_frame)) # generate CRC16
|
|
||||||
# convert crc to 2 byte hex string
|
|
||||||
crc = crc.value.to_bytes(2, byteorder='big')
|
|
||||||
buffer += crc # append crc16 to buffer
|
|
||||||
data = (ctypes.c_ubyte * self.datac0_bytes_per_frame).from_buffer_copy(buffer)
|
|
||||||
|
|
||||||
# modulate DATA and safe it into mod_out pointer
|
|
||||||
self.c_lib.freedv_rawdatapreambletx(self.datac0_freedv, mod_out_preamble)
|
|
||||||
self.c_lib.freedv_rawdatatx(self.datac0_freedv, mod_out, data)
|
|
||||||
self.c_lib.freedv_rawdatapostambletx(self.datac0_freedv, mod_out_postamble)
|
|
||||||
|
|
||||||
self.streambuffer = bytearray()
|
|
||||||
self.streambuffer += bytes(mod_out_preamble)
|
|
||||||
self.streambuffer += bytes(mod_out)
|
|
||||||
self.streambuffer += bytes(mod_out_postamble)
|
|
||||||
|
|
||||||
# resample up to 48k (resampler works on np.int16)
|
|
||||||
x = np.frombuffer(self.streambuffer, dtype=np.int16)
|
|
||||||
txbuffer_48k = self.resampler.resample8_to_48(x)
|
|
||||||
|
|
||||||
|
|
||||||
# append frame again with as much as in count defined
|
|
||||||
#for i in range(1, count):
|
|
||||||
# self.streambuffer += bytes(txbuffer_48k.tobytes())
|
|
||||||
|
|
||||||
while self.ptt_and_wait(True):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# set channel state
|
|
||||||
static.CHANNEL_STATE = 'SENDING_SIGNALLING'
|
|
||||||
|
|
||||||
# start writing audio data to audio stream
|
|
||||||
#self.stream_tx.write(self.streambuffer)
|
|
||||||
self.stream_tx.write(txbuffer_48k.tobytes())
|
|
||||||
|
|
||||||
|
|
||||||
# set ptt back to false
|
|
||||||
self.ptt_and_wait(False)
|
|
||||||
|
|
||||||
|
|
||||||
# we have a problem with the receiving state
|
|
||||||
if state_before_transmit != 'RECEIVING_DATA':
|
|
||||||
static.CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
|
||||||
else:
|
|
||||||
static.CHANNEL_STATE = state_before_transmit
|
|
||||||
|
|
||||||
return True
|
|
||||||
# --------------------------------------------------------------------------------------------------------
|
|
||||||
# GET ARQ BURST FRAME VOM BUFFER AND MODULATE IT
|
|
||||||
|
|
||||||
def transmit_arq_burst(self, mode, frames):
|
|
||||||
|
|
||||||
# we could place this timing part inside the modem...
|
|
||||||
# lets see if this is a good idea..
|
|
||||||
# we need to update our timeout timestamp
|
|
||||||
|
|
||||||
state_before_transmit = static.CHANNEL_STATE
|
|
||||||
static.CHANNEL_STATE = 'SENDING_DATA'
|
|
||||||
|
|
||||||
freedv = cast(self.c_lib.freedv_open(mode), c_void_p)
|
|
||||||
self.c_lib.freedv_set_clip(freedv, 1)
|
|
||||||
self.c_lib.freedv_set_tx_bpf(freedv, 1)
|
|
||||||
|
|
||||||
bytes_per_frame = int(self.c_lib.freedv_get_bits_per_modem_frame(freedv) / 8)
|
|
||||||
payload_per_frame = bytes_per_frame - 2
|
|
||||||
n_nom_modem_samples = self.c_lib.freedv_get_n_nom_modem_samples(freedv)
|
|
||||||
n_tx_modem_samples = self.c_lib.freedv_get_n_tx_modem_samples(freedv)
|
|
||||||
n_tx_preamble_modem_samples = self.c_lib.freedv_get_n_tx_preamble_modem_samples(freedv)
|
|
||||||
n_tx_postamble_modem_samples = self.c_lib.freedv_get_n_tx_postamble_modem_samples(freedv)
|
|
||||||
|
|
||||||
mod_out = create_string_buffer(n_tx_modem_samples * 2)
|
|
||||||
mod_out_preamble = create_string_buffer(n_tx_preamble_modem_samples * 2)
|
|
||||||
mod_out_postamble = create_string_buffer(n_tx_postamble_modem_samples * 2)
|
|
||||||
|
|
||||||
self.streambuffer = bytearray()
|
|
||||||
self.c_lib.freedv_rawdatapreambletx(freedv, mod_out_preamble)
|
|
||||||
self.streambuffer += bytes(mod_out_preamble)
|
|
||||||
|
|
||||||
|
|
||||||
# loop through list of frames per burst
|
|
||||||
for n in range(0, len(frames)):
|
|
||||||
|
|
||||||
# create TX buffer
|
|
||||||
buffer = bytearray(payload_per_frame)
|
|
||||||
# set buffersize to length of data which will be send
|
|
||||||
buffer[:len(frames[n])] = frames[n]
|
|
||||||
|
|
||||||
crc = ctypes.c_ushort(self.c_lib.freedv_gen_crc16(bytes(buffer), payload_per_frame)) # generate CRC16
|
|
||||||
# convert crc to 2 byte hex string
|
|
||||||
crc = crc.value.to_bytes(2, byteorder='big')
|
|
||||||
buffer += crc # append crc16 to buffer
|
|
||||||
data = (ctypes.c_ubyte * bytes_per_frame).from_buffer_copy(buffer)
|
|
||||||
|
|
||||||
# modulate DATA and safe it into mod_out pointer
|
|
||||||
self.c_lib.freedv_rawdatatx(freedv, mod_out, data)
|
|
||||||
self.streambuffer += bytes(mod_out)
|
|
||||||
|
|
||||||
self.c_lib.freedv_rawdatapostambletx(freedv, mod_out_postamble)
|
|
||||||
self.streambuffer += bytes(mod_out_postamble)
|
|
||||||
|
|
||||||
# resample up to 48k (resampler works on np.int16)
|
|
||||||
x = np.frombuffer(self.streambuffer, dtype=np.int16)
|
|
||||||
txbuffer_48k = self.resampler.resample8_to_48(x)
|
|
||||||
|
|
||||||
# -------------- transmit audio
|
|
||||||
|
|
||||||
while self.ptt_and_wait(True):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# set channel state
|
|
||||||
static.CHANNEL_STATE = 'SENDING_DATA'
|
|
||||||
|
|
||||||
# write audio to stream
|
|
||||||
self.stream_tx.write(txbuffer_48k.tobytes())
|
|
||||||
|
|
||||||
static.CHANNEL_STATE = 'RECEIVING_SIGNALLING'
|
|
||||||
|
|
||||||
self.ptt_and_wait(False)
|
|
||||||
|
|
||||||
# close codec2 instance
|
|
||||||
self.c_lib.freedv_close(freedv)
|
|
||||||
|
|
||||||
return True
|
|
||||||
# --------------------------------------------------------------------------------------------------------
|
|
||||||
'''
|
|
||||||
def audio(self):
|
def audio(self):
|
||||||
try:
|
try:
|
||||||
print(f"starting pyaudio callback", file=sys.stderr)
|
print(f"starting pyaudio callback", file=sys.stderr)
|
||||||
|
@ -597,12 +445,12 @@ class RF():
|
||||||
else:
|
else:
|
||||||
structlog.get_logger("structlog").warning("[TNC] ARQ - other frame type", frametype=frametype)
|
structlog.get_logger("structlog").warning("[TNC] ARQ - other frame type", frametype=frametype)
|
||||||
|
|
||||||
'''
|
|
||||||
# DO UNSYNC AFTER LAST BURST by checking the frame nums against the total frames per burst
|
# DO UNSYNC AFTER LAST BURST by checking the frame nums against the total frames per burst
|
||||||
if frame == n_frames_per_burst:
|
if frame == n_frames_per_burst:
|
||||||
logging.info("LAST FRAME ---> UNSYNC")
|
logging.info("LAST FRAME ---> UNSYNC")
|
||||||
self.c_lib.freedv_set_sync(freedv, 0) # FORCE UNSYNC
|
self.c_lib.freedv_set_sync(freedv, 0) # FORCE UNSYNC
|
||||||
'''
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# for debugging purposes to receive all data
|
# for debugging purposes to receive all data
|
||||||
|
@ -688,12 +536,12 @@ class RF():
|
||||||
# round data to decrease size
|
# round data to decrease size
|
||||||
dfft = np.around(dfft, 1)
|
dfft = np.around(dfft, 1)
|
||||||
dfftlist = dfft.tolist()
|
dfftlist = dfft.tolist()
|
||||||
|
|
||||||
static.FFT = dfftlist[10:180] #200 --> bandwith 3000
|
static.FFT = dfftlist[0:320] #200 --> bandwith 3000
|
||||||
except:
|
except:
|
||||||
|
|
||||||
structlog.get_logger("structlog").debug("[TNC] Setting fft=0")
|
structlog.get_logger("structlog").debug("[TNC] Setting fft=0")
|
||||||
# else 0
|
# else 0
|
||||||
static.FFT = [0] * 400
|
static.FFT = [0] * 320
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
Loading…
Reference in a new issue