decode only if needed

this should reduce cpu load when in idle state and reduce it also when sending in specific mode. This is not yet working for AUTO mode selection. #106
This commit is contained in:
dj2ls 2022-01-15 19:23:28 +01:00
parent 6c519c5e8d
commit a4eeea8a03
3 changed files with 39 additions and 15 deletions

View file

@ -16,11 +16,17 @@ class FREEDV_MODE(Enum):
datac0 = 14
datac1 = 10
datac3 = 12
def freedv_get_mode(mode):
allmodes = 255
# function for returning the mode value
def freedv_get_mode_value_by_name(mode):
return FREEDV_MODE[mode].value
# function for returning the mode name
def freedv_get_mode_name_by_value(mode):
return FREEDV_MODE(mode).name
# check if we are running in a pyinstaller environment
try:
app_path = sys._MEIPASS

View file

@ -714,7 +714,7 @@ class DATA():
connection_frame[1:2] = static.DXCALLSIGN_CRC8
connection_frame[2:3] = static.MYCALLSIGN_CRC8
connection_frame[3:9] = static.MYCALLSIGN
connection_frame[9:10] = bytes([0]) # ONE BYTE LEFT FOR OTHER THINGS
connection_frame[9:10] = bytes([mode])
connection_frame[10:12] = data_len.to_bytes(2, byteorder='big')
connection_frame[12:13] = bytes([compression_factor])
connection_frame[13:14] = bytes([n_frames_per_burst])
@ -761,6 +761,20 @@ class DATA():
static.TOTAL_BYTES = int.from_bytes(bytes(data_in[10:12]), "big") # kBytes
static.ARQ_COMPRESSION_FACTOR = float(int.from_bytes(bytes(data_in[12:13]), "big") / 10)
n_frames_per_burst = int.from_bytes(bytes(data_in[13:14]), "big")
mode = int.from_bytes(bytes(data_in[9:10]), "big")
# set modes we want to listening to
mode_name = codec2.freedv_get_mode_name_by_value(mode)
if mode_name == 'datac1':
modem.RECEIVE_DATAC1 = True
elif mode_name == 'datac3':
modem.RECEIVE_DATAC3 = True
elif mode_name == 'allmodes':
modem.RECEIVE_DATAC1 = True
modem.RECEIVE_DATAC3 = True
#we need to find a way how to do this. this isn't working anymore since we mode to a class based module
#modem.set_frames_per_burst(n_frames_per_burst)
@ -1027,6 +1041,10 @@ class DATA():
static.RX_FRAME_BUFFER = b''
self.burst_ack_snr= 255
# reset modem receiving state to reduce cpu load
modem.RECEIVE_DATAC1 = False
modem.RECEIVE_DATAC3 = False
def arq_reset_ack(self,state:bool):
self.burst_ack = state

View file

@ -88,6 +88,10 @@ MODEM_RECEIVED_QUEUE = queue.Queue()
MODEM_TRANSMIT_QUEUE = queue.Queue()
static.TRANSMITTING = False
# receive only specific modes to reduce cpu load
RECEIVE_DATAC1 = False
RECEIVE_DATAC3 = False
class RF():
def __init__(self):
@ -217,14 +221,15 @@ class RF():
x = np.frombuffer(data_in48k, dtype=np.int16)
x = self.resampler.resample48_to_8(x)
# avoid buffer overflow
# avoid buffer overflow by filling only if buffer not full
if not self.datac0_buffer.nbuffer+len(x) > self.datac0_buffer.size:
self.datac0_buffer.push(x)
# avoid buffer overflow
if not self.datac1_buffer.nbuffer+len(x) > self.datac1_buffer.size:
# avoid buffer overflow by filling only if buffer not full and selected datachannel mode
if not self.datac1_buffer.nbuffer+len(x) > self.datac1_buffer.size and RECEIVE_DATAC1:
self.datac1_buffer.push(x)
# avoid buffer overflow
if not self.datac3_buffer.nbuffer+len(x) > self.datac3_buffer.size:
# avoid buffer overflow by filling only if buffer not full and selected datachannel mode
if not self.datac3_buffer.nbuffer+len(x) > self.datac3_buffer.size and RECEIVE_DATAC3:
self.datac3_buffer.push(x)
@ -245,7 +250,6 @@ class RF():
# toggle ptt early to save some time
static.PTT_STATE = self.hamlib.set_ptt(True)
# open codec2 instance
#self.MODE = codec2.freedv_get_mode_value_by_name(mode)
self.MODE = mode
freedv = cast(codec2.api.freedv_open(self.MODE), c_void_p)
@ -340,12 +344,10 @@ class RF():
threading.Event().set()
def audio_datac0(self):
nbytes_datac0 = 0
nbytes_datac0 = 0
while self.audio_stream.is_active():
threading.Event().wait(0.01)
while self.datac0_buffer.nbuffer >= self.datac0_nin:
# demodulate audio
nbytes_datac0 = codec2.api.freedv_rawdatarx(self.datac0_freedv, self.datac0_bytes_out, self.datac0_buffer.buffer.ctypes)
self.datac0_buffer.pop(self.datac0_nin)
@ -360,7 +362,6 @@ class RF():
while self.audio_stream.is_active():
threading.Event().wait(0.01)
while self.datac1_buffer.nbuffer >= self.datac1_nin:
# demodulate audio
nbytes_datac1 = codec2.api.freedv_rawdatarx(self.datac1_freedv, self.datac1_bytes_out, self.datac1_buffer.buffer.ctypes)
self.datac1_buffer.pop(self.datac1_nin)
@ -375,7 +376,6 @@ class RF():
while self.audio_stream.is_active():
threading.Event().wait(0.01)
while self.datac3_buffer.nbuffer >= self.datac3_nin:
# demodulate audio
nbytes_datac3 = codec2.api.freedv_rawdatarx(self.datac3_freedv, self.datac3_bytes_out, self.datac3_buffer.buffer.ctypes)
self.datac3_buffer.pop(self.datac3_nin)