Quisk version 4.2.30
This commit is contained in:
@@ -1,3 +1,10 @@
|
||||
Quisk Version 4.2.30 March 2024
|
||||
================================
|
||||
A new option "Tx-Rx silence msec" on the Timing configuration screen controls how long
|
||||
to suppress Rx audio when switching from Tx to Rx. The previous fixed time was 50 msec.
|
||||
|
||||
The SSB squelch control now works on CW too. Please test.
|
||||
|
||||
Quisk Version 4.2.29 January 2024
|
||||
==================================
|
||||
This version updates the FreeDV library files and program logic. I added a "Monitor"
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
#Quisk version 4.2.29
|
||||
#Quisk version 4.2.30
|
||||
from .quisk import main
|
||||
|
||||
+1
-1
@@ -2005,7 +2005,7 @@ class ControlMixin:
|
||||
if self.radio_name == Settings[1]: # changed for current radio
|
||||
if name in ('hot_key_ptt_toggle', 'hot_key_ptt_if_hidden', 'keyupDelay', 'cwTone', 'pulse_audio_verbose_output',
|
||||
'start_cw_delay', 'start_ssb_delay', 'maximum_tx_secs', 'quisk_serial_cts', 'quisk_serial_dsr',
|
||||
'hot_key_ptt1', 'hot_key_ptt2', 'midi_ptt_toggle'):
|
||||
'hot_key_ptt1', 'hot_key_ptt2', 'midi_ptt_toggle', 'TxRxSilenceMsec'):
|
||||
setattr(conf, name, x)
|
||||
application.ImmediateChange(name)
|
||||
elif name[0:4] in ('lin_', 'win_'):
|
||||
|
||||
@@ -168,6 +168,7 @@ static void modem_status(void)
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/time.h>
|
||||
#include <termios.h>
|
||||
|
||||
static int fdComm = -1; // File descriptor to read the serial port
|
||||
|
||||
@@ -181,6 +181,7 @@ int quisk_sidetoneFreq; // frequency in hertz for the sidetone
|
||||
int quisk_start_cw_delay = 15; // milliseconds to delay output on CW key down
|
||||
int quisk_start_ssb_delay = 100; // milliseconds to discard output on SSB etc. key down
|
||||
static int maximum_tx_secs; // Failsafe timeout for Tx in seconds
|
||||
static int TxRxSilenceMsec = 50; // Play silence in msec on Tx to Rx
|
||||
static int key_is_down = 0; // internal key state up or down
|
||||
|
||||
static double agcReleaseGain=80; // AGC maximum gain
|
||||
@@ -1921,6 +1922,10 @@ static int quisk_process_demodulate(complex double * cSamples, double * dsamples
|
||||
}
|
||||
if(bank == 0)
|
||||
dAutoNotch(dsamples, nSamples, rit_freq, quisk_filter_srate);
|
||||
if (ssb_squelch_enabled) {
|
||||
ssb_squelch(dsamples, nSamples, quisk_filter_srate, MeasureSquelch + bank);
|
||||
d_delay(dsamples, nSamples, bank, SQUELCH_FFT_SIZE);
|
||||
}
|
||||
nSamples = quisk_dInterpolate(dsamples, nSamples, &Storage[bank].filtAudio12p2, 2);
|
||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand7);
|
||||
@@ -1940,6 +1945,10 @@ static int quisk_process_demodulate(complex double * cSamples, double * dsamples
|
||||
}
|
||||
if(bank == 0)
|
||||
dAutoNotch(dsamples, nSamples, rit_freq, quisk_filter_srate);
|
||||
if (ssb_squelch_enabled) {
|
||||
ssb_squelch(dsamples, nSamples, quisk_filter_srate, MeasureSquelch + bank);
|
||||
d_delay(dsamples, nSamples, bank, SQUELCH_FFT_SIZE);
|
||||
}
|
||||
nSamples = quisk_dInterpolate(dsamples, nSamples, &Storage[bank].filtAudio12p2, 2);
|
||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand7);
|
||||
@@ -2458,7 +2467,7 @@ int quisk_process_samples(complex double * cSamples, int nSamples)
|
||||
quisk_sound_state.sample_rate;
|
||||
nout = (int)dOutCounter; // number of samples to output
|
||||
dOutCounter -= nout;
|
||||
playSilence = (int)(quisk_sound_state.playback_rate * 50e-3); // Play silence after sidetone ends, number of samples
|
||||
playSilence = (int)(quisk_sound_state.playback_rate * 1E-3 * TxRxSilenceMsec); // Play silence after sidetone ends, number of samples
|
||||
keyupEnvelope = 0;
|
||||
if (quisk_active_sidetone == 2 && QUISK_CWKEY_DOWN) { // Play sidetone instead of radio for CW
|
||||
if (! sidetoneIsOn) { // turn on sidetone
|
||||
@@ -4694,6 +4703,9 @@ static PyObject * ImmediateChange(PyObject * self, PyObject * args) // called fr
|
||||
else if ( ! strcmp(name, "maximum_tx_secs")) {
|
||||
maximum_tx_secs = QuiskGetConfigInt(name, 0);
|
||||
}
|
||||
else if ( ! strcmp(name, "TxRxSilenceMsec")) {
|
||||
TxRxSilenceMsec = QuiskGetConfigInt(name, 50);
|
||||
}
|
||||
Py_INCREF (Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
@@ -5851,6 +5863,7 @@ static PyObject * record_app(PyObject * self, PyObject * args)
|
||||
quisk_start_cw_delay = QuiskGetConfigInt("start_cw_delay", 15);
|
||||
quisk_start_ssb_delay = QuiskGetConfigInt("start_ssb_delay", 100);
|
||||
maximum_tx_secs = QuiskGetConfigInt("maximum_tx_secs", 0);
|
||||
TxRxSilenceMsec = QuiskGetConfigInt("TxRxSilenceMsec", 50);
|
||||
quisk_sound_state.sample_rate = rate;
|
||||
fft_sample_rate = rate;
|
||||
is_little_endian = 1; // Test machine byte order
|
||||
|
||||
@@ -3762,7 +3762,8 @@ class App(wx.App):
|
||||
# Find the data width from a list of preferred sizes; it is the width of returned graph data.
|
||||
# The graph_width is the width of data_width that is displayed.
|
||||
if conf.window_width > 0:
|
||||
wFrame, h = frame.GetClientSize().Get() # client window width
|
||||
#wFrame, h = frame.GetClientSize().Get() # client window width
|
||||
wFrame = conf.window_width - 15 # Thanks to Nick Abramenko, RA3PKJ
|
||||
graph = GraphScreen(frame, self.width//2, self.width//2, None) # make a GraphScreen to calculate borders
|
||||
self.graph_width = wFrame - (graph.width - graph.graph_width) # less graph borders equals actual graph_width
|
||||
graph.Destroy()
|
||||
|
||||
@@ -419,6 +419,8 @@ hermes_PTT_hang_time = 4
|
||||
## hermes_antenna_tuner Antenna tuner, text choice
|
||||
# This option only applies to the Hermes Lite 2. Set this to None if you don't have a tuner.
|
||||
# Set this to "Tune" to control the Icom AH-4 compatible ATU attached to the Hermes Lite 2 end plate.
|
||||
# Note that this option only applies to the HL2 end plate, not the IO board.
|
||||
# A tuner attached to the IO board is controlled from a button on the last line of the screen.
|
||||
# Then when the Spot button is pressed with a positive power, a tune request is sent to the ATU.
|
||||
# If the Spot button is pressed with a zero power level, the tuner is set to bypass mode.
|
||||
# Changes are immediate (no need to restart).
|
||||
@@ -1646,6 +1648,15 @@ start_ssb_delay = 100
|
||||
# Changes are immediate (no need to restart).
|
||||
maximum_tx_secs = 0
|
||||
|
||||
## TxRxSilenceMsec Tx-Rx silence msec, integer
|
||||
# When changing from transmit to receive a radio may receive either noise or the end of the transmission.
|
||||
# This may be returned as received audio, and can be heard as a loud pop.
|
||||
# This parameter plays silence for the specified number of milliseconds when changing from transmit to receive.
|
||||
# Make it long enough to zero out the pop, but not too much longer.
|
||||
# It is ignored when in full duplex mode.
|
||||
# Changes are immediate (no need to restart).
|
||||
TxRxSilenceMsec = 50
|
||||
|
||||
## keyupDelay Keyup delay msecs, integer
|
||||
# This is the key hang time for semi-breakin CW. It is the time in milliseconds
|
||||
# from the last CW key release until changing to receive.
|
||||
|
||||
@@ -7,7 +7,7 @@ import os
|
||||
# You must define the version here. A title string including
|
||||
# the version will be written to __init__.py and read by quisk.py.
|
||||
|
||||
Version = '4.2.29'
|
||||
Version = '4.2.30'
|
||||
|
||||
fp = open("__init__.py", "w") # write title string
|
||||
fp.write("#Quisk version %s\n" % Version)
|
||||
|
||||
Reference in New Issue
Block a user