From ba7737594d857df67eb71f40c4dd4e7beb812c6a Mon Sep 17 00:00:00 2001 From: DJ2LS Date: Wed, 17 May 2023 15:23:49 +0200 Subject: [PATCH] added tci gui control field --- gui/preload-main.js | 58 ++++++++++++++++++++++ gui/src/index.html | 50 ++++++++++++++++++- tnc/data_handler.py | 4 +- tnc/modem.py | 114 +++++++++++++++++++++++++++++++++++++------- 4 files changed, 207 insertions(+), 19 deletions(-) diff --git a/gui/preload-main.js b/gui/preload-main.js index 31eaabcb..2411fbab 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -444,24 +444,51 @@ window.addEventListener("DOMContentLoaded", () => { if (config.radiocontrol == "rigctld") { document.getElementById("radio-control-switch-disabled").checked = false; document.getElementById("radio-control-switch-rigctld").checked = true; + document.getElementById("radio-control-switch-tci").checked = false; + document.getElementById("radio-control-disabled").style.visibility = "hidden"; document.getElementById("radio-control-disabled").style.display = "none"; + document.getElementById("radio-control-tci").style.display = "none"; + document.getElementById("radio-control-tci").style.visibility = "hidden"; + document.getElementById("radio-control-help").style.visibility = "hidden"; document.getElementById("radio-control-help").style.display = "none"; document.getElementById("radio-control-rigctld").style.visibility = "visible"; document.getElementById("radio-control-rigctld").style.display = "block"; + } else if(config.radiocontrol == "tci"){ + document.getElementById("radio-control-switch-disabled").checked = false; + document.getElementById("radio-control-switch-rigctld").checked = false; + document.getElementById("radio-control-switch-tci").checked = true; + + document.getElementById("radio-control-disabled").style.visibility = + "hidden"; + document.getElementById("radio-control-disabled").style.display = "none"; + + document.getElementById("radio-control-help").style.visibility = "hidden"; + document.getElementById("radio-control-help").style.display = "none"; + document.getElementById("radio-control-rigctld").style.visibility = "hidden"; + document.getElementById("radio-control-rigctld").style.display = "none"; + + document.getElementById("radio-control-tci").style.visibility = + "visible"; + document.getElementById("radio-control-tci").style.display = "block"; + } else { document.getElementById("radio-control-switch-disabled").checked = true; document.getElementById("radio-control-switch-rigctld").checked = false; + document.getElementById("radio-control-switch-tci").checked = false; document.getElementById("radio-control-help").style.display = "none"; document.getElementById("radio-control-help").style.visibility = "hidden"; + document.getElementById("radio-control-tci").style.display = "none"; + document.getElementById("radio-control-tci").style.visibility = "hidden"; + document.getElementById("radio-control-rigctld").style.visibility = "hidden"; document.getElementById("radio-control-rigctld").style.display = "none"; @@ -536,6 +563,8 @@ window.addEventListener("DOMContentLoaded", () => { document.getElementById("radio-control-disabled").style.display = "block"; document.getElementById("radio-control-disabled").style.visibility = "visible"; + document.getElementById("radio-control-tci").style.display = "none"; + document.getElementById("radio-control-tci").style.visibility = "hidden"; document.getElementById("radio-control-help").style.display = "none"; document.getElementById("radio-control-help").style.visibility = "hidden"; @@ -563,6 +592,9 @@ window.addEventListener("DOMContentLoaded", () => { document.getElementById("radio-control-help").style.display = "none"; document.getElementById("radio-control-help").style.visibility = "hidden"; + document.getElementById("radio-control-tci").style.display = "none"; + document.getElementById("radio-control-tci").style.visibility = "hidden"; + document.getElementById("radio-control-rigctld").style.visibility = "visible"; document.getElementById("radio-control-rigctld").style.display = "block"; @@ -572,6 +604,32 @@ window.addEventListener("DOMContentLoaded", () => { FD.saveConfig(config, configPath); }); + // // radio settings 'rigctld' event listener + document + .getElementById("radio-control-switch-tci") + .addEventListener("click", () => { + //document.getElementById("hamlib_info_field").innerHTML = + // "Edit your rigctld settings and start and stop rigctld ."; + + document.getElementById("radio-control-disabled").style.display = "none"; + document.getElementById("radio-control-disabled").style.visibility = + "hidden"; + + document.getElementById("radio-control-rigctld").style.display = "none"; + document.getElementById("radio-control-rigctld").style.visibility = "hidden"; + + document.getElementById("radio-control-help").style.display = "none"; + document.getElementById("radio-control-help").style.visibility = "hidden"; + + document.getElementById("radio-control-tci").style.visibility = + "visible"; + document.getElementById("radio-control-tci").style.display = "block"; + + config.radiocontrol = "tci"; + //fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + FD.saveConfig(config, configPath); + }); + document .getElementById("btnHamlibCopyCommand") .addEventListener("click", () => { diff --git a/gui/src/index.html b/gui/src/index.html index 18b9adfb..e2060a8e 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -407,6 +407,25 @@ Hamlib +
+ + +
@@ -437,7 +456,7 @@

- +
@@ -502,7 +521,36 @@
+ +
+
+
+ TCI + Address + +
+ +
+ Port + +
+
+
VOX: Use rig control mode 'none' diff --git a/tnc/data_handler.py b/tnc/data_handler.py index dc91631d..ec3ac2a8 100644 --- a/tnc/data_handler.py +++ b/tnc/data_handler.py @@ -2855,7 +2855,9 @@ class DATA: self.log.info("[TNC] ENABLE FSK", state=TNC.enable_fsk) self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.fsk_ldpc_0.value) else: - self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) + #self.enqueue_frame_for_tx([cq_frame], c2_mode=FREEDV_MODE.sig0.value, copies=1, repeat_delay=0) + TNC.transmitting = True + modem.MODEM_TRANSMIT_QUEUE.put(["morse", 1, 0, "123"]) def received_cq(self, data_in: bytes) -> None: """ diff --git a/tnc/modem.py b/tnc/modem.py index 5c783228..24fdbeba 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -28,6 +28,7 @@ from static import FRAME_TYPE import structlog import ujson as json import tci +import cw from queues import DATA_QUEUE_RECEIVED, MODEM_RECEIVED_QUEUE, MODEM_TRANSMIT_QUEUE, RIGCTLD_COMMAND_QUEUE, \ AUDIO_RECEIVED_QUEUE, AUDIO_TRANSMIT_QUEUE @@ -686,19 +687,8 @@ class RF: self.mod_out_locked = True # ------------------------------- - chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX # 4800 - chunk = [ - txbuffer_out[i: i + chunk_length] - for i in range(0, len(txbuffer_out), chunk_length) - ] - for c in chunk: - # Pad the chunk, if needed - if len(c) < chunk_length: - delta = chunk_length - len(c) - delta_zeros = np.zeros(delta, dtype=np.int16) - c = np.append(c, delta_zeros) - # self.log.debug("[MDM] mod out shorter than audio buffer", delta=delta) - self.modoutqueue.append(c) + # add modulation to modout_queue + self.enqueue_modulation(txbuffer_out) # Release our mod_out_lock, so we can use the queue self.mod_out_locked = False @@ -745,6 +735,93 @@ class RF: transmission_time = end_of_transmission - start_of_transmission self.log.debug("[MDM] ON AIR TIME", time=transmission_time) + def transmit_morse(self, repeats, repeat_delay, frames): + TNC.transmitting = True + # if we're transmitting FreeDATA signals, reset channel busy state + ModemParam.channel_busy = False + self.log.debug( + "[MDM] TRANSMIT", mode="MORSE" + ) + start_of_transmission = time.time() + + txbuffer = cw.MorseCodePlayer().text_to_signal("DJ2LS-1") + print(txbuffer) + print(type(txbuffer)) + x = np.frombuffer(txbuffer, dtype=np.int16) + print(type(x)) + txbuffer_out = x + print(txbuffer_out) + + #if not AudioParam.audio_enable_tci: + # txbuffer_out = self.resampler.resample8_to_48(x) + #else: + # txbuffer_out = x + + self.mod_out_locked = True + self.enqueue_modulation(txbuffer_out) + self.mod_out_locked = False + + # we need to wait manually for tci processing + if AudioParam.audio_enable_tci: + duration = len(txbuffer_out) / 8000 + timestamp_to_sleep = time.time() + duration + self.log.debug("[MDM] TCI calculated duration", duration=duration) + tci_timeout_reached = False + #while time.time() < timestamp_to_sleep: + # threading.Event().wait(0.01) + else: + timestamp_to_sleep = time.time() + # set tci timeout reached to True for overriding if not used + tci_timeout_reached = True + + while self.modoutqueue or not tci_timeout_reached: + if AudioParam.audio_enable_tci: + if time.time() < timestamp_to_sleep: + tci_timeout_reached = False + else: + tci_timeout_reached = True + + threading.Event().wait(0.01) + # if we're transmitting FreeDATA signals, reset channel busy state + ModemParam.channel_busy = False + + + + + HamlibParam.ptt_state = self.radio.set_ptt(False) + + # Push ptt state to socket stream + jsondata = {"ptt": "False"} + data_out = json.dumps(jsondata) + sock.SOCKET_QUEUE.put(data_out) + + # After processing, set the locking state back to true to be prepared for next transmission + self.mod_out_locked = True + + self.modem_transmit_queue.task_done() + TNC.transmitting = False + threading.Event().set() + + end_of_transmission = time.time() + transmission_time = end_of_transmission - start_of_transmission + self.log.debug("[MDM] ON AIR TIME", time=transmission_time) + + def enqueue_modulation(self, txbuffer_out): + chunk_length = self.AUDIO_FRAMES_PER_BUFFER_TX # 4800 + chunk = [ + txbuffer_out[i: i + chunk_length] + for i in range(0, len(txbuffer_out), chunk_length) + ] + for c in chunk: + # Pad the chunk, if needed + if len(c) < chunk_length: + delta = chunk_length - len(c) + delta_zeros = np.zeros(delta, dtype=np.int16) + c = np.append(c, delta_zeros) + # self.log.debug("[MDM] mod out shorter than audio buffer", delta=delta) + self.modoutqueue.append(c) + + def demodulate_audio( self, audiobuffer: codec2.audio_buffer, @@ -1009,10 +1086,12 @@ class RF: self.log.debug("[MDM] self.modem_transmit_queue", qsize=queuesize) data = self.modem_transmit_queue.get() - # self.log.debug("[MDM] worker_transmit", mode=data[0]) - self.transmit( - mode=data[0], repeats=data[1], repeat_delay=data[2], frames=data[3] - ) + if data[0] in ["morse"]: + self.transmit_morse(repeats=data[1], repeat_delay=data[2], frames=data[3]) + else: + self.transmit( + mode=data[0], repeats=data[1], repeat_delay=data[2], frames=data[3] + ) # self.modem_transmit_queue.task_done() def worker_received(self) -> None: @@ -1399,3 +1478,4 @@ def get_modem_error_state(): return True return False +