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\
    \n\
    \n\ Last updated\n\ - 2018-02-24 13:42:49 \n\ + 2020-06-22 01:38:45 \n\
    \n\
    \n\ \n\ diff --git a/src/feld/feld.cxx b/src/feld/feld.cxx index 813d0a7a..4d927441 100644 --- a/src/feld/feld.cxx +++ b/src/feld/feld.cxx @@ -101,13 +101,19 @@ void feld::init() } +static void set_HellBW(double val) +{ + sldrHellBW->value(val); +} + void feld::restart() { - set_bandwidth(hell_bandwidth); +// set_bandwidth(hell_bandwidth); RxColumnLen = progdefaults.HellRcvHeight; TxColumnLen = FELD_COLUMN_LEN; + int fbw; switch (mode) { // Amplitude modulation modes case MODE_FELDHELL: @@ -117,7 +123,10 @@ TxColumnLen = FELD_COLUMN_LEN; downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; - filter_bandwidth = progdefaults.HELL_BW_FH; + fbw = 1.2 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_FH = filter_bandwidth = fbw; break; case MODE_SLOWHELL: feldcolumnrate = 2.1875; @@ -126,7 +135,10 @@ TxColumnLen = FELD_COLUMN_LEN; downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; - filter_bandwidth = progdefaults.HELL_BW_SH; + fbw = 1.2 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_SH = filter_bandwidth = fbw; break; case MODE_HELLX5: feldcolumnrate = 87.5; @@ -135,7 +147,10 @@ TxColumnLen = FELD_COLUMN_LEN; downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; - filter_bandwidth = progdefaults.HELL_BW_X5; + fbw = 1.2 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_X5 = filter_bandwidth = fbw; break; case MODE_HELLX9: feldcolumnrate = 157.5; @@ -144,10 +159,13 @@ TxColumnLen = FELD_COLUMN_LEN; downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; - filter_bandwidth = progdefaults.HELL_BW_X9; + fbw = 1.2 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_X9 = filter_bandwidth = fbw; break; // Frequency modulation modes - case MODE_FSKHELL: + case MODE_FSKH245: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); @@ -155,7 +173,10 @@ TxColumnLen = FELD_COLUMN_LEN; upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 122.5; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); - filter_bandwidth = progdefaults.HELL_BW_FSK; + fbw = 3.0 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_FSKH245 = filter_bandwidth = fbw; cap |= CAP_REV; break; case MODE_FSKH105: @@ -166,7 +187,10 @@ TxColumnLen = FELD_COLUMN_LEN; upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 55; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); - filter_bandwidth = progdefaults.HELL_BW_FSK105; + fbw = 4.0 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_FSKH105 = filter_bandwidth = fbw; cap |= CAP_REV; break; case MODE_HELL80: @@ -177,13 +201,20 @@ TxColumnLen = FELD_COLUMN_LEN; upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 300; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); - filter_bandwidth = progdefaults.HELL_BW_HELL80; + fbw = 2.5 * hell_bandwidth; + if (fbw % 5 > 2) fbw += (5 - (fbw % 5)); + else fbw -= (fbw % 5); + progdefaults.HELL_BW_HELL80 = filter_bandwidth = fbw; cap |= CAP_REV; break; default : feldcolumnrate = 17.5; break; } + set_bandwidth(hell_bandwidth); + progdefaults.HELL_BW = filter_bandwidth; + + REQ(set_HellBW, filter_bandwidth); /* std::cout << "HellRcvHeight: " << progdefaults.HellRcvHeight << "\n" << @@ -204,7 +235,7 @@ std::cout << feld::~feld() { if (hilbert) delete hilbert; - if (bpfilt) delete bpfilt; + if (lpfilt) delete lpfilt; if (bbfilt) delete bbfilt; if (minmaxfilt) delete minmaxfilt; } @@ -219,17 +250,16 @@ feld::feld(trx_mode m) restart(); - progdefaults.HELL_BW = filter_bandwidth; +// progdefaults.HELL_BW = filter_bandwidth; +// set_bandwidth(hell_bandwidth); hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); - set_bandwidth(hell_bandwidth); - wf->redraw_marker(); - lp = filter_bandwidth / samplerate; - bpfilt = new fftfilt(0, lp, 1024); + lp = 0.5 * filter_bandwidth / samplerate; + lpfilt = new fftfilt(0, lp, 1024); bbfilt = new Cmovavg(8); average = new Cmovavg( static_cast(500 / downsampleinc)); @@ -261,7 +291,7 @@ cmplx feld::mixer(cmplx in) return z; } -void feld::FSKHELL_rx(cmplx z) +void feld::FSKH_rx(cmplx z) { guard_lock raster_lock(&feld_mutex); @@ -299,8 +329,7 @@ void feld::FSKHELL_rx(cmplx z) vid = f + 0.5; vid = CLAMP(vid, 0.0, 1.0); - if (mode == MODE_HELL80) - vid = 1.0 - vid; + if (reverse) vid = 1.0 - vid; if (progdefaults.HellBlackboard) @@ -419,18 +448,18 @@ int feld::rx_process(const double *buf, int len) case MODE_HELLX9: progdefaults.HELL_BW_X9 = filter_bandwidth; break; - case MODE_FSKHELL: - progdefaults.HELL_BW_FSK = filter_bandwidth; + case MODE_FSKH245: + progdefaults.HELL_BW_FSKH245 = filter_bandwidth; break; case MODE_FSKH105: - progdefaults.HELL_BW_FSK105 = filter_bandwidth; + progdefaults.HELL_BW_FSKH105 = filter_bandwidth; break; case MODE_HELL80: progdefaults.HELL_BW_HELL80 = filter_bandwidth; } - lp = filter_bandwidth / samplerate; - bpfilt->create_filter(0, lp); + lp = 0.5 * filter_bandwidth / samplerate; + lpfilt->create_filter(0, lp); wf->redraw_marker(); } @@ -439,19 +468,19 @@ int feld::rx_process(const double *buf, int len) z = cmplx( *buf, *buf ); buf++; - hilbert->run(z, z); +/// hilbert transform need for complex frequency shift - /* ...so it can be shifted in frequency */ + hilbert->run(z, z); z = mixer(z); - n = bpfilt->run(z, &zp); + n = lpfilt->run(z, &zp); switch (mode) { - case MODE_FSKHELL: + case MODE_FSKH245: case MODE_FSKH105: case MODE_HELL80: for (i = 0; i < n; i++) { - FSKHELL_rx(zp[i]); + FSKH_rx(zp[i]); } break; default: @@ -538,11 +567,11 @@ void feld::send_symbol(int currsymb, int nextsymb) initKeyWaveform(); } - if (mode == MODE_FSKHELL || mode == MODE_FSKH105 || mode == MODE_HELL80) + if (mode == MODE_FSKH245 || mode == MODE_FSKH105 || mode == MODE_HELL80) tone += (reverse ? -1 : 1) * (currsymb ? -1 : 1) * bandwidth / 2.0; for (;;) { switch (mode) { - case MODE_FSKHELL : case MODE_FSKH105 : case MODE_HELL80 : + case MODE_FSKH245 : case MODE_FSKH105 : case MODE_HELL80 : break; case MODE_HELLX5 : case MODE_HELLX9 : Amp = currsymb; diff --git a/src/flarq-src/arqdialogs.cxx b/src/flarq-src/arqdialogs.cxx index 00b0190b..ed3d9b2e 100644 --- a/src/flarq-src/arqdialogs.cxx +++ b/src/flarq-src/arqdialogs.cxx @@ -91,7 +91,7 @@ Fl_Box *indCONNECT=(Fl_Box *)0; Fl_Input2 *txtState=(Fl_Input2 *)0; -Fl_Text_Display *txtARQ=(Fl_Text_Display *)0; +FTextView *txtARQ=(FTextView *)0; Fl_Input2 *txtStatus=(Fl_Input2 *)0; @@ -105,7 +105,7 @@ static void cb_btnClearText(Fl_Button*, void*) { cbClearText(); } -Fl_Text_Display *txtRX=(Fl_Text_Display *)0; +FTextView *txtRX=(FTextView *)0; Fl_Input2 *txtTX=(Fl_Input2 *)0; @@ -194,11 +194,19 @@ Fl_Double_Window* arq_dialog() { } // Fl_Group* o o->end(); } // Fl_Group* o - { txtARQ = new Fl_Text_Display(0, 87, 515, 117); + { txtARQ = new FTextView(0, 87, 515, 117); txtARQ->box(FL_DOWN_BOX); + txtARQ->color(FL_BACKGROUND2_COLOR); + txtARQ->selection_color(FL_SELECTION_COLOR); + txtARQ->labeltype(FL_NORMAL_LABEL); + txtARQ->labelfont(0); + txtARQ->labelsize(14); + txtARQ->labelcolor(FL_FOREGROUND_COLOR); txtARQ->textfont(4); + txtARQ->align(Fl_Align(FL_ALIGN_TOP)); + txtARQ->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtARQ); - } // Fl_Text_Display* txtARQ + } // FTextView* txtARQ { Fl_Group* o = new Fl_Group(0, 206, 516, 26); o->box(FL_DOWN_BOX); { Fl_Input2* o = txtStatus = new Fl_Input2(5, 208, 220, 22); @@ -242,11 +250,19 @@ Fl_Double_Window* arq_dialog() { { Fl_Group* o = new Fl_Group(0, 235, 515, 180, "Plain Talk"); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { txtRX = new Fl_Text_Display(5, 255, 505, 130); + { txtRX = new FTextView(5, 255, 505, 130); txtRX->box(FL_DOWN_BOX); + txtRX->color(FL_BACKGROUND2_COLOR); + txtRX->selection_color(FL_SELECTION_COLOR); + txtRX->labeltype(FL_NORMAL_LABEL); + txtRX->labelfont(0); + txtRX->labelsize(14); + txtRX->labelcolor(FL_FOREGROUND_COLOR); txtRX->textfont(4); + txtRX->align(Fl_Align(FL_ALIGN_TOP)); + txtRX->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtRX); - } // Fl_Text_Display* txtRX + } // FTextView* txtRX { Fl_Group* o = new Fl_Group(0, 387, 515, 28); o->box(FL_ENGRAVED_FRAME); { txtTX = new Fl_Input2(5, 390, 450, 22, "input:"); @@ -344,11 +360,18 @@ static void cb_btnOK(Fl_Button*, void*) { closeConfig(); } +Fl_Check_Button *btn_restart_beacon=(Fl_Check_Button *)0; + +static void cb_btn_restart_beacon(Fl_Check_Button* o, void*) { + restart_beacon = (int)(o->value()); +cbSetConfig(); +} + Fl_Double_Window* arq_configure() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 190, "Configure flarq"); w = o; if (w) {/* empty */} - { Fl_Input2* o = txtMyCall = new Fl_Input2(98, 13, 150, 24, "My Call:"); + { Fl_Input2* o = txtMyCall = new Fl_Input2(98, 13, 150, 22, "My Call:"); txtMyCall->box(FL_DOWN_BOX); txtMyCall->color(FL_BACKGROUND2_COLOR); txtMyCall->selection_color(FL_SELECTION_COLOR); @@ -361,7 +384,7 @@ Fl_Double_Window* arq_configure() { txtMyCall->when(FL_WHEN_RELEASE); o->value(MyCall.c_str()); } // Fl_Input2* txtMyCall - { Fl_Input2* o = txtBEACONTXT = new Fl_Input2(98, 42, 370, 24, "Beacon Text"); + { Fl_Input2* o = txtBEACONTXT = new Fl_Input2(98, 42, 370, 22, "Beacon Text"); txtBEACONTXT->tooltip("Text for the beacon 64 chars max"); txtBEACONTXT->box(FL_DOWN_BOX); txtBEACONTXT->color(FL_BACKGROUND2_COLOR); @@ -427,7 +450,7 @@ Fl_Double_Window* arq_configure() { o->step(15); o->value(itimeout / 1000); } // Fl_Spinner2* spnTimeout - { Fl_Spinner2* o = spnTxDelay = new Fl_Spinner2(317, 98, 70, 22, "Tx delay (msec):"); + { Fl_Spinner2* o = spnTxDelay = new Fl_Spinner2(317, 126, 70, 22, "Tx delay (msec):"); spnTxDelay->tooltip("delay from Rx to Tx"); spnTxDelay->box(FL_NO_BOX); spnTxDelay->color(FL_BACKGROUND_COLOR); @@ -472,6 +495,7 @@ Fl_Double_Window* arq_configure() { spnIDtimer->labelcolor(FL_FOREGROUND_COLOR); spnIDtimer->minimum(0); spnIDtimer->maximum(10); + spnIDtimer->value(10); spnIDtimer->callback((Fl_Callback*)cb_spnIDtimer); spnIDtimer->align(Fl_Align(FL_ALIGN_LEFT)); spnIDtimer->when(FL_WHEN_RELEASE); @@ -480,7 +504,7 @@ Fl_Double_Window* arq_configure() { o->step(1); o->value(idtimer); } // Fl_Spinner2* spnIDtimer - { choiceBlockSize = new Fl_ComboBox(314, 126, 72, 24, "Block Size:"); + { choiceBlockSize = new Fl_ComboBox(314, 155, 72, 22, "Block Size:"); choiceBlockSize->box(FL_DOWN_BOX); choiceBlockSize->color(FL_BACKGROUND2_COLOR); choiceBlockSize->selection_color(FL_BACKGROUND_COLOR); @@ -496,6 +520,13 @@ Fl_Double_Window* arq_configure() { { btnOK = new Fl_Button(406, 154, 62, 24, "Ok"); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Button* btnOK + { Fl_Check_Button* o = btn_restart_beacon = new Fl_Check_Button(448, 101, 20, 20, "Restart Beacon"); + btn_restart_beacon->tooltip("Restart beacon after disconnect"); + btn_restart_beacon->down_box(FL_DOWN_BOX); + btn_restart_beacon->callback((Fl_Callback*)cb_btn_restart_beacon); + btn_restart_beacon->align(Fl_Align(FL_ALIGN_LEFT)); + o->value(restart_beacon); + } // Fl_Check_Button* btn_restart_beacon o->end(); } // Fl_Double_Window* o return w; @@ -543,11 +574,13 @@ Fl_Double_Window* arq_SendSelect() { return w; } +Fl_Input2 *inpMailFrom=(Fl_Input2 *)0; + Fl_Input2 *inpMailTo=(Fl_Input2 *)0; Fl_Input2 *inpMailSubj=(Fl_Input2 *)0; -Fl_Text_Editor *txtMailText=(Fl_Text_Editor *)0; +F_Edit *txtMailText=(F_Edit *)0; Fl_Button *btnOpenComposedMail=(Fl_Button *)0; @@ -581,9 +614,20 @@ static void cb_btnSaveComposedMail(Fl_Button*, void*) { Fl_Double_Window* arq_composer() { Fl_Double_Window* w; - { Fl_Double_Window* o = new Fl_Double_Window(515, 275, "Flarq Mail Composer"); + { Fl_Double_Window* o = new Fl_Double_Window(515, 300, "Flarq Mail Composer"); w = o; if (w) {/* empty */} - { inpMailTo = new Fl_Input2(48, 4, 460, 24, "To:"); + { inpMailFrom = new Fl_Input2(47, 5, 460, 24, "From"); + inpMailFrom->box(FL_DOWN_BOX); + inpMailFrom->color(FL_BACKGROUND2_COLOR); + inpMailFrom->selection_color(FL_SELECTION_COLOR); + inpMailFrom->labeltype(FL_NORMAL_LABEL); + inpMailFrom->labelfont(0); + inpMailFrom->labelsize(14); + inpMailFrom->labelcolor(FL_FOREGROUND_COLOR); + inpMailFrom->align(Fl_Align(FL_ALIGN_LEFT)); + inpMailFrom->when(FL_WHEN_RELEASE); + } // Fl_Input2* inpMailFrom + { inpMailTo = new Fl_Input2(48, 32, 460, 24, "To"); inpMailTo->box(FL_DOWN_BOX); inpMailTo->color(FL_BACKGROUND2_COLOR); inpMailTo->selection_color(FL_SELECTION_COLOR); @@ -594,7 +638,7 @@ Fl_Double_Window* arq_composer() { inpMailTo->align(Fl_Align(FL_ALIGN_LEFT)); inpMailTo->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailTo - { inpMailSubj = new Fl_Input2(48, 30, 460, 24, "Subj:"); + { inpMailSubj = new Fl_Input2(48, 59, 460, 24, "Subj"); inpMailSubj->box(FL_DOWN_BOX); inpMailSubj->color(FL_BACKGROUND2_COLOR); inpMailSubj->selection_color(FL_SELECTION_COLOR); @@ -605,42 +649,51 @@ Fl_Double_Window* arq_composer() { inpMailSubj->align(Fl_Align(FL_ALIGN_LEFT)); inpMailSubj->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailSubj - { txtMailText = new Fl_Text_Editor(0, 56, 510, 188); + { txtMailText = new F_Edit(0, 85, 510, 188); + txtMailText->box(FL_DOWN_FRAME); + txtMailText->color(FL_BACKGROUND2_COLOR); + txtMailText->selection_color(FL_SELECTION_COLOR); + txtMailText->labeltype(FL_NORMAL_LABEL); + txtMailText->labelfont(0); + txtMailText->labelsize(14); + txtMailText->labelcolor(FL_FOREGROUND_COLOR); + txtMailText->textfont(4); + txtMailText->align(Fl_Align(FL_ALIGN_TOP)); + txtMailText->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtMailText); - } // Fl_Text_Editor* txtMailText - { Fl_Pack* o = new Fl_Pack(0, 247, 515, 28); - o->type(1); - { btnOpenComposedMail = new Fl_Button(4, 251, 70, 20, "Open"); + } // F_Edit* txtMailText + { Fl_Group* o = new Fl_Group(0, 274, 515, 28); + { btnOpenComposedMail = new Fl_Button(4, 278, 70, 20, "Open"); btnOpenComposedMail->tooltip("Open existing Composed email"); btnOpenComposedMail->callback((Fl_Callback*)cb_btnOpenComposedMail); } // Fl_Button* btnOpenComposedMail - { new Fl_Box(75, 251, 5, 20); + { new Fl_Box(75, 278, 5, 20); } // Fl_Box* o - { btnClearComposer = new Fl_Button(81, 251, 70, 20, "Clear"); + { btnClearComposer = new Fl_Button(81, 278, 70, 20, "Clear"); btnClearComposer->tooltip("Clear all fields"); btnClearComposer->callback((Fl_Callback*)cb_btnClearComposer); } // Fl_Button* btnClearComposer - { new Fl_Box(152, 251, 5, 20); + { new Fl_Box(152, 278, 5, 20); } // Fl_Box* o - { btnUseTemplate = new Fl_Button(159, 251, 70, 20, "Template"); + { btnUseTemplate = new Fl_Button(159, 278, 70, 20, "Template"); btnUseTemplate->tooltip("Use template file"); btnUseTemplate->callback((Fl_Callback*)cb_btnUseTemplate); } // Fl_Button* btnUseTemplate - { Fl_Box* o = new Fl_Box(230, 251, 127, 20); + { Fl_Box* o = new Fl_Box(230, 278, 127, 20); Fl_Group::current()->resizable(o); } // Fl_Box* o - { btnCancelComposedMail = new Fl_Button(358, 251, 70, 20, "Cancel"); + { btnCancelComposedMail = new Fl_Button(358, 278, 70, 20, "Cancel"); btnCancelComposedMail->tooltip("Close Dialog"); btnCancelComposedMail->callback((Fl_Callback*)cb_btnCancelComposedMail); } // Fl_Button* btnCancelComposedMail - { new Fl_Box(429, 251, 5, 20); + { new Fl_Box(429, 278, 5, 20); } // Fl_Box* o - { btnSaveComposedMail = new Fl_Button(436, 251, 70, 20, "Save"); + { btnSaveComposedMail = new Fl_Button(436, 278, 70, 20, "Save"); btnSaveComposedMail->tooltip("Save this message (shift click Save Template)"); btnSaveComposedMail->callback((Fl_Callback*)cb_btnSaveComposedMail); } // Fl_Button* btnSaveComposedMail o->end(); - } // Fl_Pack* o + } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; diff --git a/src/flarq-src/arqdialogs.fl b/src/flarq-src/arqdialogs.fl index 8ec715e9..cc383fcf 100644 --- a/src/flarq-src/arqdialogs.fl +++ b/src/flarq-src/arqdialogs.fl @@ -1,5 +1,5 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0304 +version 1.0305 header_name {.h} code_name {.cxx} decl {\#include } {private local @@ -20,12 +20,11 @@ decl {\#include "flslider2.h"} {public local decl {\#include "combo.h"} {public local } -Function {arq_dialog()} {open -} { +Function {arq_dialog()} {} { Fl_Window {} { label flarq - callback {arqCLOSE();} - xywh {825 38 515 415} type Double color 50 resizable visible + callback {arqCLOSE();} open + xywh {848 29 515 415} type Double color 50 resizable visible } { Fl_Menu_Bar mnu {open xywh {0 0 516 22} @@ -142,6 +141,8 @@ Function {arq_dialog()} {open } Fl_Text_Display txtARQ { xywh {0 87 515 117} box DOWN_BOX textfont 4 resizable + code0 {\#include "FTextView.h"} + class FTextView } Fl_Group {} {open xywh {0 206 516 26} box DOWN_BOX @@ -173,6 +174,7 @@ Function {arq_dialog()} {open } { Fl_Text_Display txtRX { xywh {5 255 505 130} box DOWN_BOX textfont 4 resizable + class FTextView } Fl_Group {} {open xywh {0 387 515 28} box ENGRAVED_FRAME @@ -199,26 +201,26 @@ Function {arq_configure()} {open } { Fl_Window {} { label {Configure flarq} open - xywh {741 499 480 190} type Double resizable visible + xywh {658 503 480 190} type Double resizable visible } { Fl_Input txtMyCall { label {My Call:} callback {changeMyCall(o->value());} - xywh {98 13 150 24} + xywh {98 13 150 22} code0 {o->value(MyCall.c_str());} class Fl_Input2 } Fl_Input txtBEACONTXT { label {Beacon Text} callback {changeBeaconText(o->value());} - tooltip {Text for the beacon 64 chars max} xywh {98 42 370 24} resizable + tooltip {Text for the beacon 64 chars max} xywh {98 42 370 22} resizable code0 {o->value(beacontext.c_str());} class Fl_Input2 } Fl_Spinner spnRetries { label {Retries:} callback {iretries = (int)o->value(); -cbSetConfig();} selected +cbSetConfig();} tooltip {\# retries before connection declared down} xywh {146 71 45 22} code0 {o->minimum(2);} code1 {o->maximum(20);} @@ -252,7 +254,7 @@ cbSetConfig();} label {Tx delay (msec):} callback {txdelay = (int)o->value(); cbSetConfig();} - tooltip {delay from Rx to Tx} xywh {317 98 70 22} + tooltip {delay from Rx to Tx} xywh {317 126 70 22} code0 {o->minimum(200);} code1 {o->maximum(2000);} code2 {o->step(100);} @@ -273,7 +275,7 @@ cbSetConfig();} label {ID timer (min):} callback {idtimer = (int)(o->value()); cb_idtimer();} - tooltip {ID timer\\n0 = disable} xywh {121 155 70 22} minimum 0 maximum 10 + tooltip {ID timer\\n0 = disable} xywh {121 155 70 22} minimum 0 maximum 10 value 10 code0 {o->minimum(0);} code1 {o->maximum(10);} code2 {o->step(1);} @@ -283,8 +285,8 @@ cb_idtimer();} Fl_Group choiceBlockSize { label {Block Size:} callback {exponent = (int)o->index() + 4; -cbSetConfig();} open - xywh {314 126 72 24} box DOWN_BOX color 7 align 4 +cbSetConfig();} open selected + xywh {314 155 72 22} box DOWN_BOX color 7 align 4 class Fl_ComboBox } {} Fl_Button btnOK { @@ -292,6 +294,13 @@ cbSetConfig();} open callback {closeConfig();} xywh {406 154 62 24} } + Fl_Check_Button btn_restart_beacon { + label {Restart Beacon} + callback {restart_beacon = (int)(o->value()); +cbSetConfig();} + tooltip {Restart beacon after disconnect} xywh {448 101 20 20} down_box DOWN_BOX align 4 + code0 {o->value(restart_beacon);} + } } } @@ -323,64 +332,71 @@ Function {arq_SendSelect()} {} { Function {arq_composer()} {} { Fl_Window {} { label {Flarq Mail Composer} open - xywh {575 537 515 275} type Double hide resizable + xywh {848 430 515 300} type Double hide resizable } { + Fl_Input inpMailFrom { + label From + xywh {47 5 460 24} + class Fl_Input2 + } Fl_Input inpMailTo { - label {To:} - xywh {48 4 460 24} + label To + xywh {48 32 460 24} class Fl_Input2 } Fl_Input inpMailSubj { - label {Subj:} - xywh {48 30 460 24} + label Subj + xywh {48 59 460 24} class Fl_Input2 } Fl_Text_Editor txtMailText { - xywh {0 56 510 188} resizable + xywh {0 85 510 188} textfont 4 resizable + code0 {\#include "F_Edit.h"} + class F_Edit } - Fl_Pack {} {open - xywh {0 247 515 28} type HORIZONTAL + Fl_Group {} {open + xywh {0 274 515 28} } { Fl_Button btnOpenComposedMail { label Open callback {cb_OpenComposeMail();} - tooltip {Open existing Composed email} xywh {4 251 70 20} + tooltip {Open existing Composed email} xywh {4 278 70 20} code0 {extern void cb_OpenComposeMail();} } Fl_Box {} { - xywh {75 251 5 20} + xywh {75 278 5 20} } Fl_Button btnClearComposer { label Clear callback {cb_ClearComposer();} - tooltip {Clear all fields} xywh {81 251 70 20} + tooltip {Clear all fields} xywh {81 278 70 20} code0 {extern void cb_ClearComposer();} } Fl_Box {} { - xywh {152 251 5 20} + xywh {152 278 5 20} } Fl_Button btnUseTemplate { label Template callback {cb_UseTemplate();} - tooltip {Use template file} xywh {159 251 70 20} + tooltip {Use template file} xywh {159 278 70 20} code0 {extern void cb_UseTemplate();} } Fl_Box {} { - xywh {230 251 127 20} resizable + xywh {230 278 127 20} resizable } Fl_Button btnCancelComposedMail { label Cancel callback {cb_CancelComposeMail();} - tooltip {Close Dialog} xywh {358 251 70 20} + tooltip {Close Dialog} xywh {358 278 70 20} code0 {extern void cb_CancelComposeMail();} } Fl_Box {} { - xywh {429 251 5 20} + xywh {429 278 5 20} } Fl_Button btnSaveComposedMail { label Save callback {cb_SaveComposeMail();} - tooltip {Save this message (shift click Save Template)} xywh {436 251 70 20} + tooltip {Save this message (shift click Save Template)} xywh {436 278 70 20} code0 {extern void cb_SaveComposeMail();} } } diff --git a/src/flarq-src/flarq.cxx b/src/flarq-src/flarq.cxx index 17b8d7e2..bbc746da 100644 --- a/src/flarq-src/flarq.cxx +++ b/src/flarq-src/flarq.cxx @@ -79,6 +79,8 @@ #include "xml_server.h" +#include "FTextView.h" + #define FLDIGI_port "7322" #define MPSK_port "3122" @@ -128,19 +130,9 @@ bool SHOWDEBUG = false; extern void STATUSprint(string s); -Fl_Text_Buffer *txtbuffARQ; -Fl_Text_Buffer *stylebufARQ; -Fl_Text_Buffer *txtbuffRX; -Fl_Text_Buffer *stylebufRX; -Fl_Text_Buffer *txtbuffComposer; -//Fl_Text_Buffer *styleComposer; - -Fl_Text_Display::Style_Table_Entry styletable[] = { // Style table - { FL_BLACK, FL_SCREEN, FL_NORMAL_SIZE }, // A - RX - { FL_DARK_RED, FL_SCREEN, FL_NORMAL_SIZE }, // B - TX - { FL_DARK_GREEN, FL_SCREEN, FL_NORMAL_SIZE }, // C - DEBUG rx text - { FL_MAGENTA, FL_SCREEN, FL_NORMAL_SIZE } // D - DEBUG tx text -}; +Fl_Text_Buffer_mod *txtbuffARQ; +Fl_Text_Buffer_mod *txtbuffRX; +Fl_Text_Buffer_mod *txtbuffComposer; Fl_Double_Window *arqwin = 0; Fl_Double_Window *dlgconfig = 0; @@ -194,8 +186,10 @@ long itimeout = 60000; int idtimer = 10; int bcnInterval = 30; -bool autobeacon = false; +enum {OFF, ON, WAIT}; +int autobeacon = OFF; bool beaconrcvd = false; +bool restart_beacon = false; int blocksSent = 0; @@ -411,14 +405,25 @@ void readComposedFile(string filename) char szline[10000]; string fline, tempstr; size_t p; - txtbuffComposer->text(""); + txtMailText->clear(); + inpMailFrom->value(""); + inpMailTo->value(""); + inpMailSubj->value(""); while (!textfile.eof()) { memset(szline,0, 10000); textfile.getline(szline,10000); fline = szline; - if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) continue; - if ((p = fline.find("Date: ")) != string::npos) continue; - if ((p = fline.find("From:")) != string::npos) continue; + if ((p = fline.find("//FLARQ COMPOSER")) != string::npos) + continue; + if ((p = fline.find("Date: ")) != string::npos) + continue; + if ((p = fline.find("Content-Type:")) != string::npos) + continue; + if ((p = fline.find("From: ")) != string::npos) { + tempstr = fline.substr(p + 6); + inpMailFrom->value(tempstr.c_str()); + continue; + } if ((p = fline.find("To: ")) != string::npos) { tempstr = fline.substr(p + 4); p = tempstr.find("<"); @@ -433,8 +438,8 @@ void readComposedFile(string filename) continue; } if (strlen(szline) == 0 && txtbuffComposer->length() == 0) continue; - txtbuffComposer->append(szline); - txtbuffComposer->append("\n"); + txtMailText->add(szline); + txtMailText->add("\n"); } textfile.close(); } @@ -452,7 +457,8 @@ void cb_UseTemplate() void cb_ClearComposer() { sendfilename.clear(); - txtbuffComposer->text(""); + txtMailText->clear(); + inpMailFrom->value(""); inpMailTo->value(""); inpMailSubj->value(""); } @@ -499,10 +505,12 @@ void saveComposedText(string filename) struct tm *gmt = gmtime(&maildt); strftime(szmaildt, sizeof(szmaildt), "%x %X", gmt); textfile << "Date: " << szmaildt << endl; + textfile << "From: " << inpMailFrom->value() << endl; textfile << "To: " << inpMailTo->value() << endl; - textfile << "From: " << endl; textfile << "Subject: " << inpMailSubj->value() << endl; - textfile << endl << txtbuffComposer->text() << endl; + textfile << "Content-Type: text/plain; charset=\"UTF-8\"" << endl; + textfile << endl; + textfile << txtbuffComposer->text() << endl; textfile.close(); cb_ClearComposer(); } @@ -552,11 +560,11 @@ void ComposeMail() if (composer == 0) { composer = arq_composer(); composer->xclass(PACKAGE_TARNAME); - txtbuffComposer = new Fl_Text_Buffer(); - txtMailText->buffer(txtbuffComposer); + txtbuffComposer = txtMailText->buffer(); txtMailText->wrap_mode(1,80); } txtbuffComposer->text(""); + inpMailFrom->value(""); inpMailTo->value(""); inpMailSubj->value(""); @@ -580,7 +588,7 @@ void createAsciiChars() AsciiChars += 0x09; // tab AsciiChars += 0x0A; // lf AsciiChars += 0x0D; // cr - for (int n = 20; n < 128; n++) AsciiChars += n; + for (int n = 20; n < 256; n++) AsciiChars += n; } void initVals() @@ -637,6 +645,8 @@ void readConfig() configfile.ignore(); configfile.getline(tempstr, 200); beacontext = tempstr; + configfile >> restart_beacon; + digi_arq->myCall(MyCall.c_str()); digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); @@ -673,6 +683,7 @@ void saveConfig() configfile << mainW << endl; configfile << mainH << endl; configfile << beacontext.c_str() << endl; + configfile << restart_beacon << endl; configfile.close(); } } @@ -891,7 +902,7 @@ char bcnMsg[40]; void arqAutoBeacon(void *) { - if (autobeacon == true) { + if (autobeacon == ON) { int currstate = digi_arq->state(); btnCONNECT->deactivate(); btnCONNECT->redraw(); @@ -926,7 +937,7 @@ void arqAutoBeacon(void *) btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } - } else { + } else if (autobeacon == OFF) { autobeaconcounter = 0; btnCONNECT->activate(); btnCONNECT->redraw(); @@ -936,16 +947,22 @@ void arqAutoBeacon(void *) btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); + } else { // autobeacon == WAIT + btnBEACON->deactivate(); + btnBEACON->redraw(); + Fl::repeat_timeout(1.0, arqAutoBeacon); } } void arqBEACON() { - if (autobeacon == false) { - autobeacon = true; + if (autobeacon != ON) { + autobeacon = ON; + btnBEACON->value(1); Fl::add_timeout(0.01, arqAutoBeacon); } else { - autobeacon = false; + autobeacon = OFF; + btnBEACON->value(0); } } @@ -1107,10 +1124,7 @@ void payloadText(string s) { static char szPercent[10]; string text = noCR(s); - string style; - style.append(text.length(), 'A'); - stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); @@ -1278,11 +1292,15 @@ void sendEmailFile() TX.append(sendfilename.substr(p)); TX.append("\n"); TX.append(arqemail); - while (textfile.get(cin)) + // only allow ASCII printable characters - if ((cin >= ' ' && cin <= '~') || - (cin == 0x09 || (cin == 0x0a) || cin == 0x0d) ) - textin += cin; + while (textfile.get(cin)) textin += (cin & 0xFF); + textfile.close(); + if ( textin.find_first_not_of(AsciiChars) != string::npos) { + fl_alert2("File contains non-ASCII bytes and must be sent as binary."); + return; + } + textfile.close(); txtsize = textin.length(); arqPayloadSize = txtsize; @@ -1332,13 +1350,14 @@ void sendAsciiFile() TX.append(p); TX.append("\n"); TX.append(arqascii); - while (textfile.get(cin)) - textin += cin; + + while (textfile.get(cin)) textin += (cin & 0xFF); textfile.close(); if ( textin.find_first_not_of(AsciiChars) != string::npos) { fl_alert2("File contains non-ASCII bytes and must be sent as binary."); return; } + txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; @@ -1367,7 +1386,7 @@ void sendImageFile() fl_alert2("Not connected"); return; } - const char *p = FSEL::select("ARQ image file", "*.{png,jpg,bmp}\t*", ""); + const char *p = FSEL::select(_("ARQ image file"), "Images\t*.{png,jpg,bmp}", ""); char cin; size_t b64size; string textin = ""; @@ -1496,89 +1515,103 @@ void send_xml_text(std::string fname, std::string txt) sendingfile = false; } -char statemsg[80]; +static char statemsg[80]; void dispState() { + static int last_state = DOWN; int currstate = digi_arq->state(); static char xfrmsg[80]; static char szPercent[10]; arqstate = currstate & 0x7F; - - if (arqstate == DOWN || arqstate == TIMEDOUT) { - if (btnCONNECT->active()) - btnCONNECT->label("Connect"); - if (!autobeacon) + if (last_state != currstate) { + last_state = currstate; + if (arqstate == DOWN || arqstate == TIMEDOUT) { + if (btnCONNECT->active()) { + btnCONNECT->label("Connect"); + } btnBEACON->activate(); -// mnuSend->deactivate(); - mnu->redraw(); - } - else if (arqstate == ARQ_CONNECTED || arqstate == WAITING) { - if (btnCONNECT->active()) - btnCONNECT->label("Disconnect"); - if (!autobeacon) - btnBEACON->deactivate(); - mnuSend->activate(); - mnu->redraw(); - } - if (rxARQfile || sendingfile) { + mnu->redraw(); + } + else if (arqstate == ARQ_CONNECTED || arqstate == WAITING) { + if (btnCONNECT->active()) + btnCONNECT->label("Disconnect"); + if (!autobeacon) + btnBEACON->deactivate(); + mnuSend->activate(); + mnu->redraw(); + } + if (rxARQfile || sendingfile) { + if (btnCONNECT->active()) + btnCONNECT->label("Abort"); + } if (btnCONNECT->active()) - btnCONNECT->label("Abort"); - } - if (btnCONNECT->active()) - btnCONNECT->redraw_label(); - - if (currstate <= 0x7F) // receiving - switch (currstate) { - case ARQ_CONNECTING : - snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); - txtState->value(statemsg); - txtState->redraw(); - autobeacon = false; - break; - case WAITFORACK : - snprintf(statemsg, sizeof(statemsg), "WAITING FOR ACK "); - txtState->value(statemsg); - txtState->redraw(); - autobeacon = false; - break; - case ABORT: - case ABORTING : - txtState->value("ABORTING XFR"); - txtState->redraw(); - autobeacon = false; - break; - case WAITING : - case ARQ_CONNECTED : - char szState[80]; - snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", - digi_arq->quality()); - indCONNECT->color(FL_GREEN); - indCONNECT->redraw(); - txtState->value(szState); - txtURCALL->value( digi_arq->urCall().c_str() ); - autobeacon = false; - break; - case TIMEDOUT : - indCONNECT->color(FL_WHITE); - indCONNECT->redraw(); - txtState->value("TIMED OUT"); - txtStatus->value(""); - autobeacon = false; - beaconrcvd = false; - break; - case DISCONNECT: - case DISCONNECTING: - txtState->value("DISCONNECTING"); - break; - case DOWN : - default : - indCONNECT->color(FL_WHITE); - indCONNECT->redraw(); - txtState->value("NOT CONNECTED"); - txtStatus->value(""); + btnCONNECT->redraw_label(); + + if (currstate <= 0x7F) { // receiving + switch (currstate) { + case ARQ_CONNECTING : + snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); + txtState->value(statemsg); + txtState->redraw(); + autobeacon = WAIT; + break; + case WAITFORACK : + snprintf(statemsg, sizeof(statemsg), "WAITING FOR ACK "); + txtState->value(statemsg); + txtState->redraw(); + autobeacon = WAIT; + break; + case ABORT: + case ABORTING : + txtState->value("ABORTING XFR"); + txtState->redraw(); + autobeacon = WAIT; + break; + case WAITING : + case ARQ_CONNECTED : + char szState[80]; + snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", + digi_arq->quality()); + indCONNECT->color(FL_GREEN); + indCONNECT->redraw(); + txtBeaconing->value(""); + txtState->value(szState); + txtURCALL->value( digi_arq->urCall().c_str() ); + autobeacon = WAIT; + break; + case TIMEDOUT : + indCONNECT->color(FL_WHITE); + indCONNECT->redraw(); + txtState->value("TIMED OUT"); + txtStatus->value(""); + if (restart_beacon && autobeacon != ON) { + autobeacon = ON; + Fl::remove_timeout(arqAutoBeacon); + Fl::add_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); + } + beaconrcvd = false; + break; + case DISCONNECT: + case DISCONNECTING: + txtState->value("DISCONNECTING"); + break; + case DOWN : + default : + if (autobeacon != ON && restart_beacon) { + btnBEACON->activate(); + Fl::remove_timeout(arqAutoBeacon); + Fl::add_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); + } + indCONNECT->color(FL_WHITE); + indCONNECT->redraw(); + autobeacon = ON; + txtState->value("NOT CONNECTED"); + txtStatus->value(""); + } } + } if (sendingfile == true) { if (digi_arq->transferComplete()) { @@ -1671,9 +1704,6 @@ void changeBeaconText(const char *txt) void TALKprint(string s) { - string style; - style.append(s.length(), 'A'); - stylebufRX->append(style.c_str()); txtRX->insert(s.c_str()); txtRX->show_insert_position(); txtRX->redraw(); @@ -1697,14 +1727,11 @@ void STATUSprint(string s, double disptime) void cbSendTalk() { string tosend; - string style; tosend = txtTX->value(); if (tosend.empty()) return; tosend += '\n'; digi_arq->sendPlainText(tosend); txtTX->value(""); - style.append(tosend.length(), 'B'); - stylebufRX->append(style.c_str()); txtRX->insert(tosend.c_str()); txtRX->show_insert_position(); txtRX->redraw(); @@ -1733,10 +1760,7 @@ void arqlog(string nom,string s) void DEBUGrxprint(string s) { - string style; string text = noCR(s); - style.append(text.length(), 'C'); - stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); @@ -1745,10 +1769,7 @@ void DEBUGrxprint(string s) void DEBUGtxprint(string s) { - string style; string text = noCR(s); - style.append(text.length(), 'D'); - stylebufRX->append(style.c_str()); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); @@ -1757,11 +1778,8 @@ void DEBUGtxprint(string s) void TXecho(string s) { - string style; blocksSent += s.length(); string text = noCR(s); - style.append(text.length(), 'B'); - stylebufARQ->append(style.c_str()); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); @@ -1774,7 +1792,6 @@ void style_unfinished_cb(int, void*) { void cbClearTalk() { txtbuffRX->text(""); - stylebufRX->text(""); } void cb_arqwin(Fl_Widget *, void*) @@ -1865,21 +1882,11 @@ int main (int argc, char *argv[] ) menu_mnu[i].labelsize(FL_NORMAL_SIZE); - txtbuffRX = new Fl_Text_Buffer(); - txtRX->buffer(txtbuffRX); + txtbuffRX = txtRX->buffer(); txtRX->wrap_mode(1,80); - stylebufRX = new Fl_Text_Buffer(); - txtRX->highlight_data(stylebufRX, styletable, - sizeof(styletable) / sizeof(styletable[0]), - 'A', style_unfinished_cb, 0); - txtbuffARQ = new Fl_Text_Buffer(); - txtARQ->buffer(txtbuffARQ); + txtbuffARQ = txtARQ->buffer(); txtARQ->wrap_mode(1,80); - stylebufARQ = new Fl_Text_Buffer(); - txtARQ->highlight_data(stylebufARQ, styletable, - sizeof(styletable) / sizeof(styletable[0]), - 'A', style_unfinished_cb, 0); digi_arq = new arq(); @@ -2043,7 +2050,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 } diff --git a/src/flarq-src/include/arqdialogs.h b/src/flarq-src/include/arqdialogs.h index 849e834c..3f5a29a8 100644 --- a/src/flarq-src/include/arqdialogs.h +++ b/src/flarq-src/include/arqdialogs.h @@ -22,14 +22,14 @@ extern Fl_Input2 *txtBeaconing; #include extern Fl_Box *indCONNECT; extern Fl_Input2 *txtState; -#include -extern Fl_Text_Display *txtARQ; +#include "FTextView.h" +extern FTextView *txtARQ; extern Fl_Input2 *txtStatus; extern Fl_Input2 *txtStatus2; #include extern Fl_Progress *prgStatus; extern Fl_Button *btnClearText; -extern Fl_Text_Display *txtRX; +extern FTextView *txtRX; extern Fl_Input2 *txtTX; extern Fl_Button *btnSendTalk; Fl_Double_Window* arq_dialog(); @@ -56,6 +56,8 @@ extern Fl_Spinner2 *spnBcnInterval; extern Fl_Spinner2 *spnIDtimer; extern Fl_ComboBox *choiceBlockSize; extern Fl_Button *btnOK; +#include +extern Fl_Check_Button *btn_restart_beacon; Fl_Double_Window* arq_configure(); #include "table.h" extern Table *tblOutgoing; @@ -65,11 +67,11 @@ extern Fl_Button *send_Cancel; extern void sendOK(); extern Fl_Return_Button *send_OK; Fl_Double_Window* arq_SendSelect(); +extern Fl_Input2 *inpMailFrom; extern Fl_Input2 *inpMailTo; extern Fl_Input2 *inpMailSubj; -#include -extern Fl_Text_Editor *txtMailText; -#include +#include "F_Edit.h" +extern F_Edit *txtMailText; extern void cb_OpenComposeMail(); extern Fl_Button *btnOpenComposedMail; extern void cb_ClearComposer(); diff --git a/src/flarq-src/include/flarq.h b/src/flarq-src/include/flarq.h index 5359c6bf..93e51181 100644 --- a/src/flarq-src/include/flarq.h +++ b/src/flarq-src/include/flarq.h @@ -66,6 +66,7 @@ extern long iwaittime; extern long itimeout; extern int bcnInterval; extern int idtimer; +extern bool restart_beacon; extern void cb_idtimer(); diff --git a/src/fsq/fsq.cxx b/src/fsq/fsq.cxx index b1d17c8d..2b2a0a62 100644 --- a/src/fsq/fsq.cxx +++ b/src/fsq/fsq.cxx @@ -1291,7 +1291,9 @@ int fsq::rx_process(const double *buf, int len) memmove(rx_stream, // to &rx_stream[SHIFT_SIZE], // from BLOCK_SIZE*sizeof(*rx_stream)); // # bytes - memset(fft_data, 0, sizeof(fft_data)); + // fft_data gets overwritten each time with a fixed number of + // elements. Do we need to zero it out? + //memset(fft_data, 0, sizeof(fft_data)); for (int i = 0; i < BLOCK_SIZE; i++) { double d = rx_stream[i] * a_blackman[i]; fft_data[i] = cmplx(d, d); diff --git a/src/globals/globals.cxx b/src/globals/globals.cxx index c0a9a98e..559fda48 100644 --- a/src/globals/globals.cxx +++ b/src/globals/globals.cxx @@ -49,7 +49,7 @@ using namespace std; //struc entries: // mode, **modem, *sname, *name, *pskmail_name, *adif_name, *export_mode, *export_submode, *vid_name, iface_io - +// *** DO NOT PUT A '/' in the name string const struct mode_info_t mode_info[NUM_MODES] = { {MODE_NULL,&null_modem,"NULL","NULL","","NULL","","","", DISABLED_IO }, @@ -95,8 +95,8 @@ const struct mode_info_t mode_info[NUM_MODES] = { {MODE_SLOWHELL,&feld_slowmodem,"SLOWHELL","Slow Hell","","HELL","HELL","","SHLL", DISABLED_IO }, {MODE_HELLX5,&feld_x5modem,"HELLX5","Feld Hell X5","","HELL","HELL","","HLX5", DISABLED_IO }, {MODE_HELLX9,&feld_x9modem,"HELLX9","Feld Hell X9","","HELL","HELL","","HLX9", DISABLED_IO }, -{MODE_FSKHELL,&feld_FMmodem,"FSKHELL","FSK Hell","","FSKHELL","HELL","FSKHELL","FSKHL", DISABLED_IO }, -{MODE_FSKH105,&feld_FM105modem,"FSKH105","FSK Hell-105","","FMHELL","HELL","FMHELL","H105", DISABLED_IO }, +{MODE_FSKH245,&feld_FMmodem,"FSKH245","FSK Hell-245","","FSKH245","HELL","FSKH245","FSKHL", DISABLED_IO }, +{MODE_FSKH105,&feld_FM105modem,"FSKH105","FSK Hell-105","","FSKH105","HELL","FSKH105","H105", DISABLED_IO }, {MODE_HELL80,&feld_80modem,"HELL80","Hell 80","","HELL80","HELL","HELL80","HL80", DISABLED_IO }, {MODE_MFSK8,&mfsk8_modem,"MFSK8","MFSK-8","MFSK8","MFSK8","MFSK","MFSK8","MK 8", DISABLED_IO }, @@ -174,7 +174,7 @@ const struct mode_info_t mode_info[NUM_MODES] = { {MODE_OLIVIA_16_500,&olivia_16_500_modem,"OLIVIA-16/500","OL 16-500","OLIV 16-500","OLIVIA 16/500","OLIVIA","OLIVIA 16/500","OL16/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_1000,&olivia_16_1000_modem,"OLIVIA-16/1K","OL 16-1K","OLIV 16-1K","OLIVIA 16/1K","OLIVIA","OLIVIA 16/1K","OL16/1K", ARQ_IO | KISS_IO }, -{MODE_OLIVIA_16_1000,&olivia_16_2000_modem,"OLIVIA-16/2K","OL 16-2K","OLIV 16-2K","OLIVIA 16/2K","OLIVIA","OLIVIA 16/2K","OL16/2K", ARQ_IO | KISS_IO }, +{MODE_OLIVIA_16_2000,&olivia_16_2000_modem,"OLIVIA-16/2K","OL 16-2K","OLIV 16-2K","OLIVIA 16/2K","OLIVIA","OLIVIA 16/2K","OL16/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_1000,&olivia_32_1000_modem,"OLIVIA-32/1K","OL 32-1K","OLIV 32-1K","OLIVIA 32/1K","OLIVIA","OLIVIA 32/1K","OL32/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_2000,&olivia_32_2000_modem,"OLIVIA-32/2K","OL 32-2K","OLIV 32-2K","OLIVIA 32/2K","OLIVIA","OLIVIA 32/2K","OL32/2K", ARQ_IO | KISS_IO }, diff --git a/src/include/F_Edit.h b/src/include/F_Edit.h new file mode 100644 index 00000000..f77e742b --- /dev/null +++ b/src/include/F_Edit.h @@ -0,0 +1,82 @@ +// ---------------------------------------------------------------------------- +// FTextView.h +// +// Copyright (C) 2007-2009 +// Stelios Bounanos, M0GLD +// +// This file is part of fldigi. +// +// fldigi is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// ---------------------------------------------------------------------------- + +#ifndef F_EDIT_H_ +#define F_EDIT_H_ + +#include +#include + +#include +#include +#include +#include + +#include "FTextView.h" + +/// A FTextBase subclass to display and edit text + +class F_Edit : public FTextEdit +{ +public: + F_Edit(int x, int y, int w, int h, const char *l = 0); + + virtual int handle(int event); + + void clear(void); + void add_text(std::string s); + + void setFont(Fl_Font f, int attr = NATTR); + +protected: + enum { + EDIT_MENU_CUT, EDIT_MENU_COPY, EDIT_MENU_PASTE, + EDIT_MENU_CLEAR, EDIT_MENU_READ, EDIT_MENU_WRAP + }; + int handle_key(int key); + int handle_dnd_drag(int pos); + void handle_context_menu(void); + void menu_cb(size_t item); + void change_keybindings(void); + static int kf_default(int c, Fl_Text_Editor_mod* e); + static int kf_enter(int c, Fl_Text_Editor_mod* e); + static int kf_delete(int c, Fl_Text_Editor_mod* e); + static int kf_cut(int c, Fl_Text_Editor_mod* e); + static int kf_paste(int c, Fl_Text_Editor_mod* e); + +private: + F_Edit(); + F_Edit(const F_Edit &t); + +protected: + static Fl_Menu_Item menu[]; + int editpos; + int bkspaces; + static int *p_editpos; +}; + +#endif // F_EDIT_H_ + +// Local Variables: +// mode: c++ +// c-file-style: "linux" +// End: diff --git a/src/include/FreqControl.h b/src/include/FreqControl.h index 8e034589..b3013e48 100644 --- a/src/include/FreqControl.h +++ b/src/include/FreqControl.h @@ -60,9 +60,9 @@ public: cFreqControl(int x, int y, int w, int h, const char *lbl = "9"); ~cFreqControl(); void updatevalue(); - void value(long lv); - long value(){return val;}; - long int maximum(void); + void value(unsigned long int lv); + unsigned long int value() {return val;}; + unsigned long int maximum(void); void font(Fl_Font fnt); void SetONCOLOR (uchar r, uchar g, uchar b); void SetOFFCOLOR (uchar r, uchar g, uchar b); @@ -122,7 +122,7 @@ private: Fl_Repeat_Button *Digit[MAX_DIGITS]; Fl_Float_Input *finp; static const char *Label[]; - long int mult[MAX_DIGITS]; + unsigned long int mult[MAX_DIGITS]; Fl_Box *decbx; Fl_Box *hfill1; Fl_Box *hfill2; @@ -135,8 +135,8 @@ private: Fl_Color REVOFFCOLOR; int nD; //int active; - long int maxVal; - long int minVal; + unsigned long int maxVal; + unsigned long int minVal; int pw; // decimal width int wfill; @@ -153,7 +153,7 @@ private: void cancel_kb_entry(void); protected: - long int val, oldval; + unsigned long int val, oldval; int precision; int dpoint; diff --git a/src/include/analysis.h b/src/include/analysis.h index 8bb1c21e..930616f4 100644 --- a/src/include/analysis.h +++ b/src/include/analysis.h @@ -60,6 +60,7 @@ private: long int wf_freq; double dspcnt; long int passno; + int rxcorr; struct timespec start_time; struct tm File_Start_Date; diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 7c95ecbb..d9d11a59 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -821,6 +821,7 @@ extern Fl_ListBox *menuSampleConverter; extern Fl_Spinner2 *cntRxRateCorr; extern Fl_Spinner2 *cntTxRateCorr; extern Fl_Spinner2 *cntTxOffset; +extern Fl_Counter *cntRIT; extern Fl_ListBox *listbox_wav_samplerate; extern Fl_Check_Button *btn_record_both; extern Fl_Spinner2 *cntChannels; diff --git a/src/include/configuration.h b/src/include/configuration.h index a9f54c84..c788cfcf 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -570,9 +570,9 @@ ELEM_(double, HELL_BW_SH, "HELL_BW2", "Slow Hell bandwidth", 30.0) \ ELEM_(double, HELL_BW_X5, "HELL_BW3", "X5 Hell bandwidth", 1225.) \ ELEM_(double, HELL_BW_X9, "HELL_BW4", "X9 Hell bandwidth", 2205.0) \ - ELEM_(double, HELL_BW_FSK, "HELL_BW5", "FSK Hell bandwidth", 180.0) \ - ELEM_(double, HELL_BW_FSK105, "HELL_BW6", "FSK105 Hell bandwidth", 100.0) \ - ELEM_(double, HELL_BW_HELL80, "HELL_BW7", "HELL80 bandwidth", 450.0) \ + ELEM_(double, HELL_BW_FSKH245, "HELL_BW5", "FSKH-245 bandwidth", 250.0) \ + ELEM_(double, HELL_BW_FSKH105, "HELL_BW6", "FSKH-105 Hell bandwidth", 120.0) \ + ELEM_(double, HELL_BW_HELL80, "HELL_BW7", "HELL-80 bandwidth", 450.0) \ ELEM_(int, HellRcvWidth, "HELLRCVWIDTH", \ "Horizontal size multiplier for each hell character, 1, 2, or 3", \ 2) \ @@ -1581,6 +1581,9 @@ ELEM_(int, TxOffset, "TXOFFSET", \ "Difference between RX and TX freq (rig offset)", \ 0) \ + ELEM_(double, RIT, "RIT", \ + "Linear frequency correction applied to frequency analysis", \ + 0) \ ELEM_(int, wavSampleRate, "WAV_SAMPLERATE", \ "Wave file record sample rate\n" \ "0 - 8000, 1 - 11025, 2 - 16000, 3 - 22050\n" \ diff --git a/src/include/fd_view.h b/src/include/fd_view.h index a1c37c27..d6bfa751 100644 --- a/src/include/fd_view.h +++ b/src/include/fd_view.h @@ -10,13 +10,13 @@ extern Fl_Output *view_FD_class; extern Fl_Output *view_FD_section; extern Fl_Output *view_FD_mult; extern Fl_Output *view_FD_score; -#include extern Fl_Output *view_FD_CW[12]; extern Fl_Output *view_FD_CW_OP[12]; extern Fl_Output *view_FD_DIG[12]; extern Fl_Output *view_FD_DIG_OP[12]; extern Fl_Output *view_FD_PHONE[12]; extern Fl_Output *view_FD_PHONE_OP[12]; +#include #include #include "flinput2.h" extern Fl_Input2 *inp_fd_tcpip_addr; diff --git a/src/include/feld.h b/src/include/feld.h index b05b2827..f2e0208f 100644 --- a/src/include/feld.h +++ b/src/include/feld.h @@ -62,7 +62,7 @@ protected: double phi2freq; C_FIR_filter *hilbert; - fftfilt *bpfilt; + fftfilt *lpfilt; Cmovavg *bbfilt; Cmovavg *minmaxfilt; Cmovavg *average; @@ -92,7 +92,7 @@ protected: cmplx mixer(cmplx); double nco(double); void rx(cmplx); - void FSKHELL_rx(cmplx); + void FSKH_rx(cmplx); void send_symbol(int currsymbol, int nextsymbol); void send_null_column(); void tx_char(char); diff --git a/src/include/globals.h b/src/include/globals.h index a7fe296e..ff4fb8cd 100644 --- a/src/include/globals.h +++ b/src/include/globals.h @@ -91,7 +91,7 @@ enum { MODE_SLOWHELL, MODE_HELLX5, MODE_HELLX9, - MODE_FSKHELL, + MODE_FSKH245, MODE_FSKH105, MODE_HELL80, MODE_HELL_FIRST = MODE_FELDHELL, diff --git a/src/include/qrunner.h b/src/include/qrunner.h index 36159e61..2350c2a8 100644 --- a/src/include/qrunner.h +++ b/src/include/qrunner.h @@ -56,6 +56,7 @@ extern void qrunner_debug(int tid, const char * name); extern const char *sztid[]; #ifndef __MINGW32__ +typedef int SOCKET; # define QRUNNER_READ(fd__, buf__, len__) read(fd__, buf__, len__) # define QRUNNER_WRITE(fd__, buf__, len__) write(fd__, buf__, len__) #else @@ -167,7 +168,7 @@ public: protected: fqueue *fifo; - int pfd[2]; + SOCKET pfd[2]; bool attached; int _id_no; std::string _id_string; diff --git a/src/include/rigsupport.h b/src/include/rigsupport.h index 5af07872..467de103 100644 --- a/src/include/rigsupport.h +++ b/src/include/rigsupport.h @@ -95,7 +95,7 @@ extern void FLRIG_start_flrig_thread(); extern void stop_flrig_thread(); extern void reconnect_to_flrig(); extern void set_flrig_ptt(int on); -extern void set_flrig_freq(long int fr); +extern void set_flrig_freq(unsigned long int fr); extern void set_flrig_mode(const char *md); extern void set_flrig_bw(int bw1, int bw2 = 0); extern void set_flrig_notch(); diff --git a/src/include/sound.h b/src/include/sound.h index 4a11ba22..29d13cfb 100644 --- a/src/include/sound.h +++ b/src/include/sound.h @@ -31,9 +31,7 @@ #include #include -#if USE_SNDFILE # include -#endif #include @@ -74,8 +72,6 @@ protected: SRC_STATE *rx_src_state; double *wrt_buffer; -#if USE_SNDFILE - SNDFILE* ofCapture; SNDFILE* ifPlayback; SNDFILE* ofGenerate; @@ -105,13 +101,10 @@ protected: float modem_play_sr; bool new_playback; - sf_count_t read_file(SNDFILE* file, float* buf, size_t count); void write_file(SNDFILE* file, float* buf_left, float *buf_right, size_t count); void write_file(SNDFILE* file, double* buf_left, double *buf_right, size_t count); -#endif - public: SoundBase(); virtual ~SoundBase(); @@ -125,7 +118,6 @@ public: virtual void flush(unsigned dir = UINT_MAX) = 0; virtual bool must_close(int dir = 0) = 0; -#if USE_SNDFILE int startCapture(std::string fname, int format); void stopCapture(); @@ -138,7 +130,6 @@ public: int AudioMP3(std::string fname); int AudioWAV(std::string fname); int Audio(std::string fname); -#endif }; diff --git a/src/logbook/fd_logger.cxx b/src/logbook/fd_logger.cxx index c06f3abb..0eae1126 100644 --- a/src/logbook/fd_logger.cxx +++ b/src/logbook/fd_logger.cxx @@ -496,7 +496,8 @@ void FD_logoff() void FD_band_check() { if (fd_band != FD_opband()) { FD_logoff(); -// FD_start(); + MilliSleep(50); + FD_start(); FD_logon(); } } @@ -507,7 +508,8 @@ void FD_band_check() { void FD_mode_check() { if (fd_mode != FD_opmode()) { FD_logoff(); -// FD_start(); + MilliSleep(50); + FD_start(); FD_logon(); } } diff --git a/src/logbook/fd_view.cxx b/src/logbook/fd_view.cxx index a265e641..6e80da4c 100644 --- a/src/logbook/fd_view.cxx +++ b/src/logbook/fd_view.cxx @@ -65,273 +65,417 @@ Fl_Box *box_fdserver_connected=(Fl_Box *)0; Fl_Double_Window* make_fd_view() { Fl_Double_Window* w; - { Fl_Double_Window* o = new Fl_Double_Window(785, 270, _("Field Day Viewer - use with program \'fdserver\'")); + { Fl_Double_Window* o = new Fl_Double_Window(670, 270, _("Field Day Viewer - use with program \'fdserver\'")); w = o; if (w) {/* empty */} o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); - { Fl_Output* o = view_FD_call = new Fl_Output(98, 6, 77, 24, _("FD Call")); + { Fl_Output* o = view_FD_call = new Fl_Output(59, 6, 77, 24, _("FD Call")); o->value(progdefaults.my_FD_call.c_str()); } // Fl_Output* view_FD_call - { Fl_Output* o = view_FD_class = new Fl_Output(277, 5, 38, 24, _("FD Class")); + { Fl_Output* o = view_FD_class = new Fl_Output(219, 5, 38, 24, _("FD Class")); o->value(progdefaults.my_FD_class.c_str()); } // Fl_Output* view_FD_class - { Fl_Output* o = view_FD_section = new Fl_Output(417, 5, 38, 24, _("FD Section")); + { Fl_Output* o = view_FD_section = new Fl_Output(341, 5, 38, 24, _("FD Section")); o->value(progdefaults.my_FD_section.c_str()); } // Fl_Output* view_FD_section - { Fl_Output* o = view_FD_mult = new Fl_Output(557, 5, 38, 24, _("FD Mult")); + { Fl_Output* o = view_FD_mult = new Fl_Output(462, 5, 38, 24, _("FD Mult")); o->value(progdefaults.my_FD_mult.c_str()); } // Fl_Output* view_FD_mult - { view_FD_score = new Fl_Output(698, 5, 80, 24, _("Score")); + { view_FD_score = new Fl_Output(584, 5, 80, 24, _("Score")); } // Fl_Output* view_FD_score - { Fl_Box* o = new Fl_Box(55, 33, 50, 17, _("160")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(114, 33, 50, 17, _("80")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(174, 33, 50, 17, _("40")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(233, 33, 50, 17, _("20")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(293, 33, 50, 17, _("17")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(352, 33, 50, 17, _("15")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(414, 33, 50, 17, _("12")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(476, 33, 50, 17, _("10")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(538, 33, 50, 17, _("6")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(600, 33, 50, 17, _("2")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(660, 33, 60, 17, _("220")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { Fl_Box* o = new Fl_Box(720, 33, 60, 17, _("440")); - o->box(FL_FLAT_BOX); - } // Fl_Box* o - { view_FD_CW[0] = new Fl_Output(55, 49, 60, 24, _("CW")); + { view_FD_CW[0] = new Fl_Output(55, 49, 50, 24, _("CW")); + view_FD_CW[0]->textfont(4); + view_FD_CW[0]->textsize(12); } // Fl_Output* view_FD_CW[0] - { view_FD_CW[1] = new Fl_Output(115, 49, 60, 24); + { view_FD_CW[1] = new Fl_Output(106, 49, 50, 24); + view_FD_CW[1]->textfont(4); + view_FD_CW[1]->textsize(12); view_FD_CW[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[1] - { view_FD_CW[2] = new Fl_Output(174, 49, 60, 24); + { view_FD_CW[2] = new Fl_Output(156, 49, 50, 24); + view_FD_CW[2]->textfont(4); + view_FD_CW[2]->textsize(12); view_FD_CW[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[2] - { view_FD_CW[3] = new Fl_Output(234, 49, 60, 24); + { view_FD_CW[3] = new Fl_Output(207, 49, 50, 24); + view_FD_CW[3]->textfont(4); + view_FD_CW[3]->textsize(12); view_FD_CW[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[3] - { view_FD_CW[4] = new Fl_Output(293, 49, 60, 24); + { view_FD_CW[4] = new Fl_Output(258, 49, 50, 24); + view_FD_CW[4]->textfont(4); + view_FD_CW[4]->textsize(12); view_FD_CW[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[4] - { view_FD_CW[5] = new Fl_Output(353, 49, 60, 24); + { view_FD_CW[5] = new Fl_Output(309, 49, 50, 24); + view_FD_CW[5]->textfont(4); + view_FD_CW[5]->textsize(12); view_FD_CW[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[5] - { view_FD_CW[6] = new Fl_Output(415, 49, 60, 24); + { view_FD_CW[6] = new Fl_Output(360, 49, 50, 24); + view_FD_CW[6]->textfont(4); + view_FD_CW[6]->textsize(12); view_FD_CW[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[6] - { view_FD_CW[7] = new Fl_Output(475, 49, 60, 24); + { view_FD_CW[7] = new Fl_Output(411, 49, 50, 24); + view_FD_CW[7]->textfont(4); + view_FD_CW[7]->textsize(12); view_FD_CW[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[7] - { view_FD_CW[8] = new Fl_Output(536, 49, 60, 24); + { view_FD_CW[8] = new Fl_Output(462, 49, 50, 24); + view_FD_CW[8]->textfont(4); + view_FD_CW[8]->textsize(12); view_FD_CW[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[8] - { view_FD_CW[9] = new Fl_Output(598, 49, 60, 24); + { view_FD_CW[9] = new Fl_Output(513, 49, 50, 24); + view_FD_CW[9]->textfont(4); + view_FD_CW[9]->textsize(12); view_FD_CW[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[9] - { view_FD_CW[10] = new Fl_Output(659, 49, 60, 24); + { view_FD_CW[10] = new Fl_Output(564, 49, 50, 24); + view_FD_CW[10]->textfont(4); + view_FD_CW[10]->textsize(12); view_FD_CW[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[10] - { view_FD_CW[11] = new Fl_Output(719, 49, 60, 24); + { view_FD_CW[11] = new Fl_Output(615, 49, 50, 24); + view_FD_CW[11]->textfont(4); + view_FD_CW[11]->textsize(12); view_FD_CW[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[11] - { view_FD_CW_OP[0] = new Fl_Output(55, 73, 60, 24, _("Oper\'")); + { view_FD_CW_OP[0] = new Fl_Output(55, 75, 50, 24, _("Oper\'")); + view_FD_CW_OP[0]->textfont(4); + view_FD_CW_OP[0]->textsize(12); } // Fl_Output* view_FD_CW_OP[0] - { view_FD_CW_OP[1] = new Fl_Output(115, 73, 60, 24); + { view_FD_CW_OP[1] = new Fl_Output(106, 73, 50, 24); + view_FD_CW_OP[1]->textfont(4); + view_FD_CW_OP[1]->textsize(12); view_FD_CW_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[1] - { view_FD_CW_OP[2] = new Fl_Output(174, 73, 60, 24); + { view_FD_CW_OP[2] = new Fl_Output(156, 73, 50, 24); + view_FD_CW_OP[2]->textfont(4); + view_FD_CW_OP[2]->textsize(12); view_FD_CW_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[2] - { view_FD_CW_OP[3] = new Fl_Output(234, 73, 60, 24); + { view_FD_CW_OP[3] = new Fl_Output(207, 73, 50, 24); + view_FD_CW_OP[3]->textfont(4); + view_FD_CW_OP[3]->textsize(12); view_FD_CW_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[3] - { view_FD_CW_OP[4] = new Fl_Output(293, 73, 60, 24); + { view_FD_CW_OP[4] = new Fl_Output(258, 73, 50, 24); + view_FD_CW_OP[4]->textfont(4); + view_FD_CW_OP[4]->textsize(12); view_FD_CW_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[4] - { view_FD_CW_OP[5] = new Fl_Output(353, 73, 60, 24); + { view_FD_CW_OP[5] = new Fl_Output(309, 73, 50, 24); + view_FD_CW_OP[5]->textfont(4); + view_FD_CW_OP[5]->textsize(12); view_FD_CW_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[5] - { view_FD_CW_OP[6] = new Fl_Output(415, 73, 60, 24); + { view_FD_CW_OP[6] = new Fl_Output(360, 73, 50, 24); + view_FD_CW_OP[6]->textfont(4); + view_FD_CW_OP[6]->textsize(12); view_FD_CW_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[6] - { view_FD_CW_OP[7] = new Fl_Output(475, 73, 60, 24); + { view_FD_CW_OP[7] = new Fl_Output(411, 73, 50, 24); + view_FD_CW_OP[7]->textfont(4); + view_FD_CW_OP[7]->textsize(12); view_FD_CW_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[7] - { view_FD_CW_OP[8] = new Fl_Output(536, 73, 60, 24); + { view_FD_CW_OP[8] = new Fl_Output(462, 73, 50, 24); + view_FD_CW_OP[8]->textfont(4); + view_FD_CW_OP[8]->textsize(12); view_FD_CW_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[8] - { view_FD_CW_OP[9] = new Fl_Output(598, 73, 60, 24); + { view_FD_CW_OP[9] = new Fl_Output(513, 73, 50, 24); + view_FD_CW_OP[9]->textfont(4); + view_FD_CW_OP[9]->textsize(12); view_FD_CW_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[9] - { view_FD_CW_OP[10] = new Fl_Output(659, 73, 60, 24); + { view_FD_CW_OP[10] = new Fl_Output(564, 73, 50, 24); + view_FD_CW_OP[10]->textfont(4); + view_FD_CW_OP[10]->textsize(12); view_FD_CW_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[10] - { view_FD_CW_OP[11] = new Fl_Output(719, 73, 60, 24); + { view_FD_CW_OP[11] = new Fl_Output(615, 73, 50, 24); + view_FD_CW_OP[11]->textfont(4); + view_FD_CW_OP[11]->textsize(12); view_FD_CW_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[11] - { view_FD_DIG[0] = new Fl_Output(55, 103, 60, 24, _("DIG")); + { view_FD_DIG[0] = new Fl_Output(55, 102, 50, 24, _("DIG")); + view_FD_DIG[0]->textfont(4); + view_FD_DIG[0]->textsize(12); } // Fl_Output* view_FD_DIG[0] - { view_FD_DIG[1] = new Fl_Output(115, 103, 60, 24); + { view_FD_DIG[1] = new Fl_Output(106, 103, 50, 24); + view_FD_DIG[1]->textfont(4); + view_FD_DIG[1]->textsize(12); view_FD_DIG[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[1] - { view_FD_DIG[2] = new Fl_Output(174, 103, 60, 24); + { view_FD_DIG[2] = new Fl_Output(156, 103, 50, 24); + view_FD_DIG[2]->textfont(4); + view_FD_DIG[2]->textsize(12); view_FD_DIG[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[2] - { view_FD_DIG[3] = new Fl_Output(234, 103, 60, 24); + { view_FD_DIG[3] = new Fl_Output(207, 103, 50, 24); + view_FD_DIG[3]->textfont(4); + view_FD_DIG[3]->textsize(12); view_FD_DIG[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[3] - { view_FD_DIG[4] = new Fl_Output(293, 103, 60, 24); + { view_FD_DIG[4] = new Fl_Output(258, 103, 50, 24); + view_FD_DIG[4]->textfont(4); + view_FD_DIG[4]->textsize(12); view_FD_DIG[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[4] - { view_FD_DIG[5] = new Fl_Output(353, 103, 60, 24); + { view_FD_DIG[5] = new Fl_Output(309, 103, 50, 24); + view_FD_DIG[5]->textfont(4); + view_FD_DIG[5]->textsize(12); view_FD_DIG[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[5] - { view_FD_DIG[6] = new Fl_Output(415, 103, 60, 24); + { view_FD_DIG[6] = new Fl_Output(360, 103, 50, 24); + view_FD_DIG[6]->textfont(4); + view_FD_DIG[6]->textsize(12); view_FD_DIG[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[6] - { view_FD_DIG[7] = new Fl_Output(475, 103, 60, 24); + { view_FD_DIG[7] = new Fl_Output(411, 103, 50, 24); + view_FD_DIG[7]->textfont(4); + view_FD_DIG[7]->textsize(12); view_FD_DIG[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[7] - { view_FD_DIG[8] = new Fl_Output(536, 103, 60, 24); + { view_FD_DIG[8] = new Fl_Output(462, 103, 50, 24); + view_FD_DIG[8]->textfont(4); + view_FD_DIG[8]->textsize(12); view_FD_DIG[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[8] - { view_FD_DIG[9] = new Fl_Output(598, 103, 60, 24); + { view_FD_DIG[9] = new Fl_Output(513, 103, 50, 24); + view_FD_DIG[9]->textfont(4); + view_FD_DIG[9]->textsize(12); view_FD_DIG[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[9] - { view_FD_DIG[10] = new Fl_Output(659, 103, 60, 24); + { view_FD_DIG[10] = new Fl_Output(564, 103, 50, 24); + view_FD_DIG[10]->textfont(4); + view_FD_DIG[10]->textsize(12); view_FD_DIG[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[10] - { view_FD_DIG[11] = new Fl_Output(719, 103, 60, 24); + { view_FD_DIG[11] = new Fl_Output(615, 103, 50, 24); + view_FD_DIG[11]->textfont(4); + view_FD_DIG[11]->textsize(12); view_FD_DIG[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[11] - { view_FD_DIG_OP[0] = new Fl_Output(55, 128, 60, 24, _("Oper\'")); + { view_FD_DIG_OP[0] = new Fl_Output(55, 129, 50, 24, _("Oper\'")); + view_FD_DIG_OP[0]->textfont(4); + view_FD_DIG_OP[0]->textsize(12); } // Fl_Output* view_FD_DIG_OP[0] - { view_FD_DIG_OP[1] = new Fl_Output(115, 128, 60, 24); + { view_FD_DIG_OP[1] = new Fl_Output(106, 128, 50, 24); + view_FD_DIG_OP[1]->textfont(4); + view_FD_DIG_OP[1]->textsize(12); view_FD_DIG_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[1] - { view_FD_DIG_OP[2] = new Fl_Output(174, 128, 60, 24); + { view_FD_DIG_OP[2] = new Fl_Output(156, 128, 50, 24); + view_FD_DIG_OP[2]->textfont(4); + view_FD_DIG_OP[2]->textsize(12); view_FD_DIG_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[2] - { view_FD_DIG_OP[3] = new Fl_Output(234, 128, 60, 24); + { view_FD_DIG_OP[3] = new Fl_Output(207, 128, 50, 24); + view_FD_DIG_OP[3]->textfont(4); + view_FD_DIG_OP[3]->textsize(12); view_FD_DIG_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[3] - { view_FD_DIG_OP[4] = new Fl_Output(293, 128, 60, 24); + { view_FD_DIG_OP[4] = new Fl_Output(258, 128, 50, 24); + view_FD_DIG_OP[4]->textfont(4); + view_FD_DIG_OP[4]->textsize(12); view_FD_DIG_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[4] - { view_FD_DIG_OP[5] = new Fl_Output(353, 128, 60, 24); + { view_FD_DIG_OP[5] = new Fl_Output(309, 128, 50, 24); + view_FD_DIG_OP[5]->textfont(4); + view_FD_DIG_OP[5]->textsize(12); view_FD_DIG_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[5] - { view_FD_DIG_OP[6] = new Fl_Output(415, 128, 60, 24); + { view_FD_DIG_OP[6] = new Fl_Output(360, 128, 50, 24); + view_FD_DIG_OP[6]->textfont(4); + view_FD_DIG_OP[6]->textsize(12); view_FD_DIG_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[6] - { view_FD_DIG_OP[7] = new Fl_Output(475, 128, 60, 24); + { view_FD_DIG_OP[7] = new Fl_Output(411, 128, 50, 24); + view_FD_DIG_OP[7]->textfont(4); + view_FD_DIG_OP[7]->textsize(12); view_FD_DIG_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[7] - { view_FD_DIG_OP[8] = new Fl_Output(536, 128, 60, 24); + { view_FD_DIG_OP[8] = new Fl_Output(462, 128, 50, 24); + view_FD_DIG_OP[8]->textfont(4); + view_FD_DIG_OP[8]->textsize(12); view_FD_DIG_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[8] - { view_FD_DIG_OP[9] = new Fl_Output(598, 128, 60, 24); + { view_FD_DIG_OP[9] = new Fl_Output(513, 128, 50, 24); + view_FD_DIG_OP[9]->textfont(4); + view_FD_DIG_OP[9]->textsize(12); view_FD_DIG_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[9] - { view_FD_DIG_OP[10] = new Fl_Output(659, 128, 60, 24); + { view_FD_DIG_OP[10] = new Fl_Output(564, 128, 50, 24); + view_FD_DIG_OP[10]->textfont(4); + view_FD_DIG_OP[10]->textsize(12); view_FD_DIG_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[10] - { view_FD_DIG_OP[11] = new Fl_Output(719, 128, 60, 24); + { view_FD_DIG_OP[11] = new Fl_Output(615, 128, 50, 24); + view_FD_DIG_OP[11]->textfont(4); + view_FD_DIG_OP[11]->textsize(12); view_FD_DIG_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[11] - { view_FD_PHONE[0] = new Fl_Output(55, 158, 60, 24, _("PHONE")); + { view_FD_PHONE[0] = new Fl_Output(55, 156, 50, 24, _("PHONE")); + view_FD_PHONE[0]->textfont(4); + view_FD_PHONE[0]->textsize(12); } // Fl_Output* view_FD_PHONE[0] - { view_FD_PHONE[1] = new Fl_Output(115, 158, 60, 24); + { view_FD_PHONE[1] = new Fl_Output(106, 158, 50, 24); + view_FD_PHONE[1]->textfont(4); + view_FD_PHONE[1]->textsize(12); view_FD_PHONE[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[1] - { view_FD_PHONE[2] = new Fl_Output(174, 158, 60, 24); + { view_FD_PHONE[2] = new Fl_Output(156, 158, 50, 24); + view_FD_PHONE[2]->textfont(4); + view_FD_PHONE[2]->textsize(12); view_FD_PHONE[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[2] - { view_FD_PHONE[3] = new Fl_Output(234, 158, 60, 24); + { view_FD_PHONE[3] = new Fl_Output(207, 158, 50, 24); + view_FD_PHONE[3]->textfont(4); + view_FD_PHONE[3]->textsize(12); view_FD_PHONE[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[3] - { view_FD_PHONE[4] = new Fl_Output(293, 158, 60, 24); + { view_FD_PHONE[4] = new Fl_Output(258, 158, 50, 24); + view_FD_PHONE[4]->textfont(4); + view_FD_PHONE[4]->textsize(12); view_FD_PHONE[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[4] - { view_FD_PHONE[5] = new Fl_Output(353, 158, 60, 24); + { view_FD_PHONE[5] = new Fl_Output(309, 158, 50, 24); + view_FD_PHONE[5]->textfont(4); + view_FD_PHONE[5]->textsize(12); view_FD_PHONE[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[5] - { view_FD_PHONE[6] = new Fl_Output(415, 158, 60, 24); + { view_FD_PHONE[6] = new Fl_Output(360, 158, 50, 24); + view_FD_PHONE[6]->textfont(4); + view_FD_PHONE[6]->textsize(12); view_FD_PHONE[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[6] - { view_FD_PHONE[7] = new Fl_Output(475, 158, 60, 24); + { view_FD_PHONE[7] = new Fl_Output(411, 158, 50, 24); + view_FD_PHONE[7]->textfont(4); + view_FD_PHONE[7]->textsize(12); view_FD_PHONE[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[7] - { view_FD_PHONE[8] = new Fl_Output(536, 158, 60, 24); + { view_FD_PHONE[8] = new Fl_Output(462, 158, 50, 24); + view_FD_PHONE[8]->textfont(4); + view_FD_PHONE[8]->textsize(12); view_FD_PHONE[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[8] - { view_FD_PHONE[9] = new Fl_Output(598, 158, 60, 24); + { view_FD_PHONE[9] = new Fl_Output(513, 158, 50, 24); + view_FD_PHONE[9]->textfont(4); + view_FD_PHONE[9]->textsize(12); view_FD_PHONE[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[9] - { view_FD_PHONE[10] = new Fl_Output(659, 158, 60, 24); + { view_FD_PHONE[10] = new Fl_Output(564, 158, 50, 24); + view_FD_PHONE[10]->textfont(4); + view_FD_PHONE[10]->textsize(12); view_FD_PHONE[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[10] - { view_FD_PHONE[11] = new Fl_Output(719, 158, 60, 24); + { view_FD_PHONE[11] = new Fl_Output(615, 158, 50, 24); + view_FD_PHONE[11]->textfont(4); + view_FD_PHONE[11]->textsize(12); view_FD_PHONE[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[11] - { view_FD_PHONE_OP[0] = new Fl_Output(55, 183, 60, 24, _("Oper\'")); + { view_FD_PHONE_OP[0] = new Fl_Output(55, 183, 50, 24, _("Oper\'")); + view_FD_PHONE_OP[0]->textfont(4); + view_FD_PHONE_OP[0]->textsize(12); } // Fl_Output* view_FD_PHONE_OP[0] - { view_FD_PHONE_OP[1] = new Fl_Output(115, 183, 60, 24); + { view_FD_PHONE_OP[1] = new Fl_Output(106, 183, 50, 24); + view_FD_PHONE_OP[1]->textfont(4); + view_FD_PHONE_OP[1]->textsize(12); view_FD_PHONE_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[1] - { view_FD_PHONE_OP[2] = new Fl_Output(174, 183, 60, 24); + { view_FD_PHONE_OP[2] = new Fl_Output(156, 183, 50, 24); + view_FD_PHONE_OP[2]->textfont(4); + view_FD_PHONE_OP[2]->textsize(12); view_FD_PHONE_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[2] - { view_FD_PHONE_OP[3] = new Fl_Output(234, 183, 60, 24); + { view_FD_PHONE_OP[3] = new Fl_Output(207, 183, 50, 24); + view_FD_PHONE_OP[3]->textfont(4); + view_FD_PHONE_OP[3]->textsize(12); view_FD_PHONE_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[3] - { view_FD_PHONE_OP[4] = new Fl_Output(293, 183, 60, 24); + { view_FD_PHONE_OP[4] = new Fl_Output(258, 183, 50, 24); + view_FD_PHONE_OP[4]->textfont(4); + view_FD_PHONE_OP[4]->textsize(12); view_FD_PHONE_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[4] - { view_FD_PHONE_OP[5] = new Fl_Output(353, 183, 60, 24); + { view_FD_PHONE_OP[5] = new Fl_Output(309, 183, 50, 24); + view_FD_PHONE_OP[5]->textfont(4); + view_FD_PHONE_OP[5]->textsize(12); view_FD_PHONE_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[5] - { view_FD_PHONE_OP[6] = new Fl_Output(415, 183, 60, 24); + { view_FD_PHONE_OP[6] = new Fl_Output(360, 183, 50, 24); + view_FD_PHONE_OP[6]->textfont(4); + view_FD_PHONE_OP[6]->textsize(12); view_FD_PHONE_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[6] - { view_FD_PHONE_OP[7] = new Fl_Output(475, 183, 60, 24); + { view_FD_PHONE_OP[7] = new Fl_Output(411, 183, 50, 24); + view_FD_PHONE_OP[7]->textfont(4); + view_FD_PHONE_OP[7]->textsize(12); view_FD_PHONE_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[7] - { view_FD_PHONE_OP[8] = new Fl_Output(536, 183, 60, 24); + { view_FD_PHONE_OP[8] = new Fl_Output(462, 183, 50, 24); + view_FD_PHONE_OP[8]->textfont(4); + view_FD_PHONE_OP[8]->textsize(12); view_FD_PHONE_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[8] - { view_FD_PHONE_OP[9] = new Fl_Output(598, 183, 60, 24); + { view_FD_PHONE_OP[9] = new Fl_Output(513, 183, 50, 24); + view_FD_PHONE_OP[9]->textfont(4); + view_FD_PHONE_OP[9]->textsize(12); view_FD_PHONE_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[9] - { view_FD_PHONE_OP[10] = new Fl_Output(659, 183, 60, 24); + { view_FD_PHONE_OP[10] = new Fl_Output(564, 183, 50, 24); + view_FD_PHONE_OP[10]->textfont(4); + view_FD_PHONE_OP[10]->textsize(12); view_FD_PHONE_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[10] - { view_FD_PHONE_OP[11] = new Fl_Output(719, 183, 60, 24); + { view_FD_PHONE_OP[11] = new Fl_Output(615, 183, 50, 24); + view_FD_PHONE_OP[11]->textfont(4); + view_FD_PHONE_OP[11]->textsize(12); view_FD_PHONE_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[11] - { Fl_Group* o = new Fl_Group(5, 212, 775, 55, _("\"fdserver\" Client")); + { Fl_Box* o = new Fl_Box(60, 33, 40, 17, _("160")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(111, 33, 40, 17, _("80")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(161, 33, 40, 17, _("40")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(212, 33, 40, 17, _("20")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(263, 33, 40, 17, _("17")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(314, 33, 40, 17, _("15")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(365, 33, 40, 17, _("12")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(416, 33, 40, 17, _("10")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(467, 33, 40, 17, _("6")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(518, 33, 40, 17, _("2")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(569, 33, 40, 17, _("220")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(620, 33, 40, 17, _("440")); + o->box(FL_FLAT_BOX); + } // Fl_Box* o + { Fl_Group* o = new Fl_Group(5, 212, 660, 55, _("\"fdserver\" Client")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); - { Fl_Input2* o = inp_fd_tcpip_addr = new Fl_Input2(85, 234, 198, 24, _("tcpip addr")); + { Fl_Input2* o = inp_fd_tcpip_addr = new Fl_Input2(85, 234, 150, 24, _("tcpip addr")); inp_fd_tcpip_addr->tooltip(_("fdserver tcipip address")); inp_fd_tcpip_addr->box(FL_DOWN_BOX); inp_fd_tcpip_addr->color(FL_BACKGROUND2_COLOR); @@ -345,7 +489,7 @@ Fl_Double_Window* make_fd_view() { inp_fd_tcpip_addr->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_addr.c_str()); } // Fl_Input2* inp_fd_tcpip_addr - { Fl_Input2* o = inp_fd_tcpip_port = new Fl_Input2(325, 234, 75, 24, _("port")); + { Fl_Input2* o = inp_fd_tcpip_port = new Fl_Input2(273, 234, 75, 24, _("port")); inp_fd_tcpip_port->tooltip(_("fdserver tcpip port")); inp_fd_tcpip_port->box(FL_DOWN_BOX); inp_fd_tcpip_port->color(FL_BACKGROUND2_COLOR); @@ -359,7 +503,7 @@ Fl_Double_Window* make_fd_view() { inp_fd_tcpip_port->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_port.c_str()); } // Fl_Input2* inp_fd_tcpip_port - { Fl_Input2* o = inp_fd_op_call = new Fl_Input2(500, 234, 90, 24, _("OP callsign")); + { Fl_Input2* o = inp_fd_op_call = new Fl_Input2(402, 234, 90, 24, _("OP call")); inp_fd_op_call->tooltip(_("free form exchange")); inp_fd_op_call->box(FL_DOWN_BOX); inp_fd_op_call->color(FL_BACKGROUND2_COLOR); @@ -373,13 +517,13 @@ Fl_Double_Window* make_fd_view() { inp_fd_op_call->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_op_call.c_str()); } // Fl_Input2* inp_fd_op_call - { Fl_Check_Button* o = btn_fd_connect = new Fl_Check_Button(608, 236, 70, 20, _("Connect")); + { Fl_Check_Button* o = btn_fd_connect = new Fl_Check_Button(502, 236, 70, 20, _("Connect")); btn_fd_connect->tooltip(_("Connect / Disconnect^jAddr/Port/OP required")); btn_fd_connect->down_box(FL_DOWN_BOX); btn_fd_connect->callback((Fl_Callback*)cb_btn_fd_connect); o->value(progdefaults.connect_to_fdserver); } // Fl_Check_Button* btn_fd_connect - { box_fdserver_connected = new Fl_Box(722, 237, 18, 18, _("Connected")); + { box_fdserver_connected = new Fl_Box(608, 237, 18, 18, _("Connected")); box_fdserver_connected->box(FL_ROUND_DOWN_BOX); box_fdserver_connected->color((Fl_Color)31); box_fdserver_connected->align(Fl_Align(FL_ALIGN_TOP)); diff --git a/src/logbook/fd_view.fl b/src/logbook/fd_view.fl index c2fc549c..47b5418f 100644 --- a/src/logbook/fd_view.fl +++ b/src/logbook/fd_view.fl @@ -1,5 +1,5 @@ # data file for the Fltk User Interface Designer (fluid) -version 1.0304 +version 1.0305 i18n_type 1 i18n_include "gettext.h" i18n_function _ @@ -11,312 +11,312 @@ decl {\#include "configuration.h"} {private local Function {make_fd_view()} {open } { Fl_Window {} { - label {Field Day Viewer - use with program 'fdserver'} open - xywh {745 38 785 270} type Double align 5 visible + label {Field Day Viewer - use with program 'fdserver'} open selected + xywh {603 168 670 270} type Double align 5 visible } { Fl_Output view_FD_call { label {FD Call} - xywh {98 6 77 24} + xywh {59 6 77 24} code0 {o->value(progdefaults.my_FD_call.c_str());} } Fl_Output view_FD_class { label {FD Class} - xywh {277 5 38 24} + xywh {219 5 38 24} code0 {o->value(progdefaults.my_FD_class.c_str());} } Fl_Output view_FD_section { label {FD Section} - xywh {417 5 38 24} + xywh {341 5 38 24} code0 {o->value(progdefaults.my_FD_section.c_str());} } Fl_Output view_FD_mult { label {FD Mult} - xywh {557 5 38 24} + xywh {462 5 38 24} code0 {o->value(progdefaults.my_FD_mult.c_str());} } Fl_Output view_FD_score { label Score - xywh {698 5 80 24} - } - Fl_Box {} { - label 160 - xywh {55 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 80 - xywh {114 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 40 - xywh {174 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 20 - xywh {233 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 17 - xywh {293 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 15 - xywh {352 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 12 - xywh {414 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 10 - xywh {476 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 6 - xywh {538 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 2 - xywh {600 33 50 17} box FLAT_BOX - } - Fl_Box {} { - label 220 - xywh {660 33 60 17} box FLAT_BOX - } - Fl_Box {} { - label 440 - xywh {720 33 60 17} box FLAT_BOX + xywh {584 5 80 24} } Fl_Output {view_FD_CW[0]} { label CW - xywh {55 49 60 24} + xywh {55 49 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_CW[1]} { - xywh {115 49 60 24} align 20 + xywh {106 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[2]} { - xywh {174 49 60 24} align 20 + xywh {156 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[3]} { - xywh {234 49 60 24} align 20 + xywh {207 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[4]} { - xywh {293 49 60 24} align 20 + xywh {258 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[5]} { - xywh {353 49 60 24} align 20 + xywh {309 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[6]} { - xywh {415 49 60 24} align 20 + xywh {360 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[7]} { - xywh {475 49 60 24} align 20 + xywh {411 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[8]} { - xywh {536 49 60 24} align 20 + xywh {462 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[9]} { - xywh {598 49 60 24} align 20 + xywh {513 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[10]} { - xywh {659 49 60 24} align 20 + xywh {564 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[11]} { - xywh {719 49 60 24} align 20 + xywh {615 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[0]} { label {Oper'} - xywh {55 73 60 24} + xywh {55 75 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[1]} { - xywh {115 73 60 24} align 20 + xywh {106 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[2]} { - xywh {174 73 60 24} align 20 + xywh {156 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[3]} { - xywh {234 73 60 24} align 20 + xywh {207 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[4]} { - xywh {293 73 60 24} align 20 + xywh {258 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[5]} { - xywh {353 73 60 24} align 20 + xywh {309 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[6]} { - xywh {415 73 60 24} align 20 + xywh {360 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[7]} { - xywh {475 73 60 24} align 20 + xywh {411 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[8]} { - xywh {536 73 60 24} align 20 + xywh {462 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[9]} { - xywh {598 73 60 24} align 20 + xywh {513 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[10]} { - xywh {659 73 60 24} align 20 + xywh {564 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[11]} { - xywh {719 73 60 24} align 20 + xywh {615 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[0]} { label DIG - xywh {55 103 60 24} + xywh {55 102 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_DIG[1]} { - xywh {115 103 60 24} align 20 + xywh {106 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[2]} { - xywh {174 103 60 24} align 20 + xywh {156 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[3]} { - xywh {234 103 60 24} align 20 + xywh {207 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[4]} { - xywh {293 103 60 24} align 20 + xywh {258 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[5]} { - xywh {353 103 60 24} align 20 + xywh {309 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[6]} { - xywh {415 103 60 24} align 20 + xywh {360 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[7]} { - xywh {475 103 60 24} align 20 + xywh {411 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[8]} { - xywh {536 103 60 24} align 20 + xywh {462 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[9]} { - xywh {598 103 60 24} align 20 + xywh {513 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[10]} { - xywh {659 103 60 24} align 20 + xywh {564 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[11]} { - xywh {719 103 60 24} align 20 + xywh {615 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[0]} { label {Oper'} - xywh {55 128 60 24} + xywh {55 129 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[1]} { - xywh {115 128 60 24} align 20 + xywh {106 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[2]} { - xywh {174 128 60 24} align 20 + xywh {156 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[3]} { - xywh {234 128 60 24} align 20 + xywh {207 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[4]} { - xywh {293 128 60 24} align 20 + xywh {258 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[5]} { - xywh {353 128 60 24} align 20 + xywh {309 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[6]} { - xywh {415 128 60 24} align 20 + xywh {360 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[7]} { - xywh {475 128 60 24} align 20 + xywh {411 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[8]} { - xywh {536 128 60 24} align 20 + xywh {462 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[9]} { - xywh {598 128 60 24} align 20 + xywh {513 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[10]} { - xywh {659 128 60 24} align 20 + xywh {564 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[11]} { - xywh {719 128 60 24} align 20 + xywh {615 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[0]} { label PHONE - xywh {55 158 60 24} + xywh {55 156 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[1]} { - xywh {115 158 60 24} align 20 + xywh {106 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[2]} { - xywh {174 158 60 24} align 20 + xywh {156 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[3]} { - xywh {234 158 60 24} align 20 + xywh {207 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[4]} { - xywh {293 158 60 24} align 20 + xywh {258 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[5]} { - xywh {353 158 60 24} align 20 + xywh {309 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[6]} { - xywh {415 158 60 24} align 20 + xywh {360 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[7]} { - xywh {475 158 60 24} align 20 + xywh {411 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[8]} { - xywh {536 158 60 24} align 20 + xywh {462 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[9]} { - xywh {598 158 60 24} align 20 + xywh {513 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[10]} { - xywh {659 158 60 24} align 20 + xywh {564 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[11]} { - xywh {719 158 60 24} align 20 + xywh {615 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[0]} { label {Oper'} - xywh {55 183 60 24} + xywh {55 183 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[1]} { - xywh {115 183 60 24} align 20 + xywh {106 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[2]} { - xywh {174 183 60 24} align 20 + xywh {156 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[3]} { - xywh {234 183 60 24} align 20 + xywh {207 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[4]} { - xywh {293 183 60 24} align 20 + xywh {258 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[5]} { - xywh {353 183 60 24} align 20 + xywh {309 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[6]} { - xywh {415 183 60 24} align 20 + xywh {360 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[7]} { - xywh {475 183 60 24} align 20 + xywh {411 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[8]} { - xywh {536 183 60 24} align 20 + xywh {462 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[9]} { - xywh {598 183 60 24} align 20 + xywh {513 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[10]} { - xywh {659 183 60 24} align 20 + xywh {564 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[11]} { - xywh {719 183 60 24} align 20 + xywh {615 183 50 24} align 20 textfont 4 textsize 12 + } + Fl_Box {} { + label 160 + xywh {60 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 80 + xywh {111 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 40 + xywh {161 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 20 + xywh {212 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 17 + xywh {263 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 15 + xywh {314 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 12 + xywh {365 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 10 + xywh {416 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 6 + xywh {467 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 2 + xywh {518 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 220 + xywh {569 33 40 17} box FLAT_BOX + } + Fl_Box {} { + label 440 + xywh {620 33 40 17} box FLAT_BOX } Fl_Group {} { label {"fdserver" Client} open - xywh {5 212 775 55} box ENGRAVED_BOX align 21 + xywh {5 212 660 55} box ENGRAVED_BOX align 21 } { Fl_Input inp_fd_tcpip_addr { label {tcpip addr} callback {progdefaults.fd_tcpip_addr=o->value(); progdefaults.changed = true;} - tooltip {fdserver tcipip address} xywh {85 234 198 24} + tooltip {fdserver tcipip address} xywh {85 234 150 24} code0 {o->value(progdefaults.fd_tcpip_addr.c_str());} code1 {\#include "flinput2.h"} class Fl_Input2 @@ -325,15 +325,15 @@ progdefaults.changed = true;} label port callback {progdefaults.fd_tcpip_port=o->value(); progdefaults.changed = true;} - tooltip {fdserver tcpip port} xywh {325 234 75 24} + tooltip {fdserver tcpip port} xywh {273 234 75 24} code0 {o->value(progdefaults.fd_tcpip_port.c_str());} class Fl_Input2 } Fl_Input inp_fd_op_call { - label {OP callsign} + label {OP call} callback {progdefaults.fd_op_call=o->value(); progdefaults.changed = true;} - tooltip {free form exchange} xywh {500 234 90 24} + tooltip {free form exchange} xywh {402 234 90 24} code0 {o->value(progdefaults.fd_op_call.c_str());} class Fl_Input2 } @@ -348,15 +348,15 @@ if (progdefaults.connect_to_fdserver) { progdefaults.logging = LOG_QSO; } UI_select();} - tooltip {Connect / Disconnect^jAddr/Port/OP required} xywh {608 236 70 20} down_box DOWN_BOX + tooltip {Connect / Disconnect^jAddr/Port/OP required} xywh {502 236 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_fdserver);} code1 {\#include "confdialog.h"} code2 {\#include "fl_digi.h"} code3 {\#include "logsupport.h"} } Fl_Box box_fdserver_connected { - label Connected selected - xywh {722 237 18 18} box ROUND_DOWN_BOX color 31 align 1 + label Connected + xywh {608 237 18 18} box ROUND_DOWN_BOX color 31 align 1 } } } diff --git a/src/logbook/logsupport.cxx b/src/logbook/logsupport.cxx index 909b3060..a8ca2ed9 100644 --- a/src/logbook/logsupport.cxx +++ b/src/logbook/logsupport.cxx @@ -2190,9 +2190,9 @@ void cabrillo_append_qso (FILE *fp, cQsoRec *rec) if (btnCabMode->value()) { mode = adif2export(rec->getField(ADIF_MODE)); if (mode.compare("USB") == 0 || mode.compare("LSB") == 0 || + mode.compare("FM") == 0 || mode.compare("SSB") == 0 || mode.compare("PH") == 0 ) mode = "PH"; - else if (mode.compare("FM") == 0 || mode.compare("CW") == 0 ) ; - else mode = "RY"; + else if (mode.compare("RTTY") == 0) mode = "RY"; qsoline.append(mode); qsoline.append(" "); } diff --git a/src/logbook/table.cxx b/src/logbook/table.cxx index 31b755de..f5a2b3b2 100644 --- a/src/logbook/table.cxx +++ b/src/logbook/table.cxx @@ -1097,28 +1097,30 @@ int Table::handle(int event) { } break; - // Push on cell. - default: + // Push on cell. + default: bool changed = selected != row; selected = row; // Create new selection int len = 0; char **tableRow = data[selected]; - char *buffer; + char *buffer = nullptr; for (int col = 0; col < nCols; col++) len += strlen(tableRow[col]) + 1; // Create a tab separated list from data. buffer = (char*)malloc(len); - strcpy(buffer, tableRow[0]); - for (int col = 1; col < nCols; col++) { - strcat(buffer, "\t"); - strcat(buffer, tableRow[col]); + if (buffer != nullptr) { + strcpy(buffer, tableRow[0]); + for (int col = 1; col < nCols; col++) { + strcat(buffer, "\t"); + strcat(buffer, tableRow[col]); + } + Fl::selection(*this, buffer, len); + free(buffer); } - Fl::selection(*this, buffer, len); - free(buffer); // Update view. damage(DAMAGE_ROWS); diff --git a/src/main.cxx b/src/main.cxx index 783e0eec..4e840b54 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -1397,10 +1397,8 @@ void generate_option_help(void) { << " Specify the input\n" << " Must be a positive integer indicating the number of samples\n" " of silence to generate as the input" -# if USE_SNDFILE ", or a filename containing\n" " non-digit characters" -#endif "\n\n" << " --benchmark-output FILE\n" @@ -1882,9 +1880,7 @@ void generate_version_text(void) << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n" << " " "libsamplerate " << SAMPLERATE_BUILD_VERSION "\n"; -#if USE_SNDFILE s << " " "libsndfile " << SNDFILE_BUILD_VERSION "\n"; -#endif #if USE_PORTAUDIO s << " " "PortAudio " << PORTAUDIO_BUILD_VERSION "\n"; #endif @@ -1903,11 +1899,9 @@ void generate_version_text(void) } s << " libraries : " << src_get_version() << '\n'; -#if USE_SNDFILE char sndfile_version[32]; sf_command(NULL, SFC_GET_LIB_VERSION, sndfile_version, sizeof(sndfile_version)); s << " " << sndfile_version << '\n'; -#endif #if USE_PORTAUDIO s << " " << Pa_GetVersionText() << ' ' << Pa_GetVersion() << '\n'; #endif diff --git a/src/misc/benchmark.cxx b/src/misc/benchmark.cxx index 81c3340c..7aa9987e 100644 --- a/src/misc/benchmark.cxx +++ b/src/misc/benchmark.cxx @@ -39,9 +39,7 @@ # include "compat.h" #endif -#if USE_SNDFILE # include -#endif #include "fl_digi.h" #include "modem.h" @@ -70,13 +68,8 @@ int setup_benchmark(void) char* p; benchmark.samples = (size_t)strtol(benchmark.input.c_str(), &p, 10); if (*p != '\0') { // invalid char in input string -#if USE_SNDFILE // treat as filename benchmark.samples = 0; -#else - LOG_ERROR("Bad input string, \"%s\"", benchmark.input.c_str()); - return 1; -#endif } } if (!benchmark.output.empty()) @@ -104,9 +97,7 @@ int setup_benchmark(void) return 0; } -#if USE_SNDFILE SNDFILE* infile = 0; -#endif static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]); static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]); @@ -129,7 +120,6 @@ void do_benchmark(void) << " rate=" << active_modem->get_samplerate(); LOG_INFO("%s", info.str().c_str()); -#if USE_SNDFILE if (!benchmark.samples) { SF_INFO info = { 0, 0, 0, 0, 0, 0 }; if ((infile = sf_open(benchmark.input.c_str(), SFM_READ, &info)) == NULL) { @@ -137,7 +127,6 @@ void do_benchmark(void) return; } } -#endif struct rusage ru[2]; struct timespec wall_time[2]; @@ -151,12 +140,10 @@ void do_benchmark(void) ru[1].ru_utime -= ru[0].ru_utime; wall_time[1] -= wall_time[0]; -#if USE_SNDFILE if (infile) { sf_close(infile); infile = 0; } -#endif info << "processed: " << nproc << " samples (decoded " << nrx << ") in " << precision(3) @@ -180,7 +167,6 @@ static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]) size_t inlen = 1 << 19; double* inbuf = new double[inlen]; -#if USE_SNDFILE if (infile) { nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); @@ -189,9 +175,7 @@ static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]) for (size_t n; (n = sf_readf_double(infile, inbuf, inlen)); nread += n) active_modem->rx_process(inbuf, n); } - else -#endif - { + else { memset(inbuf, 0, sizeof(double) * inlen); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); @@ -218,25 +202,21 @@ static long src_read(void* arg, float** data) *data = inbuf; return inlen; } -#if USE_SNDFILE static long src_readf(void* arg, float** data) { long n = (long)sf_readf_float(infile, inbuf, inlen); *data = n ? inbuf : 0; return n; } -#endif static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) { int err; SRC_STATE* src_state; -#if USE_SNDFILE if (infile) src_state = src_callback_new(src_readf, benchmark.src_type, 1, &err, NULL); else -#endif src_state = src_callback_new(src_read, benchmark.src_type, 1, &err, NULL); if (!src_state) { @@ -251,7 +231,6 @@ static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) long n; size_t nread; -#if USE_SNDFILE if (infile) { // read until src returns 0 nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); @@ -266,9 +245,7 @@ static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) nread = (size_t)round(nread * benchmark.src_ratio); } - else -#endif - { // read benchmark.samples * benchmark.src_ratio + else { // read benchmark.samples * benchmark.src_ratio nread = (size_t)round(benchmark.samples * benchmark.src_ratio); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); diff --git a/src/misc/kiss_io.cxx b/src/misc/kiss_io.cxx index af76c89e..8cc41915 100644 --- a/src/misc/kiss_io.cxx +++ b/src/misc/kiss_io.cxx @@ -786,7 +786,7 @@ static void reply_csma_mode(char *arg) static void set_busy_channel_inhibit(char *arg) { std::string argstr = ""; - time_t temp = 0; + int temp = 0; if(arg) { argstr.assign(arg); @@ -796,7 +796,7 @@ static void set_busy_channel_inhibit(char *arg) temp_disable_tx_inhibit = time(0) + temp_disable_tx_duration; } } else if(isdigit(argstr[0])) { - sscanf(arg, "%lu", &temp); + sscanf(arg, "%d", &temp); if(temp == 0) temp_disable_tx_duration = DISABLE_TX_INHIBIT_DURATION; else diff --git a/src/misc/log.cxx b/src/misc/log.cxx index 112d1e7f..f11122fa 100644 --- a/src/misc/log.cxx +++ b/src/misc/log.cxx @@ -95,7 +95,9 @@ void cLogfile::log_to_file(log_t type, const string& s) else { time(&t); gmtime_r(&t, &tm); - strftime(timestr, sizeof(timestr), "%a %b %e %H:%M:%S %Y UTC", &tm); + // Was %e (space padded month) but it's not available in the MS C + // runtime library, %d (zero-padded) is more portable. + strftime(timestr, sizeof(timestr), "%a %b %d %H:%M:%S %Y UTC", &tm); fprintf(logfile, "\n--- Logging %s at %s ---\n", s.c_str(), timestr); } diff --git a/src/navtex/navtex.cxx b/src/navtex/navtex.cxx index a84dc202..f196b2d3 100644 --- a/src/navtex/navtex.cxx +++ b/src/navtex/navtex.cxx @@ -1231,7 +1231,7 @@ private: // the average of the two is a valid character. for (i = 0; i < 7; i++) { int a = m_bit_values[m_bit_cursor + i]; - int r = m_bit_values[rep + i]; + int r = m_bit_values[reppos + i]; avg[i] = a + r; } diff --git a/src/network/socket.cxx b/src/network/socket.cxx index 34075154..18a2e3e0 100644 --- a/src/network/socket.cxx +++ b/src/network/socket.cxx @@ -1181,7 +1181,7 @@ size_t Socket::sendTo(const void* buf, size_t len) unsigned long host_addr = get_address4((struct sockaddr *)useAddr); unsigned int host_port = get_port((struct sockaddr *) useAddr); - LOG_VERBOSE("HAP:%lX:%d count=%d buf=%s", host_addr, host_port, len, buf); + LOG_VERBOSE("HAP:%lX:%d count=%d buf=%s", host_addr, host_port, (int)len, (char*)buf); } #endif diff --git a/src/network/xmlrpc.cxx b/src/network/xmlrpc.cxx index 2da693ef..e687fc6c 100644 --- a/src/network/xmlrpc.cxx +++ b/src/network/xmlrpc.cxx @@ -1083,9 +1083,10 @@ LOG_VERBOSE("main.set_wf_sideband %s", s.c_str()); void xmlrpc_set_qsy(long long rfc) { - wf->rfcarrier(rfc); + unsigned long int freq = static_cast(rfc); + wf->rfcarrier(freq); wf->movetocenter(); - show_frequency(rfc); + show_frequency(freq); } class Main_set_freq : public xmlrpc_c::method @@ -2215,8 +2216,8 @@ public: { XMLRPC_LOCK; double rfc = wf->rfcarrier(); -long int f = (long int)(params.getDouble(0,0.0)); -LOG_VERBOSE("rig.set_frequency: %ld", f); + unsigned long int f = (long int)(params.getDouble(0,0.0)); + LOG_VERBOSE("rig.set_frequency: %lu", f); REQ(set_frequency, (long long int)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } diff --git a/src/qrunner/qrunner.cxx b/src/qrunner/qrunner.cxx index 04756e06..3cde3c63 100644 --- a/src/qrunner/qrunner.cxx +++ b/src/qrunner/qrunner.cxx @@ -111,7 +111,7 @@ qrunner::~qrunner() void qrunner::attach(int id_no, std::string id_string) { - Fl::add_fd(pfd[0], FL_READ, qrunner::execute, this); + Fl::add_fd(pfd[0], FL_READ, reinterpret_cast(qrunner::execute), this); attached = true; _id_no = id_no; _id_string.assign(id_string); @@ -119,7 +119,7 @@ void qrunner::attach(int id_no, std::string id_string) void qrunner::attach(void) { - Fl::add_fd(pfd[0], FL_READ, qrunner::execute, this); + Fl::add_fd(pfd[0], FL_READ, reinterpret_cast(qrunner::execute), this); attached = true; } void qrunner::detach(void) diff --git a/src/rigcontrol/FreqControl.cxx b/src/rigcontrol/FreqControl.cxx index 0b0c4a58..566a5610 100644 --- a/src/rigcontrol/FreqControl.cxx +++ b/src/rigcontrol/FreqControl.cxx @@ -44,14 +44,14 @@ const char *cFreqControl::Label[10] = { void cFreqControl::IncFreq (int nbr) { double v = (double)val + (double)mult[nbr] * precision; - if (v <= maxVal) val = (long int)v; + if (v <= maxVal) val = (unsigned long int)v; updatevalue(); do_callback(); } void cFreqControl::DecFreq (int nbr) { double v = (double)val - (double)mult[nbr] * precision; - if (v >= minVal) val = (long int)v; + if (v >= minVal) val = (unsigned long int)v; updatevalue(); do_callback(); } @@ -60,7 +60,7 @@ void cbSelectDigit (Fl_Widget *btn, void * nbr) { Fl_Button *b = (Fl_Button *)btn; - int Nbr = (int)(reinterpret_cast (nbr)); + int Nbr = reinterpret_cast (nbr); cFreqControl *fc = (cFreqControl *)b->parent(); if (fc->hrd_buttons) { @@ -132,7 +132,7 @@ cFreqControl::cFreqControl(int x, int y, int w, int h, const char *lbl): minVal = 0; double fmaxval = (pow(10.0, nD) - 1) * precision; - long int UMAX = maximum(); + unsigned long int UMAX = maximum(); if (fmaxval > UMAX) fmaxval = UMAX; maxVal = fmaxval; fmaxval /= 1000.0; @@ -222,7 +222,7 @@ cFreqControl::~cFreqControl() void cFreqControl::updatevalue() { - long int v = val / precision; + unsigned long int v = val / precision; int i; if (likely(v > 0L)) { for (i = 0; i < nD; i++) { @@ -332,16 +332,16 @@ static void blink_point(Fl_Widget* w) Fl::add_timeout(0.2, (Fl_Timeout_Handler)blink_point, w); } -void cFreqControl::value(long lv) +void cFreqControl::value(unsigned long int lv) { oldval = val = lv; Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); updatevalue(); } -long int cFreqControl::maximum(void) +unsigned long int cFreqControl::maximum(void) { - return (long int)(pow(2.0, 31) - 1); + return (unsigned long int)(pow(2.0, 32) - 1); } @@ -549,7 +549,7 @@ void cFreqControl::freq_input_cb(Fl_Widget*, void* arg) { cFreqControl* fc = reinterpret_cast(arg); double val = strtod(fc->finp->value(), NULL); - long int lval; + unsigned long int lval; val *= 1e3; val += 0.5; lval = (long)val; @@ -619,7 +619,7 @@ void cFreqControl::set_ndigits(int nbr) minVal = 0; double fmaxval = (pow(10.0, nD) - 1) * precision; - long int UMAX = (long int)(pow(2.0, 31) - 1); + unsigned long int UMAX = (unsigned long int)(pow(2.0, 32) - 1); if (fmaxval > UMAX) fmaxval = UMAX; maxVal = fmaxval; fmaxval /= 1000.0; diff --git a/src/rigcontrol/rigio.cxx b/src/rigcontrol/rigio.cxx index 3832f014..458d9ab6 100644 --- a/src/rigcontrol/rigio.cxx +++ b/src/rigcontrol/rigio.cxx @@ -1376,7 +1376,7 @@ static void rigcat_set_smeter(void *data) pwrmeter->hide(); smeter->show(); } - int val = reinterpret_cast(data); + int val = reinterpret_cast(data); smeter->value(val); } } @@ -1528,7 +1528,7 @@ static void rigcat_set_pmeter(void *data) smeter->hide(); pwrmeter->show(); } - int val = reinterpret_cast(data); + int val = reinterpret_cast(data); pwrmeter->value(val); } } @@ -1635,7 +1635,7 @@ void rigCAT_get_pwrmeter() static void rigcat_notch(void *data) { - int val = reinterpret_cast(data); + int val = reinterpret_cast(data); notch_frequency = val; } @@ -2080,9 +2080,9 @@ void rigCAT_set_notch(int freq) LOG_ERROR("%s failed", symbol); } -int pwrlevel_data(DATA d, size_t p) +long pwrlevel_data(DATA d, size_t p) { - int val = 0; + long val = 0; if (d.dtype == "BCD") { if (d.reverse == true) @@ -2102,7 +2102,7 @@ int pwrlevel_data(DATA d, size_t p) } size_t n; - int pwr1, pwr2, val1, val2; + long pwr1, pwr2, val1, val2; for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) { if ((val > xmlrig.pwrlevel[n].val) && (val <= xmlrig.pwrlevel[n+1].val)) break; @@ -2148,9 +2148,9 @@ int pwrlevel_val(int pwr) // called by rigio thread // must use REQ(...) to set the power level control -static void rigCAT_update_pwrlevel(void *v) +static void rigCAT_update_pwrlevel(const long v) { - long pwr = reinterpret_cast(v); + long pwr = v; char szpwr[10]; snprintf(szpwr, sizeof(szpwr), "%ld", pwr); progdefaults.mytxpower = szpwr; @@ -2253,7 +2253,7 @@ void rigCAT_get_pwrlevel() // convert the data field pwr = pwrlevel_data(rTemp.data, pData); - REQ(rigCAT_update_pwrlevel, (void *)pwr); + REQ(rigCAT_update_pwrlevel, pwr); } void rigCAT_set_pwrlevel(int pwr) diff --git a/src/rigcontrol/rigsupport.cxx b/src/rigcontrol/rigsupport.cxx index 68cdcbf8..5aa8ce5f 100644 --- a/src/rigcontrol/rigsupport.cxx +++ b/src/rigcontrol/rigsupport.cxx @@ -414,7 +414,7 @@ void qso_movFreq(Fl_Widget* w, void *data) { cFreqControl *fc = (cFreqControl *)w; long int f; - long restore = reinterpret_cast(data); + long restore = reinterpret_cast(data); f = fc->value(); if (fc == qsoFreqDisp1) { qsoFreqDisp2->value(f); diff --git a/src/rigcontrol/serial.cxx b/src/rigcontrol/serial.cxx index 3b0d1a1e..921f044d 100644 --- a/src/rigcontrol/serial.cxx +++ b/src/rigcontrol/serial.cxx @@ -395,7 +395,7 @@ BOOL Cserial::OpenPort() LOG_PERROR(win_error_string(errno).c_str()); return FALSE; } - LOG_INFO("COM port %s opened, handle = %d", device.c_str(), (int)hComm); + LOG_INFO("COM port %s opened, handle = %p", device.c_str(), hComm); FlushBuffer(); @@ -410,7 +410,7 @@ BOOL Cserial::OpenPort() /////////////////////////////////////////////////////// void Cserial::ClosePort() { - LOG_INFO("Closing COM port, handle = %d", (int)hComm); + LOG_INFO("Closing COM port, handle = %p", hComm); if (hComm != INVALID_HANDLE_VALUE) { if (restore_tio) diff --git a/src/rigcontrol/xmlrpc_rig.cxx b/src/rigcontrol/xmlrpc_rig.cxx index 94aa3be3..88a55094 100644 --- a/src/rigcontrol/xmlrpc_rig.cxx +++ b/src/rigcontrol/xmlrpc_rig.cxx @@ -110,11 +110,12 @@ static int wait_bws_timeout = 0; void xmlrpc_rig_set_qsy(long long rfc) { - set_flrig_freq(static_cast(rfc)); - wf->rfcarrier(rfc); + unsigned long int freq = static_cast(rfc); + set_flrig_freq(freq); + wf->rfcarrier(freq); wf->movetocenter(); - show_frequency(rfc); - LOG_VERBOSE("set qsy: %d", (int)rfc); + show_frequency(freq); + LOG_VERBOSE("set qsy: %lu", freq); } //====================================================================== @@ -192,7 +193,7 @@ pthread_mutex_t mutex_flrig_ptt = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_ptt(void *data) { guard_lock flrig_lock(&mutex_flrig_ptt); - int on = reinterpret_cast(data); + int on = reinterpret_cast(data); if (wf && (trx_state != STATE_TUNE)) { wf->xmtrcv->value(on); wf->xmtrcv->do_callback(); @@ -234,7 +235,7 @@ void flrig_get_ptt() static bool wait_freq = false; // wait for transceiver to respond static int wait_freq_timeout = 5; // 5 polls and then disable wait -static long int xcvr_freq = 0; +static unsigned long int xcvr_freq = 0; pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; @@ -242,13 +243,13 @@ void xmlrpc_rig_show_freq(void * fr) { guard_lock flrig_lock(&mutex_flrig_freq); if (!wf) return; - long freq = reinterpret_cast(fr); + unsigned long int freq = reinterpret_cast(fr); wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); } -void set_flrig_freq(long int fr) +void set_flrig_freq(unsigned long int fr) { if (!connected_to_flrig) return; @@ -279,13 +280,13 @@ void flrig_get_frequency() if (!freq_posted) return; if (flrig_client->execute("rig.get_vfo", XmlRpcValue(), result, timeout) ) { str_freq = string(result); - int fr = atoi(str_freq.c_str()); + unsigned long int fr = atoll(str_freq.c_str()); if (!wait_freq && (fr != xcvr_freq)) { xcvr_freq = fr; guard_lock flrig_lock(&mutex_flrig_freq); Fl::awake(xmlrpc_rig_show_freq, reinterpret_cast(fr)); - LOG_VERBOSE("get freq: %d", fr); + LOG_VERBOSE("get freq: %lu", fr); } else if (wait_freq && (fr == xcvr_freq)) { wait_freq = false; wait_freq_timeout = 0; @@ -824,7 +825,7 @@ static void xmlrpc_rig_set_smeter(void *data) pwrmeter->hide(); smeter->show(); } - int val = reinterpret_cast(data); + int val = reinterpret_cast(data); smeter->value(val); } } @@ -852,7 +853,7 @@ static void xmlrpc_rig_set_pwrmeter(void *data) smeter->hide(); pwrmeter->show(); } - int val = reinterpret_cast(data); + int val = reinterpret_cast(data); pwrmeter->value(val); } } diff --git a/src/rsid/rsid_defs.cxx b/src/rsid/rsid_defs.cxx index 140668ed..6796de66 100644 --- a/src/rsid/rsid_defs.cxx +++ b/src/rsid/rsid_defs.cxx @@ -185,7 +185,7 @@ ELEM_(105, PSK_HELL, NUM_MODES) \ ELEM_(106, HELL_80, MODE_HELL80) \ ELEM_(107, FM_HELL_105, MODE_FSKH105) \ - ELEM_(108, FM_HELL_245, NUM_MODES) \ + ELEM_(108, FM_HELL_245, MODE_FSKH245) \ \ ELEM_(114, MODE_141A, NUM_MODES) \ ELEM_(123, DTMF, NUM_MODES) \ diff --git a/src/soundcard/play.pa.cxx b/src/soundcard/play.pa.cxx index 69d44004..0ea9c905 100644 --- a/src/soundcard/play.pa.cxx +++ b/src/soundcard/play.pa.cxx @@ -308,11 +308,11 @@ c_portaudio::c_portaudio() b_len = 0; rc = src_new (progdefaults.sample_converter, 1, &rc_error) ; monitor_rb = new ringbuffer(RBUFF_SIZE); - start_alert_thread(); - start_filelist_thread(); - bpfilt = 0; + bpfilt = new C_FIR_filter(); + start_alert_thread(); + start_filelist_thread(); } c_portaudio::~c_portaudio() @@ -626,6 +626,8 @@ void c_portaudio::mon_write(double *buffer, int len, int mon_sr) float vol = 0.01 * progdefaults.RxFilt_vol; float *rsbuffer = 0; + if (!bpfilt) init_filter(); + try { // do not resample if alert samplerate == modem samplerate diff --git a/src/soundcard/sound.cxx b/src/soundcard/sound.cxx index f3533209..02dd8fcb 100644 --- a/src/soundcard/sound.cxx +++ b/src/soundcard/sound.cxx @@ -104,18 +104,16 @@ namespace SND_SUPPORT { } void get_file_params(std::string def_fname, std::string &fname, int &format, bool check) { + bool isplayback = (def_fname.find("playback") != std::string::npos); std::string filters; - if (def_fname.find("playback") != std::string::npos) + if (isplayback) filters = "Audio format\t*.{mp3,wav}\n"; else filters = "Audio format\t*.wav\n"; - if (format_supported(SF_FORMAT_FLAC | SF_FORMAT_PCM_16)) { - filters.append("FLAC format\t*.flac"); - } format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; int fsel = 0; const char *fn = 0; - if (def_fname.find("playback") != std::string::npos) + if (isplayback) fn = FSEL::select(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); else fn = FSEL::saveas(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); @@ -125,6 +123,9 @@ namespace SND_SUPPORT { } fname = fn; + if (!isplayback && (fname.find(".wav") == std::string::npos)) + fname.append(".wav"); + if (check) { FILE *f = fopen(fname.c_str(), "r"); if (f) { @@ -162,13 +163,10 @@ SoundBase::SoundBase() txppm(progdefaults.TX_corr), rxppm(progdefaults.RX_corr), tx_src_state(0), rx_src_state(0), wrt_buffer(new double[SND_BUF_LEN]), -#if USE_SNDFILE ofCapture(0), ifPlayback(0), ofGenerate(0) -#endif { memset(wrt_buffer, 0, SND_BUF_LEN * sizeof(*wrt_buffer)); -#if USE_SNDFILE int err; writ_src_data_left = new SRC_DATA; writ_src_data_right = new SRC_DATA; @@ -207,14 +205,12 @@ SoundBase::SoundBase() modem_wr_sr = modem_play_sr = 0; out_pointer = src_rd_out_buffer; -#endif } SoundBase::~SoundBase() { delete [] wrt_buffer; -#if USE_SNDFILE if (ofGenerate) sf_close(ofGenerate); if (ofCapture) @@ -228,11 +224,8 @@ SoundBase::~SoundBase() delete [] src_write_buffer_right; delete [] src_rd_inp_buffer; delete [] src_rd_out_buffer; -#endif } -#if USE_SNDFILE - void SoundBase::stopCapture() { if (ofCapture) { @@ -683,8 +676,6 @@ void SoundBase::write_file(SNDFILE* file, double* bufleft, double *bufright, siz return; } -#endif // USE_SNDFILE - #if USE_OSS #define MAXSC 32767.0f @@ -932,14 +923,12 @@ size_t SoundOSS::Read(float *buffer, size_t buffersize) for (size_t i = 0; i < buffersize; i++) buffer[i] = src_buffer[2*i + (progdefaults.ReverseRxAudio ? 1 : 0)]; -#if USE_SNDFILE if (ofCapture) write_file(ofCapture, buffer, NULL, buffersize); if (ifPlayback) { read_file(ifPlayback, buffer, buffersize); return buffersize; } -#endif if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; @@ -976,10 +965,8 @@ size_t SoundOSS::Write(double *buf, size_t count) short int *wbuff; unsigned char *p; -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, buf, NULL, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -1053,10 +1040,8 @@ size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count) short int *wbuff; unsigned char *p; -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -1477,7 +1462,6 @@ do { \ size_t SoundPort::Read(float *buf, size_t count) { -#if USE_SNDFILE if (ifPlayback) { read_file(ifPlayback, buf, count); if (!ofCapture) { @@ -1486,7 +1470,6 @@ size_t SoundPort::Read(float *buf, size_t count) return count; } } -#endif if (rxppm != progdefaults.RX_corr) rxppm = progdefaults.RX_corr; @@ -1565,20 +1548,16 @@ size_t SoundPort::Read(float *buf, size_t count) buf[i] = rbuf[n]; } -#if USE_SNDFILE if (ofCapture) write_file(ofCapture, buf, NULL, count); -#endif - return count; + return count; } size_t SoundPort::Write(double *buf, size_t count) { -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, buf, NULL, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -1604,10 +1583,8 @@ size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count) if (sd[1].params.channelCount != 2) return Write(bufleft, count); -#if USE_SNDFILE if (ofGenerate) write_file(ofCapture, bufleft, bufright, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -2275,10 +2252,8 @@ void SoundPulse::flush(unsigned dir) size_t SoundPulse::Write(double* buf, size_t count) { -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, buf, NULL, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -2304,10 +2279,8 @@ size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count) if (sd[1].stream_params.channels != 2) return Write(bufleft, count); -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -2378,7 +2351,6 @@ long SoundPulse::src_read_cb(void* arg, float** data) size_t SoundPulse::Read(float *buf, size_t count) { -#if USE_SNDFILE if (ifPlayback) { read_file(ifPlayback, buf, count); if (!ofCapture) { @@ -2388,7 +2360,6 @@ size_t SoundPulse::Read(float *buf, size_t count) return count; } } -#endif size_t n = 0; long r = 0; @@ -2423,10 +2394,8 @@ size_t SoundPulse::Read(float *buf, size_t count) n += sd[0].stream_params.channels; } -#if USE_SNDFILE if (ofCapture) write_file(ofCapture, buf, NULL, count); -#endif return count; } @@ -2458,10 +2427,8 @@ void SoundPulse::src_data_reset(int mode) size_t SoundNull::Write(double* buf, size_t count) { -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, buf, NULL, count); -#endif if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; @@ -2474,10 +2441,8 @@ size_t SoundNull::Write(double* buf, size_t count) size_t SoundNull::Write_stereo(double* bufleft, double* bufright, size_t count) { -#if USE_SNDFILE if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); -#endif MilliSleep((long)ceil((1e3 * count) / sample_frequency)); @@ -2486,16 +2451,12 @@ size_t SoundNull::Write_stereo(double* bufleft, double* bufright, size_t count) size_t SoundNull::Read(float *buf, size_t count) { -#if USE_SNDFILE if (ifPlayback) read_file(ifPlayback, buf, count); else -#endif memset(buf, 0, count * sizeof(*buf)); -#if USE_SNDFILE if (ofCapture) write_file(ofCapture, buf, NULL, count); -#endif if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); @@ -2505,9 +2466,7 @@ size_t SoundNull::Read(float *buf, size_t count) void SoundNull::flush(unsigned) { -#if USE_SNDFILE if (ofGenerate) sf_close(ofGenerate); -#endif } diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index 7deacaa5..8676b65d 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -455,7 +455,7 @@ double modem::sigmaN (double es_ovr_n0) // case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: // case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: // case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: -// case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80: +// case MODE_FSKH245: case MODE_FSKH105: case MODE_HELL80: default: break; } if (trx_state == STATE_TUNE) mode_factor = 0.707; diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index 648c3f1c..59a391e3 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -1538,8 +1538,9 @@ void btnMem_cb(Fl_Widget *, void *menu_event) switch (op) { case SELECT: m = qrg_list[elem]; - if (active_modem != *mode_info[m.mode].modem) + if (active_modem != *mode_info[m.mode].modem) { init_modem_sync(m.mode); + } if (m.rfcarrier && m.rfcarrier != wf->rfcarrier()) qsy(m.rfcarrier, m.carrier); else @@ -1568,7 +1569,7 @@ void btnMem_cb(Fl_Widget *, void *menu_event) // write the menu item text { ostringstream o; - o << mode_info[m.mode].sname << " @@ "; + o << mode_info[m.mode].name << " @@ "; if (m.rfcarrier > 0) { // write 1000s separators char s[20], *p = s + sizeof(s) - 1; int i = 0; @@ -1584,10 +1585,11 @@ void btnMem_cb(Fl_Widget *, void *menu_event) o << p << (wf->USB() ? " + " : " - "); } o << m.carrier; - if (op == APPEND) + if (op == APPEND) { wf->mbtnMem->add(o.str().c_str()); - else + } else { wf->mbtnMem->replace(elem, o.str().c_str()); + } } break; } diff --git a/src/wefax/wefax.cxx b/src/wefax/wefax.cxx index eba80018..f1cf94d4 100644 --- a/src/wefax/wefax.cxx +++ b/src/wefax/wefax.cxx @@ -89,30 +89,54 @@ struct fir_coeffs // Narrow, middle and wide fir low pass filter from ACfax static const fir_coeffs input_filters[] = { - { _("Narrow"), 17, - { -7,-18,-15, 11, 56,116,177,223,240,223,177,116, 56, 11,-15,-18, -7} - }, - { _("Middle"), 17, - { 0,-18,-38,-39, 0, 83,191,284,320,284,191, 83, 0,-39,-38,-18, 0} - }, - { _("Wide"), 17, - { 6, 20, 7,-42,-74,-12,159,353,440,353,159,-12,-74,-42, 7, 20, 6} - }, - { "Blackman", 17, - { -2.7756e-15, 2.9258e+00, 1.3289e+01, 3.4418e+01, 6.8000e+01, - 1.1095e+02, 1.5471e+02, 1.8770e+02, 2.0000e+02, 1.8770e+02, - 1.5471e+02, 1.1095e+02, 6.8000e+01, 3.4418e+01, 1.3289e+01, - 2.9258e+00, -2.7756e-15 } }, - { "Hanning", 17, - { 0.00000, 7.61205, 29.28932, 61.73166, 100.00000, - 138.26834, 170.71068, 192.38795, 200.00000, 192.38795, - 170.71068, 138.26834, 100.00000, 61.73166, 29.28932, - 7.61205, 0.00000 } }, - { "Hamming", 17, - { 16.000, 23.003, 42.946, 72.793, 108.000, - 143.207, 173.054, 192.997, 200.000, 192.997, - 173.054, 143.207, 108.000, 72.793, 42.946, - 23.003, 16.000 } } +{ _("Narrow"), 65, +{ + 0.000495, 0.000684, 0.000885, 0.00109, 0.00128, + 0.00141, 0.00142, 0.00124, 0.000793, 2.94e-05, + -0.00108, -0.00251, -0.0042, -0.00602, -0.00778, + -0.00925, -0.0101, -0.0102, -0.00909, -0.00664, + -0.00267, 0.00289, 0.01, 0.0185, 0.0281, + 0.0383, 0.0488, 0.059, 0.0682, 0.0761, + 0.0821, 0.0858, 0.0871, 0.0858, 0.0821, + 0.0761, 0.0682, 0.059, 0.0488, 0.0383, + 0.0281, 0.0185, 0.01, 0.00289, -0.00267, + -0.00664, -0.00909, -0.0102, -0.0101, -0.00925, + -0.00778, -0.00602, -0.0042, -0.00251, -0.00108, + 2.94e-05, 0.000793, 0.00124, 0.00142, 0.00141, + 0.00128, 0.00109, 0.000885, 0.000684, 0.000495 +} }, +{ _("Medium"), 65, +{ + -0.000795, -0.000779, -0.000698, -0.000517, -0.000195, + 0.000303, 0.000982, 0.0018, 0.00267, 0.00343, + 0.00389, 0.00383, 0.00306, 0.00144, -0.00102, + -0.0042, -0.0078, -0.0114, -0.0143, -0.0159, + -0.0156, -0.0127, -0.00695, 0.00188, 0.0136, + 0.0277, 0.0434, 0.0596, 0.0752, 0.0889, + 0.0997, 0.106, 0.109, 0.106, 0.0997, + 0.0889, 0.0752, 0.0596, 0.0434, 0.0277, + 0.0136, 0.00188, -0.00695, -0.0127, -0.0156, + -0.0159, -0.0143, -0.0114, -0.0078, -0.0042, + -0.00102, 0.00144, 0.00306, 0.00383, 0.00389, + 0.00343, 0.00267, 0.0018, 0.000982, 0.000303, + -0.000195, -0.000517, -0.000698, -0.000779, -0.000795 +} }, +{ _("Wide"), 65, +{ + 0.000716, 0.000844, 0.000845, 0.000668, 0.000259, + -0.000402, -0.00126, -0.00216, -0.00284, -0.003, + -0.00234, -0.00073, 0.00175, 0.0047, 0.00747, + 0.00922, 0.00911, 0.00655, 0.00143, -0.00575, + -0.0138, -0.0209, -0.025, -0.0241, -0.0167, + -0.00203, 0.0193, 0.0457, 0.0743, 0.102, + 0.125, 0.14, 0.145, 0.14, 0.125, + 0.102, 0.0743, 0.0457, 0.0193, -0.00203, + -0.0167, -0.0241, -0.025, -0.0209, -0.0138, + -0.00575, 0.00143, 0.00655, 0.00911, 0.00922, + 0.00747, 0.0047, 0.00175, -0.00073, -0.00234, + -0.003, -0.00284, -0.00216, -0.00126, -0.000402, + 0.000259, 0.000668, 0.000845, 0.000844, 0.000716 +} } }; static const size_t nb_filters = sizeof(input_filters)/sizeof(input_filters[0]); ; @@ -1921,7 +1945,10 @@ void fax_implementation::rx_new_samples(const double* audio_ptr, int audio_sz) int ix = 0; /// The reception filter may have been changed by the GUI. - C_FIR_filter & ref_fir_filt_pair = m_rx_filters[ progdefaults.wefax_filter ]; + if (progdefaults.wefax_filter > 2 || progdefaults.wefax_filter < 0) + progdefaults.wefax_filter = 0; + + C_FIR_filter & ref_fir_filt_pair = m_rx_filters[ progdefaults.wefax_filter]; for (int i = 0; i < audio_sz; i++) { if (!ref_fir_filt_pair.run( diff --git a/src/widgets/FTextRXTX.cxx b/src/widgets/FTextRXTX.cxx index 92908af4..c84d0028 100644 --- a/src/widgets/FTextRXTX.cxx +++ b/src/widgets/FTextRXTX.cxx @@ -2413,6 +2413,7 @@ void FTextTX::handle_context_menu(void) bool modify_text_ok = insert_position() >= txpos; bool selected = tbuf->selected(); +std::cout << "FTextTX::tbuf " << (selected ? "selected" : "not selected") << std::endl; icons::set_active(&menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG); icons::set_active(&menu[TX_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[TX_MENU_CUT], selected && modify_text_ok); diff --git a/src/widgets/FTextView.cxx b/src/widgets/FTextView.cxx index 1916d5bd..9531923e 100644 --- a/src/widgets/FTextView.cxx +++ b/src/widgets/FTextView.cxx @@ -651,7 +651,7 @@ Fl_Menu_Item FTextEdit::menu[] = { { icons::make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Insert file..."), file_open_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, - { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL } , + { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_DIVIDER, FL_NORMAL_LABEL } , { 0 } }; @@ -855,6 +855,7 @@ int FTextEdit::handle_dnd_drop(void) void FTextEdit::handle_context_menu(void) { bool selected = tbuf->selected(); +std::cout << "FTextEdit::tbuf " << (selected ? "selected" : "not selected") << std::endl; icons::set_active(&menu[EDIT_MENU_CUT], selected); icons::set_active(&menu[EDIT_MENU_COPY], selected); icons::set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); @@ -892,6 +893,11 @@ void FTextEdit::menu_cb(size_t item) case EDIT_MENU_WRAP: set_word_wrap(!wrap, true); break; + default: + if (FTextEdit::menu[item].flags == 0) { // not an FL_SUB_MENU + add(FTextEdit::menu[item].text[0]); + add(FTextEdit::menu[item].text[1]); + } } } diff --git a/src/widgets/F_Edit.cxx b/src/widgets/F_Edit.cxx new file mode 100644 index 00000000..1144bc3b --- /dev/null +++ b/src/widgets/F_Edit.cxx @@ -0,0 +1,408 @@ +// ---------------------------------------------------------------------------- +// FTextView.cxx +// +// Copyright (C) 2007-2009 +// Stelios Bounanos, M0GLD +// +// Copyright (C) 2008-2009 +// Dave Freese, W1HKJ +// +// This file is part of fldigi. +// +// fldigi is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. +// +// fldigi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// ---------------------------------------------------------------------------- + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "flmisc.h" +#include "fileselect.h" +#include "font_browser.h" +#include "ascii.h" +#include "icons.h" +#include "gettext.h" +#include "macros.h" + +#include "F_Edit.h" + +#include "debug.h" + +using namespace std; + +int * F_Edit::p_editpos; + +Fl_Menu_Item F_Edit::menu[] = { + { 0 }, // EDIT_MENU_CUT + { 0 }, // EDIT_MENU_COPY + { 0 }, // EDIT_MENU_PASTE + { 0 }, // EDIT_MENU_CLEAR + { 0 }, // EDIT_MENU_READ + { 0 }, // EDIT_MENU_WRAP + + { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, + { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, + { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, + {0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0}, + { 0 } +}; + +F_Edit::F_Edit(int x, int y, int w, int h, const char *l) + : FTextEdit(x, y, w, h, l), editpos(0), bkspaces(0) +{ + change_keybindings(); + + memcpy(menu + EDIT_MENU_CUT, FTextEdit::menu, (FTextEdit::menu->size() - 1) * sizeof(*FTextEdit::menu)); + context_menu = menu; + init_context_menu(); + + p_editpos = &editpos; + +} + +/// Handles fltk events for this widget. +/// We pass keyboard events to handle_key() and handle mouse3 presses to show +/// the popup menu. We also disallow mouse2 events in the transmitted text area. +/// Everything else is passed to the base class handle(). +/// +/// @param event +/// +/// @return +/// +int F_Edit::handle(int event) +{ +// if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) +// return FTextEdit::handle(event); + +// if (event == FL_KEYBOARD) +// return handle_key(Fl::event_key()) ? 1 : FTextEdit::handle(event); + + return FTextEdit::handle(event); +} + +/// Clears the buffer. +/// Also resets the transmit position, stored backspaces and tx pause flag. +/// +void F_Edit::clear(void) +{ + FTextEdit::clear(); + editpos = 0; + bkspaces = 0; +} + +void F_Edit::add_text(string s) +{ + for (size_t n = 0; n < s.length(); n++) { + if (s[n] == '\b') { + int ipos = insert_position(); + if (tbuf->length()) { + if (ipos > 0) { + bkspaces++; + int nn; + tbuf->get_char_at(editpos, nn); + editpos -= nn; + } + tbuf->remove(tbuf->length() - 1, tbuf->length()); + sbuf->remove(sbuf->length() - 1, sbuf->length()); + redraw(); + } + } else { + add(s[n] & 0xFF, RECV); + } + } +} + +void F_Edit::setFont(Fl_Font f, int attr) +{ + FTextBase::setFont(f, attr); +} + +/// Handles keyboard events to override Fl_Text_Editor_mod's handling of some +/// keystrokes. +/// +/// @param key +/// +/// @return +/// +int F_Edit::handle_key(int key) +{ + switch (key) { + case FL_Tab: + if (editpos != insert_position()) + insert_position(editpos); + else + insert_position(tbuf->length()); + return 1; + case FL_BackSpace: { + int ipos = insert_position(); + if (editpos > 0 && editpos == ipos) { + bkspaces++; + editpos = tbuf->prev_char(ipos); + } + return 0; + } + default: + break; + } + +// read ctl-ddd, where d is a digit, as ascii characters (in base 10) +// and insert verbatim; e.g. ctl-001 inserts a + if (Fl::event_state() & FL_CTRL && (key >= FL_KP) && (key <= FL_KP + '9')) + return handle_key_ascii(key); + +// restart the numeric keypad entries. + ascii_cnt = 0; + ascii_chr = 0; + + return 0; +} + +int F_Edit::handle_dnd_drag(int pos) +{ + return 1; + return FTextEdit::handle_dnd_drag(pos); +} + +/// Handles mouse-3 clicks by displaying the context menu +/// +/// @param val +/// +void F_Edit::handle_context_menu(void) +{ + bool selected = tbuf->selected(); +std::cout << "F_Edit::tbuf " << (selected ? "selected" : "not selected") << std::endl; + icons::set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); + icons::set_active(&menu[EDIT_MENU_CUT], selected); + icons::set_active(&menu[EDIT_MENU_COPY], selected); + icons::set_active(&menu[EDIT_MENU_PASTE], true); + icons::set_active(&menu[EDIT_MENU_READ], true); + + if (wrap) + menu[EDIT_MENU_WRAP].set(); + else + menu[EDIT_MENU_WRAP].clear(); + + show_context_menu(); +} + +/// The context menu handler +/// +/// @param val +/// +void F_Edit::menu_cb(size_t item) +{ + switch (item) { + case EDIT_MENU_CLEAR: + clear(); + break; + case EDIT_MENU_CUT: + kf_cut(0, this); + break; + case EDIT_MENU_COPY: + kf_copy(0, this); + break; + case EDIT_MENU_PASTE: + kf_paste(0, this); + break; + case EDIT_MENU_READ: { + restore_wrap = wrap; + set_word_wrap(false); + readFile(); + break; + } + case EDIT_MENU_WRAP: + set_word_wrap(!wrap, true); + break; + default: + if (F_Edit::menu[item].flags == 0) { // not an FL_SUB_MENU + add(F_Edit::menu[item].text[0]); + add(F_Edit::menu[item].text[1]); + } + } +} + +/// Overrides some useful Fl_Text_Edit keybindings that we want to keep working, +/// provided that they don't try to change chunks of transmitted text. +/// +void F_Edit::change_keybindings(void) +{ + struct { + Fl_Text_Editor_mod::Key_Func function, override; + } fbind[] = { + { Fl_Text_Editor_mod::kf_default, F_Edit::kf_default }, + { Fl_Text_Editor_mod::kf_enter, F_Edit::kf_enter }, + { Fl_Text_Editor_mod::kf_delete, F_Edit::kf_delete }, + { Fl_Text_Editor_mod::kf_cut, F_Edit::kf_cut }, + { Fl_Text_Editor_mod::kf_paste, F_Edit::kf_paste } + }; + int n = sizeof(fbind) / sizeof(fbind[0]); + + // walk the keybindings linked list and replace items containing + // functions for which we have an override in fbind + for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { + for (int i = 0; i < n; i++) + if (fbind[i].function == k->function) + k->function = fbind[i].override; + } +} + +// The kf_* functions below call the corresponding Fl_Text_Editor_mod routines, but +// may make adjustments so that no transmitted text is modified. + +int F_Edit::kf_default(int c, Fl_Text_Editor_mod* e) +{ + return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_default(c, e); +} + +int F_Edit::kf_enter(int c, Fl_Text_Editor_mod* e) +{ + return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_enter(c, e); +} + +int F_Edit::kf_delete(int c, Fl_Text_Editor_mod* e) +{ + // single character + if (!e->buffer()->selected()) { + if (e->insert_position() >= *p_editpos && + e->insert_position() != e->buffer()->length()) + return Fl_Text_Editor_mod::kf_delete(c, e); + else + return 1; + } + + // region: delete as much as we can + int start, end; + e->buffer()->selection_position(&start, &end); + if (*p_editpos >= end) + return 1; + if (*p_editpos > start) + e->buffer()->select(*p_editpos, end); + + return Fl_Text_Editor_mod::kf_delete(c, e); +} + +int F_Edit::kf_cut(int c, Fl_Text_Editor_mod* e) +{ + if (e->buffer()->selected()) { + int start, end; + e->buffer()->selection_position(&start, &end); + if (*p_editpos >= end) + return 1; + if (*p_editpos > start) + e->buffer()->select(*p_editpos, end); + } + + return Fl_Text_Editor_mod::kf_cut(c, e); +} + +int F_Edit::kf_paste(int c, Fl_Text_Editor_mod* e) +{ + return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_paste(c, e); +} diff --git a/src/widgets/Fl_Text_Display_mod.cxx b/src/widgets/Fl_Text_Display_mod.cxx index a971de8e..c11cfc53 100644 --- a/src/widgets/Fl_Text_Display_mod.cxx +++ b/src/widgets/Fl_Text_Display_mod.cxx @@ -87,7 +87,7 @@ static int scroll_x = 0; */ Fl_Text_Display_mod::Fl_Text_Display_mod(int X, int Y, int W, int H, const char* l) : Fl_Group(X, Y, W, H, l) { - int i; + //int i; TOP_MARGIN = DEFAULT_TOP_MARGIN; BOTTOM_MARGIN = DEFAULT_BOTTOM_MARGIN; @@ -148,8 +148,9 @@ Fl_Text_Display_mod::Fl_Text_Display_mod(int X, int Y, int W, int H, const char* mNVisibleLines = 1; mLineStarts = new int[mNVisibleLines]; mLineStarts[0] = 0; - for (i=1; i #include +#include "configuration.h" #include "analysis.h" #include "modem.h" #include "misc.h" @@ -68,6 +69,7 @@ void anal::init() modem::init(); rx_init(); set_scope_mode(Digiscope::RTTY); + rxcorr = progdefaults.RX_corr; } anal::~anal() @@ -75,6 +77,7 @@ anal::~anal() delete bpfilt; delete ffilt; delete afilt; + progdefaults.RX_corr = rxcorr; } // used for checking file exists function @@ -247,7 +250,7 @@ void anal::writeFile() fprintf(out, "%02d:%02d:%02d, %13.3f, %6.3f, %8.6f, %6.2f\n", tm.tm_hour, tm.tm_min, tm.tm_sec, - (wf->rfcarrier() + (wf->USB() ? 1.0 : -1.0) * (frequency + fout)), fout, + (wf->rfcarrier() + (wf->USB() ? 1.0 : -1.0) * (frequency + fout) + progdefaults.RIT), fout + progdefaults.RIT, amp, 20.0 * log10( (amp == 0 ? 1e-6 : amp) ) ); fclose(out); @@ -310,9 +313,9 @@ int anal::rx_process(const double *buf, int len) set_scope(pipe, PIPE_LEN, false); if (wf->USB()) - snprintf(msg1, sizeof(msg1), "%13.3f", wf->rfcarrier() + frequency + fout ); + snprintf(msg1, sizeof(msg1), "%13.3f", wf->rfcarrier() + frequency + fout + progdefaults.RIT); else - snprintf(msg1, sizeof(msg1), "%13.3f", wf->rfcarrier() - frequency - fout ); + snprintf(msg1, sizeof(msg1), "%13.3f", wf->rfcarrier() - frequency - fout + progdefaults.RIT); put_Status2(msg1, 2.0); writeFile(); }