Enable fft when client connects to fft ws

pull/550/head
Mashintime 2023-11-23 01:02:56 -05:00
parent 28e7694545
commit 22e2f2f08a
2 changed files with 27 additions and 14 deletions

View File

@ -75,7 +75,8 @@ class RF:
self.tx_audio_level = config['AUDIO']['tx_audio_level'] self.tx_audio_level = config['AUDIO']['tx_audio_level']
self.enable_audio_auto_tune = config['AUDIO']['enable_auto_tune'] self.enable_audio_auto_tune = config['AUDIO']['enable_auto_tune']
self.enable_fsk = config['MODEM']['enable_fsk'] self.enable_fsk = config['MODEM']['enable_fsk']
self.enable_fft = config['MODEM']['enable_fft'] #Dynamically enable FFT when a client connects to FFT web socket
self.enable_fft = False
self.tx_delay = config['MODEM']['tx_delay'] self.tx_delay = config['MODEM']['tx_delay']
self.tuning_range_fmin = config['MODEM']['tuning_range_fmin'] self.tuning_range_fmin = config['MODEM']['tuning_range_fmin']
self.tuning_range_fmax = config['MODEM']['tuning_range_fmax'] self.tuning_range_fmax = config['MODEM']['tuning_range_fmax']
@ -300,7 +301,9 @@ class RF:
x = self.audio_received_queue.get() x = self.audio_received_queue.get()
x = np.frombuffer(x, dtype=np.int16) x = np.frombuffer(x, dtype=np.int16)
# x = self.resampler.resample48_to_8(x) # x = self.resampler.resample48_to_8(x)
if self.enable_fft:
#FFT should always be enabled as busy detection is done here
#if self.enable_fft:
self.calculate_fft(x) self.calculate_fft(x)
length_x = len(x) length_x = len(x)
@ -416,7 +419,7 @@ class RF:
if not self.modoutqueue or self.mod_out_locked: if not self.modoutqueue or self.mod_out_locked:
data_out48k = np.zeros(frames, dtype=np.int16) data_out48k = np.zeros(frames, dtype=np.int16)
if self.enable_fft: #if self.enable_fft:
self.calculate_fft(x) self.calculate_fft(x)
else: else:
# TODO Moved to this place for testing # TODO Moved to this place for testing
@ -425,7 +428,7 @@ class RF:
self.event_manager.send_ptt_change(True) self.event_manager.send_ptt_change(True)
data_out48k = self.modoutqueue.popleft() data_out48k = self.modoutqueue.popleft()
if self.enable_fft: #if self.enable_fft:
self.calculate_fft(data_out48k) self.calculate_fft(data_out48k)
except Exception as e: except Exception as e:
self.log.warning(f"[MDM] audio callback not ready yet: {e}") self.log.warning(f"[MDM] audio callback not ready yet: {e}")
@ -1422,10 +1425,10 @@ class RF:
if self.channel_busy_delay == 0: if self.channel_busy_delay == 0:
self.states.set("channel_busy", False) self.states.set("channel_busy", False)
if (self.enable_fft):
# erase queue if greater than 10 # erase queue if greater than 10
if self.fft_queue.qsize() >= 10: if self.fft_queue.qsize() >= 10:
self.fft_queue = queue.Queue() self.fft_queue = queue.Queue()
self.fft_queue.put(dfftlist[:315]) # 315 --> bandwidth 3200 self.fft_queue.put(dfftlist[:315]) # 315 --> bandwidth 3200
except Exception as err: except Exception as err:
self.log.error(f"[MDM] calculate_fft: Exception: {err}") self.log.error(f"[MDM] calculate_fft: Exception: {err}")
@ -1464,6 +1467,8 @@ class RF:
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) codec2.api.freedv_set_sync(self.fsk_ldpc_freedv_0, 0)
def set_FFT_stream(self, enable: bool):
self.enable_fft = enable
def open_codec2_instance(mode: int) -> ctypes.c_void_p: def open_codec2_instance(mode: int) -> ctypes.c_void_p:
""" """

View File

@ -17,6 +17,7 @@ class SM:
self.config = self.app.config_manager.read() self.config = self.app.config_manager.read()
self.modem_events = app.modem_events self.modem_events = app.modem_events
self.modem_fft = app.modem_fft self.modem_fft = app.modem_fft
self.enable_fft = False
self.modem_service = app.modem_service self.modem_service = app.modem_service
self.states = app.state_manager self.states = app.state_manager
@ -36,6 +37,7 @@ class SM:
self.log.info("------------------ FreeDATA ------------------") self.log.info("------------------ FreeDATA ------------------")
self.log.info("------------------ MODEM ------------------") self.log.info("------------------ MODEM ------------------")
self.start_modem() self.start_modem()
elif cmd in ['stop'] and self.modem: elif cmd in ['stop'] and self.modem:
self.stop_modem() self.stop_modem()
# we need to wait a bit for avoiding a portaudio crash # we need to wait a bit for avoiding a portaudio crash
@ -47,7 +49,12 @@ class SM:
threading.Event().wait(0.5) threading.Event().wait(0.5)
if self.start_modem(): if self.start_modem():
self.modem_events.put(json.dumps({"freedata": "modem-event", "event": "restart"})) self.modem_events.put(json.dumps({"freedata": "modem-event", "event": "restart"}))
elif cmd in ['fft:true']:
self.modem.set_FFT_stream(True)
self.enable_fft=True
elif cmd in ['fft:false']:
self.modem.set_FFT_stream(False)
self.enable_fft=False
else: else:
self.log.warning("[SVC] modem command processing failed", cmd=cmd, state=self.states.is_modem_running) self.log.warning("[SVC] modem command processing failed", cmd=cmd, state=self.states.is_modem_running)
@ -64,6 +71,7 @@ class SM:
self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service, self.states) self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service, self.states)
self.data_handler = data_handler.DATA(self.config, self.modem_events, self.states) self.data_handler = data_handler.DATA(self.config, self.modem_events, self.states)
self.states.set("is_modem_running", True) self.states.set("is_modem_running", True)
self.modem.set_FFT_stream(self.enable_fft)
return True return True
elif self.states.is_modem_running: elif self.states.is_modem_running:
self.log.warning("modem already running") self.log.warning("modem already running")