From 1852458cf5565d53dfd2be36c43587e19486e2a8 Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Mon, 13 Nov 2023 18:11:55 +0100 Subject: [PATCH] remove globals --- modem/data_handler.py | 172 ++++++++++++++++------------------------- modem/event_manager.py | 5 ++ modem/modem.py | 35 ++++----- modem/state_manager.py | 4 +- 4 files changed, 89 insertions(+), 127 deletions(-) diff --git a/modem/data_handler.py b/modem/data_handler.py index 87c959f5..a2ee42fd 100644 --- a/modem/data_handler.py +++ b/modem/data_handler.py @@ -23,13 +23,12 @@ import codec2 import helpers import modem import numpy as np -import deprecated_sock -from global_instances import ARQ, AudioParam, Beacon, Channel, Daemon, HamlibParam, ModemParam, Station, Statistics, TCIParam, Modem +from global_instances import ARQ, Beacon, HamlibParam, ModemParam, Station, Modem import structlog import stats import ujson as json from codec2 import FREEDV_MODE, FREEDV_MODE_USED_SLOTS -from queues import DATA_QUEUE_RECEIVED, DATA_QUEUE_TRANSMIT, RX_BUFFER, MESH_RECEIVED_QUEUE +from queues import DATA_QUEUE_RECEIVED, DATA_QUEUE_TRANSMIT, RX_BUFFER from static import FRAME_TYPE as FR_TYPE import broadcast @@ -365,11 +364,12 @@ class DATA: # [0] bytes # [1] freedv instance # [2] bytes_per_frame + # [3] snr self.process_data( - bytes_out=data[0], freedv=data[1], bytes_per_frame=data[2] + bytes_out=data[0], freedv=data[1], bytes_per_frame=data[2], snr=data[3] ) - def process_data(self, bytes_out, freedv, bytes_per_frame: int) -> None: + def process_data(self, bytes_out, freedv, bytes_per_frame: int, snr) -> None: """ Process incoming data and decide what to do with the frame. @@ -377,6 +377,7 @@ class DATA: bytes_out: freedv: bytes_per_frame: + snr: Returns: @@ -432,7 +433,6 @@ class DATA: # get snr of received data # FIXME find a fix for this - after moving to classes, this no longer works # snr = self.calculate_snr(freedv) - snr = ModemParam.snr self.log.debug("[Modem] RX SNR", snr=snr) # send payload data to arq checker without CRC16 self.arq_data_received( @@ -826,7 +826,7 @@ class DATA: # calculate statistics self.calculate_transfer_rate_rx( - self.rx_start_of_transmission, len(ARQ.rx_frame_buffer) + self.rx_start_of_transmission, len(ARQ.rx_frame_buffer), snr ) # send a network message with information @@ -843,36 +843,6 @@ class DATA: finished=ARQ.arq_seconds_until_finish, irs=helpers.bool_to_string(self.is_IRS) ) - - # elif self.rx_n_frame_of_burst == self.rx_n_frames_per_burst: - # # We have "Nones" in our rx buffer, - # # Check if we received last frame of burst - this is an indicator for missed frames. - # # With this way of doing this, we always MUST receive the last - # # frame of a burst otherwise the entire burst is lost - # # TODO See if a timeout on the send side with re-transmit last burst would help. - # self.log.debug( - # "[Modem] last frames of burst received:", - # frame=self.rx_n_frame_of_burst, - # frames=self.rx_n_frames_per_burst, - # - # ) - # self.calculate_transfer_rate_rx( - # self.rx_start_of_transmission, len(ARQ.rx_frame_buffer) - # ) - - # elif self.rx_n_frame_of_burst not in [self.rx_n_frames_per_burst - 1]: - # self.log.info( - # "[Modem] data_handler: received burst", - # frame=self.rx_n_frame_of_burst + 1, - # frames=self.rx_n_frames_per_burst, - # ) - - # else: - # self.log.error( - # "[Modem] data_handler: Should not reach this point...", - # frame=self.rx_n_frame_of_burst + 1, - # frames=self.rx_n_frames_per_burst, - # ) else: self.log.warning( "[Modem] data_handler: missing data in burst buffer...", @@ -889,7 +859,7 @@ class DATA: # get total bytes per transmission information as soon we received a frame with a BOF if bof_position >= 0: - self.arq_extract_statistics_from_data_frame(bof_position, eof_position) + self.arq_extract_statistics_from_data_frame(bof_position, eof_position, snr) if ( bof_position >= 0 and eof_position > 0 @@ -955,7 +925,6 @@ class DATA: e="wrong crc", expected=data_frame_crc.hex(), received=data_frame_crc_received.hex(), - overflows=AudioParam.buffer_overflow_counter, nacks=self.frame_nack_counter, duration=duration, bytesperminute=ARQ.bytes_per_minute, @@ -976,7 +945,7 @@ class DATA: # Finally cleanup our buffers and states, self.arq_cleanup() - def arq_extract_statistics_from_data_frame(self, bof_position, eof_position): + def arq_extract_statistics_from_data_frame(self, bof_position, eof_position, snr): payload = ARQ.rx_frame_buffer[ bof_position + len(self.data_frame_bof): eof_position ] @@ -987,7 +956,7 @@ class DATA: compression_factor = np.clip(compression_factor, 0, 255) ARQ.arq_compression_factor = compression_factor / 10 self.calculate_transfer_rate_rx( - self.rx_start_of_transmission, len(ARQ.rx_frame_buffer) + self.rx_start_of_transmission, len(ARQ.rx_frame_buffer), snr ) def check_if_mode_fits_to_busy_slot(self): @@ -1018,13 +987,13 @@ class DATA: # make sure new speed level isn't higher than available modes new_speed_level = min(self.speed_level + 1, len(self.mode_list) - 1) # check if actual snr is higher than minimum snr for next mode - if ModemParam.snr >= self.snr_list[new_speed_level]: + if snr >= self.snr_list[new_speed_level]: self.speed_level = new_speed_level else: self.log.info("[Modem] ARQ | increasing speed level not possible because of SNR limit", - given_snr=ModemParam.snr, + given_snr=snr, needed_snr=self.snr_list[new_speed_level] ) @@ -1040,7 +1009,7 @@ class DATA: self.log.debug( "[Modem] calculated speed level", speed_level=self.speed_level, - given_snr=ModemParam.snr, + given_snr=snr, min_snr=self.snr_list[self.speed_level], ) @@ -1055,7 +1024,7 @@ class DATA: duration = time.time() - self.rx_start_of_transmission self.calculate_transfer_rate_rx( - self.rx_start_of_transmission, len(ARQ.rx_frame_buffer) + self.rx_start_of_transmission, len(ARQ.rx_frame_buffer), snr ) self.log.info("[Modem] ARQ | RX | DATA FRAME SUCCESSFULLY RECEIVED", nacks=self.frame_nack_counter, bytesperminute=ARQ.bytes_per_minute, total_bytes=ARQ.total_bytes, duration=duration, hmac_signed=signed) @@ -1189,7 +1158,7 @@ class DATA: self.send_data_ack_frame(snr) # Update statistics AFTER the frame ACK is sent self.calculate_transfer_rate_rx( - self.rx_start_of_transmission, len(ARQ.rx_frame_buffer) + self.rx_start_of_transmission, len(ARQ.rx_frame_buffer), snr ) self.log.info( @@ -1437,7 +1406,6 @@ class DATA: "[Modem] ATTEMPT:", retry=self.tx_n_retry_of_burst, maxretries=self.tx_n_max_retries_per_burst, - overflows=AudioParam.buffer_overflow_counter, ) # update buffer position @@ -1511,8 +1479,6 @@ class DATA: BytesPerMinute=ARQ.bytes_per_minute, total_bytes=ARQ.total_bytes, BitsPerSecond=ARQ.arq_bits_per_second, - overflows=AudioParam.buffer_overflow_counter, - ) # finally do an arq cleanup @@ -1538,13 +1504,11 @@ class DATA: ) self.log.info( - "[Modem] ARQ | TX | TRANSMISSION FAILED OR TIME OUT!", - overflows=AudioParam.buffer_overflow_counter, - ) + "[Modem] ARQ | TX | TRANSMISSION FAILED OR TIME OUT!") self.stop_transmission() - def burst_ack_nack_received(self, data_in: bytes) -> None: + def burst_ack_nack_received(self, data_in: bytes, snr) -> None: """ Received an ACK/NACK for a transmitted frame, keep track and make adjustments to speed level if needed. @@ -1562,7 +1526,7 @@ class DATA: self.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -1607,7 +1571,7 @@ class DATA: ARQ.arq_speed_level = self.speed_level def frame_ack_received( - self, data_in: bytes # pylint: disable=unused-argument + self, data_in: bytes, snr # pylint: disable=unused-argument, ) -> None: """Received an ACK for a transmitted frame""" # Process data only if we are in ARQ and BUSY state @@ -1617,7 +1581,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -1628,7 +1592,7 @@ class DATA: self.arq_session_last_received = int(time.time()) def frame_nack_received( - self, data_in: bytes # pylint: disable=unused-argument + self, data_in: bytes, snr # pylint: disable=unused-argument ) -> None: """ Received a NACK for a transmitted frame @@ -1655,7 +1619,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -1678,7 +1642,7 @@ class DATA: self.arq_cleanup() - def burst_rpt_received(self, data_in: bytes): + def burst_rpt_received(self, data_in: bytes, snr): """ Repeat request frame received for transmitted frame @@ -1694,7 +1658,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -1881,7 +1845,7 @@ class DATA: ) return True - def received_session_opener(self, data_in: bytes) -> None: + def received_session_opener(self, data_in: bytes, snr) -> None: """ Received a session open request packet. @@ -1919,7 +1883,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -1976,7 +1940,7 @@ class DATA: modem.MODEM_TRANSMIT_QUEUE.put(["morse", 1, 0, self.mycallsign]) self.arq_cleanup() - def received_session_close(self, data_in: bytes): + def received_session_close(self, data_in: bytes, snr): """ Closes the session when a close session frame is received and the DXCALLSIGN_CRC matches the remote station participating in the session. @@ -1997,7 +1961,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2043,7 +2007,7 @@ class DATA: self.enqueue_frame_for_tx([connection_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) - def received_session_heartbeat(self, data_in: bytes) -> None: + def received_session_heartbeat(self, data_in: bytes, snr) -> None: """ Received an ARQ session heartbeat, record and update state accordingly. Args: @@ -2060,7 +2024,7 @@ class DATA: self.dxcallsign, Station.dxgrid, "SESSION-HB", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2269,7 +2233,7 @@ class DATA: # `data_channel_max_retries` attempts have been sent. Aborting attempt & cleaning up return False - def arq_received_data_channel_opener(self, data_in: bytes): + def arq_received_data_channel_opener(self, data_in: bytes, snr): """ Received request to open data channel frame @@ -2366,7 +2330,7 @@ class DATA: # calculate initial speed level in correlation to latest known SNR for i in range(len(self.mode_list)): - if ModemParam.snr >= self.snr_list[i]: + if snr >= self.snr_list[i]: self.speed_level = i # check if speed level fits to busy condition @@ -2380,7 +2344,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2443,7 +2407,7 @@ class DATA: + str(self.dxcallsign, "UTF-8") + "]", bandwidth="wide", - snr=ModemParam.snr, + snr=snr, ) # set start of transmission for our statistics @@ -2455,7 +2419,7 @@ class DATA: self.data_channel_last_received = int(time.time()) self.burst_last_received = int(time.time() + 10) # we might need some more time so lets increase this - def arq_received_channel_is_open(self, data_in: bytes) -> None: + def arq_received_channel_is_open(self, data_in: bytes, snr) -> None: """ Called if we received a data channel opener Args: @@ -2494,7 +2458,7 @@ class DATA: Station.dxcallsign, Station.dxgrid, "DATA", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2505,7 +2469,7 @@ class DATA: + "]>>|<<[" + str(self.dxcallsign, "UTF-8") + "]", - snr=ModemParam.snr, + snr=snr, ) # as soon as we set ARQ_STATE to True, transmission starts @@ -2566,7 +2530,6 @@ class DATA: ping="transmitting", dxcallsign=str(dxcallsign, "UTF-8"), mycallsign=str(mycallsign, "UTF-8"), - snr=str(ModemParam.snr), ) self.log.info( "[Modem] PING REQ [" @@ -2588,7 +2551,7 @@ class DATA: else: self.enqueue_frame_for_tx([ping_frame], c2_mode=FREEDV_MODE.sig0.value) - def received_ping(self, data_in: bytes) -> None: + def received_ping(self, data_in: bytes, snr) -> None: """ Called if we received a ping @@ -2614,7 +2577,7 @@ class DATA: + "] <<< [" + str(dxcallsign, "UTF-8") + "]", - snr=ModemParam.snr, + snr=snr, ) Station.dxgrid = b'------' @@ -2622,7 +2585,7 @@ class DATA: dxcallsign, Station.dxgrid, "PING", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2635,12 +2598,12 @@ class DATA: dxgrid=str(Station.dxgrid, "UTF-8"), dxcallsign=str(dxcallsign, "UTF-8"), mycallsign=str(mycallsign, "UTF-8"), - snr=str(ModemParam.snr), + snr=str(snr), ) if Modem.respond_to_call: - self.transmit_ping_ack() + self.transmit_ping_ack(snr) - def transmit_ping_ack(self): + def transmit_ping_ack(self, snr): """ transmit a ping ack frame @@ -2651,14 +2614,14 @@ class DATA: ping_frame[1:4] = Station.dxcallsign_crc ping_frame[4:7] = Station.mycallsign_crc ping_frame[7:11] = helpers.encode_grid(self.mygrid) - ping_frame[13:14] = helpers.snr_to_bytes(ModemParam.snr) + ping_frame[13:14] = helpers.snr_to_bytes(snr) if Modem.enable_fsk: self.enqueue_frame_for_tx([ping_frame], c2_mode=FREEDV_MODE.fsk_ldpc_0.value) else: self.enqueue_frame_for_tx([ping_frame], c2_mode=FREEDV_MODE.sig0.value) - def received_ping_ack(self, data_in: bytes) -> None: + def received_ping_ack(self, data_in: bytes, snr) -> None: """ Called if a PING ack has been received Args: @@ -2681,11 +2644,11 @@ class DATA: dxgrid=str(Station.dxgrid, "UTF-8"), dxcallsign=str(Station.dxcallsign, "UTF-8"), mycallsign=str(mycallsign, "UTF-8"), - snr=str(ModemParam.snr), + snr=str(snr), dxsnr=str(dxsnr) ) # combined_snr = own rx snr / snr on dx side - combined_snr = f"{ModemParam.snr}/{dxsnr}" + combined_snr = f"{snr}/{dxsnr}" helpers.add_to_heard_stations( Station.dxcallsign, Station.dxgrid, @@ -2701,7 +2664,7 @@ class DATA: + "] >|< [" + str(Station.dxcallsign, "UTF-8") + "]", - snr=ModemParam.snr, + snr=snr, dxsnr=dxsnr, ) Modem.modem_state = "IDLE" @@ -2712,7 +2675,7 @@ class DATA: + "] ??? [" + str(bytes(data_in[4:7]), "UTF-8") + "]", - snr=ModemParam.snr, + snr=snr, ) def stop_transmission(self) -> None: @@ -2820,7 +2783,7 @@ class DATA: except Exception as err: self.log.debug("[Modem] run_beacon: ", exception=err) - def received_beacon(self, data_in: bytes) -> None: + def received_beacon(self, data_in: bytes, snr) -> None: """ Called if we received a beacon Args: @@ -2837,7 +2800,7 @@ class DATA: timestamp=int(time.time()), dxcallsign=str(beacon_callsign, "UTF-8"), dxgrid=str(Station.dxgrid, "UTF-8"), - snr=str(ModemParam.snr), + snr=str(snr), ) self.log.info( @@ -2846,13 +2809,13 @@ class DATA: + "][" + str(Station.dxgrid, "UTF-8") + "] ", - snr=ModemParam.snr, + snr=snr, ) helpers.add_to_heard_stations( beacon_callsign, Station.dxgrid, "BEACON", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) @@ -2887,7 +2850,7 @@ class DATA: self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) - def received_cq(self, data_in: bytes) -> None: + def received_cq(self, data_in: bytes, snr) -> None: """ Called when we receive a CQ frame Args: @@ -2914,21 +2877,21 @@ class DATA: + "][" + str(Station.dxgrid, "UTF-8") + "] ", - snr=ModemParam.snr, + snr=snr, ) helpers.add_to_heard_stations( dxcallsign, Station.dxgrid, "CQ CQ CQ", - ModemParam.snr, + snr, ModemParam.frequency_offset, HamlibParam.hamlib_frequency, ) if Modem.respond_to_cq and Modem.respond_to_call: - self.transmit_qrv(dxcallsign) + self.transmit_qrv(dxcallsign, snr) - def transmit_qrv(self, dxcallsign: bytes) -> None: + def transmit_qrv(self, dxcallsign: bytes, snr) -> None: """ Called when we send a QRV frame Args: @@ -2957,7 +2920,7 @@ class DATA: qrv_frame[:1] = bytes([FR_TYPE.QRV.value]) qrv_frame[1:7] = helpers.callsign_to_bytes(self.mycallsign) qrv_frame[7:11] = helpers.encode_grid(self.mygrid) - qrv_frame[11:12] = helpers.snr_to_bytes(ModemParam.snr) + qrv_frame[11:12] = helpers.snr_to_bytes(snr) if Modem.enable_fsk: self.log.info("[Modem] ENABLE FSK", state=Modem.enable_fsk) @@ -2965,7 +2928,7 @@ class DATA: else: self.enqueue_frame_for_tx([qrv_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) - def received_qrv(self, data_in: bytes) -> None: + def received_qrv(self, data_in: bytes, snr) -> None: """ Called when we receive a QRV frame Args: @@ -2977,14 +2940,14 @@ class DATA: Station.dxgrid = bytes(helpers.decode_grid(data_in[7:11]), "UTF-8") dxsnr = helpers.snr_from_bytes(data_in[11:12]) - combined_snr = f"{ModemParam.snr}/{dxsnr}" + combined_snr = f"{snr}/{dxsnr}" self.send_data_to_socket_queue( freedata="modem-message", qrv="received", dxcallsign=str(dxcallsign, "UTF-8"), dxgrid=str(Station.dxgrid, "UTF-8"), - snr=str(ModemParam.snr), + snr=str(snr), dxsnr=str(dxsnr) ) @@ -2994,7 +2957,7 @@ class DATA: + "][" + str(Station.dxgrid, "UTF-8") + "] ", - snr=ModemParam.snr, + snr=snr, dxsnr=dxsnr ) helpers.add_to_heard_stations( @@ -3008,7 +2971,7 @@ class DATA: - def received_is_writing(self, data_in: bytes) -> None: + def received_is_writing(self, data_in: bytes, snr) -> None: """ Called when we receive a IS WRITING frame Args: @@ -3052,7 +3015,7 @@ class DATA: # ------------ CALCULATE TRANSFER RATES def calculate_transfer_rate_rx( - self, rx_start_of_transmission: float, receivedbytes: int + self, rx_start_of_transmission: float, receivedbytes: int, snr ) -> list: """ Calculate transfer rate for received data @@ -3090,7 +3053,7 @@ class DATA: ARQ.arq_seconds_until_finish = int(((ARQ.total_bytes - receivedbytes) / ( ARQ.bytes_per_minute * ARQ.arq_compression_factor)) * 60) - 20 # offset because of frame ack/nack - speed_chart = {"snr": ModemParam.snr, "bpm": ARQ.bytes_per_minute, "timestamp": int(time.time())} + speed_chart = {"snr": snr, "bpm": ARQ.bytes_per_minute, "timestamp": int(time.time())} # check if data already in list if speed_chart not in ARQ.speed_list: ARQ.speed_list.append(speed_chart) @@ -3209,9 +3172,6 @@ class DATA: # modem.RECEIVE_FSK_LDPC_0 = False modem.RECEIVE_FSK_LDPC_1 = False - # reset buffer overflow counter - AudioParam.buffer_overflow_counter = [0, 0, 0, 0, 0] - self.is_IRS = False self.burst_nack = False self.burst_nack_counter = 0 diff --git a/modem/event_manager.py b/modem/event_manager.py index 5a0c740e..70fea020 100644 --- a/modem/event_manager.py +++ b/modem/event_manager.py @@ -17,4 +17,9 @@ class EventManager: def send_scatter_change(self, data): jsondata = {"scatter": str(data)} data_out = json.dumps(jsondata) + self.broadcast(data_out) + + def send_buffer_overflow(self, data): + jsondata = {"buffer-overflow": str(data)} + data_out = json.dumps(jsondata) self.broadcast(data_out) \ No newline at end of file diff --git a/modem/modem.py b/modem/modem.py index 5ad6abe0..08b493ca 100644 --- a/modem/modem.py +++ b/modem/modem.py @@ -20,7 +20,7 @@ import codec2 import itertools import numpy as np import sounddevice as sd -from global_instances import AudioParam, HamlibParam, ModemParam, Modem +from global_instances import HamlibParam, ModemParam, Modem from static import FRAME_TYPE import structlog import tci @@ -77,6 +77,7 @@ class RF: self.tx_audio_level = config['AUDIO']['tx_audio_level'] self.enable_audio_auto_tune = config['AUDIO']['enable_auto_tune'] self.enable_fft = config['MODEM']['enable_fft'] + self.enable_scatter = config['MODEM']['enable_scatter'] self.tx_delay = config['MODEM']['tx_delay'] self.tuning_range_fmin = config['MODEM']['tuning_range_fmin'] @@ -85,11 +86,10 @@ class RF: self.tci_ip = config['TCI']['tci_ip'] self.tci_port = config['TCI']['tci_port'] - + self.buffer_overflow_counter = [0, 0, 0, 0, 0, 0, 0, 0] self.channel_busy_delay = 0 - self.AUDIO_SAMPLE_RATE_RX = 48000 self.AUDIO_SAMPLE_RATE_TX = 48000 self.MODEM_SAMPLE_RATE = codec2.api.FREEDV_FS_8000 @@ -382,8 +382,9 @@ class RF: x = set_audio_volume(x, self.rx_audio_level) # audio recording for debugging purposes - if AudioParam.audio_record: - AudioParam.audio_record_file.writeframes(x) + # TODO Find a nice place for this + #if AudioParam.audio_record: + # AudioParam.audio_record_file.writeframes(x) # Avoid decoding when transmitting to reduce CPU # TODO Overriding this for testing purposes @@ -401,7 +402,8 @@ class RF: (self.fsk_ldpc_buffer_1, Modem.enable_fsk, 6), ]: if (audiobuffer.nbuffer + length_x) > audiobuffer.size: - AudioParam.buffer_overflow_counter[index] += 1 + self.buffer_overflow_counter[index] += 1 + self.event_manager.send_buffer_overflow(self.buffer_overflow_counter) elif receive: audiobuffer.push(x) # end of "not Modem.transmitting" if block @@ -875,10 +877,9 @@ class RF: self.log.debug( "[MDM] [demod_audio] Pushing received data to received_queue", nbytes=nbytes ) - - self.modem_received_queue.put([bytes_out, freedv, bytes_per_frame]) + snr = self.calculate_snr(freedv) + self.modem_received_queue.put([bytes_out, freedv, bytes_per_frame, snr]) self.get_scatter(freedv) - self.calculate_snr(freedv) state_buffer = [] else: self.log.warning( @@ -1159,7 +1160,8 @@ class RF: # data[0] = bytes_out # data[1] = freedv session # data[2] = bytes_per_frame - DATA_QUEUE_RECEIVED.put([data[0], data[1], data[2]]) + # data[3] = snr + DATA_QUEUE_RECEIVED.put([data[0], data[1], data[2], data[3]]) self.modem_received_queue.task_done() def get_frequency_offset(self, freedv: ctypes.c_void_p) -> float: @@ -1185,7 +1187,7 @@ class RF: :param freedv: codec2 instance to query :type freedv: ctypes.c_void_p """ - if not ModemParam.enable_scatter: + if not self.enable_scatter: return modemStats = codec2.MODEMSTATS() @@ -1369,14 +1371,11 @@ class RF: rms = int(np.sqrt(np.max(d ** 2))) if rms == 0: raise ZeroDivisionError - AudioParam.audio_dbfs = 20 * np.log10(rms / 32768) + audio_dbfs = 20 * np.log10(rms / 32768) + self.states.set("audio_dbfs", audio_dbfs) except Exception as e: - # FIXME Disabled for cli cleanup - #self.log.warning( - # "[MDM] fft calculation error - please check your audio setup", - # e=e, - #) - AudioParam.audio_dbfs = -100 + self.states.set("audio_dbfs", -100) + rms_counter = 0 diff --git a/modem/state_manager.py b/modem/state_manager.py index d18bd91a..244756fd 100644 --- a/modem/state_manager.py +++ b/modem/state_manager.py @@ -3,15 +3,13 @@ import ujson as json class STATES: def __init__(self, statequeue): self.statequeue = statequeue - self.testvalue = "Hello World!" - self.channel_busy = False self.channel_busy_slot = [False, False, False, False, False] self.is_codec2_traffic = False self.is_modem_running = False - self.is_beacon_running = False + self.audio_dbfs = 0 def set(self, key, value): setattr(self, key, value)