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