diff --git a/ChangeLog b/ChangeLog
index 0a6f3c79..5308fca3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,34 @@
+2020-06-26 David Freese
+ ca67a417e: alpha
+ 9a6c2ae4c: Field Day Logger
+ a9ccff775: flarq update
-=Version 4.1.13=
+2020-06-25 Rik van Riel
+
+ a38bb1e36: Navtex
+
+2020-06-22 David Freese
+
+ 85c25e27f: Sound Record
+ f952c0808: Freq Control
+
+2020-06-17 Richard Shaw
-2020-05-26 David Freese
+ c5ffb269c: MinGW64
+
+2020-06-12 David Freese
+
+ d9f379f4e: FSK HELL
+ b3f5f6b16: Cabrillo logs
+ ed7c443ec: sound.cxx warning
+ 84f1f3679: SNDFILE
+ 05000ef4b: Store/Recall
+ b70cc0b68: wefax
+ 5a06abd08: Rx Monitor
+
+
+=Version 4.1.13=
a09931a2e: doxygen
1caa2a467: wefax
diff --git a/configure.ac b/configure.ac
index 3e3f58e9..9479e59a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,10 +9,10 @@ dnl major and minor must be integers; patch may
dnl contain other characters or be empty
m4_define(FLDIGI_MAJOR, [4])
m4_define(FLDIGI_MINOR, [1])
-m4_define(FLDIGI_PATCH, [.13])
+m4_define(FLDIGI_PATCH, [.13.18])
m4_define(FLARQ_MAJOR, [4])
m4_define(FLARQ_MINOR, [3])
-m4_define(FLARQ_PATCH, [.7])
+m4_define(FLARQ_PATCH, [.7.08])
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[]FLDIGI_PATCH, [fldigi-devel@sourceforge.net])
@@ -233,8 +233,11 @@ fi
# Set ac_cv_sndfile to yes/no
# Define USE_SNDFILE in config.h
# Substitute SNDFILE_CFLAGS and SNDFILE_LIBS in Makefile
-AC_FLDIGI_PKG_CHECK([sndfile], [sndfile >= 1.0.10], [yes], [yes],
+# name, version, show-in-help?, optional?, help-text, [am-cond]
+if test "x$ac_cv_want_fldigi" = "xyes"; then
+ AC_FLDIGI_PKG_CHECK([sndfile], [sndfile >= 1.0.10], [yes], [no],
[enable reading/writing of audio files via libsndfile @<:@autodetect@:>@] )
+fi
### portaudio
# Set ac_cv_portaudio to yes/no
@@ -295,6 +298,13 @@ AC_FLDIGI_PKG_CHECK([libmbedtls], [libmbedtls >= 2.16.0],
[yes], [yes], [use mbedtls libraries @<:@autodetect@:>@],
[ENABLE_LIBMBEDTLS])
+### regex
+# Does no provide a pkgconf file, so find manually
+AC_SEARCH_LIBS([regcomp], [regex], [], [
+ AC_MSG_ERROR([Unable to find a compatible regex library.])
+])
+
+
### libintl
# Substitute INTL_CFLAGS in Makefile
# Substitute INTL_LIBS in Makefile
@@ -358,7 +368,6 @@ fi
if test "x$ac_cv_want_fldigi" = "xyes"; then
AC_MSG_RESULT([ fldigi build options:
- sndfile ..................... $ac_cv_sndfile
oss ......................... $ac_cv_oss
portaudio ................... $ac_cv_portaudio
pulseaudio .................. $ac_cv_pulseaudio
diff --git a/data/win32/fldigi.nsi b/data/win32/fldigi.nsi
index 63c3fb26..2d89ea5b 100644
--- a/data/win32/fldigi.nsi
+++ b/data/win32/fldigi.nsi
@@ -121,6 +121,7 @@ SectionEnd
SectionIn RO
SetOutPath $INSTDIR
File "${FLDIGI_BINARY}"
+ File /nonfatal "${DIST_DEPS}/*"
!ifdef FLDIGI_LOCALE_DIR
File /r "${FLDIGI_LOCALE_PATH}/${FLDIGI_LOCALE_DIR}"
!endif
diff --git a/fldigi_doxygen/user_src_docs/WEFAX.txt b/fldigi_doxygen/user_src_docs/WEFAX.txt
index e5414c56..68a67c12 100644
--- a/fldigi_doxygen/user_src_docs/WEFAX.txt
+++ b/fldigi_doxygen/user_src_docs/WEFAX.txt
@@ -81,12 +81,9 @@ Select an input FIR (Finite Impulse Response) filter:
narrow
medium
wide
- Blackman
- Hamming
- Hanning
There is rarely any QRM on a government WEFAX broadcast, but the filter selection might
-improve the decoded signal to noise ratio. My preference is to use the Blackman filter.
+improve the decoded signal to noise ratio. Start with the medium filter setting.
\image html wefax-filter-impulse.png ""
\image latex wefax-filter-impulse.png "" width=5.0in
diff --git a/m4/macosx.m4 b/m4/macosx.m4
index 17545b8c..b61b953c 100644
--- a/m4/macosx.m4
+++ b/m4/macosx.m4
@@ -8,12 +8,15 @@ case "$target_os" in
;;
esac
-if test "$target_darwin" = "yes"; then
- AC_MSG_NOTICE([using bundled GNU regex on $target_os])
- # pretend that the regex.h check failed so that we use the bundled regex code
- ac_cv_header_regex_h=no
- AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.])
-fi
+### Try to use system regex
+#
+#if test "$target_darwin" = "yes"; then
+# AC_MSG_NOTICE([using bundled GNU regex on $target_os])
+# # pretend that the regex.h check failed so that we use the bundled regex code
+# ac_cv_header_regex_h=no
+# AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.])
+#fi
+
AC_ARG_ENABLE([mac-universal], AC_HELP_STRING([--enable-mac-universal],
[build a universal binary on Mac OS X @<:@no@:>@]),
diff --git a/m4/np-compat.m4 b/m4/np-compat.m4
index 7b8b8100..ca1cc5ee 100644
--- a/m4/np-compat.m4
+++ b/m4/np-compat.m4
@@ -17,9 +17,6 @@ AC_DEFUN([AC_FLDIGI_NP_COMPAT], [
if test "x$target_mingw32" = "xyes"; then
# Newer versions of mingw32 comes with pthread.
sem_libs="pthreadGC2 pthread"
- # pretend that the regex.h check failed so that we use the bundled regex code
- ac_cv_header_regex_h=no
- AC_DEFINE([HAVE_REGEX_H], 0, [Define to 1 if you have the header file.])
else
sem_libs="pthread rt"
fi
diff --git a/scripts/mingw-find-deps b/scripts/mingw-find-deps
new file mode 100755
index 00000000..aff023b5
--- /dev/null
+++ b/scripts/mingw-find-deps
@@ -0,0 +1,89 @@
+#!/bin/bash
+
+# Halt on errors
+set -e
+
+installroot=$PWD/dist;
+
+if [ $# -lt 1 ]; then
+ echo "Usage: $0 win32_binary [--debug]"
+ exit 1;
+fi
+
+if [ ! -f "$1" ]; then
+ echo "Cannot find file $1"
+ echo ""
+ echo "Usage: $0 win32_binary [--debug]"
+ exit 1;
+fi
+
+
+# Note: This script is written to be used with the Fedora mingw environment
+if [ "$(file $1 | grep -o x86-64)" == "x86-64" ]; then
+ echo "Scanning dependencies for $1 (64bit binary)"
+ MINGWROOT=/usr/x86_64-w64-mingw32/sys-root/mingw
+else
+ echo "Scanning dependencies for $1 (32bit binary)"
+ MINGWROOT=/usr/i686-w64-mingw32/sys-root/mingw
+fi
+
+if [ "$2" == "--debug" ]; then
+ withdebug=1
+fi
+
+isqt5=false
+
+# Collect dependencies
+function isnativedll {
+ # If the import library exists but not the dynamic library, the dll ist most likely a native one
+ local lower=${1,,}
+ [ ! -e $MINGWROOT/bin/$1 ] && [ -f $MINGWROOT/lib/lib${lower/%.*/.a} ] && return 0;
+ return 1;
+}
+
+function cpDep {
+# Copy the specified binary dependency
+ destdir="$installroot/${2:-$(dirname $1)}"
+ name="$(basename $1)"
+ test -e "$destdir/$name" && return 0
+ if [ ! -e "$MINGWROOT/$1" ]; then
+ echo "Error: missing $MINGWROOT/$1"
+ return 0
+ fi
+ mkdir -p "$destdir" || return 1
+ echo "Copying $1"
+ cp -a "$MINGWROOT/$1" "$destdir/$name" || return 1
+ if [ $withdebug ]; then test -e "$MINGWROOT/$1.debug" && cp "$MINGWROOT/$1.debug" "$destdir/$name.debug" && echo "Copying $1.debug" || echo "Warning: missing $name.debug"; fi
+ autoCpDeps $destdir/$name || return 1
+ return 0
+}
+
+function autoCpDeps {
+# Collects and links the dependencies of the specified binary
+ for dep in $(mingw-objdump -p "$1" | grep "DLL Name" | awk '{print $3}'); do
+ # Hacks / Workarounds
+ if [ "$dep" == "LIBPQ.dll" ]; then
+ dep="libpq.dll"
+ elif [ "$dep" == "QtUiToolsd4.dll" ]; then
+ continue;
+ elif [ "$dep" == "Qt5Core.dll" ]; then
+ isqt5=true
+ fi
+
+ if [ ! -f "$dep" ] && ! isnativedll "$dep"; then
+ cpDep bin/$dep || return 1
+ fi
+ done
+ return 0
+}
+
+mkdir -p dist/bin
+autoCpDeps $1
+if [ $withdebug ]; then
+ cpDep bin/gdb.exe
+fi
+if [[ $isqt5 == true ]]; then
+ mkdir -p dist/bin/platforms
+ cp -a $MINGWROOT/lib/qt5/plugins/platforms/qwindows.dll dist/bin/platforms/
+ autoCpDeps $MINGWROOT/lib/qt5/plugins/platforms/qwindows.dll
+fi
diff --git a/scripts/mknsisinst.sh b/scripts/mknsisinst.sh
index 3467344a..92995656 100755
--- a/scripts/mknsisinst.sh
+++ b/scripts/mknsisinst.sh
@@ -16,6 +16,7 @@ fi
PWD=`pwd`
data="${PWD}/$1"
build="${PWD}/$2"
+dist="${PWD}/../dist/bin"
# more sanity checks
for d in "$data" "$build"; do
@@ -54,6 +55,8 @@ if test "x$USE_NLS" = "xyes" && make -C "$srcdir/../po" install prefix="$build"
def="$def -DFLDIGI_LOCALE_PATH=$build/share -DFLDIGI_LOCALE_DIR=locale"
fi
+def="$def -DDIST_DEPS=$dist"
+
$MAKENSIS -V2 -NOCD -D"INSTALLER_FILE=$INSTALLER_FILE" -D"LICENSE_FILE=$data/../COPYING" \
-D"SUPPORT_URL=$PACKAGE_HOME" -D"UPDATES_URL=$PACKAGE_DL" -D"FLDIGI_DOCS_URL=$PACKAGE_DOCS" \
-D"FLARQ_DOCS_URL=$FLARQ_DOCS" -D"GUIDE_URL=$PACKAGE_GUIDE" $def "$data/win32/fldigi.nsi"
diff --git a/src/Makefile.am b/src/Makefile.am
index e34fdb53..92442828 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -48,7 +48,7 @@ COMMON_WIN32_RES_SRC = common.rc
BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx
-REGEX_SRC = compat/regex.h compat/regex.c
+#REGEX_SRC = compat/regex.h compat/regex.c
STACK_SRC = include/stack.h misc/stack.cxx
@@ -980,9 +980,7 @@ flarq_SOURCES += \
flarq-src/include/flarq.h \
flarq-src/include/flarqenv.h \
flarq-src/include/xml_server.h \
- include/Fl_Text_Display_mod.H \
- include/Fl_Text_Editor_mod.H \
- include/FTextView.h \
+ include/F_Edit.h \
include/fileselect.h \
include/flinput2.h \
include/flmisc.h \
@@ -1015,7 +1013,8 @@ flarq_SOURCES += \
widgets/Fl_Text_Buffer_mod.cxx \
widgets/Fl_Text_Display_mod.cxx \
widgets/Fl_Text_Editor_mod.cxx \
- widgets/FTextView.cxx
+ widgets/FTextView.cxx \
+ widgets/F_Edit.cxx
# Additional files that we distribute
EXTRA_DIST = \
diff --git a/src/compat/mingw.c b/src/compat/mingw.c
index efc7dc7f..252459e3 100644
--- a/src/compat/mingw.c
+++ b/src/compat/mingw.c
@@ -30,6 +30,7 @@
// ----------------------------------------------------------------------------
#include
+#include
#include
#include "compat.h"
@@ -124,7 +125,7 @@ static void wsa_init(void)
atexit((void(*)(void)) WSACleanup);
}
-int socketpair(int family, int type, int protocol, int *sv)
+int socketpair(int family, int type, int protocol, SOCKET *sv)
{
struct sockaddr_in addr;
SOCKET sfd;
diff --git a/src/compat/mingw.h b/src/compat/mingw.h
index f8cec282..530e52e5 100644
--- a/src/compat/mingw.h
+++ b/src/compat/mingw.h
@@ -50,7 +50,6 @@
extern "C" {
#endif
-typedef int pid_t;
typedef long suseconds_t;
#define hstrerror strerror
@@ -103,7 +102,7 @@ int mingw_rename(const char*, const char*);
#endif
int nanosleep (const struct timespec *req, struct timespec *rem);
-int socketpair(int family, int type, int protocol, int *sv);
+int socketpair(int family, int type, int protocol, SOCKET *sv);
/* uname */
#define UTSNAME_MAX_ 257
diff --git a/src/compat/regex.c b/src/compat/regex.c
index 6045cd0a..74e8ee89 100644
--- a/src/compat/regex.c
+++ b/src/compat/regex.c
@@ -3747,7 +3747,7 @@ re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
regstart[r] = old_regstart[r];
/* xx why this test? */
- if ((int) old_regend[r] >= (int) regstart[r])
+ if ((intptr_t) old_regend[r] >= (intptr_t) regstart[r])
regend[r] = old_regend[r];
}
}
diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx
index fa569a49..69e1b8df 100644
--- a/src/dialogs/confdialog.cxx
+++ b/src/dialogs/confdialog.cxx
@@ -7264,6 +7264,12 @@ static void cb_cntTxOffset(Fl_Spinner2* o, void*) {
progdefaults.changed = true;
}
+Fl_Counter *cntRIT=(Fl_Counter *)0;
+
+static void cb_cntRIT(Fl_Counter* o, void*) {
+ progdefaults.RIT=o->value();
+}
+
Fl_ListBox *listbox_wav_samplerate=(Fl_ListBox *)0;
static void cb_listbox_wav_samplerate(Fl_ListBox* o, void*) {
@@ -13549,8 +13555,8 @@ le Earth)"));
{ Fl_Choice* o = wefax_choice_rx_filter = new Fl_Choice(302, 137, 110, 24, _("Filter"));
wefax_choice_rx_filter->down_box(FL_BORDER_BOX);
wefax_choice_rx_filter->callback((Fl_Callback*)cb_wefax_choice_rx_filter);
- o->add("Narrow|Middle|Wide|Blackman|Hanning|Hamming");
- o->value(progdefaults.wefax_filter);
+ o->add("Narrow|Medium|Wide");
+ o->value(progdefaults.wefax_filter < 3 ? progdefaults.wefax_filter : 0);
} // Fl_Choice* wefax_choice_rx_filter
{ Fl_Counter* o = auto_after_nrows = new Fl_Counter(588, 81, 150, 24, _("Enable Auto-align after"));
auto_after_nrows->minimum(5);
@@ -16112,21 +16118,25 @@ i.e. localhost"));
} // Fl_Round_Button* btn_is_full_duplex
AudioDuplex->end();
} // Fl_Group* AudioDuplex
- { AudioAlerts = new Fl_Group(255, 235, 500, 80, _("Alerts / Rx Audio"));
+ { AudioAlerts = new Fl_Group(255, 235, 500, 90);
AudioAlerts->box(FL_ENGRAVED_FRAME);
- AudioAlerts->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
- { menuAlertsDev = new Fl_Choice(427, 255, 310, 25, _("Playback"));
+ AudioAlerts->align(Fl_Align(FL_ALIGN_CENTER));
+ { menuAlertsDev = new Fl_Choice(265, 260, 365, 25, _("Audio device shared by Audio Alerts and Rx Monitor"));
menuAlertsDev->tooltip(_("Audio output device"));
menuAlertsDev->down_box(FL_BORDER_BOX);
menuAlertsDev->callback((Fl_Callback*)cb_menuAlertsDev);
+ menuAlertsDev->align(Fl_Align(FL_ALIGN_TOP_LEFT));
} // Fl_Choice* menuAlertsDev
- { Fl_Round_Button* o = btn_enable_audio_alerts = new Fl_Round_Button(427, 283, 225, 25, _("Enable Audio alerts"));
+ { Fl_Round_Button* o = btn_enable_audio_alerts = new Fl_Round_Button(657, 260, 76, 25, _("Enable"));
btn_enable_audio_alerts->tooltip(_("First select audio alert playback device"));
btn_enable_audio_alerts->down_box(FL_DOWN_BOX);
btn_enable_audio_alerts->selection_color((Fl_Color)1);
btn_enable_audio_alerts->callback((Fl_Callback*)cb_btn_enable_audio_alerts);
o->value(progdefaults.enable_audio_alerts);
} // Fl_Round_Button* btn_enable_audio_alerts
+ { Fl_Box* o = new Fl_Box(265, 295, 473, 22, _("Note: must be selected and enabled for Rx Audio monitoring!"));
+ o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE));
+ } // Fl_Box* o
AudioAlerts->end();
} // Fl_Group* AudioAlerts
CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Devices"));
@@ -16199,11 +16209,10 @@ nce.\nYou may change the state from either location.\n..."));
{ Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Soundcard/Settings"));
o->box(FL_ENGRAVED_BOX);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
- o->hide();
{ grpAudioSampleRate = new Fl_Group(260, 48, 490, 90, _("Sample rate"));
grpAudioSampleRate->box(FL_ENGRAVED_FRAME);
grpAudioSampleRate->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
- { Fl_ListBox* o = menuInSampleRate = new Fl_ListBox(270, 77, 100, 22, _("Capture"));
+ { Fl_ListBox* o = menuInSampleRate = new Fl_ListBox(284, 77, 100, 22, _("Capture"));
menuInSampleRate->tooltip(_("Force a specific sample rate. Select \"Native\" if \"Auto\"\ndoes not work we\
ll with your audio device."));
menuInSampleRate->box(FL_DOWN_BOX);
@@ -16220,7 +16229,7 @@ ll with your audio device."));
o->labelsize(FL_NORMAL_SIZE);
menuInSampleRate->end();
} // Fl_ListBox* menuInSampleRate
- { Fl_ListBox* o = menuOutSampleRate = new Fl_ListBox(270, 107, 100, 22, _("Playback"));
+ { Fl_ListBox* o = menuOutSampleRate = new Fl_ListBox(284, 107, 100, 22, _("Playback"));
menuOutSampleRate->box(FL_DOWN_BOX);
menuOutSampleRate->color(FL_BACKGROUND2_COLOR);
menuOutSampleRate->selection_color(FL_BACKGROUND_COLOR);
@@ -16256,7 +16265,7 @@ ll with your audio device."));
{ Fl_Group* o = new Fl_Group(260, 138, 490, 62, _("Corrections"));
o->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
- { Fl_Spinner2* o = cntRxRateCorr = new Fl_Spinner2(270, 168, 85, 20, _("RX ppm"));
+ { Fl_Spinner2* o = cntRxRateCorr = new Fl_Spinner2(284, 165, 85, 20, _("RX ppm"));
cntRxRateCorr->tooltip(_("RX sound card correction"));
cntRxRateCorr->box(FL_NO_BOX);
cntRxRateCorr->color(FL_BACKGROUND_COLOR);
@@ -16273,7 +16282,7 @@ ll with your audio device."));
o->maximum(50000);
o->labelsize(FL_NORMAL_SIZE);
} // Fl_Spinner2* cntRxRateCorr
- { Fl_Spinner2* o = cntTxRateCorr = new Fl_Spinner2(431, 168, 85, 20, _("TX ppm"));
+ { Fl_Spinner2* o = cntTxRateCorr = new Fl_Spinner2(431, 165, 85, 20, _("TX ppm"));
cntTxRateCorr->tooltip(_("TX sound card correction"));
cntTxRateCorr->box(FL_NO_BOX);
cntTxRateCorr->color(FL_BACKGROUND_COLOR);
@@ -16290,7 +16299,7 @@ ll with your audio device."));
o->maximum(50000);
o->labelsize(FL_NORMAL_SIZE);
} // Fl_Spinner2* cntTxRateCorr
- { Fl_Spinner2* o = cntTxOffset = new Fl_Spinner2(593, 168, 85, 20, _("TX offset"));
+ { Fl_Spinner2* o = cntTxOffset = new Fl_Spinner2(591, 165, 85, 20, _("TX offset"));
cntTxOffset->tooltip(_("Difference between Rx & Tx freq (rig offset)"));
cntTxOffset->box(FL_NO_BOX);
cntTxOffset->color(FL_BACKGROUND_COLOR);
@@ -16309,6 +16318,21 @@ ll with your audio device."));
} // Fl_Spinner2* cntTxOffset
o->end();
} // Fl_Group* o
+ { Fl_Group* o = new Fl_Group(260, 200, 490, 62, _("Frequency Analysis Rx Correction"));
+ o->box(FL_ENGRAVED_FRAME);
+ o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
+ { Fl_Counter* o = cntRIT = new Fl_Counter(284, 226, 130, 20, _("RIT"));
+ cntRIT->tooltip(_("Used ONLY for frequency analysis mode"));
+ cntRIT->minimum(-5);
+ cntRIT->maximum(5);
+ cntRIT->step(0.01);
+ cntRIT->callback((Fl_Callback*)cb_cntRIT);
+ cntRIT->align(Fl_Align(FL_ALIGN_RIGHT));
+ o->value(progdefaults.RIT);
+ o->lstep(0.1);
+ } // Fl_Counter* cntRIT
+ o->end();
+ } // Fl_Group* o
CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Settings"));
config_pages.push_back(p);
tab_tree->add(_("Soundcard/Settings"));
diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl
index e6762f1f..b1026f03 100644
--- a/src/dialogs/confdialog.fl
+++ b/src/dialogs/confdialog.fl
@@ -469,7 +469,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {}
Fl_Window {} {
label {Fldigi configuration} open
- xywh {503 32 800 380} type Double color 45 selection_color 51 labelsize 18 align 80 resizable size_range {750 380 0 380} visible
+ xywh {604 42 800 380} type Double color 45 selection_color 51 labelsize 18 align 80 resizable size_range {750 380 0 380} visible
} {
Fl_Group {} {
xywh {0 0 201 385} resizable
@@ -6070,7 +6070,7 @@ progdefaults.changed = true;}
}
}
Fl_Group {} {
- label {Modem/Wefax} open selected
+ label {Modem/Wefax}
xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide
code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Wefax"));}
code1 {config_pages.push_back(p);}
@@ -6128,8 +6128,8 @@ progdefaults.changed = true;}
label Filter
callback {progdefaults.wefax_filter=o->value();} open
xywh {302 137 110 24} down_box BORDER_BOX
- code0 {o->add("Narrow|Middle|Wide|Blackman|Hanning|Hamming");}
- code1 {o->value(progdefaults.wefax_filter);}
+ code0 {o->add("Narrow|Medium|Wide");}
+ code1 {o->value(progdefaults.wefax_filter < 3 ? progdefaults.wefax_filter : 0);}
} {}
Fl_Counter auto_after_nrows {
label {Enable Auto-align after}
@@ -9058,25 +9058,28 @@ resetSoundCard();}
code0 {o->value(progdefaults.is_full_duplex);}
}
}
- Fl_Group AudioAlerts {
- label {Alerts / Rx Audio} open
- xywh {255 235 500 80} box ENGRAVED_FRAME align 21
+ Fl_Group AudioAlerts {open
+ xywh {255 235 500 90} box ENGRAVED_FRAME align 0
} {
Fl_Choice menuAlertsDev {
- label Playback
+ label {Audio device shared by Audio Alerts and Rx Monitor}
callback {progdefaults.AlertDevice = o->text();
progdefaults.AlertIndex = reinterpret_cast(o->mvalue()->user_data());
progdefaults.changed = true;} open
- tooltip {Audio output device} xywh {427 255 310 25} down_box BORDER_BOX
+ tooltip {Audio output device} xywh {265 260 365 25} down_box BORDER_BOX align 5
} {}
Fl_Round_Button btn_enable_audio_alerts {
- label {Enable Audio alerts}
+ label Enable
callback {progdefaults.enable_audio_alerts = o->value();
progdefaults.changed = true;
reset_audio_alerts();}
- tooltip {First select audio alert playback device} xywh {427 283 225 25} down_box DOWN_BOX selection_color 1
+ tooltip {First select audio alert playback device} xywh {657 260 76 25} down_box DOWN_BOX selection_color 1
code0 {o->value(progdefaults.enable_audio_alerts);}
}
+ Fl_Box {} {
+ label {Note: must be selected and enabled for Rx Audio monitoring!}
+ xywh {265 295 473 22} align 16
+ }
}
}
Fl_Group {} {
@@ -9188,8 +9191,8 @@ progdefaults.changed = true;}
}
}
Fl_Group {} {
- label {Soundcard/Settings}
- xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide
+ label {Soundcard/Settings} open selected
+ xywh {200 0 600 350} box ENGRAVED_BOX align 21
code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Settings"));}
code1 {config_pages.push_back(p);}
code2 {tab_tree->add(_("Soundcard/Settings"));}
@@ -9204,7 +9207,7 @@ progdefaults.changed = true;}
resetSoundCard();
progdefaults.changed = true;} open
tooltip {Force a specific sample rate. Select "Native" if "Auto"
-does not work well with your audio device.} xywh {270 77 100 22} box DOWN_BOX color 7 align 8
+does not work well with your audio device.} xywh {284 77 100 22} box DOWN_BOX color 7 align 8
code0 {o->clear_changed();}
code1 {o->labelsize(FL_NORMAL_SIZE);}
class Fl_ListBox
@@ -9214,7 +9217,7 @@ does not work well with your audio device.} xywh {270 77 100 22} box DOWN_BOX co
callback {progdefaults.out_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index();
resetSoundCard();
progdefaults.changed = true;} open
- xywh {270 107 100 22} box DOWN_BOX color 7 align 8
+ xywh {284 107 100 22} box DOWN_BOX color 7 align 8
code0 {o->clear_changed();}
code1 {o->tooltip(menuInSampleRate->tooltip());}
code2 {o->labelsize(FL_NORMAL_SIZE);}
@@ -9242,7 +9245,7 @@ o->tooltip(src_get_description(progdefaults.sample_converter));} open
label {RX ppm}
callback {progdefaults.RX_corr = (int)o->value();
progdefaults.changed = true;}
- tooltip {RX sound card correction} xywh {270 168 85 20} align 8
+ tooltip {RX sound card correction} xywh {284 165 85 20} align 8
code0 {o->step(1);}
code1 {o->minimum(-50000);}
code2 {o->maximum(50000);}
@@ -9253,7 +9256,7 @@ progdefaults.changed = true;}
label {TX ppm}
callback {progdefaults.TX_corr = (int)o->value();
progdefaults.changed = true;}
- tooltip {TX sound card correction} xywh {431 168 85 20} align 8
+ tooltip {TX sound card correction} xywh {431 165 85 20} align 8
code0 {o->step(1);}
code1 {o->minimum(-50000);}
code2 {o->maximum(50000);}
@@ -9264,7 +9267,7 @@ progdefaults.changed = true;}
label {TX offset}
callback {progdefaults.TxOffset = (int)o->value();
progdefaults.changed = true;}
- tooltip {Difference between Rx & Tx freq (rig offset)} xywh {593 168 85 20} align 8
+ tooltip {Difference between Rx & Tx freq (rig offset)} xywh {591 165 85 20} align 8
code0 {o->value(progdefaults.TxOffset);}
code1 {o->step(1);}
code2 {o->minimum(-50); o->maximum(50);}
@@ -9272,6 +9275,18 @@ progdefaults.changed = true;}
class Fl_Spinner2
}
}
+ Fl_Group {} {
+ label {Frequency Analysis Rx Correction} open
+ xywh {260 200 490 62} box ENGRAVED_FRAME align 21
+ } {
+ Fl_Counter cntRIT {
+ label RIT
+ callback {progdefaults.RIT=o->value();}
+ tooltip {Used ONLY for frequency analysis mode} xywh {284 226 130 20} align 8 minimum -5 maximum 5 step 0.01
+ code0 {o->value(progdefaults.RIT);}
+ code1 {o->lstep(0.1);}
+ }
+ }
}
Fl_Group {} {
label {Soundcard/Wav file recording}
diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx
index 03c37fb9..a0d58b2b 100644
--- a/src/dialogs/fl_digi.cxx
+++ b/src/dialogs/fl_digi.cxx
@@ -985,7 +985,7 @@ static const Fl_Menu_Item quick_change_feld[] = {
{ mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL },
{ mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5 },
{ mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9 },
- { mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL },
+ { mode_info[MODE_FSKH245].name, 0, cb_init_mode, (void *)MODE_FSKH245 },
{ mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105 },
{ mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80 },
{ 0 }
@@ -1668,7 +1668,7 @@ void init_modem(trx_mode mode, int freq)
mode == MODE_SLOWHELL ||
mode == MODE_HELLX5 ||
mode == MODE_HELLX9 ||
- mode == MODE_FSKHELL ||
+ mode == MODE_FSKH245 ||
mode == MODE_FSKH105 ||
mode == MODE_HELL80 ||
mode == MODE_WEFAX_576 ||
@@ -1753,7 +1753,7 @@ void init_modem(trx_mode mode, int freq)
case MODE_SLOWHELL:
case MODE_HELLX5:
case MODE_HELLX9:
- case MODE_FSKHELL:
+ case MODE_FSKH245:
case MODE_FSKH105:
case MODE_HELL80:
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
@@ -1988,7 +1988,7 @@ void init_modem(trx_mode mode, int freq)
break;
default:
- LOG_ERROR("Unknown mode: %" PRIdPTR, mode);
+ LOG_ERROR("Unknown mode: %d", (int)mode);
mode = MODE_PSK31;
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
*mode_info[mode].modem = new psk(mode), freq);
@@ -2123,7 +2123,7 @@ void macro_cb(Fl_Widget *w, void *v)
// if (active_modem->get_mode() == MODE_FSQ)
// return;
- int b = (int)(reinterpret_cast (v));
+ int b = (int)(reinterpret_cast (v));
if (b & 0x80) { // 4 bar docked macros
b &= 0x7F;
@@ -2288,7 +2288,7 @@ void cb_mnuConfigModems(Fl_Menu_*, void*) {
open_config(TAB_DOMINOEX);
break;
case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9:
- case MODE_FSKHELL: case MODE_FSKH105:case MODE_HELL80:
+ case MODE_FSKH245: case MODE_FSKH105:case MODE_HELL80:
open_config(TAB_FELDHELL);
break;
case MODE_WEFAX_576: case MODE_WEFAX_288:
@@ -2435,7 +2435,6 @@ void cb_view_hide_channels(Fl_Menu_ *w, void *d)
return;
}
-#if USE_SNDFILE
static bool capval = false;
static bool genval = false;
@@ -2553,7 +2552,6 @@ void cb_mnuPlayback(Fl_Widget *w, void *d)
btnAutoSpot->do_callback();
}
}
-#endif // USE_SNDFILE
bool first_tab_select = true;
@@ -2613,7 +2611,7 @@ void cb_mnuVisitURL(Fl_Widget*, void* arg)
// be done with the returned HINSTANCE is to cast it to an
// int and compare it with the value 32 or one of the error
// codes below." (Error codes omitted to preserve sanity).
- if ((int)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32)
+ if ((INT_PTR)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32)
fl_alert2(_("Could not open url:\n%s\n"), url);
#endif
}
@@ -2977,7 +2975,14 @@ void toggleRSID()
cbRSID(NULL, NULL);
}
+static notify_dialog *rx_monitor_alert = 0;
void cb_mnuRxAudioDialog(Fl_Menu_ *w, void *d) {
+ if (!progdefaults.enable_audio_alerts) {
+ if (!rx_monitor_alert) rx_monitor_alert = new notify_dialog;
+ rx_monitor_alert->notify("Audio-Alert / Rx-Monitor device NOT enabled", 10.0);
+ show_notifier(rx_monitor_alert);
+ return;
+ }
if (rxaudio_dialog)
rxaudio_dialog->show();
}
@@ -5755,13 +5760,11 @@ static Fl_Menu_Item menu_[] = {
{ LOG_TO_FILE_MLABEL, 0, cb_logfile, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
-#if USE_SNDFILE
{ icons::make_icon_label(_("Audio")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0},
{_("RX capture"), 0, (Fl_Callback*)cb_mnuCapture, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},
{_("TX generate"), 0, (Fl_Callback*)cb_mnuGenerate, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},
{_("Playback"), 0, (Fl_Callback*)cb_mnuPlayback, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
-#endif
{ icons::make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
@@ -5821,7 +5824,7 @@ static Fl_Menu_Item menu_[] = {
{ mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9, 0, FL_NORMAL_LABEL, 0, 14, 0},
-{ mode_info[MODE_FSKHELL].name, 0, cb_init_mode, (void *)MODE_FSKHELL, 0, FL_NORMAL_LABEL, 0, 14, 0},
+{ mode_info[MODE_FSKH245].name, 0, cb_init_mode, (void *)MODE_FSKH245, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80, 0, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
@@ -8423,7 +8426,7 @@ static void put_rx_char_flmain(unsigned int data, int style)
if (mailclient || mailserver)
rx_chd.rx((unsigned char *)ascii2[data & 0xFF]);
- else if (progdefaults.show_all_codes)
+ else if (progdefaults.show_all_codes && iscntrl(data & 0xFF))
rx_chd.rx((unsigned char *)ascii3[data & 0xFF]);
else if (mode == MODE_RTTY)
@@ -8434,7 +8437,7 @@ static void put_rx_char_flmain(unsigned int data, int style)
} else
rx_chd.rx((unsigned char *)ascii[data & 0xFF]);
else
- rx_chd.rx(data);
+ rx_chd.rx(data & 0xFF);
// feed the decoded data into the RX parser
if (rx_chd.data_length() > 0) {
@@ -8969,20 +8972,16 @@ void put_echo_char(unsigned int data, int style)
if (mode == MODE_CW && progdefaults.QSKadjust)
return;
- REQ(&add_tx_char, data);
+ REQ(&add_tx_char, data & 0xFF);
// select a byte translation table
const char **asc = NULL;//ascii;
- if (mailclient || mailserver || arq_text_available)
+ if (mailclient || mailserver) {
asc = ascii2;
- else if (progdefaults.show_all_codes)
- asc = ascii3;
- else if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)
- asc = ascii3;
-
- // assign a style to the data
- if (asc == ascii2 && iscntrl(data))
style = FTextBase::CTRL;
+ } else if ((progdefaults.show_all_codes && iscntrl(data & 0xFF)) ||
+ PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)
+ asc = ascii3;
// receive and convert the data
static unsigned int lastdata = 0;
@@ -8990,12 +8989,12 @@ void put_echo_char(unsigned int data, int style)
if (data == '\r' && lastdata == '\r') // reject multiple CRs
return;
- if (data == '\a') {
+ if (mode == MODE_RTTY && data == '\a') {
if (progdefaults.visibleBELL)
echo_chd.rx((unsigned char *)ascii2[7]);
REQ(TTY_bell);
} else if (asc == NULL)
- echo_chd.rx(data);
+ echo_chd.rx(data & 0xFF);
else
echo_chd.rx((unsigned char *)asc[data & 0xFF]);
diff --git a/src/dialogs/guide.cxx b/src/dialogs/guide.cxx
index 3f4e6f18..3dc7cc54 100644
--- a/src/dialogs/guide.cxx
+++ b/src/dialogs/guide.cxx
@@ -2039,7 +2039,7 @@ numeric keypad’s 0-9 the sequence will be discarded.
\n\