FreeDATA/tools/custom_mode_tests/create_custom_ofdm_mod.py

88 lines
2.6 KiB
Python

"""
FreeDATA % python3.11 tools/custom_mode_tests/create_custom_ofdm_mod.py | ./freedata_server/lib/codec2/build_osx/src/freedv_data_raw_rx --vv --framesperburst 1 DATAC1 - /dev/null
"""
import ctypes
from freedata_server.codec2 import api, FREEDV_MODE, open_instance, audio_buffer
import threading
from freedata_server import modulator
from freedata_server.context import AppContext
MODE = FREEDV_MODE.datac1
def demod(txbuffer):
c2instance = open_instance(MODE.value)
print(f"DEMOD: {MODE}")
# get bytes per frame
bytes_per_frame = int(api.freedv_get_bits_per_modem_frame(c2instance) / 8)
# create byte out buffer
bytes_out = ctypes.create_string_buffer(bytes_per_frame)
# set initial frames per burst
api.freedv_set_frames_per_burst(c2instance, 1)
# init audio buffer
audiobuffer = audio_buffer(len(txbuffer))
# get initial nin
nin = api.freedv_nin(c2instance)
audiobuffer.push(txbuffer)
threading.Event().wait(0.01)
while audiobuffer.nbuffer >= nin:
# demodulate audio
nbytes = api.freedv_rawdatarx(freedv, bytes_out, audiobuffer.buffer.ctypes)
# get current freedata_server states and write to list
# 1 trial
# 2 sync
# 3 trial sync
# 6 decoded
# 10 error decoding == NACK
# rx_status = api.freedv_get_rx_status(freedv)
# print(rx_status)
# decrement codec traffic counter for making state smoother
audiobuffer.pop(nin)
nin = api.freedv_nin(freedv)
if nbytes == bytes_per_frame:
print("DECODED!!!!")
print("---------------------------------")
print("ENDED")
print(nin)
print(audiobuffer.nbuffer)
config_file = "config.ini"
ctx = AppContext(config_file)
ctx.startup()
modulator = modulator.Modulator(ctx)
# freedv = open_instance(FREEDV_MODE.data_ofdm_2438.value)
# freedv = open_instance(FREEDV_MODE.datac14.value)
# freedv = open_instance(FREEDV_MODE.datac1.value)
freedv = open_instance(MODE.value)
print(f"MODULATE: {MODE}")
# freedv = open_instance(FREEDV_MODE.data_ofdm_500.value)
# freedv = open_instance(FREEDV_MODE.qam16c2.value)
frames = 1
txbuffer = bytearray()
for frame in range(0, frames):
# txbuffer = modulator.transmit_add_silence(txbuffer, 1000)
txbuffer = modulator.transmit_add_preamble(txbuffer, freedv)
txbuffer = modulator.transmit_create_frame(txbuffer, freedv, b"123")
txbuffer = modulator.transmit_add_postamble(txbuffer, freedv)
txbuffer = modulator.transmit_add_silence(txbuffer, 1000)
# sys.stdout.buffer.flush()
# sys.stdout.buffer.write(txbuffer)
# sys.stdout.buffer.flush()
demod(txbuffer)