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
|
Quisk Version 4.2.29 January 2024
|
||||||
==================================
|
==================================
|
||||||
This version updates the FreeDV library files and program logic. I added a "Monitor"
|
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
|
from .quisk import main
|
||||||
|
|||||||
+1
-1
@@ -2005,7 +2005,7 @@ class ControlMixin:
|
|||||||
if self.radio_name == Settings[1]: # changed for current radio
|
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',
|
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',
|
'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)
|
setattr(conf, name, x)
|
||||||
application.ImmediateChange(name)
|
application.ImmediateChange(name)
|
||||||
elif name[0:4] in ('lin_', 'win_'):
|
elif name[0:4] in ('lin_', 'win_'):
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ static void modem_status(void)
|
|||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/time.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
|
||||||
static int fdComm = -1; // File descriptor to read the serial port
|
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_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
|
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 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 int key_is_down = 0; // internal key state up or down
|
||||||
|
|
||||||
static double agcReleaseGain=80; // AGC maximum gain
|
static double agcReleaseGain=80; // AGC maximum gain
|
||||||
@@ -1921,6 +1922,10 @@ static int quisk_process_demodulate(complex double * cSamples, double * dsamples
|
|||||||
}
|
}
|
||||||
if(bank == 0)
|
if(bank == 0)
|
||||||
dAutoNotch(dsamples, nSamples, rit_freq, quisk_filter_srate);
|
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_dInterpolate(dsamples, nSamples, &Storage[bank].filtAudio12p2, 2);
|
||||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
||||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand7);
|
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)
|
if(bank == 0)
|
||||||
dAutoNotch(dsamples, nSamples, rit_freq, quisk_filter_srate);
|
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_dInterpolate(dsamples, nSamples, &Storage[bank].filtAudio12p2, 2);
|
||||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand6);
|
||||||
nSamples = quisk_dInterp2HB45(dsamples, nSamples, &Storage[bank].HalfBand7);
|
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;
|
quisk_sound_state.sample_rate;
|
||||||
nout = (int)dOutCounter; // number of samples to output
|
nout = (int)dOutCounter; // number of samples to output
|
||||||
dOutCounter -= nout;
|
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;
|
keyupEnvelope = 0;
|
||||||
if (quisk_active_sidetone == 2 && QUISK_CWKEY_DOWN) { // Play sidetone instead of radio for CW
|
if (quisk_active_sidetone == 2 && QUISK_CWKEY_DOWN) { // Play sidetone instead of radio for CW
|
||||||
if (! sidetoneIsOn) { // turn on sidetone
|
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")) {
|
else if ( ! strcmp(name, "maximum_tx_secs")) {
|
||||||
maximum_tx_secs = QuiskGetConfigInt(name, 0);
|
maximum_tx_secs = QuiskGetConfigInt(name, 0);
|
||||||
}
|
}
|
||||||
|
else if ( ! strcmp(name, "TxRxSilenceMsec")) {
|
||||||
|
TxRxSilenceMsec = QuiskGetConfigInt(name, 50);
|
||||||
|
}
|
||||||
Py_INCREF (Py_None);
|
Py_INCREF (Py_None);
|
||||||
return 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_cw_delay = QuiskGetConfigInt("start_cw_delay", 15);
|
||||||
quisk_start_ssb_delay = QuiskGetConfigInt("start_ssb_delay", 100);
|
quisk_start_ssb_delay = QuiskGetConfigInt("start_ssb_delay", 100);
|
||||||
maximum_tx_secs = QuiskGetConfigInt("maximum_tx_secs", 0);
|
maximum_tx_secs = QuiskGetConfigInt("maximum_tx_secs", 0);
|
||||||
|
TxRxSilenceMsec = QuiskGetConfigInt("TxRxSilenceMsec", 50);
|
||||||
quisk_sound_state.sample_rate = rate;
|
quisk_sound_state.sample_rate = rate;
|
||||||
fft_sample_rate = rate;
|
fft_sample_rate = rate;
|
||||||
is_little_endian = 1; // Test machine byte order
|
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.
|
# 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.
|
# The graph_width is the width of data_width that is displayed.
|
||||||
if conf.window_width > 0:
|
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
|
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
|
self.graph_width = wFrame - (graph.width - graph.graph_width) # less graph borders equals actual graph_width
|
||||||
graph.Destroy()
|
graph.Destroy()
|
||||||
|
|||||||
@@ -419,6 +419,8 @@ hermes_PTT_hang_time = 4
|
|||||||
## hermes_antenna_tuner Antenna tuner, text choice
|
## 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.
|
# 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.
|
# 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.
|
# 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.
|
# 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).
|
# Changes are immediate (no need to restart).
|
||||||
@@ -1646,6 +1648,15 @@ start_ssb_delay = 100
|
|||||||
# Changes are immediate (no need to restart).
|
# Changes are immediate (no need to restart).
|
||||||
maximum_tx_secs = 0
|
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
|
## keyupDelay Keyup delay msecs, integer
|
||||||
# This is the key hang time for semi-breakin CW. It is the time in milliseconds
|
# 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.
|
# 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
|
# You must define the version here. A title string including
|
||||||
# the version will be written to __init__.py and read by quisk.py.
|
# 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 = open("__init__.py", "w") # write title string
|
||||||
fp.write("#Quisk version %s\n" % Version)
|
fp.write("#Quisk version %s\n" % Version)
|
||||||
|
|||||||
Reference in New Issue
Block a user