Upstream version 3.0pre1

pull/2/head
Stelios Bounanos 2008-06-12 23:15:17 +01:00
rodzic 92ebc3e93f
commit f379ad5eab
30 zmienionych plików z 805 dodań i 191 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
Change Log:
2.11 1) Added EXEC macro
3.0 1) Added EXEC macro
2) Added mousewheel over Macro buttons to move between macro button sets.
3) Fixed bug in Olivia signal level display.
4) Ported to Windows (win32) and OS-X
@ -88,6 +88,9 @@ Change Log:
40) Fixed bug in waterfall update method that could cause a seg fault
under certain conditions.
41) Change to PortAudio samplerate probing.
42) Increased average power level in MT-63 mode.
43) Significantly decreased cpu usage with changes to qrunner and complex
classes.
2.10.3)
1) Corrected memory leak bug.

Wyświetl plik

@ -7,9 +7,9 @@ AC_PREREQ(2.61)
dnl major and minor must be integers; patch may
dnl contain other characters or be empty
m4_define(FLDIGI_MAJOR, [2])
m4_define(FLDIGI_MINOR, [11])
m4_define(FLDIGI_PATCH, [AU])
m4_define(FLDIGI_MAJOR, [3])
m4_define(FLDIGI_MINOR, [0])
m4_define(FLDIGI_PATCH, [pre])
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])

Wyświetl plik

@ -120,6 +120,7 @@ fldigi_SOURCES += \
dialogs/fl_digi.cxx \
dialogs/font_browser.cxx \
dialogs/Viewer.cxx \
dialogs/htmlstrings.cxx \
thor/thor.cxx \
thor/thorvaricode.cxx \
dominoex/dominoex.cxx \
@ -134,6 +135,7 @@ fldigi_SOURCES += \
filters/filters.cxx \
filters/viterbi.cxx \
globals/globals.cxx \
include/htmlstrings.h \
include/Combo_Box.h \
include/Combo_List.h \
include/confdialog.h \

Wyświetl plik

@ -80,7 +80,6 @@ void rtty::init()
rtty::~rtty()
{
if (hilbert) delete hilbert;
// if (wfid) delete wfid;
if (bitfilt) delete bitfilt;
if (bpfilt) delete bpfilt;
}

Wyświetl plik

@ -1056,6 +1056,13 @@ static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) {
progdefaults.changed = true;
}
Fl_Spinner *valHellXmtWidth=(Fl_Spinner *)0;
static void cb_valHellXmtWidth(Fl_Spinner* o, void*) {
progdefaults.HellXmtWidth=(int)o->value();
progdefaults.changed = true;
}
Fl_Group *tabOlivia=(Fl_Group *)0;
Fl_Choice *mnuOlivia_Tones=(Fl_Choice *)0;
@ -1949,6 +1956,7 @@ l with your sound hardware.");
{ tabMisc = new Fl_Group(0, 25, 400, 195, "Misc");
tabMisc->color((Fl_Color)51);
tabMisc->selection_color((Fl_Color)51);
tabMisc->hide();
{ Fl_Group* o = new Fl_Group(5, 35, 390, 90, "Sweet Spot");
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
@ -2010,7 +2018,6 @@ l with your sound hardware.");
{ tabModems = new Fl_Group(0, 25, 401, 195, "Modem");
tabModems->color((Fl_Color)51);
tabModems->selection_color((Fl_Color)51);
tabModems->hide();
{ tabsModems = new Fl_Tabs(0, 25, 401, 195);
tabsModems->color((Fl_Color)51);
tabsModems->selection_color((Fl_Color)10);
@ -2209,6 +2216,7 @@ l with your sound hardware.");
{ tabDomEX = new Fl_Group(0, 50, 400, 170, "Dom");
tabDomEX->color((Fl_Color)51);
tabDomEX->selection_color((Fl_Color)51);
tabDomEX->hide();
{ txtSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text");
txtSecondary->type(4);
txtSecondary->callback((Fl_Callback*)cb_txtSecondary);
@ -2250,8 +2258,7 @@ l with your sound hardware.");
{ tabFeld = new Fl_Group(0, 50, 400, 170, "Feld");
tabFeld->color((Fl_Color)51);
tabFeld->selection_color((Fl_Color)51);
tabFeld->hide();
{ Fl_Choice* o = selHellFont = new Fl_Choice(175, 62, 122, 20, "Feld Hell Font:");
{ Fl_Choice* o = selHellFont = new Fl_Choice(260, 62, 122, 20, "Feld Hell Font:");
selHellFont->down_box(FL_BORDER_BOX);
selHellFont->labelfont(4);
selHellFont->textfont(4);
@ -2271,9 +2278,10 @@ l with your sound hardware.");
sldrHellBW->align(FL_ALIGN_TOP_LEFT);
o->value(progdefaults.HELL_BW);
} // Fl_Value_Slider* sldrHellBW
{ Fl_Check_Button* o = btnHellXmtWidth = new Fl_Check_Button(40, 93, 113, 15, "2x Xmt Width");
{ Fl_Check_Button* o = btnHellXmtWidth = new Fl_Check_Button(175, 175, 113, 15, "2x Xmt Width");
btnHellXmtWidth->down_box(FL_DOWN_BOX);
btnHellXmtWidth->callback((Fl_Callback*)cb_btnHellXmtWidth);
btnHellXmtWidth->hide();
o->value(progdefaults.HellXmtWidth);
} // Fl_Check_Button* btnHellXmtWidth
{ Fl_Check_Button* o = btnHellRcvWidth = new Fl_Check_Button(40, 113, 130, 15, "1/2 x Rcv Width");
@ -2286,15 +2294,15 @@ l with your sound hardware.");
btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard);
o->value(progdefaults.HellBlackboard);
} // Fl_Check_Button* btnBlackboard
{ Fl_Group* o = new Fl_Group(175, 90, 195, 85, "Pulse Shape");
{ Fl_Group* o = new Fl_Group(189, 90, 195, 85, "Pulse Shape");
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
{ Fl_Check_Button* o = btnHellFastAttack = new Fl_Check_Button(185, 110, 169, 15, "Fast Attack (2 msec)");
{ Fl_Check_Button* o = btnHellFastAttack = new Fl_Check_Button(199, 110, 169, 15, "Fast Attack (2 msec)");
btnHellFastAttack->down_box(FL_DOWN_BOX);
btnHellFastAttack->callback((Fl_Callback*)cb_btnHellFastAttack);
o->value(progdefaults.HellPulseFast);
} // Fl_Check_Button* btnHellFastAttack
{ Fl_Check_Button* o = btnHellSlowAttack = new Fl_Check_Button(185, 131, 70, 15, "Slow Attack (4 msec)");
{ Fl_Check_Button* o = btnHellSlowAttack = new Fl_Check_Button(199, 131, 70, 15, "Slow Attack (4 msec)");
btnHellSlowAttack->down_box(FL_DOWN_BOX);
btnHellSlowAttack->value(1);
btnHellSlowAttack->callback((Fl_Callback*)cb_btnHellSlowAttack);
@ -2308,6 +2316,13 @@ l with your sound hardware.");
btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle);
o->value(progdefaults.HellXmtIdle);
} // Fl_Check_Button* btnFeldHellIdle
{ Fl_Spinner* o = valHellXmtWidth = new Fl_Spinner(40, 80, 40, 25, "Xmt Width");
valHellXmtWidth->maximum(3);
valHellXmtWidth->value(1);
valHellXmtWidth->callback((Fl_Callback*)cb_valHellXmtWidth);
valHellXmtWidth->align(FL_ALIGN_RIGHT);
o->value(progdefaults.HellXmtWidth);
} // Fl_Spinner* valHellXmtWidth
tabFeld->end();
} // Fl_Group* tabFeld
{ tabOlivia = new Fl_Group(0, 50, 400, 170, "Olivia");

Wyświetl plik

@ -898,7 +898,7 @@ progdefaults.changed = true;}
}
Fl_Group tabMisc {
label Misc open
xywh {0 25 400 195} color 51 selection_color 51
xywh {0 25 400 195} color 51 selection_color 51 hide
} {
Fl_Group {} {
label {Sweet Spot} open
@ -952,7 +952,7 @@ progdefaults.changed = true;}
Fl_Check_Button chkSlowCpu {
label {Slow cpu}
callback {progdefaults.slowcpu = o->value();
progdefaults.changed = true;} selected
progdefaults.changed = true;}
xywh {110 190 89 15} down_box DOWN_BOX
code0 {o->value(progdefaults.slowcpu);}
}
@ -960,7 +960,7 @@ progdefaults.changed = true;} selected
}
Fl_Group tabModems {
label Modem open
xywh {0 25 401 195} color 51 selection_color 51 hide
xywh {0 25 401 195} color 51 selection_color 51
} {
Fl_Tabs tabsModems {open
xywh {0 25 401 195} color 51 selection_color 10 align 9
@ -1133,7 +1133,7 @@ progdefaults.changed = true;}
}
Fl_Group tabDomEX {
label Dom open
xywh {0 50 400 170} color 51 selection_color 51
xywh {0 50 400 170} color 51 selection_color 51 hide
} {
Fl_Input txtSecondary {
label {Secondary Text}
@ -1174,13 +1174,13 @@ progdefaults.changed = true;}
}
Fl_Group tabFeld {
label Feld open
xywh {0 50 400 170} color 51 selection_color 51 hide
xywh {0 50 400 170} color 51 selection_color 51
} {
Fl_Choice selHellFont {
label {Feld Hell Font:}
callback {progdefaults.feldfontnbr=o->value();
progdefaults.changed = true;} open
xywh {175 62 122 20} down_box BORDER_BOX labelfont 4 textfont 4
xywh {260 62 122 20} down_box BORDER_BOX labelfont 4 textfont 4
code0 {\#include "fontdef.h"}
code1 {o->add(szFeldFonts);}
code2 {o->value(progdefaults.feldfontnbr);}
@ -1195,7 +1195,7 @@ progdefaults.changed = true;} open
label {2x Xmt Width}
callback {progdefaults.HellXmtWidth=o->value();
progdefaults.changed = true;}
xywh {40 93 113 15} down_box DOWN_BOX
xywh {175 175 113 15} down_box DOWN_BOX hide
code0 {o->value(progdefaults.HellXmtWidth);}
}
Fl_Check_Button btnHellRcvWidth {
@ -1214,7 +1214,7 @@ progdefaults.changed = true;}
}
Fl_Group {} {
label {Pulse Shape} open
xywh {175 90 195 85} box ENGRAVED_FRAME align 21
xywh {189 90 195 85} box ENGRAVED_FRAME align 21
} {
Fl_Check_Button btnHellFastAttack {
label {Fast Attack (2 msec)}
@ -1226,7 +1226,7 @@ btnHellSlowAttack->value(1);
progdefaults.HellPulseFast = false;
}
progdefaults.changed = true;}
xywh {185 110 169 15} down_box DOWN_BOX
xywh {199 110 169 15} down_box DOWN_BOX
code0 {o->value(progdefaults.HellPulseFast);}
}
Fl_Check_Button btnHellSlowAttack {
@ -1239,7 +1239,7 @@ btnHellFastAttack->value(1);
progdefaults.HellPulseFast = true;
}
progdefaults.changed = true;}
xywh {185 131 70 15} down_box DOWN_BOX value 1
xywh {199 131 70 15} down_box DOWN_BOX value 1
code0 {o->value(!progdefaults.HellPulseFast);}
}
}
@ -1250,6 +1250,13 @@ progdefaults.changed = true;}
xywh {40 155 70 15} down_box DOWN_BOX value 1
code0 {o->value(progdefaults.HellXmtIdle);}
}
Fl_Spinner valHellXmtWidth {
label {Xmt Width}
callback {progdefaults.HellXmtWidth=(int)o->value();
progdefaults.changed = true;} selected
xywh {40 80 40 25} align 8 maximum 3 value 1
code0 {o->value(progdefaults.HellXmtWidth);}
}
}
Fl_Group tabOlivia {
label Olivia open

Wyświetl plik

@ -100,6 +100,8 @@
#include "Viewer.h"
#include "soundconf.h"
#include "htmlstrings.h"
Fl_Double_Window *fl_digi_main=(Fl_Double_Window *)0;
Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0;
Fl_Double_Window *scopeview = (Fl_Double_Window *)0;
@ -753,6 +755,25 @@ void html_help( const string &Html)
help_dialog = new Fl_Help_Dialog;
help_dialog->value(Html.c_str());
help_dialog->show();
restoreFocus();
}
void cb_mnuBeginnersURL(Fl_Widget*, void*)
{
if (!help_dialog)
help_dialog = new Fl_Help_Dialog;
help_dialog->value(szBeginner);
help_dialog->show();
restoreFocus();
}
void cb_mnuAboutURL(Fl_Widget*, void*)
{
if (!help_dialog)
help_dialog = new Fl_Help_Dialog;
help_dialog->value(szAbout);
help_dialog->show();
restoreFocus();
}
void fldigi_help(const string& theHelp)
@ -1189,12 +1210,13 @@ Fl_Menu_Item menu_[] = {
// settle the gmfsk vs fldigi argument once and for all
{"@-1circle Create sunspots", 0, cb_mnuFun, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0},
#endif
{"Beginners Help", 0, cb_mnuBeginnersURL, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"Online documentation", 0, cb_mnuVisitURL, (void *)PACKAGE_DOCS, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"Home page", 0, cb_mnuVisitURL, (void *)PACKAGE_HOME, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0},
{"Command line options", 0, cb_mnuCmdLineHelp, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"Audio device info", 0, cb_mnuAudioInfo, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"Build info", 0, cb_mnuBuildInfo, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0},
{"About", 0, cb_mnuAbout, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"About", 0, cb_mnuAboutURL, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
{" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0},
@ -1346,7 +1368,7 @@ void create_fl_digi_main() {
if (twoscopes) WNOM -= 2*DEFAULT_SW;
fl_digi_main = new Fl_Double_Window(WNOM, HNOM, "fldigi");
fl_digi_main = new Fl_Double_Window(WNOM, HNOM, PACKAGE_NAME" "PACKAGE_VERSION);//"fldigi");
mnu = new Fl_Menu_Bar(0, 0, WNOM - 142, Hmenu);
// FL_NORMAL_SIZE may have changed; update the menu items
for (size_t i = 0; i < sizeof(menu_)/sizeof(menu_[0]); i++)
@ -2225,3 +2247,4 @@ void start_tx()
fl_unlock(&trx_mutex);
wf->set_XmtRcvBtn(true);
}

Wyświetl plik

@ -0,0 +1,568 @@
// ----------------------------------------------------------------------------
//
// htmlstrings.cxx
//
// Copyright (C) 2008
// 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 2 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 fldigi; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ----------------------------------------------------------------------------
char szBeginner[] = "\
<HTML>\
<HEAD>\
<TITLE>Beginners' Guide to FLDIGI</TITLE>\
</HEAD>\
<BODY BG=FFFFFF TEXT=404040 LINK=CC0088 VLINK=995544>\
<font size=\"0\" face=\"Verdana, Arial, Helvetica\">\
<CENTER>\
<H1>Beginners' Guide to FLDIGI</H1>\
<P>\
<A HREF=\"#Wotuneed\">Requirements</A>&nbsp;\
<A HREF=\"#Install\">Installation</A>&nbsp;\
<A HREF=\"#Start\">Getting Started</A>&nbsp;\
<A HREF=\"#Oper\">Operating</A>&nbsp;\
<A HREF=\"#Keys\">Special Keys</A>&nbsp;\
\
<HR>\
</CENTER>\
<H2>Beginners' Questions Answered</H2>\
<H3><I>What is FLDIGI?</I></H3>\
<BLOCKQUOTE>\
FLDIGI is a computer program intended for Amateur Radio Digital Modes operation using a PC (Personal Computer).\
FLDIGI operates (as does most similar software) in conjunction with a conventional HF SSB radio transceiver,\
and uses the\
PC sound card as the main means of input from the radio, and output to the radio. These are audio-frequency\
signals. The software also controls the radio by means of another connection, typically a serial port.\
<P>\
FLDIGI is multi-mode, which means that it is able to operate many popular digital modes without switching\
programs, so you only have one program to learn. FLDIGI includes all the popular modes, such as DominoEX, MFSK16,\
PSK31, and RTTY.\
<P>\
Unusually, FLDIGI is available for multiple computer operating systems; Linux, Free-BSD; OS-X and Windows(XP).\
</BLOCKQUOTE>\
<H3><I>What is a Digital Mode?</I></H3>\
<BLOCKQUOTE>\
Digital Modes are a means of operating Amateur radio from the computer keyboard. The computer acts as 'modem' (modulator - demodulator),\
as well as allowing you to type, and see what the other person types. It also controls the transmitter, changes modes as required,\
and provides various convenient features such as easy tuning of signals and prearranged messages.\
<P>\
In this context, we are talking\
about modes used on the HF (high frequency) bands, specifically 'chat' modes, those used to have a regular\
conversation in a similar way to voice or Morse, where one operator 'talks' for a minute or two, then another\
does the same. These chat modes allow multiple operators to take part in a 'net'.\
<P>\
Because of sophisticated digital signal processing which takes place inside the computer, digital modes can\
offer performance that cannot be achieved using voice (and in some cases even Morse), through reduced\
bandwidth, improved signal-to-noise performance and reduced transmitter power requirement. Some modes also\
offer built-in automatic error correction.\
<P>\
Digital Mode operating procedure is not unlike Morse operation, and many of the same abbreviations are used.\
Software such as FLDIGI makes this very simple as most of the procedural business is set up for you using\
the Function Keys at the top of the keyboard. These are easy to learn.\
</BLOCKQUOTE>\
<H3><I>Why all the different modes?</I></H3>\
<BLOCKQUOTE>\
HF propagation is very dependent on the ionosphere, which reflects the signals back to earth. There are strong\
interactions between different signals arriving from different paths. Experience has shown that particular\
modulation systems, speeds and bandwidths suit different operating conditions.\
<P>\
Other factors such as available band space, operating speed and convenience, noise level, signal level and\
available power also affect the choice of mode. While in many cases several different modes might be suitable,\
having a choice adds to the operating pleasure. It is diffcult to advise which mode is best for each particular\
occasion, and experience plays an important role. \
<P>\
You might consider purchasing '<I>Digital Modes for All Occasions</I>'\
(ISBN 1-872309-82-8) by Murray Greenman ZL1BPU, published by the <A HREF=\"http://www.rsgbshop.org/\">RSGB</A>,\
as this gives a good insight into each mode\
and its capabilities. The book is also available from FUNKAMATEUR and CQ Communications.\
<P>\
</BLOCKQUOTE>\
<H3><I>How do I recognise and tune in the signals?</I></H3>\
<BLOCKQUOTE>\
Recognising the different modes comes with experience. It is a matter of listening to the signal, and observing\
the appearance of the signal on the tuning display. You can also practice transmitting with the transceiver\
disconnected, listening to the sound of the signals coming from the computer. There is also (see later paragraph)\
an automatic tuning option which can recognise and tune in most modes for you.\
<P>\
The software provides a tuning display which shows the radio signals that are receivable within the transceiver\
passband. Using a 'point and click' technique with the mouse, you can click on the centre of a signal to select it,\
and the software will tune it in for you. Some modes require more care than others, and of course you need to have\
the software set for the correct mode first - not always so easy!\
<P>\
The 'RSID' (automatic mode detection and tuning) feature uses a special sequence of tones transmitted at the beginning of each transmission to identify\
and tune in the signals received. For this feature to work, not only do you need to enable the feature in the receiver,\
but in addition the stations you are wishing to tune in need to have this feature enabled on transmission. Other\
programs also offer this RSID feature as an option.\
</BLOCKQUOTE>\
<H3><I>Where can I find detailed instructions for FLDIGI?</I></H3>\
<BLOCKQUOTE>\
Of necessity, this Beginner's Guide contains only as much as you need to know to get started. You can always read the\
details and learn how to make best use of the program by reading the <A HREF=\"http://www.w1hkj.com/FldigiHelp/index.html\">Online Documentation</A>. You can also access it from within the FLDIGI program from the HELP Menu item. \
</BLOCKQUOTE>\
<A NAME=\"Wotuneed\">\
<HR>\
<H2>Requirements</H2>\
<BLOCKQUOTE>\
<DL>\
<DT><B>Computer</B></DT>\
<DD>Pentium&trade; 3 or 4, Celeron&trade;, or equivalent, 750MHz or better, 256MB RAM or more. Faster computers can give\
better performance.</DD>\
<DT><B>Operating System</B></DT>\
<DD>Windows XP SP2 (Home or Pro), LINUX distributions such as Debian, Ubuntu, Kubuntu, Mandriva, Mandrake,\
SuSE, Puppy Linux, or FreeBSD. FLDIGI can be home compiled for other distributions. FLDIGI does not support\
Windows 98 or older, and may not work with Windows VISTA.</DD>\
<DT><B>Other Requirements</B></DT>\
<DD><LI>Computer serial port (or USB serial port) for rig control\
<LI>Optional serial CAT (Computer Aided Tuning) computer control\
<LI>About 5MB of drive space is required for program files\
<LI>Internet connection will allow direct connection to the online help files and your online callsign server subscription.\
<LI>A radio interface to the sound card and serial port, such as the RigBlaster&trade; or similar. You can make one yourself.\
<LI>A modern HF SSB transceiver, with or without CAT control. For some modes, frequency stability is very important\
(preferably less than 1Hz drift per over), and the difference between transmit and receive frequencies should also\
be low (less than 1Hz). Tuning steps should be 100Hz or less. Most commercial synthesized transceivers made in the last\
20 years will meet these requirements.\
</DD></DL>\
</BLOCKQUOTE>\
<A NAME=\"Install\">\
<HR>\
<H2>Installation</H2>\
<H3><I>Installing</I></H3>\
<BLOCKQUOTE>\
<UL><LI>Locate and download the correct archive for your operating system from the <A HREF=\"http://www.w1hkj.com/Fldigi.html\">\
FLDIGI web site</A>.\
<LI>Create a suitable folder on your hard drive (for example Programs/FLDIGI) and unzip the archive into this folder.\
<LI>Right-click on the executable <B>fldigi.exe</B>, select 'Create Shortcut', and drag the resulting shortcut either to\
the desktop or to a suitable place in the menu structure.\
<LI>Double-click on this new shortcut to start the program. You're in business!\
</BLOCKQUOTE>\
<H3><I>Updating the Program</I></H3>\
<BLOCKQUOTE>\
<UL><LI>Delete the shortcut you made during installation\
<LI>Repeat the installation process described above, using the same folder. The new program will over-write the old.\
<LI>Make a new shortcut as described above.\
</UL>\
</BLOCKQUOTE>\
<H3><I>Removing the Program</I></H3>\
<BLOCKQUOTE>\
<UL><LI>Delete the shortcut you made during installation\
<LI>Locate the program folder you made during installation, delete the contents, and then delete the folder.\
</UL>\
</BLOCKQUOTE>\
<H3><I>Setting Up</I></H3>\
<BLOCKQUOTE>\
<UL><LI>Use the menu <B>Configure/Defaults/Sound Card Audio Devices</B> tab to select the sound card you wish to use.\
You can ignore the other tabs for now.\
<LI>Use the menu <B>Configure/Defaults/Operator</B> item to set the user name, callsign, location and so on.\
<LI>Use the menu <B>Configure/Defaults/Rig Ctrl</B> item to set how you will control the rig. Set 'Ptt' to 'TTY'.\
If you will control the rig via a serial port, select the COM port you will use, and select which line controls PTT.\
If in doubt, check both RTS and DTR. You MUST then press the <B>Initialize</B> button.\
<LI>If you plan to use CAT control of the rig via the COM port, check 'userigCAT'. If in addition you wish to use\
PTT control via CAT, also then check 'rigCAT PTT'. You MUST then press the <B>Initialize</B> button.\
<LI>Use the menu <B>Configure/Defaults/Misc</B> item to set whether you wish to transmit RSID data at the start of each\
over (this is for the benefit of others, this setting does not affect RSID reception), and whether you have a slow computer (under 1000MHz)\
or not. The receiver decoding strategy uses less processor power in 'Slow cpu' mode. If you plan to regularly\
use the RSID feature on receive, you must leave the 'Start New Modem at Sweet Spot' item unchecked.\
<LI>Each of the modems can be individually set up from the <B>Configure/Modems</B> multi-tabbed dialog.\
You need not change anything here to start with, although it might be a good idea to set the 'secondary text' for DominoEX\
('Dom' tab) and THOR ('Thor' tab) to something useful, such as your call and locator. (Secondary text is transmitted when the text\
you type does not keep up with the typing speed of the mode - this handy text appears in a small window at the very bottom of the screen).\
Note that this set of tabs is also where you set the RTTY modem speed and shift, although the default values should be fine\
for normal operation.\
<LI>Use the menu <B>Configure/Save Config</B> item to save the new configuration.\
<LI>Use your sound card 'Master Volume' applet to select the sound card, the Wave output and set the transmit audio level.\
You can check the level using the <B>TUNE</B> button, top right, beyond the Menu.\
<LI>The 'Volume' applet can usually be opened by <B>START/Run...</B> and enter '<B>sndvol32'</B>, or from the Control Panel.\
<LI>Use your sound card 'Recording Control' applet to select the sound card, the line or mic input and set the receiver audio level.\
Watch the waterfall display for receiver noise when setting the level. If you see any dark blue noise, you have the right input\
and about the right level. The actual setting is not very important, provided you see blue noise. If the audio level is too high,\
the little diamond shaped indicator (bottom right) will show <B><FONT COLOR=RED>red</FONT></B>. The waterfall may also show red bands.\
Performance will be degraded if the level is too high.\
<LI>The 'Record' applet can usually be opened by <B>START/Run...</B> and enter '<B>sndvol32 /r</B>', or from the Control Panel.\
If opened from the Control Panel, you'll end up with the Master Volume applet, and need to switch using Options/Properties, and selecting\
the 'Recording' radio button.\
</UL>\
</BLOCKQUOTE>\
<A NAME=\"Start\">\
<HR>\
<H2>Getting Started</H2>\
<H3><I>Guided Tour</I></H3>\
<BLOCKQUOTE>\
Double-click on the FLDIGI shortcut to start the program. A window with three main panes will appear.\
Study it carefully as you read these notes. From top to bottom, these are the <B>RECEIVE</B> pane\
(<B><FONT COLOR=EECC44>orange</FONT></B>), the <B>TRANSMIT</B> pane (<B><FONT COLOR=cyan>light blue</FONT></B>), and the <B>WATERFALL</B> pane (<B><FONT COLOR=black>black</FONT></B>). At the top is\
the collection of entry items which form the <B>LOG DATA</B>, and at the very top, a\
conventional drop-down <B>MENU</B> system, with entries for <U>F</U>iles, Op <U>M</U>ode, Configure, View and Help.\
<P>\
Between the RECEIVE and TRANSMIT panes is a line of boxes (buttons), which represent the Function Keys F1 - F12.\
We call this the <B>FUNCTIONS</B> group.\
Below the WATERFALL pane is another line of boxes (buttons), which provide various control features. We call this the\
<B>CONTROLS</B> group. The program and various buttons can mostly be operated using the mouse or the keyboard, and users\
generally find it convenient\
to use the mouse while tuning around, and the keyboard and function keys during a QSO.\
</BLOCKQUOTE>\
<H3><I>RECEIVE Pane</I></H3>\
<BLOCKQUOTE>\
This is where the text from decoded incoming signals is displayed, in <B><FONT COLOR=black>black</FONT></B> text.\
When you transmit, the transmitted text is also displayed here, but in <B><FONT COLOR=red>red</FONT></B>, so\
the RECEIVE pane becomes a complete record of the QSO. The information in this pane can also be logged to a file.\
<P>\
The line at the bottom of this pane can be dragged up and down with the mouse. You might prefer to drag it down a bit\
to enlarge the RECEIVE pane and reduce the size of the TRANSMIT pane.\
</BLOCKQUOTE>\
<H3><I>TRANSMIT Pane</I></H3>\
<BLOCKQUOTE>\
This is where you type what you want to transmit. The mouse must click in here before you type (to obtain 'focus') otherwise\
your text will go nowhere. You can type in here while you are receiving, and when you start transmitting, the text already typed\
will be sent first. This trick is a cool way to impress others with your typing speed! As the text is transmitted, the text colour\
changes from <B><FONT COLOR=black>black</FONT></B> to <B><FONT COLOR=red>red</FONT></B>. At the end of the over, all the transmitted\
text (and any as yet not transmitted) will be deleted.\
</BLOCKQUOTE>\
<H3><I>WATERFALL Pane</I></H3>\
<BLOCKQUOTE>\
This is the main tuning facility. There are two modes, 'Waterfall' and 'FFT', selected by a button in the CONTROL group. For now,\
leave it in 'Waterfall' mode, as this is the easiest to tune with, and gives the best identification of the signal.\
<UL><LI>'Waterfall' is a spectrogram display, of signal strength versus frequency, over passing time. The receiver passband\
is analysed and displayed with lower frequencies to the left, higher to the right. Weak signals and background noise\
are dark while stronger signals show as brighter colours. As time passes (over a few seconds), the historic signals move downwards like a waterfall.\
<LI>'FFT' is a spectrum display, simply the mean signal strength versus frequency. Again frequency is displayed from left to right,\
but now the vertical direction shows signal strength and there is no brightness or historic onformation.</UL>\
<P>\
At the top of the pane is a scale of frequency in Hz, which corresponds to the frequency displayed immediately below it. This\
scale can be moved around and zoomed using buttons in the CONTROL group.\
<P>\
As you move the mouse around in this pane you will see a <B><FONT COLOR=CCCC00>yellow</FONT></B> group of tuning marks following the mouse pointer.\
Tuning is achieved by left-clicking on a signal displayed by the waterfall in this pane. Use these yellow marks to\
exactly straddle the signal and then left-click on the centre of the signal. The tuning marks change to\
<B><FONT COLOR=red>red</FONT></B>. The <B><FONT COLOR=red>red</FONT></B> vertical lines will show the approximate\
width of the active signal area (the expected signal bandwidth), while a <B><FONT COLOR=red>red</FONT></B>\
horizontal bar above will indicate the receiver software's active decoding range. When you left-click, the red\
marks move to where you clicked, and will attempt to auto-track the signal from there.\
<P>\
You can temporarily 'monitor' a different signal by right-clicking on it. As long as you hold the mouse button down, the signal under\
it will be decoded; as soon as you release the mouse, decoding will revert to the previously tuned spot (where the red marks are).\
</BLOCKQUOTE>\
<H3><I>LOG Data</I></H3>\
<BLOCKQUOTE>\
Using this group of entry boxes, you can keep a log of your QSOs. At the left are two '<B>Frequency</B>' boxes.\
If you use CAT control to operate your transceiver, the dial frequency is recorded automatically in the lower box;\
otherwise you can type it manually or select (botton to the right) from a list of common frequencies. The audio frequency from the waterfall\
is added to this value and displayed in the upper box - assuming your rig is calibrated correctly, this is the true\
centre frequency of the station you are in QSO with. You can't type in the upper box.\
<P>\
The program is able to switch sidebands (the '<B>U</B>' or '<B>L</B>' button under the '<B>Time</B>' display),\
so if your rig is in LSB mode, the signals are inverted for you, and when you\
add the frequency to the log information, the audio frequency is subtracted rather than added, so again the true transmit\
frequency is displayed and logged.\
<P>\
The '<B>Time</B>' box can be typed in, or you can push the adjacent button to insert the current time. All times are in UTC,\
and the computer knows how to calculate this from the PC local civil time, time zone and summer-time setting. Clever stuff!\
<P>\
You can type the other station's callsign and name in the '<B>Call</B>' and '<B>Namel</B>' boxes, or right-click\
on the appropriate word in the RECEIVE pane to insert them automatically. The same applies to the '<B>QTH</B>',\
'<B>LOC</B>' (locator) and received signal report '<B>RST In</B>'. The other entries must be added manually.\
If you have access to an appropriate Callbook on-line subscription or CD, pressing the '<B>QRZ</B>' button will fetch\
this information for you automatically.\
<P>\
The '<B>Clear</B>' button clears all the log data; the '<B>Save</B>' button sends the logged information to the log file.\
</BLOCKQUOTE>\
<H3><I>MENU</I></H3>\
<BLOCKQUOTE>\
At the very top of the program window is a conventional drop-down menu. If you click on any of the items, a list of optional\
functions will appear. Keyboard menu selection is also provided.\
Where <U>underscored</U> characters are shown in the menu, you can select these menu items from the keyboard\
using the marked character and &lt;<B>Alt</B>&gt; at the same time, then moving around with the up/down/left/right keys.\
Use &lt;<B>Esc</B>&gt; to quit from the menu with no change.\
These menu functions are:\
</BLOCKQUOTE>\
<DL><DT><B><U>F</U>iles</B></DT>\
<DD>Allows you to open or save Macros (we won't get into that here), turn on/off logging to file, record/play audio samples, and exit the program. You can also exit the program by clicking on the 'X' in the tope right corner of the window, in the usual manner.</DD>\
<DT><B>Op <U>M</U>ode</B></DT>\
<DD>This is where you select the operating modem used for transmission and reception. Some modes only have one option. Where more are\
offered, drag the mouse down the list and sideways following the arrow to a secondary list, before releasing it. When you start the\
program next time, it will remember the last mode you used.\
<P>\
Not all the modes are widely used, so choose a mode which (a) maximizes your chance of a QSO, and (b) is appropriate for\
the band, conditions, bandwidth requirements and permissions relevant to your operating licence.\
<P>\
At the bottom of the list are two 'modes' which aren't modes at all, and do not transmit (see\
<A HREF=\"http://www.w1hkj.com/FldigiHelp/index.html\">Online Documentation</A> for details). <B>WWV</B> mode allows you to receive a standard time\
signal so the beeps it transmits can be used for sound card calibration. <B>Freq Analysis</B> provides just a waterfall display with a very narrow cursor, and a frequency meter\
which indicates the received frequency in Hz to two decimal places. This is useful for on-air frequency measurement.</DD>\
<DT><B>Configure</B></DT>\
<DD>This is where you set up the program to suit your computer, yourself and your operating preferences. <B>Defaults</B>\
will allow you to change the operating settings of the program. This is where you enter your personal information,\
or define your computer sound card, for example.\
<B>Modems</B> can be individually changed, each having\
different adjustments. The <B>Modems</B> dialog has multiple tabs, so you can edit any one of them. Don't fool with\
the settings until you know what you are doing! The final item, <B>Save Config</B> allows you to save the altered configuration\
for next time you start the program (otherwise changes are temporary).\
<DT><B>View</B></DT>\
<DD>This menu item allows you to open extra windows. Most will be greyed out, but two that are available are the <B>Digiscope</B>,\
and the <B>PSK Browser</B>. The <B>Digiscope</B> provides a mode-specific graphical analysis of the received signal, and\
can have more than one view (left click in the new window to change the view), or maybe none at all. The <B>PSK Browser</B>\
is a rather cool tool that allows you to monitor several PSK31 signals all at the same time! These windows can be resized to suit.</DD>\
<DT><B>Help</B></DT>\
<DD>Brings up the <A HREF=\"http://www.w1hkj.com/FldigiHelp/index.html\">Online Documentation</A>, the FLDIGI\
<A HREF=\"http://www.w1hkj.com/Fldigi.html\">Home Page</A>, and various information about the program.</DD>\
</DL>\
<H3><I>FUNCTIONS</I></H3>\
<BLOCKQUOTE>\
This line of buttons provides user-editable QSO features. For example, the first button on the left sends CQ for you. Both the\
function of these buttons (we call them <B><I>MACROS</I></B>) and the label on each button, can be changed. Select each button\
to use it by pressing the corresponding Function Key (F1 - F12, you'll notice the buttons are grouped in patterns four to a group,\
just as the Function Keys are). You can also select them with a left-click of the mouse. If you right-click on the button, you\
are able to edit the buttons label and its function. A handy dialog pops up to allow this to be done. There are many standard\
shortcuts, such as &lt;MYCALL&gt; which you can use within the Macros. Notice that the buttons also turn the transmitter on\
and off as necessary.\
<P>\
You can just about hold a complete QSO using these buttons from left to right (but please don't!). Notice that at the right are\
two spare buttons you can set as you wish, and then a button labelled '1'. Yes, this is the first set of FOUR sets of Macros,\
and you can access the others using this button, which changes to read '2', '3', '4' then '1' again (right-click to go backwards),\
or by pressing &lt;<B>Alt</B>&gt; and the corresponding number (1-4, not F1-F4) at the same time.\
<P>\
If you REALLY mess up the Macros and can't see how to fix them, just close the program without saving them, and reopen it.\
</BLOCKQUOTE>\
<H3><I>CONTROLS</I></H3>\
<BLOCKQUOTE>\
The line of buttons under the waterfall is used to control the program (as opposed to the QSO). If you hover the mouse over\
these buttons, you'll see a little yellow hint box appear which tells you what each button does.\
<P>\
The <B>Id?</B> button turns on the receive\
RSID (automatic mode detection and tuning) feature. When in use, the button turns yellow and no text reception is possible until\
a signal is identified, or the feature is turned off again. If you plan to use the RSID feature on receive,\
you must leave the 'Start New Modem at Sweet Spot' item in the Menu Configure/Defaults/Mics tab unchecked.\
<P>\
The next three buttons control waterfall behaviour. The first switches between Waterfall and FFT modes; the next sets the scale\
zoom factor (visible display width, x1, x2 or x4); the third selects the waterfall speed. NORM or SLOW setting is best unless\
you have a very fast computer.\
<P>\
The next three buttons move the waterfall left and right, followed by two (either side of a number, the audio frequency in Hz)\
which control the receiving frequency (they move the red cursor lines).\
<P>\
You can also adjust the signal level over which the waterfall works. The default range is from 0dB downwards 70dB (i.e. to -70dB).\
Both of these values can be adjusted to suit your sound card and receiver audio level.\
<P>\
The <B>M</B> button allows you to store or recall the current frequency (see the <A HREF=\"http://www.w1hkj.com/FldigiHelp/index.html\">Online Documentation</A> for details). The <B>Lk</B> button locks the transmit frequency (fixes the red cursors), and the <B>Rv</B> button turns\
the signal decoding upside down (some modes are sideband sensitive, and if they are the wrong way up, can't be received\
correctly). Remember to turn this one off when you're done, or you won't receive anything! If every signal you hear is upside\
down, check your transceiver sideband setting.\
<P>\
The <B>T/R</B> button forces the transmitter on or off - use this with care, as it will stop transmission immediately,\
losing whatever is in the buffer (what you have typed in the Transmit pane), or start it immediately, even if nothing is ready to transmit.\
<P>\
There are two further controls in the bottom right corner of the program, to the right of the Status line:\
</BLOCKQUOTE>\
<DL><DT><B>Afc</B> - The AFC control</DT>\
<DD>When this button is pressed, an indicator on the button turns yellow, and the program will automatically retune to drifting signals.\
When the button is again pressed, AFC is off, and the tuning will stay where you leave it.</DD>\
<DT><B>Sql</B> - The Squelch control</DT>\
<DD>When off (no coloured indicator on the button, the receiver displays all 'text' received, even if there is no signal present,\
and the receiver is simply attempting to decode noise. When activated by pressing the button, the indicator turns yellow.\
If the incoming signal strength exceeds that set by the adjacent slider control (above the <B>Sql</B> button), the indicator\
turns green and the incoming signal is decoded and printed. The signal strength is indicated on the green bar beside the\
Squelch level slider. If nothing seems to be printing, the first thing to do is check the Squelch!</DD>\
</DL>\
</BLOCKQUOTE>\
<H3><I>STATUS Line</I></H3>\
<BLOCKQUOTE>\
At the very bottom line of the FLDIGI window is a row of useful information. At the left is the current operating mode. Next (some modes)\
is the measured signal-to-noise ratio at the receiver, and (in some modes) the measured signal intermodulation level (IMD).\
<P>\
The larger central box shows (in DominoEX and THOR modes) the received 'Secondary Text'. This is information (such as\
station identification) which is transmitted automatically whenever the transmitter has completed all user text that is\
available to send. It is transmitted using special characters, and is automatically directed to this special window. Secondary text\
you transmit is also shown here. This box changes size when you enlarge the program window.\
</BLOCKQUOTE>\
<A NAME=\"Oper\">\
<HR>\
<H2>Operating</H2>\
<H3><I>Procedure</I></H3>\
<BLOCKQUOTE>\
Operating procedure for digital modes is similar to that for Morse. Some of the same abbreviations are used. For example, at the beginning\
of an over, you might send 'VK3XYZ de WB8ABC' or just 'RR Jack' and so on. At the end of an over, it is usual to send 'ZL1ABC de AA3AR K',\
and at the end of a QSO '73 F3XYZ de 3D2ZZ SK'. When operating in a group or net it is usual to sign 'AA3AE es gp de ZK8WW K'.\
<P>\
It is also considered a courtesy to send a blank line or two (press &lt;<B>Enter</B>&gt;)\
before any text at the start of an over, and following the last text at the end of an over. You can also place these in the macros.\
The purpose is to separate your text from the previous text, and especially from any rubbish that was printed between overs.\
<P>\
FLDIGI does all of this for you. The Function Keys are set up to provide these start and end of over facilities, and can be edited\
to suit your preferences. In\
order that the other station's callsign can appear when these keys are used, you need to set the other station's callsign in the log\
data - it does not matter if you use the log facility or not.\
<DL>\
<DT><B>Hint:</B> Some Function Key Macro buttons have graphic symbols on them which imply the following:<BR>\
<DD><B>&gt;&gt;</B>&nbsp;&nbsp;The transmitter comes on and stays on when you use this button/macro.\
<DD><B>||</B>&nbsp;&nbsp;&nbsp;The transmitter goes off when the text from this button/macro has been sent.\
<DD><B>&gt;|</B>&nbsp;&nbsp;The transmitter comes on, sends the text from this button/macro, and goes off when the text from this button/macro has been sent.\
</DL>\
\
The Macros are set up to control the transmitter as necessary, but you can also switch the transmitter on at the start of an over with &lt;<B>Ctrl</B>&gt;\
and <B>T</B> or the <B>TX</B> macro button, and off again with &lt;<B>Ctrl</B>&gt; and <B>R</B> or the <B>RX</B> macro button. If you\
have Macros copied into or text already typed in the Transmit pane when you start the transmitter, this is sent first.\
<P>\
Calling another station you have tuned in is as simple as pushing a button. Put his callsign into the log data (right click, select Call)\
and press the <B>ANS</B> Macro button (or <B>F2</B>) when you are ready. If he replies, you are in business! Then press <B>QSO</B> (<B>F3</B>)\
to start each over, and <B>BTU</B> (<B>F4</B>) to end it, and <B>SK</B> (<B>F5</B>) to sign off.\
<DL>\
<DT><B>Hint:</B> When typing text, the correct use of upper and lower case is important:<BR>\
<DD><LI>Modes such as RTTY and THROB have no lower case capability.\
<DD><LI>In most other modes, excessive use of upper case is considered impolite, like SHOUTING!\
<DD><LI>Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are optimized for lower case.\
You should use lower case as much as possible in these modes to achieve maximum text speed. In these modes upper case\
characters are noticeably slower to send and also slightly more prone to errors.\
</DL>\
</BLOCKQUOTE>\
<H3><I>Adjustment</I></H3>\
<BLOCKQUOTE>\
Most digital modes do not require much transmitter power, as the receiver software is very sensitive. Many modes (PSK31, THROB,\
MT63) also require very high transmitter linearity, which is another reason to keep transmitter power below 30% of maximum.\
Some modes (Hellschreiber, Morse) have high peak power output, which may not indicate well on the conventional power meter,\
another reason to keep the average transmitted power low to prevent a very broad signal being transmitted.\
<P>\
Adjust the transmitter output power using the <B>TUNE</B> button, top right, beyond the Menu. The output will be the same as the peak\
power in other modes. Adjust the master Volume applet Wave Out and Master Volume controls to achieve the appropriate power.\
Use of excessive drive will result in distortion (signal difficult to tune in, and often poorer reception) and a very broad signal.\
<P>Some multi-carrier modes (MT63 for example) may require individual adjustment as the average power may be rather low.\
<DL>\
<DT><B>Hint:</B> Where possible, use the area above 1200Hz on the waterfall.\
<DD><LI>Below 1200Hz the second harmonic of the transmitted audio will pass through the transmitter filters.\
<DD><LI>When using lower frequency tones, adjust the transmitter and audio level with great\
care, as the second (and even third) harmonic will appear in the transmitter passband, causing excessive signal width.\
<DD><LI>A narrow (CW) filter in the rig is no help in this regard, as it is only used on receive. When you do use a narrow filter, this will restrict the area over which the receiver and transmitter will operate (without retuning of course). Try adjusting the passband tuning (if available).\
<DD><LI>Keep the sound card audio level to a minimum and set the transmitter gain to a similar level used for SSB.\
</DL>\
</BLOCKQUOTE>\
<H3><I>Waterfall Tuning</I></H3>\
<BLOCKQUOTE>\
When using this program, as with most other digital modes programs, tuning is generally accomplished by leaving the\
transceiver VFO at a popular spot (for example 14.070MHz, USB), and performing all the 'tuning' by moving around within\
the software.\
<P>\
The FLDIGI software has a second 'VFO' which is tuned by clicking on the waterfall. On a busy band, you\
may see many signals at the same time (especially with PSK31 or Morse), and so you can click with the mouse on\
any one of these signals to tune it in, receive it, and if the opportunity allows, reply to the station.\
<P>\
The software 'VFO' operates in a transceive mode, so the transmitter signal is automatically and exactly tuned to the\
received frequency. If you click correctly on the signal, your reply will always be in tune with the other station.\
<DL>\
<DT><B>Hint:</B> You <B>MUST NOT</B> use RIT (Clarifier) when using digital modes.\
<DD><LI>With RIT on, you will probably have to retune after every over.\
<DD><LI>Use of the RIT will also cause the other station to change frequency, and you will chase each other\
across the band.\
<DD><LI>Older transceivers without digital synthesis may have an unwanted offset (frequency difference)\
between transmit and receive frequencies. Such rigs should not be used for digital modes.\
</DL>\
Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as tuning is not at all critical.\
The software tuning still operates, but because the signal is so wide, there is limited ability to move\
around in the waterfall tuning.\
</BLOCKQUOTE>\
<A NAME=\"Keys\">\
<H3><I>Special Keys</I></H3>\
<BLOCKQUOTE>\
Several special keyboard controls are provided to make operating easier.\
</BLOCKQUOTE>\
<DL><DT><B>Pause Transmission</B></DT>\
<DD>\
Press &lt;<B>Pause/Break</B>&gt; while in receive, and the program will switch to transmit mode. It will continue\
with the text in the transmit buffer (the Transmit pane text) from the current point, i.e. where the red (previously sent) text ends and\
the black (yet to be sent) text begins. If the buffer only contains unsent text, then it will begin at the first\
character in the buffer. If the buffer is empty, the program will switch to transmit mode, and depending on the\
mode of operation, will send idle characters or nothing at all until characters are entered into the buffer. \
<P>\
If you press &lt;<B>Pause/Break</B>&gt; while in transmit mode, the program will return to receive mode. There\
may be a slight delay for some modes like MFSK, PSK and others, that requires the transmitter to send a postamble\
at the end of a transmission. The transmit text buffer stays intact, ready for the &lt;<B>Pause/Break</B>&gt;\
key to return you to the transmit mode .\
<P>\
Pressing &lt;<B>Alt/Meta</B>&gt; and <B>R</B> has the same effect as &lt;<B>Pause/Break</B>&gt;.\
You could think of the &lt;<B>Pause/Break</B>&gt; key as a software break-in capability.</DD>\
<P>\
<DT><B>ESCAPE</B></DT>\
<DD>\
Pressing &lt;<B>Esc</B>&gt; while transmitting will abort the transmission. Transmission stops as soon as possible,\
(any necessary postamble is sent), and the program returns to receive. Any unsent text in the transmit\
buffer will be lost.\
<P>\
If you press &lt;<B>Esc</B>&gt; &lt;<B>Esc</B>&gt; (i.e. twice in quick succession),\
transmission stops immediately, (without sending any postamble), and the program returns to receive. Any unsent\
text in the transmit buffer will be lost. Use this feature as an <FONT COLOR=RED><B>EMERGENCY STOP</B></FONT>.\
<P>\
<DT><B>RETURN to Receive</B></DT>\
<DD>Press &lt;<B>Ctrl</B>&gt; and <B>R</B> to insert the <B>^r</B> command in the transmit buffer at the current typing\
point. When transmission reaches this point, transmission will stop. The transmission does not stop immediately.\
<P>\
<DT><B>START Transmission</B></DT>\
<DD>Press &lt;<B>Ctrl</B>&gt; and <B>T</B> to start transmission if there is text ready in the transmit buffer.\
</DD><P>\
<P>\
<DT><B>MOVE Typing Cursor</B></DT>\
<DD>Press &lt;<B>Tab</B>&gt; to move the cursor (typing insertion point) to the end of the transmit buffer.\
This will also pause transmission. A &lt;<B>Tab</B>&gt; press at that position moves the cursor back to the\
character following the last one transmitted. Morse operation is slightly different. See the on-line help for\
<A HREF=\"http://www.w1hkj.com/FldigiHelp/CW.html\">CW</A>. \
</DD><P>\
<P>\
<DT><B>SEND any ASCII character</B></DT>\
<DD>Press &lt;<B>Ctl</B>&gt; and (at the same time) any three-digit number (on the numeric keypad) to\
insert the ASCII character designated by that entry value into the transmit buffer. For example,\
&lt;<B>Ctl</B>&gt;<B>177</B> is '±' and &lt;<B>Ctl</B>&gt;<B>176</B> is '°' (degree).\
</DL>\
<HR>\
<SMALL><CENTER><b>Copyright © M. Greenman</a> 2008</b.</SMALL>\
</CENTER>\
\
</BODY>\
</HTML>\
<html><body></body></html>\
";
char szAbout[] =
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\
<html>\
<head>\
<title>about</title>\
</head>\
<BODY BGCOLOR=FFFFCO TEXT=101010>\
<font size=\"0\" face=\"Verdana, Arial, Helvetica\">\
<CENTER>\
<H1><I>Fldigi</I></H1>\
<br>\
</CENTER>\
<H4>Digital modem program for</H4><br>\
<P>\
&nbsp; &nbsp; &nbsp;Linux<br>\
&nbsp; &nbsp; &nbsp;Free-BSD<br>\
&nbsp; &nbsp; &nbsp;OS-X<br>\
&nbsp; &nbsp; &nbsp;Windows (XP)<br>\
<br>\
<H4>Authors:</H4><br>\
<P>\
&nbsp; &nbsp; &nbsp;Dave Freese, W1HKJ<br>\
&nbsp; &nbsp; &nbsp;Stelios Buonanos, M0GLD<br>\
&nbsp; &nbsp; &nbsp;Leigh Klotz, WA5ZNU<br>\
<br>\
<H4>Beginners Help:</H4><br>\
<P>\
&nbsp; &nbsp; &nbsp;M. Greenman, ZL1BPU<br>\
</big>\
</body>\
</html>\
";

Wyświetl plik

@ -467,7 +467,7 @@ int feld::tx_process()
int c;
bool hdkey;
dxmode = 1 + progdefaults.HellXmtWidth;
dxmode = progdefaults.HellXmtWidth;
hdkey = progdefaults.HellPulseFast;
fntnbr = progdefaults.feldfontnbr;

Wyświetl plik

@ -85,7 +85,7 @@ void fftfilt::create_filter(double f1, double f2)
/*
* Filter with fast convolution (overlap-add algorithm).
*/
int fftfilt::run(complex in, complex **out)
int fftfilt::run(const complex& in, complex **out)
{
// collect filterlen/2 input samples
filtdata[inptr++] = in;
@ -103,7 +103,7 @@ int fftfilt::run(complex in, complex **out)
// multiply with the filter shape
for (int i = 0; i < filterlen; i++)
filtdata[i] = filtdata[i] * filter[i];
filtdata[i] *= filter[i];
// IFFT transpose back to the time domain
ift->icdft(filtdata);

Wyświetl plik

@ -432,7 +432,7 @@ sfft::~sfft()
// Values are not stable until more than "len" samples have been processed.
// returns address of first component in array
complex *sfft::run(complex input)
complex *sfft::run(const complex& input)
{
complex z;
complex y;

Wyświetl plik

@ -330,6 +330,9 @@ protected:
int txpos;
static int *ptxpos;
int bkspaces;
char ascii_cnt;
unsigned ascii_chr;
};

Wyświetl plik

@ -11,56 +11,66 @@ class complex {
public:
double re;
double im;
complex(double r = 0.0, double i = 0.0) {
re = r;
im = i;
}
~complex() {};
complex(double r = 0.0, double i = 0.0)
: re(r), im(i) { }
double real() { return re; };
void real(double R) {re = R;};
double imag() { return im; };
void imag(double I) {im = I;};
// Z = X * Y
complex operator* (complex y) {
complex z;
z.re = re * y.re - im * y.im;
z.im = re * y.im + im * y.re;
return z;
complex& operator*=(const complex& y) {
re = re * y.re - im * y.im;
im = re * y.im + im * y.re;
return *this;
}
complex operator*(const complex& y) const {
return complex(re * y.re - im * y.im, re * y.im + im * y.re);
}
// Z = X * y
complex operator* (double y) {
complex z;
z.re = y * z.re;
z.im = y * z.im;
return z;
complex& operator*=(double y) {
re *= y;
im *= y;
return *this;
}
complex operator*(double y) const {
return complex(re * y, im * y);
}
// Z = X + Y
complex operator+ (complex y) {
complex z;
z.re = re + y.re;
z.im = im + y.im;
return z;
complex& operator+=(const complex& y) {
re += y.re;
im += y.im;
return *this;
}
complex operator+(const complex& y) const {
return complex(re + y.re, im + y.im);
}
// Z = X - Y
complex operator- (complex y) {
complex z;
z.re = re - y.re;
z.im = im - y.im;
return z;
complex& operator-=(const complex& y) {
re -= y.re;
im -= y.im;
return *this;
}
complex operator-(const complex& y) const {
return complex(re - y.re, im - y.im);
}
// Z = X / Y
complex operator/ (complex y) {
complex& operator/=(const complex& y) {
double denom = y.re*y.re + y.im*y.im;
if (denom == 0.0) denom = 1e-10;
complex z;
z.re = (re * y.re + im * y.im) / denom;
z.im = (im * y.re - re * y.im) / denom;
return z;
re = (re * y.re + im * y.im) / denom;
im = (im * y.re - re * y.im) / denom;
return *this;
}
complex operator/(const complex& y) const {
double denom = y.re*y.re + y.im*y.im;
if (denom == 0.0) denom = 1e-10;
return complex((re * y.re + im * y.im) / denom, (im * y.re - re * y.im) / denom);
}
// Z = (complex conjugate of X) * Y
@ -68,7 +78,12 @@ public:
// Z2 = x2 + jy2, or Z2 = |Z2|exp(jP2)
// Z = (x1 - jy1) * (x2 + jy2)
// or Z = |Z1|*|Z2| exp (j (P2 - P1))
complex operator% (complex y) {
complex& operator%=(const complex& y) {
re = re * y.re + im * y.im;
im = re * y.im - im * y.re;
return *this;
}
complex operator%(const complex& y) const {
complex z;
z.re = re * y.re + im * y.im;
z.im = re * y.im - im * y.re;
@ -76,29 +91,29 @@ public:
}
// n = |Z| * |Z|
double norm() {
double norm() const {
return (re * re + im * im);
}
// n = |Z|
double mag() {
double mag() const {
return sqrt(norm());
}
// Z = x + jy
// Z = |Z|exp(jP)
// arg returns P
double arg() {
double arg() const {
return atan2(im, re);
}
};
inline complex cmac (complex *a, complex *b, int ptr, int len) {
inline complex cmac (const complex *a, const complex *b, int ptr, int len) {
complex z;
ptr = ptr % len;
ptr %= len;
for (int i = 0; i < len; i++) {
z = z + a[i] * b[ptr];
z += a[i] * b[ptr];
ptr = (ptr + 1) % len;
}
return z;

Wyświetl plik

@ -162,6 +162,7 @@ extern Fl_Check_Button *btnBlackboard;
extern Fl_Check_Button *btnHellFastAttack;
extern Fl_Check_Button *btnHellSlowAttack;
extern Fl_Check_Button *btnFeldHellIdle;
extern Fl_Spinner *valHellXmtWidth;
extern Fl_Group *tabOlivia;
extern Fl_Choice *mnuOlivia_Tones;
extern Fl_Choice *mnuOlivia_Bandwidth;

Wyświetl plik

@ -73,7 +73,7 @@ struct configuration {
double HELL_BW;
bool HellRcvWidth;
bool HellBlackboard;
bool HellXmtWidth;
int HellXmtWidth;
bool HellXmtIdle;
bool HellPulseFast;
// OLIVIA

Wyświetl plik

@ -25,7 +25,7 @@ public:
fftfilt(double f1, double f2, int len);
~fftfilt();
void create_filter(double f1, double f2);
int run(complex in, complex **out);
int run(const complex& in, complex **out);
};
#endif

Wyświetl plik

@ -131,7 +131,7 @@ private:
public:
sfft(int len, int first, int last);
~sfft();
complex *run(complex input);
complex *run(const complex& input);
};

Wyświetl plik

@ -0,0 +1,31 @@
// ----------------------------------------------------------------------------
//
// htmlstrings.h
//
// Copyright (C) 2008
// 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 2 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 fldigi; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ----------------------------------------------------------------------------
#ifndef HTMLSTRINGS_H
#define HTMLSTRINGS_H
extern char szBeginner[];
extern char szAbout[];
#endif

Wyświetl plik

@ -87,16 +87,16 @@ struct nop
class qrunner
{
public:
qrunner(size_t npri_ = 1);
qrunner();
~qrunner();
void attach(void);
void detach(void);
template <typename F>
bool request(const F &f, size_t pri = 0)
bool request(const F& f)
{
if (fifo->push(f, pri)) {
if (fifo->push(f)) {
#ifdef NDEBUG
if (unlikely(write(pfd[1], "", 1) != 1))
throw qexception(errno);
@ -113,13 +113,13 @@ public:
}
template <typename F>
bool request_sync(const F &f, size_t pri = 0)
bool request_sync(const F& f)
{
if (!attached)
return request(f, pri);
return request(f);
for (;;) {
if (request(f, pri))
if (request(f))
break;
sched_yield();
}
@ -128,7 +128,7 @@ public:
fsignal s(&m, &c);
fl_lock(&m);
for (;;) {
if (request(s, pri))
if (request(s))
break;
sched_yield();
}
@ -141,14 +141,12 @@ public:
static void execute(int fd, void *arg);
void flush(void);
size_t nprio(void) { return fifo->queues(); }
void drop(size_t pri) { fifo->drop(pri); }
size_t size(size_t pri) { return fifo->size(pri); }
void drop(void) { fifo->drop(); }
size_t size(void) { return fifo->size(); }
protected:
fqueue *fifo;
int pfd[2];
size_t npri;
bool attached;
public:
bool drop_flag;

Wyświetl plik

@ -137,7 +137,7 @@ protected:
unsigned char symbolpair[2];
private:
complex mixer(int n, complex in);
complex mixer(int n, const complex& in);
// Rx
void recvchar(int c);

Wyświetl plik

@ -135,7 +135,7 @@ int main(int argc, char ** argv)
SET_THREAD_ID(FLMAIN_TID);
for (int i = 0; i < NUM_QRUNNER_THREADS; i++) {
cbq[i] = new qrunner(1);
cbq[i] = new qrunner;
cbq[i]->attach();
}

Wyświetl plik

@ -78,7 +78,7 @@ configuration progdefaults = {
150.0, // double HELL_BW;
false, // bool HellRcvWidth;
false, // bool HellBlackboard;
false, // bool HellXmtWidth;
1, // bool HellXmtWidth;
true, // bool HellXmtIdle;
false, // bool HellPulseFast;
// OLIVIA
@ -420,7 +420,7 @@ void configuration::writeDefaultsXML()
writeXMLint(f, "FELDFONTNBR", feldfontnbr);
writeXMLbool(f, "HELLRCVWIDTH", HellRcvWidth);
writeXMLbool(f, "HELLXMTWIDTH", HellXmtWidth);
writeXMLint(f, "HELLXMTWIDTH", HellXmtWidth);
writeXMLbool(f, "HELLBLACKBOARD", HellBlackboard);
writeXMLbool(f, "HELLPULSEFAST", HellPulseFast);
writeXMLbool(f, "HELLXMTIDLE", HellXmtIdle);

Wyświetl plik

@ -53,6 +53,8 @@ void mt63::rx_init()
escape = 0;
}
double peak = 0.0;
int mt63::tx_process()
{
int c;
@ -69,6 +71,8 @@ int mt63::tx_process()
if (stopflag && flush-- == 0) {
stopflag = false;
Tx->SendJam();
for (int i = 0; i < Tx->Comb.Output.Len; i++)
Tx->Comb.Output.Data[i] /= 0.8;
ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len);
cwid();
return -1; /* we're done */
@ -82,10 +86,14 @@ int mt63::tx_process()
if (c > 127) {
c &= 127;
Tx->SendChar(127);
for (int i = 0; i < Tx->Comb.Output.Len; i++)
Tx->Comb.Output.Data[i] /= 0.8;
ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len);
}
Tx->SendChar(c);
for (int i = 0; i < Tx->Comb.Output.Len; i++)
Tx->Comb.Output.Data[i] /= 0.8;
ModulateXmtr((Tx->Comb.Output.Data), Tx->Comb.Output.Len);
return 0;

Wyświetl plik

@ -255,7 +255,7 @@ int olivia::rx_process(const double *buf, int len)
double s2n = 20.0 * log10(snr < 0.1 ? 0.1 : snr);
snprintf(msg1, sizeof(msg1), "s/n %4.1f", s2n);//Rx->SignalToNoiseRatio());
snprintf(msg1, sizeof(msg1), "s/n %4.1f dB", s2n);
put_Status1(msg1);
snprintf(msg2, sizeof(msg2), "Freq: %+4.1f", Rx->FrequencyOffset());
put_Status2(msg2);
@ -272,11 +272,10 @@ void olivia::restart()
tones = progdefaults.oliviatones;
bw = progdefaults.oliviabw;
samplerate = 8000;
// samplerate = 11025;
Tx->Tones = 2 * (1 << tones);
Tx->Bandwidth = 125 * (1 << bw);
Tx->SampleRate = samplerate; //8000.0; //samplerate;
Tx->SampleRate = samplerate;
Tx->OutputSampleRate = samplerate;
txbasefreq = get_txfreq_woffset();
@ -300,8 +299,8 @@ void olivia::restart()
if (txfbuffer) delete [] txfbuffer;
txfbuffer = new double[txbufferlen];
rxbufferlen = 0; //SCBLOCKSIZE;
rxbuffer = 0; //new short int[rxbufferlen];
rxbufferlen = 0;
rxbuffer = 0;
Rx->Tones = Tx->Tones;
Rx->Bandwidth = Tx->Bandwidth;
@ -309,7 +308,7 @@ void olivia::restart()
Rx->SyncIntegLen = sinteg;
Rx->SyncThreshold = progStatus.sqlonoff ? progStatus.sldrSquelchValue : 0.0;
Rx->SampleRate = samplerate; // 8000.0;//samplerate;
Rx->SampleRate = samplerate;
Rx->InputSampleRate = samplerate;
if (reverse) {
@ -326,8 +325,6 @@ void olivia::restart()
}
fragmentsize = 1024;
set_bandwidth(Tx->Bandwidth);
// Rx->PrintParameters();
put_MODEstatus(mode);
}
@ -344,7 +341,6 @@ olivia::olivia()
txbuffer = 0;
txfbuffer = 0;
rxbuffer = 0;
// samplerate = 11025;
samplerate = 8000;
FL_LOCK();
@ -353,7 +349,6 @@ olivia::olivia()
FL_UNLOCK();
mode = MODE_OLIVIA;
// wfid = new id(this);
smargin = progdefaults.oliviasmargin;
sinteg = progdefaults.oliviasinteg;
lastfreq = 0;
@ -367,6 +362,5 @@ olivia::~olivia()
if (txbuffer) delete [] txbuffer;
if (txfbuffer) delete [] txfbuffer;
if (rxbuffer) delete [] rxbuffer;
// if (wfid) delete wfid;
}

Wyświetl plik

@ -58,113 +58,61 @@ class fqueue
typedef ringbuffer<char> fqueue_ringbuffer_t;
public:
fqueue(size_t count = 2048, size_t nqueues_ = 1, size_t blocksize_ = 128)
: nqueues(nqueues_), blocksize(blocksize_)
fqueue(size_t count = 2048, size_t blocksize_ = 128)
: blocksize(blocksize_)
{
rb = new fqueue_ringbuffer_t*[nqueues];
for (size_t i = 0; i < nqueues; i++)
rb[i] = new fqueue_ringbuffer_t(blocksize * count);
rb = new fqueue_ringbuffer_t(blocksize * count);
}
~fqueue()
{
for (size_t i = 0; i < nqueues; i++) {
drop(i);
delete rb[i];
}
delete [] rb;
drop();
delete rb;
}
bool empty(size_t q)
{
if (q != nqueues)
return rb[q]->read_space() == 0;
for (size_t i = 0; i < nqueues; i++)
if (rb[i]->read_space() > 0)
return false;
return true;
}
bool empty(void) { return empty(nqueues); }
bool full(size_t q)
{
if (q != nqueues)
return rb[q]->write_space() == 0;
for (size_t i = 0; i < nqueues; i++)
if (rb[i]->write_space() > 0)
return false;
return true;
}
size_t size(size_t q)
{
if (q != nqueues)
return rb[q]->read_space() / blocksize;
size_t n = 0;
for (size_t i = 0; i < nqueues; i++)
n += rb[i]->read_space() / blocksize;
return n;
}
size_t size(void) { return size(nqueues); }
size_t queues(void) { return nqueues; }
bool empty(void) { return rb->read_space() == 0; }
bool full(void) { return rb->write_space() == 0; }
size_t size(void) { return rb->read_space() / blocksize; }
template <class T>
bool push(const T &t, size_t q)
bool push(const T& t)
{
// If we have any space left at all, it will be at least
// a blocksize. It will not wrap around the end of the rb.
rb[q]->get_wv(wvec);
if (unlikely(wvec[0].len < blocksize))
if (unlikely(rb->get_wv(wvec, blocksize) < blocksize))
return false;
assert(blocksize >= sizeof(func_wrap<T>));
// we assume a no-throw ctor!
new (wvec[0].buf) func_wrap<T>(t);
rb[q]->write_advance(blocksize);
rb->write_advance(blocksize);
return true;
}
bool pop(size_t q, bool exec = false)
bool pop(bool exec = false)
{
size_t start, end;
if (q != nqueues) // pull from named queue
start = end = q;
else { // pull first available element
start = 0;
end = nqueues - 1;
}
if (rb->get_rv(rvec, blocksize) < blocksize)
return false;
reinterpret_cast<func_base *>(rvec[0].buf)->destroy(exec);
rb->read_advance(blocksize);
for (size_t i = start; i <= end; i++) {
rb[i]->get_rv(rvec);
if (rvec[0].len < blocksize)
continue;
reinterpret_cast<func_base *>(rvec[0].buf)->destroy(exec);
rb[i]->read_advance(blocksize);
return true;
}
return false;
return true;
}
bool execute(void) { return pop(nqueues, true); }
bool execute(void) { return pop(true); }
size_t drop(size_t q)
size_t drop(void)
{
size_t n = 0;
while (pop(q, false))
while (pop(false))
++n;
return n;
}
protected:
fqueue_ringbuffer_t **rb;
fqueue_ringbuffer_t* rb;
fqueue_ringbuffer_t::vector_type rvec[2], wvec[2];
size_t nqueues, blocksize;
size_t blocksize;
};
#endif // FQUEUE_H_

Wyświetl plik

@ -34,10 +34,10 @@
#include "fqueue.h"
#include "qrunner.h"
qrunner::qrunner(size_t npri_)
: npri(npri_), attached(false), drop_flag(false)
qrunner::qrunner()
: attached(false), drop_flag(false)
{
fifo = new fqueue(2048, npri);
fifo = new fqueue(2048);
#ifndef __CYGWIN__
if (pipe(pfd) == -1)
#else

Wyświetl plik

@ -245,7 +245,7 @@ thor::thor(trx_mode md)
//=====================================================================
// rx modules
complex thor::mixer(int n, complex in)
complex thor::mixer(int n, const complex& in)
{
complex z;
double f;
@ -258,7 +258,7 @@ complex thor::mixer(int n, complex in)
f = THORFIRSTIF - THORBASEFREQ - bandwidth/2 + (samplerate / symlen) * (1.0 * n / paths);
z.re = cos(phase[n]);
z.im = sin(phase[n]);
z = z * in;
z *= in;
phase[n] -= twopi * f / samplerate;
if (phase[n] > M_PI)
phase[n] -= twopi;

Wyświetl plik

@ -77,7 +77,6 @@ throb::~throb()
if (outbuf) delete[] outbuf;
for (int i = 0; i < num_tones; i++)
if (rxtone[i]) delete [] rxtone[i];
// if (wfid) delete wfid;
}
void throb::flip_syms() //call this whenever a space or idle is sent or received
@ -231,7 +230,6 @@ throb::throb(trx_mode throb_mode) : modem()
syncpos = 0.5;
scope_data = new double [SCOPE_DATA_LEN];
// wfid = new id(this);
phaseacc = 0.0;
metric = 0.0;

Wyświetl plik

@ -626,7 +626,8 @@ void WFdisp::update_waterfall() {
RGBI *p3, *p4;
p1 = tmp_fft_db + offset;
p3 = fft_img;
short* limit = tmp_fft_db + image_area - step + 1;
for (int row = 0; row < image_height; row++) {
p2 = p1;
p4 = p3;
@ -635,38 +636,38 @@ void WFdisp::update_waterfall() {
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ (*p2+ *(p2+1)+ *(p2+2)+ *(p2+3))/4 ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
else if (step == 2)
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ (*p2 + *(p2+1))/2 ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
else
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ *p2 ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
} else {
if (step == 4)
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ MAX( MAX ( MAX ( *p2, *(p2+1) ), *(p2+2) ), *(p2+3) ) ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
else if (step == 2)
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ MAX( *p2, *(p2+1) ) ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
else
for (int col = 0; col < disp_width; col++) {
*(p4++) = mag2RGBI[ *p2 ];
p2 += step;
if (p2 > tmp_fft_db + image_area - step + 1) break;
if (p2 > limit) break;
}
}
p1 += IMAGE_WIDTH;

Wyświetl plik

@ -642,6 +642,8 @@ FTextEdit::FTextEdit(int x, int y, int w, int h, const char *l)
context_menu = edit_menu;
change_keybindings();
ascii_cnt = 0;
ascii_chr = 0;
}
/// Handles fltk events for this widget.
@ -908,12 +910,13 @@ int FTextEdit::handle_key(int key)
if (key >= FL_F && key <= FL_F_Last && insert_position() >= txpos)
return handle_key_macro(key);
// read A/M-ddd, where d is a digit, as ascii characters (in base 10)
// and insert verbatim; e.g. M-001 inserts a <soh>
if (Fl::event_state() & FL_CTRL && isdigit(key) &&
// read ctl-ddd, where d is a digit, as ascii characters (in base 10)
// and insert verbatim; e.g. ctl-001 inserts a <soh>
if (Fl::event_state() & FL_CTRL && (key >= FL_KP + '0') && (key <= FL_KP + '9') &&
insert_position() >= txpos)
return handle_key_ascii(key);
ascii_cnt = 0; // restart the numeric keypad entries.
ascii_chr = 0;
// do not insert printable characters in the transmitted text
if (insert_position() < txpos) {
int d;
@ -953,16 +956,13 @@ int FTextEdit::handle_key_macro(int key)
///
int FTextEdit::handle_key_ascii(int key)
{
static char ascii_cnt = 0;
static unsigned ascii_chr = 0;
key -= '0';
key -= (FL_KP + '0');
ascii_cnt++;
for (int i = 0; i < 3 - ascii_cnt; i++)
key *= 10;
ascii_chr += key;
if (ascii_cnt == 3) {
if (ascii_chr <= 0x7F)
if (ascii_chr < 0x100) //0x7F)
add(ascii_chr, (iscntrl(ascii_chr) ? CTRL : RECV));
ascii_cnt = ascii_chr = 0;
}