diff --git a/gui/daemon.js b/gui/daemon.js index 10bab25b..1bad3e18 100644 --- a/gui/daemon.js +++ b/gui/daemon.js @@ -224,7 +224,8 @@ exports.startTNC = function ( rx_buffer_size, enable_explorer, explorer_stats, - auto_tune + auto_tune, + tx_delay ) { var json_command = JSON.stringify({ type: "set", @@ -258,6 +259,7 @@ exports.startTNC = function ( enable_explorer: enable_explorer, enable_stats: explorer_stats, enable_auto_tune: auto_tune, + tx_delay: tx_delay, }, ], }); diff --git a/gui/main.js b/gui/main.js index eda5b466..c5f9bfd7 100644 --- a/gui/main.js +++ b/gui/main.js @@ -94,7 +94,8 @@ const configDefaultSettings = "enable_is_writing" : "True", \ "shared_folder_path" : ".", \ "enable_request_profile" : "True", \ - "enable_request_shared_folder" : "False" \ + "enable_request_shared_folder" : "False", \ + "tx_delay" : 0 \ }'; if (!fs.existsSync(configPath)) { diff --git a/gui/preload-main.js b/gui/preload-main.js index 62a420f7..951907ff 100644 --- a/gui/preload-main.js +++ b/gui/preload-main.js @@ -360,6 +360,9 @@ window.addEventListener("DOMContentLoaded", () => { document.getElementById("tuning_range_fmin").value = config.tuning_range_fmin; document.getElementById("tuning_range_fmax").value = config.tuning_range_fmax; + //Update TX delay + document.getElementById("tx_delay").value = config.tx_delay; + // Update TX Audio Level document.getElementById("audioLevelTXvalue").innerHTML = parseInt( config.tx_audio_level @@ -1151,6 +1154,13 @@ window.addEventListener("DOMContentLoaded", () => { FD.saveConfig(config, configPath); }); + document.getElementById("tx_delay").addEventListener("click", () => { + var tx_delay = document.getElementById("tx_delay").value; + config.tx_delay = tx_delay; + FD.saveConfig(config, configPath); + }); + + // Theme selector clicked document.getElementById("theme_selector").addEventListener("change", () => { var theme = document.getElementById("theme_selector").value; @@ -1268,6 +1278,7 @@ window.addEventListener("DOMContentLoaded", () => { var data_bits = document.getElementById("hamlib_data_bits").value; var stop_bits = document.getElementById("hamlib_stop_bits").value; var handshake = document.getElementById("hamlib_handshake").value; + var tx_delay = document.getElementById("tx_delay").value; if (document.getElementById("scatterSwitch").checked == true) { var enable_scatter = "True"; @@ -1378,6 +1389,7 @@ window.addEventListener("DOMContentLoaded", () => { config.enable_explorer = enable_explorer; config.explorer_stats = explorer_stats; config.auto_tune = auto_tune; + config.tx_delay = tx_delay; //fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); FD.saveConfig(config, configPath); @@ -1409,7 +1421,8 @@ window.addEventListener("DOMContentLoaded", () => { rx_buffer_size, enable_explorer, explorer_stats, - auto_tune + auto_tune, + tx_delay ); }); diff --git a/gui/src/index.html b/gui/src/index.html index 4245eb44..e3ddbbe0 100644 --- a/gui/src/index.html +++ b/gui/src/index.html @@ -2406,6 +2406,38 @@ aria-labelledby="tnc-tab" tabindex="0" > + +
+ + +
+
diff --git a/tnc/config.ini b/tnc/config.ini index 6b5bc0cd..8bc4ae75 100644 --- a/tnc/config.ini +++ b/tnc/config.ini @@ -4,20 +4,20 @@ tncport = 3000 [STATION] #station settings -mycall = DJ2LS-9 -mygrid = JN12AA +mycall = DN2LS-0 +mygrid = JN48cs ssid_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [AUDIO] #audio settings -rx = 1 -tx = 2 -txaudiolevel = 78 +rx = 6 +tx = 6 +txaudiolevel = 20 auto_tune = False [RADIO] #radio settings -radiocontrol = disabled +radiocontrol = rigctld rigctld_ip = 127.0.0.1 rigctld_port = 4532 @@ -26,11 +26,12 @@ rigctld_port = 4532 scatter = True fft = True narrowband = False -fmin = -250.0 -fmax = 250.0 +fmin = -150.0 +fmax = 150.0 qrv = True rxbuffersize = 16 explorer = False stats = False -fsk = True +fsk = False +tx_delay = 0 diff --git a/tnc/config.py b/tnc/config.py index e8ac8f4e..ba7651dd 100644 --- a/tnc/config.py +++ b/tnc/config.py @@ -76,7 +76,8 @@ class CONFIG: 'rxbuffersize': data[16], 'explorer': data[17], 'stats': data[19], - 'fsk': data[13] + 'fsk': data[13], + 'tx_delay': data[21] } try: with open(self.config_name, 'w') as configfile: diff --git a/tnc/daemon.py b/tnc/daemon.py index ce83bbd7..71e70b84 100755 --- a/tnc/daemon.py +++ b/tnc/daemon.py @@ -151,6 +151,7 @@ class DAEMON: # data[18] ssid_list # data[19] auto_tune # data[20] stats + # data[21] tx_delay if data[0] == "STARTTNC": self.start_tnc(data) @@ -268,6 +269,10 @@ class DAEMON: if data[13] == "True": options.append("--fsk") + options.append("--tx-delay") + options.append(data[21]) + + # safe data to config file config.write_entire_config(data) diff --git a/tnc/main.py b/tnc/main.py index 8885eb1c..5be8b819 100755 --- a/tnc/main.py +++ b/tnc/main.py @@ -244,6 +244,14 @@ if __name__ == "__main__": help="Set tci destination port", ) + PARSER.add_argument( + "--tx-delay", + dest="tx_delay", + default=0, + help="delay in ms before modulation is pushed to audio device", + type=int, + ) + ARGS = PARSER.parse_args() # set save to folder state for allowing downloading files to local file system @@ -297,6 +305,7 @@ if __name__ == "__main__": static.AUDIO_ENABLE_TCI = ARGS.audio_enable_tci static.TCI_IP = ARGS.tci_ip static.TCI_PORT = ARGS.tci_port + static.TX_DELAY = ARGS.tx_delay except Exception as e: log.error("[DMN] Error reading config file", exception=e) @@ -347,6 +356,7 @@ if __name__ == "__main__": static.AUDIO_ENABLE_TCI = conf.get('AUDIO', 'enable_tci', 'False') static.TCI_IP = str(conf.get('AUDIO', 'tci_ip', 'localhost')) static.TCI_PORT = int(conf.get('AUDIO', 'tci_port', '50001')) + static.TX_DELAY = int(conf.get('TNC', 'tx_delay', '0')) except KeyError as e: log.warning("[CFG] Error reading config file near", key=str(e)) except Exception as e: diff --git a/tnc/modem.py b/tnc/modem.py index bd11f6ba..d8338d47 100644 --- a/tnc/modem.py +++ b/tnc/modem.py @@ -559,14 +559,15 @@ class RF: ) # Add empty data to handle ptt toggle time - # data_delay_mseconds = 0 # milliseconds - # data_delay = int(self.MODEM_SAMPLE_RATE * (data_delay_mseconds / 1000)) # type: ignore - # mod_out_silence = ctypes.create_string_buffer(data_delay * 2) - # txbuffer = bytes(mod_out_silence) - # TODO: Disabled this one for testing - txbuffer = bytes() + if static.TX_DELAY > 0: + data_delay = int(self.MODEM_SAMPLE_RATE * (static.TX_DELAY / 1000)) # type: ignore + mod_out_silence = ctypes.create_string_buffer(data_delay * 2) + txbuffer = bytes(mod_out_silence) + else: + txbuffer = bytes() + self.log.debug( - "[MDM] TRANSMIT", mode=self.MODE, payload=payload_bytes_per_frame + "[MDM] TRANSMIT", mode=self.MODE, payload=payload_bytes_per_frame, delay=static.TX_DELAY ) for _ in range(repeats): diff --git a/tnc/sock.py b/tnc/sock.py index 51cdc264..ab93cb3e 100644 --- a/tnc/sock.py +++ b/tnc/sock.py @@ -876,6 +876,7 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): enable_explorer = str(helpers.return_key_from_object("False", startparam, "enable_explorer")) enable_auto_tune = str(helpers.return_key_from_object("False", startparam, "enable_auto_tune")) enable_stats = str(helpers.return_key_from_object("False", startparam, "enable_stats")) + tx_delay = str(helpers.return_key_from_object("0", startparam, "tx_delay")) try: # convert ssid list to python list ssid_list = str(helpers.return_key_from_object("0, 1, 2, 3, 4, 5, 6, 7, 8, 9", startparam, "ssid_list")) @@ -915,7 +916,8 @@ class ThreadedTCPRequestHandler(socketserver.StreamRequestHandler): enable_explorer, ssid_list, enable_auto_tune, - enable_stats + enable_stats, + tx_delay ] ) command_response("start_tnc", True) diff --git a/tnc/static.py b/tnc/static.py index e6d4e10e..2942bd80 100644 --- a/tnc/static.py +++ b/tnc/static.py @@ -69,6 +69,7 @@ ENABLE_SCATTER: bool = False ENABLE_FSK: bool = False RESPOND_TO_CQ: bool = False RESPOND_TO_CALL: bool = True # respond to cq, ping, connection request, file request if not in session +TX_DELAY: int = 0 # delay in ms before sending modulation for triggering VOX for example or slow PTT radios # --------------------------------- # Audio Defaults