kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Upstream version 3.04AL
rodzic
53e71e80ad
commit
09b75d7ae0
|
|
@ -46,9 +46,12 @@ Change Log:
|
|||
{ execute("modem.set_by_name BPSK31"); \
|
||||
execute("modem.set_by_name RTTY"); }
|
||||
18) Added brief message to the opening Rx text area indicating which
|
||||
macro file was loaded on start up. Also added name of the working
|
||||
macro file to the title bar of the macro editor.
|
||||
macro file was loaded on start up. This is a configurable item on
|
||||
the Misc/Macro tab
|
||||
19) Addition of Navy MARS prosigns to the CW Morse encoder / decoder.
|
||||
20) Add new option to dock a digiscope and deprecate command line switch
|
||||
21) Add option to change waterfall mouse wheel handling. Adapt patch
|
||||
by Stephane F8CFE to change rig frequency via the mouse wheel.
|
||||
|
||||
3.03
|
||||
1) Changes to socket server to correct shutdown process
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may
|
|||
dnl contain other characters or be empty
|
||||
m4_define(FLDIGI_MAJOR, [3])
|
||||
m4_define(FLDIGI_MINOR, [0])
|
||||
m4_define(FLDIGI_PATCH, [4AK])
|
||||
m4_define(FLDIGI_PATCH, [4AL])
|
||||
|
||||
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])
|
||||
|
||||
|
|
@ -38,6 +38,7 @@ AC_CONFIG_HEADER([src/config.h])
|
|||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
|
||||
AC_DEFINE([PACKAGE_AUTHORS], ["Dave Freese, Stelios Bounanos, Leigh Klotz, and others"], [Authors])
|
||||
AC_DEFINE([PACKAGE_HOME], ["http://www.w1hkj.com/Fldigi.html"], [Home page])
|
||||
AC_DEFINE([PACKAGE_PROJ], ["http://developer.berlios.de/project/showfiles.php?group_id=9149"], [BerliOS page])
|
||||
AC_DEFINE([PACKAGE_DOCS], ["http://www.w1hkj.com/FldigiHelp/index.html"], [Docs index])
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ Fl_PopBrowser::Fl_PopBrowser (int X, int Y, int W, int H, retvals R)
|
|||
|
||||
Fl_PopBrowser::~Fl_PopBrowser ()
|
||||
{
|
||||
if (popbrwsr) delete popbrwsr;
|
||||
}
|
||||
|
||||
int Fl_PopBrowser::handle(int event)
|
||||
|
|
@ -170,7 +169,8 @@ Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *L)
|
|||
{
|
||||
width = W; height = H - 4;
|
||||
Btn = new Fl_Button (X + W - 18, Y + 1, 18, H - 2);
|
||||
(new Fl_Pixmap (brws_12))->label (Btn);
|
||||
btnmap = new Fl_Pixmap(brws_12);
|
||||
btnmap->label(Btn);
|
||||
Btn->callback ((Fl_Callback *)btnComboBox_cb, 0);
|
||||
Output = new Fl_Input (X, Y, W-18, H);
|
||||
|
||||
|
|
@ -186,6 +186,19 @@ Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *L)
|
|||
R.idx = &idx;
|
||||
}
|
||||
|
||||
Fl_ComboBox::~Fl_ComboBox()
|
||||
{
|
||||
if (Brwsr) delete Brwsr;
|
||||
for (int i = 0; i < listsize; i++) {
|
||||
if (datalist[i]) {
|
||||
if (datalist[i]->s) delete [] datalist[i]->s;
|
||||
delete datalist[i];
|
||||
}
|
||||
}
|
||||
delete [] datalist;
|
||||
delete btnmap;
|
||||
}
|
||||
|
||||
void Fl_ComboBox::type (int t)
|
||||
{
|
||||
listtype = t;
|
||||
|
|
@ -271,8 +284,8 @@ void Fl_ComboBox::add( const char *s, void * d)
|
|||
if (listsize == maxsize) {
|
||||
int nusize = maxsize + FL_COMBO_LIST_INCR;
|
||||
datambr **temparray = new datambr *[nusize];
|
||||
for (int i = 0; i < listsize; i++) temparray[i] = datalist[i];
|
||||
delete [] datalist;
|
||||
for (int i = 0; i < listsize; i++) temparray[i] = datalist[i];
|
||||
delete [] datalist;
|
||||
datalist = temparray;
|
||||
maxsize = nusize;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -668,7 +668,7 @@ void cw::send_symbol(int bits)
|
|||
duration = knum + keyup;
|
||||
}
|
||||
|
||||
if (progdefaults.QSK)
|
||||
if (progdefaults.QSKv)
|
||||
ModulateStereo(outbuf, qrqbuf, duration);
|
||||
else
|
||||
ModulateXmtr(outbuf, duration);
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include "soundconf.h"
|
||||
#include "combo.h"
|
||||
#include "colorsfonts.h"
|
||||
#include "waterfall.h"
|
||||
extern void initViewer();
|
||||
Fl_Double_Window *dlgConfig;
|
||||
|
||||
|
|
@ -305,6 +306,13 @@ static void cb_inpWaterfallClickText(Fl_Input* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Choice *mnuWaterfallWheelAction=(Fl_Choice *)0;
|
||||
|
||||
static void cb_mnuWaterfallWheelAction(Fl_Choice* o, void*) {
|
||||
progdefaults.WaterfallWheelAction = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabVideo=(Fl_Group *)0;
|
||||
|
||||
Fl_Check_Button *btnsendid=(Fl_Check_Button *)0;
|
||||
|
|
@ -927,6 +935,15 @@ static void cb_btnStartAtSweetSpot(Fl_Check_Button* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabMainWindow=(Fl_Group *)0;
|
||||
|
||||
Fl_Check_Button *btnDockedScope=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnDockedScope(Fl_Check_Button* o, void*) {
|
||||
progdefaults.docked_scope = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabModems=(Fl_Group *)0;
|
||||
|
||||
Fl_Tabs *tabsModems=(Fl_Tabs *)0;
|
||||
|
|
@ -1026,7 +1043,7 @@ Fl_Group *tabCWQSK=(Fl_Group *)0;
|
|||
Fl_Check_Button *btnQSK=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnQSK(Fl_Check_Button* o, void*) {
|
||||
progdefaults.QSK=o->value();
|
||||
progdefaults.QSKv=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
|
|
@ -1494,7 +1511,6 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
tabOperator->selection_color((Fl_Color)51);
|
||||
tabOperator->callback((Fl_Callback*)cb_tabOperator);
|
||||
tabOperator->when(FL_WHEN_CHANGED);
|
||||
tabOperator->hide();
|
||||
{ inpMyCallsign = new Fl_Input(78, 36, 85, 24, "Callsign:");
|
||||
inpMyCallsign->callback((Fl_Callback*)cb_inpMyCallsign);
|
||||
} // Fl_Input* inpMyCallsign
|
||||
|
|
@ -1720,6 +1736,11 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
} // Fl_Input* inpWaterfallClickText
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
{ mnuWaterfallWheelAction = new Fl_Choice(15, 176, 150, 22, "Wheel action");
|
||||
mnuWaterfallWheelAction->down_box(FL_BORDER_BOX);
|
||||
mnuWaterfallWheelAction->callback((Fl_Callback*)cb_mnuWaterfallWheelAction);
|
||||
mnuWaterfallWheelAction->align(FL_ALIGN_RIGHT);
|
||||
} // Fl_Choice* mnuWaterfallWheelAction
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
o->end();
|
||||
|
|
@ -2158,9 +2179,9 @@ l with your sound hardware.");
|
|||
{ tabMisc = new Fl_Group(0, 25, 405, 200, "Misc");
|
||||
tabMisc->color((Fl_Color)51);
|
||||
tabMisc->selection_color((Fl_Color)51);
|
||||
tabMisc->hide();
|
||||
{ tabsMisc = new Fl_Tabs(0, 25, 400, 195);
|
||||
{ tabCPUspeed = new Fl_Group(0, 50, 400, 170, "CPU speed");
|
||||
tabCPUspeed->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 62, 390, 43);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
|
|
@ -2174,6 +2195,7 @@ l with your sound hardware.");
|
|||
tabCPUspeed->end();
|
||||
} // Fl_Group* tabCPUspeed
|
||||
{ tabMacros = new Fl_Group(0, 50, 400, 170, "Macros");
|
||||
tabMacros->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 55, 390, 69);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(30, 70, 274, 15, "load last used Macro file on startup");
|
||||
|
|
@ -2250,6 +2272,20 @@ l with your sound hardware.");
|
|||
} // Fl_Group* o
|
||||
tabSweetSpot->end();
|
||||
} // Fl_Group* tabSweetSpot
|
||||
{ tabMainWindow = new Fl_Group(0, 50, 400, 170, "Main window");
|
||||
tabMainWindow->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 390, 75);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ btnDockedScope = new Fl_Check_Button(30, 84, 125, 20, "Docked scope");
|
||||
btnDockedScope->tooltip("Restart fldigi for this option to take effect");
|
||||
btnDockedScope->down_box(FL_DOWN_BOX);
|
||||
btnDockedScope->callback((Fl_Callback*)cb_btnDockedScope);
|
||||
btnDockedScope->value(progdefaults.docked_scope);
|
||||
} // Fl_Check_Button* btnDockedScope
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
tabMainWindow->end();
|
||||
} // Fl_Group* tabMainWindow
|
||||
tabsMisc->end();
|
||||
} // Fl_Tabs* tabsMisc
|
||||
tabMisc->end();
|
||||
|
|
@ -2386,7 +2422,7 @@ l with your sound hardware.");
|
|||
{ Fl_Check_Button* o = btnQSK = new Fl_Check_Button(35, 75, 175, 15, "QSK on right channel");
|
||||
btnQSK->down_box(FL_DOWN_BOX);
|
||||
btnQSK->callback((Fl_Callback*)cb_btnQSK);
|
||||
o->value(progdefaults.QSK);
|
||||
o->value(progdefaults.QSKv);
|
||||
} // Fl_Check_Button* btnQSK
|
||||
{ Fl_Counter* o = cntPreTiming = new Fl_Counter(25, 109, 64, 21, "Pre Timing");
|
||||
cntPreTiming->type(1);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ decl {\#include "combo.h"} {}
|
|||
|
||||
decl {\#include "colorsfonts.h"} {}
|
||||
|
||||
decl {\#include "waterfall.h"} {}
|
||||
|
||||
decl {extern void initViewer();} {}
|
||||
|
||||
decl {Fl_Double_Window *dlgConfig;} {public
|
||||
|
|
@ -46,8 +48,8 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
} {
|
||||
Fl_Group tabOperator {
|
||||
label Oper
|
||||
callback {progdefaults.changed = true;} open
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1 hide
|
||||
callback {progdefaults.changed = true;} open selected
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1
|
||||
} {
|
||||
Fl_Input inpMyCallsign {
|
||||
label {Callsign:}
|
||||
|
|
@ -380,6 +382,12 @@ progdefaults.changed = true;}
|
|||
xywh {15 126 150 40} align 8
|
||||
}
|
||||
}
|
||||
Fl_Choice mnuWaterfallWheelAction {
|
||||
label {Wheel action}
|
||||
callback {progdefaults.WaterfallWheelAction = o->value();
|
||||
progdefaults.changed = true;} open
|
||||
xywh {15 176 150 22} down_box BORDER_BOX align 8
|
||||
} {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1025,14 +1033,14 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabMisc {
|
||||
label Misc open
|
||||
xywh {0 25 405 200} color 51 selection_color 51
|
||||
xywh {0 25 405 200} color 51 selection_color 51 hide
|
||||
} {
|
||||
Fl_Tabs tabsMisc {open
|
||||
xywh {0 25 400 195}
|
||||
} {
|
||||
Fl_Group tabCPUspeed {
|
||||
label {CPU speed} open
|
||||
xywh {0 50 400 170} hide
|
||||
xywh {0 50 400 170}
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 62 390 43} box ENGRAVED_FRAME align 21
|
||||
|
|
@ -1048,7 +1056,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabMacros {
|
||||
label Macros open
|
||||
xywh {0 50 400 170}
|
||||
xywh {0 50 400 170} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 55 390 69} box ENGRAVED_FRAME
|
||||
|
|
@ -1057,7 +1065,7 @@ progdefaults.changed = true;}
|
|||
label {load last used Macro file on startup}
|
||||
callback {progdefaults.UseLastMacro = o->value();
|
||||
update_main_title();
|
||||
progdefaults.changed = true;} selected
|
||||
progdefaults.changed = true;}
|
||||
xywh {30 70 274 15} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.UseLastMacro);}
|
||||
}
|
||||
|
|
@ -1130,6 +1138,22 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabMainWindow {
|
||||
label {Main window} open
|
||||
xywh {0 50 400 170} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 390 75} box ENGRAVED_FRAME
|
||||
} {
|
||||
Fl_Check_Button btnDockedScope {
|
||||
label {Docked scope}
|
||||
callback {progdefaults.docked_scope = o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Restart fldigi for this option to take effect} xywh {30 84 125 20} down_box DOWN_BOX
|
||||
code0 {btnDockedScope->value(progdefaults.docked_scope);}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabModems {
|
||||
|
|
@ -1242,10 +1266,10 @@ progdefaults.changed = true;}
|
|||
} {
|
||||
Fl_Check_Button btnQSK {
|
||||
label {QSK on right channel}
|
||||
callback {progdefaults.QSK=o->value();
|
||||
callback {progdefaults.QSKv=o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {35 75 175 15} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.QSK);}
|
||||
code0 {o->value(progdefaults.QSKv);}
|
||||
}
|
||||
Fl_Counter cntPreTiming {
|
||||
label {Pre Timing}
|
||||
|
|
|
|||
|
|
@ -118,7 +118,6 @@ Fl_Double_Window *scopeview = (Fl_Double_Window *)0;
|
|||
MixerBase* mixer = 0;
|
||||
|
||||
bool useCheckButtons;
|
||||
bool twoscopes = false;
|
||||
|
||||
|
||||
Fl_Light_Button *btnTune = (Fl_Light_Button *)0;
|
||||
|
|
@ -568,7 +567,7 @@ void init_modem(trx_mode mode)
|
|||
break;
|
||||
|
||||
default:
|
||||
LOG_ERROR("Unknown mode: %d", mode);
|
||||
LOG_ERROR("Unknown mode: %" PRIdPTR, mode);
|
||||
return init_modem(MODE_BPSK31);
|
||||
}
|
||||
|
||||
|
|
@ -1326,6 +1325,19 @@ bool clean_exit(void) {
|
|||
MilliSleep(10);
|
||||
}
|
||||
|
||||
if (dlgConfig) {
|
||||
dlgConfig->hide();
|
||||
delete cboHamlibRig;
|
||||
delete dlgConfig;
|
||||
}
|
||||
|
||||
#if USE_HAMLIB
|
||||
if (xcvr) delete xcvr;
|
||||
#endif
|
||||
#if USE_XMLRPC
|
||||
XML_RPC_Server::stop();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1657,7 +1669,8 @@ void create_fl_digi_main() {
|
|||
|
||||
int pad = wSpace, Y = 0;
|
||||
|
||||
if (twoscopes) WNOM -= 2*DEFAULT_SW;
|
||||
if (progdefaults.docked_scope)
|
||||
WNOM -= 2*DEFAULT_SW;
|
||||
|
||||
update_main_title();
|
||||
fl_digi_main = new Fl_Double_Window(WNOM, HNOM, main_window_title.c_str());
|
||||
|
|
@ -1873,7 +1886,7 @@ void create_fl_digi_main() {
|
|||
|
||||
Y += Hmacros;
|
||||
|
||||
if (twoscopes) {
|
||||
if (progdefaults.docked_scope) {
|
||||
Fl_Pack *wfpack = new Fl_Pack(0, Y, WNOM, Hwfall);
|
||||
wfpack->type(1);
|
||||
wf = new waterfall(0, Y, Wwfall - Hwfall + 24, Hwfall);
|
||||
|
|
@ -2506,62 +2519,6 @@ void setReverse(int rev) {
|
|||
active_modem->set_reverse(rev);
|
||||
}
|
||||
|
||||
void change_modem_param(int state)
|
||||
{
|
||||
int d;
|
||||
if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) )
|
||||
return;
|
||||
|
||||
if (state & (FL_META | FL_ALT)) {
|
||||
if (d > 0)
|
||||
active_modem->searchUp();
|
||||
else if (d < 0)
|
||||
active_modem->searchDown();
|
||||
return;
|
||||
}
|
||||
if (!(state & (FL_CTRL | FL_SHIFT)))
|
||||
return; // suggestions?
|
||||
|
||||
Fl_Valuator *val = 0;
|
||||
if (state & FL_CTRL) {
|
||||
switch (active_modem->get_mode()) {
|
||||
case MODE_BPSK31: case MODE_QPSK31: case MODE_PSK63: case MODE_QPSK63:
|
||||
case MODE_PSK125: case MODE_QPSK125: case MODE_PSK250: case MODE_QPSK250:
|
||||
val = mailserver ? cntServerOffset : cntSearchRange;
|
||||
break;
|
||||
case MODE_FELDHELL:
|
||||
val = sldrHellBW;
|
||||
break;
|
||||
case MODE_CW:
|
||||
val = sldrCWbandwidth;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (state & FL_SHIFT) {
|
||||
val = sldrSquelch;
|
||||
if (!twoscopes)
|
||||
d = -d;
|
||||
}
|
||||
|
||||
val->value(val->clamp(val->increment(val->value(), -d)));
|
||||
bool changed_save = progdefaults.changed;
|
||||
val->do_callback();
|
||||
progdefaults.changed = changed_save;
|
||||
if (val == cntServerOffset || val == cntSearchRange)
|
||||
active_modem->set_sigsearch(SIGSEARCH);
|
||||
else if (val == sldrSquelch) // sldrSquelch gives focus to TextWidget
|
||||
wf->take_focus();
|
||||
|
||||
char msg[60];
|
||||
if (val != sldrSquelch)
|
||||
snprintf(msg, sizeof(msg), "%s = %2.0f Hz", val->label(), val->value());
|
||||
else
|
||||
snprintf(msg, sizeof(msg), "Squelch = %2.0f %%", val->value());
|
||||
put_status(msg, 2);
|
||||
}
|
||||
|
||||
void start_tx()
|
||||
{
|
||||
if (progdefaults.rsid == true) return;
|
||||
|
|
@ -2614,6 +2571,9 @@ Fl_Color adjust_color(Fl_Color fg, Fl_Color bg)
|
|||
|
||||
void qsy(long long rfc, long long fmid)
|
||||
{
|
||||
if (fmid < 0LL)
|
||||
fmid = (long long)active_modem->get_freq();
|
||||
|
||||
if (progdefaults.chkUSERIGCATis)
|
||||
REQ(rigCAT_set_qsy, rfc, fmid);
|
||||
else if (progdefaults.chkUSEMEMMAPis)
|
||||
|
|
|
|||
|
|
@ -548,31 +548,30 @@ char szAbout[] =
|
|||
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\
|
||||
<html>\
|
||||
<head>\
|
||||
<title>about</title>\
|
||||
<title>About</title>\
|
||||
</head>\
|
||||
<BODY BGCOLOR=FFFFCO TEXT=101010>\
|
||||
<font size=\"0\" face=\"Verdana, Arial, Helvetica\">\
|
||||
<CENTER>\
|
||||
<H1><I>Fldigi " PACKAGE_VERSION "</I></H1>\
|
||||
<br>\
|
||||
</CENTER>\
|
||||
<H4>Digital modem program for</H4><br>\
|
||||
<P>\
|
||||
<H4>Digital modem program for:</H4>\
|
||||
Linux<br>\
|
||||
FreeBSD<br>\
|
||||
OS X<br>\
|
||||
Windows<br>\
|
||||
<br>\
|
||||
<H4>Programmers:</H4><br>\
|
||||
<P>\
|
||||
<H4>Programmers:</H4>\
|
||||
Dave Freese, W1HKJ<br>\
|
||||
Stelios Bounanos, M0GLD<br>\
|
||||
Leigh Klotz, WA5ZNU<br>\
|
||||
<br>\
|
||||
<H4>Beginners' Guide:</H4><br>\
|
||||
<P>\
|
||||
<H4>Beginners' Guide:</H4>\
|
||||
Murray Greenman, ZL1BPU<br>\
|
||||
</big>\
|
||||
<br>\
|
||||
<P>\
|
||||
Distributed under the GNU General Public License version 2 or later.<br>\
|
||||
This is free software: you are free to change and redistribute it.<br>\
|
||||
There is NO WARRANTY, to the extent permitted by law.\
|
||||
</body>\
|
||||
</html>\
|
||||
";
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ class Fl_ComboBox : public Fl_Group {
|
|||
// Fl_Output *Output;
|
||||
Fl_Input *Output;
|
||||
Fl_PopBrowser *Brwsr;
|
||||
Fl_Pixmap *btnmap;
|
||||
datambr **datalist;
|
||||
int listsize;
|
||||
int maxsize;
|
||||
|
|
@ -105,7 +106,8 @@ class Fl_ComboBox : public Fl_Group {
|
|||
public:
|
||||
|
||||
Fl_ComboBox (int x, int y, int w, int h, const char * = 0);
|
||||
|
||||
~Fl_ComboBox();
|
||||
|
||||
const char *value ();
|
||||
void value (const char *);
|
||||
void put_value( const char *);
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@ extern Fl_Button *btnBwTracksColor;
|
|||
extern Fl_Check_Button *btnWaterfallHistoryDefault;
|
||||
extern Fl_Check_Button *btnWaterfallQSY;
|
||||
extern Fl_Input *inpWaterfallClickText;
|
||||
#include <FL/Fl_Choice.H>
|
||||
extern Fl_Choice *mnuWaterfallWheelAction;
|
||||
extern Fl_Group *tabVideo;
|
||||
extern Fl_Check_Button *btnsendid;
|
||||
extern Fl_Check_Button *btnsendvideotext;
|
||||
|
|
@ -71,7 +73,6 @@ extern Fl_Input_Choice *inpTTYdev;
|
|||
extern Fl_Round_Button *btnPTT[5];
|
||||
extern Fl_Check_Button *chkUSEHAMLIB;
|
||||
extern Fl_ComboBox *cboHamlibRig;
|
||||
#include <FL/Fl_Choice.H>
|
||||
extern Fl_Choice *mnuBaudRate;
|
||||
extern Fl_Input_Choice *inpRIGdev;
|
||||
extern Fl_Check_Button *chkUSERIGCAT;
|
||||
|
|
@ -134,6 +135,8 @@ extern Fl_Value_Input *valCWsweetspot;
|
|||
extern Fl_Value_Input *valRTTYsweetspot;
|
||||
extern Fl_Value_Input *valPSKsweetspot;
|
||||
extern Fl_Check_Button *btnStartAtSweetSpot;
|
||||
extern Fl_Group *tabMainWindow;
|
||||
extern Fl_Check_Button *btnDockedScope;
|
||||
extern Fl_Group *tabModems;
|
||||
extern Fl_Tabs *tabsModems;
|
||||
extern Fl_Group *tabCW;
|
||||
|
|
|
|||
|
|
@ -16,8 +16,7 @@ struct configuration {
|
|||
bool rsid;
|
||||
bool TransmitRSid;
|
||||
bool slowcpu;
|
||||
bool experimental;
|
||||
|
||||
|
||||
bool changed;
|
||||
double wfRefLevel;
|
||||
double wfAmpSpan;
|
||||
|
|
@ -29,6 +28,7 @@ struct configuration {
|
|||
bool WaterfallHistoryDefault;
|
||||
bool WaterfallQSY;
|
||||
string WaterfallClickText;
|
||||
int WaterfallWheelAction;
|
||||
// for PSK & PSK mail interface
|
||||
bool PSKmailSweetSpot;
|
||||
int SearchRange;
|
||||
|
|
@ -69,7 +69,7 @@ struct configuration {
|
|||
int CWupperlimit;
|
||||
double CWrisetime;
|
||||
double CWdash2dot;
|
||||
bool QSK;
|
||||
bool QSKv;
|
||||
double CWpre;
|
||||
double CWpost;
|
||||
bool CWid;
|
||||
|
|
@ -192,14 +192,14 @@ struct configuration {
|
|||
bool MuteInput;
|
||||
|
||||
// waterfall palette
|
||||
RGBint cfgpal[9];
|
||||
RGB cfgpal[9];
|
||||
|
||||
// Button key color palette
|
||||
bool useGroupColors;
|
||||
RGBint btnGroup1;
|
||||
RGBint btnGroup2;
|
||||
RGBint btnGroup3;
|
||||
RGBint btnFkeyTextColor;
|
||||
RGB btnGroup1;
|
||||
RGB btnGroup2;
|
||||
RGB btnGroup3;
|
||||
RGB btnFkeyTextColor;
|
||||
|
||||
// Rx / Tx fonts & palettes
|
||||
Fl_Font RxFontnbr;
|
||||
|
|
@ -208,8 +208,8 @@ struct configuration {
|
|||
Fl_Font TxFontnbr;
|
||||
int TxFontsize;
|
||||
Fl_Color TxFontcolor;
|
||||
RGBint RxColor;
|
||||
RGBint TxColor;
|
||||
RGB RxColor;
|
||||
RGB TxColor;
|
||||
Fl_Color XMITcolor;
|
||||
Fl_Color CTRLcolor;
|
||||
Fl_Color SKIPcolor;
|
||||
|
|
@ -239,6 +239,7 @@ struct configuration {
|
|||
string xmlrpc_allow;
|
||||
string xmlrpc_deny;
|
||||
|
||||
bool docked_scope;
|
||||
public:
|
||||
void writeDefaultsXML();
|
||||
void storeDefaults();
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ public:
|
|||
enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, DEBUG_LEVEL, LOG_NLEVELS };
|
||||
static void start(const char* filename);
|
||||
static void stop(void);
|
||||
static void log(level_e level, const char* func, const char* srcf, int line, const char* format, ...);
|
||||
static void log(level_e level, const char* func, const char* srcf, int line,
|
||||
const char* format, ...) format__(printf, 5, 6);
|
||||
static void elog(const char* func, const char* srcf, int line, const char* text);
|
||||
static void show(void);
|
||||
static level_e level;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@ extern Fl_Button *btnMacroDummy;
|
|||
|
||||
|
||||
extern bool useCheckButtons;
|
||||
extern bool twoscopes;
|
||||
extern int altMacros;
|
||||
|
||||
extern waterfall *wf;
|
||||
|
|
@ -156,8 +155,6 @@ extern bool QuerySqlOnOff();
|
|||
extern void init_modem(trx_mode mode);
|
||||
extern void init_modem_sync(trx_mode mode);
|
||||
|
||||
extern void change_modem_param(int state);
|
||||
|
||||
extern void start_tx();
|
||||
extern void abort_tx();
|
||||
|
||||
|
|
@ -171,6 +168,6 @@ extern void stopMacroTimer();
|
|||
|
||||
Fl_Color adjust_color(Fl_Color fg, Fl_Color bg);
|
||||
|
||||
void qsy(long long rfc, long long fmid);
|
||||
void qsy(long long rfc, long long fmid = -1LL);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -45,16 +45,13 @@
|
|||
do { \
|
||||
switch (GET_THREAD_ID()) { \
|
||||
case TRX_TID: \
|
||||
LOG_ERROR("trx lock", \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
LOG_ERROR("trx lock"); \
|
||||
break; \
|
||||
case FLMAIN_TID: \
|
||||
LOG_WARN("flrun lock", \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
LOG_WARN("flrun lock"); \
|
||||
break; \
|
||||
default: \
|
||||
LOG_INFO("lock", \
|
||||
__func__, __FILE__, __LINE__); \
|
||||
LOG_INFO("lock"); \
|
||||
} \
|
||||
pstack_maybe(); \
|
||||
Fl::lock(x); \
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ enum {
|
|||
MODE_DOMINOEX11,
|
||||
MODE_DOMINOEX16,
|
||||
MODE_DOMINOEX22,
|
||||
MODE_DOMINOEX_FIRST = MODE_DOMINOEX4,
|
||||
MODE_DOMINOEX_LAST = MODE_DOMINOEX22,
|
||||
|
||||
MODE_FELDHELL,
|
||||
MODE_SLOWHELL,
|
||||
|
|
@ -65,21 +67,26 @@ enum {
|
|||
MODE_FSKHELL,
|
||||
MODE_FSKH105,
|
||||
MODE_HELL80,
|
||||
MODE_HELL_FIRST = MODE_FELDHELL,
|
||||
MODE_HELL_LAST = MODE_HELL80,
|
||||
|
||||
MODE_MFSK8,
|
||||
MODE_MFSK16,
|
||||
MODE_MFSK32,
|
||||
|
||||
// experimental modes
|
||||
MODE_MFSK4,
|
||||
MODE_MFSK11,
|
||||
MODE_MFSK22,
|
||||
MODE_MFSK31,
|
||||
MODE_MFSK64,
|
||||
|
||||
MODE_MFSK_FIRST = MODE_MFSK8,
|
||||
MODE_MFSK_LAST = MODE_MFSK64,
|
||||
|
||||
MODE_MT63_500,
|
||||
MODE_MT63_1000,
|
||||
MODE_MT63_2000,
|
||||
MODE_MT63_FIRST = MODE_MT63_500,
|
||||
MODE_MT63_LAST = MODE_MT63_2000,
|
||||
|
||||
MODE_BPSK31,
|
||||
MODE_QPSK31,
|
||||
|
|
@ -89,6 +96,8 @@ enum {
|
|||
MODE_QPSK125,
|
||||
MODE_PSK250,
|
||||
MODE_QPSK250,
|
||||
MODE_PSK_FIRST = MODE_BPSK31,
|
||||
MODE_PSK_LAST = MODE_QPSK250,
|
||||
|
||||
MODE_OLIVIA,
|
||||
|
||||
|
|
@ -101,6 +110,8 @@ enum {
|
|||
// MODE_TSOR11,
|
||||
MODE_THOR16,
|
||||
MODE_THOR22,
|
||||
MODE_THOR_FIRST = MODE_THOR4,
|
||||
MODE_THOR_LAST = MODE_THOR22,
|
||||
|
||||
MODE_THROB1,
|
||||
MODE_THROB2,
|
||||
|
|
@ -108,6 +119,8 @@ enum {
|
|||
MODE_THROBX1,
|
||||
MODE_THROBX2,
|
||||
MODE_THROBX4,
|
||||
MODE_THROB_FIRST = MODE_THROB1,
|
||||
MODE_THROB_LAST = MODE_THROBX4,
|
||||
|
||||
MODE_WWV,
|
||||
MODE_ANALYSIS,
|
||||
|
|
|
|||
|
|
@ -48,7 +48,6 @@ extern void arq_init();
|
|||
extern void arq_close();
|
||||
extern void WriteARQ(unsigned int);
|
||||
extern void checkTLF();
|
||||
void setup_signal_handlers(void);
|
||||
|
||||
#define ARQBUFSIZ 8192
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,10 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
#ifndef __STDC_FORMAT_MACROS
|
||||
# define __STDC_FORMAT_MACROS 1
|
||||
#endif
|
||||
#include <inttypes.h>
|
||||
|
||||
#ifndef powerof2
|
||||
# define powerof2(n) ((((n) - 1) & (n)) == 0)
|
||||
|
|
@ -71,6 +74,7 @@ extern "C" {
|
|||
# define inline__ inline __attribute__ ((__always_inline__))
|
||||
# define noinline__ __attribute__ ((__noinline__))
|
||||
# define nonnull__(x) __attribute__ ((__nonnull__(x)))
|
||||
# define format__(type_, index_, first_) __attribute__ ((format(type_, index_, first_)))
|
||||
#else
|
||||
# define likely(x) (x)
|
||||
# define unlikely(x) (x)
|
||||
|
|
@ -86,6 +90,7 @@ extern "C" {
|
|||
# define inline__
|
||||
# define noinline__
|
||||
# define nonnull__(x)
|
||||
# define format__(type_, index_, first_)
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
|
||||
|
|
@ -108,6 +113,9 @@ int set_cloexec(int fd, unsigned char v);
|
|||
|
||||
long ver2int(const char* version);
|
||||
|
||||
void save_signals(void);
|
||||
void restore_signals(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -70,12 +70,6 @@ struct RGB {
|
|||
uchar B;
|
||||
};
|
||||
|
||||
struct RGBint {
|
||||
int R;
|
||||
int G;
|
||||
int B;
|
||||
};
|
||||
|
||||
struct RGBI {
|
||||
uchar R;
|
||||
uchar G;
|
||||
|
|
@ -158,7 +152,6 @@ public:
|
|||
void draw();
|
||||
// void resize (int, int, int, int);
|
||||
int handle(int event);
|
||||
void handle_mouse_wheel(int event);
|
||||
void update_sigmap();
|
||||
void update_waterfall();
|
||||
void checkoffset();
|
||||
|
|
@ -365,8 +358,12 @@ public:
|
|||
double Pwr(int i) { return wfdisp->Pwr(i); }
|
||||
|
||||
int handle(int event);
|
||||
/*
|
||||
*/
|
||||
|
||||
enum { WF_NOP, WF_AFC_BW, WF_SIGNAL_SEARCH, WF_SQUELCH,
|
||||
WF_CARRIER, WF_MODEM, WF_SCROLL };
|
||||
static const char wf_wheel_action[];
|
||||
void handle_mouse_wheel(int what, int d);
|
||||
|
||||
Fl_Button *btnRev;
|
||||
Fl_Counter *wfcarrier;
|
||||
Fl_Counter *wfRefLevel;
|
||||
|
|
|
|||
59
src/main.cxx
59
src/main.cxx
|
|
@ -123,6 +123,7 @@ void generate_version_text(void);
|
|||
void debug_exec(char** argv);
|
||||
void set_platform_ui(void);
|
||||
double speed_test(int converter, unsigned repeat);
|
||||
static void setup_signal_handlers(void);
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
|
|
@ -399,9 +400,6 @@ void generate_option_help(void) {
|
|||
<< " --wfall-height HEIGHT\n"
|
||||
<< " HEIGHT in pixels, ie 100 - 200, recommend 10 pixel increments.\n\n"
|
||||
|
||||
<< " --twoscopes\n"
|
||||
<< " Dock a second digiscope adjacent to the waterfall\n\n"
|
||||
|
||||
<< " --toggle-check-buttons\n"
|
||||
<< " Use lighted or check buttons for AFC / SQL.\n";
|
||||
|
||||
|
|
@ -421,9 +419,10 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
#ifndef __CYGWIN__
|
||||
OPT_RX_IPC_KEY, OPT_TX_IPC_KEY,
|
||||
#endif
|
||||
OPT_CONFIG_DIR, OPT_EXPERIMENTAL, OPT_ARQ_ADDRESS, OPT_ARQ_PORT,
|
||||
OPT_CONFIG_DIR,
|
||||
OPT_ARQ_ADDRESS, OPT_ARQ_PORT,
|
||||
#if USE_XMLRPC
|
||||
OPT_CONFIG_XMLRPC, OPT_CONFIG_XMLRPC_ADDRESS, OPT_CONFIG_XMLRPC_PORT,
|
||||
OPT_CONFIG_XMLRPC_ADDRESS, OPT_CONFIG_XMLRPC_PORT,
|
||||
OPT_CONFIG_XMLRPC_ALLOW, OPT_CONFIG_XMLRPC_DENY, OPT_CONFIG_XMLRPC_LIST,
|
||||
#endif
|
||||
OPT_FONT, OPT_WFALL_WIDTH, OPT_WFALL_HEIGHT,
|
||||
|
|
@ -432,10 +431,9 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
#if USE_PORTAUDIO
|
||||
OPT_FRAMES_PER_BUFFER,
|
||||
#endif
|
||||
OPT_TWO_SCOPES,
|
||||
OPT_DEBUG_LEVEL,
|
||||
OPT_EXIT_AFTER,
|
||||
OPT_HELP, OPT_VERSION };
|
||||
OPT_DEPRECATED, OPT_HELP, OPT_VERSION };
|
||||
|
||||
const char shortopts[] = "+";
|
||||
static struct option longopts[] = {
|
||||
|
|
@ -444,13 +442,13 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
{ "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY },
|
||||
#endif
|
||||
{ "config-dir", 1, 0, OPT_CONFIG_DIR },
|
||||
{ "experimental", 0, 0, OPT_EXPERIMENTAL },
|
||||
{ "experimental", 0, 0, OPT_DEPRECATED },
|
||||
|
||||
{ "arq-server-address", 1, 0, OPT_ARQ_ADDRESS },
|
||||
{ "arq-server-port", 1, 0, OPT_ARQ_PORT },
|
||||
|
||||
#if USE_XMLRPC
|
||||
{ "xmlrpc-server", 0, 0, OPT_CONFIG_XMLRPC },
|
||||
{ "xmlrpc-server", 0, 0, OPT_DEPRECATED },
|
||||
{ "xmlrpc-server-address", 1, 0, OPT_CONFIG_XMLRPC_ADDRESS },
|
||||
{ "xmlrpc-server-port", 1, 0, OPT_CONFIG_XMLRPC_PORT },
|
||||
{ "xmlrpc-allow", 1, 0, OPT_CONFIG_XMLRPC_ALLOW },
|
||||
|
|
@ -463,7 +461,7 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
{ "wfall-height", 1, 0, OPT_WFALL_HEIGHT },
|
||||
{ "window-width", 1, 0, OPT_WINDOW_WIDTH },
|
||||
{ "window-height", 1, 0, OPT_WINDOW_HEIGHT },
|
||||
{ "twoscopes", 0, 0, OPT_TWO_SCOPES },
|
||||
{ "twoscopes", 0, 0, OPT_DEPRECATED },
|
||||
{ "toggle-check-buttons", 0, 0, OPT_TOGGLE_CHECK },
|
||||
|
||||
#if USE_PORTAUDIO
|
||||
|
|
@ -509,9 +507,6 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
if (*HomeDir.rbegin() != '/')
|
||||
HomeDir += '/';
|
||||
break;
|
||||
case OPT_EXPERIMENTAL:
|
||||
progdefaults.experimental = true;
|
||||
break;
|
||||
|
||||
case OPT_ARQ_ADDRESS:
|
||||
progdefaults.arq_address = optarg;
|
||||
|
|
@ -521,10 +516,6 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
break;
|
||||
|
||||
#if USE_XMLRPC
|
||||
case OPT_CONFIG_XMLRPC:
|
||||
cerr << "W: the --" << longopts[longindex].name
|
||||
<< " option will be removed in the next version\n";
|
||||
break;
|
||||
case OPT_CONFIG_XMLRPC_ADDRESS:
|
||||
progdefaults.xmlrpc_address = optarg;
|
||||
break;
|
||||
|
|
@ -575,10 +566,6 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
HNOM = strtol(optarg, NULL, 10);
|
||||
break;
|
||||
|
||||
case OPT_TWO_SCOPES:
|
||||
twoscopes = true;
|
||||
break;
|
||||
|
||||
case OPT_TOGGLE_CHECK:
|
||||
useCheckButtons = !useCheckButtons;
|
||||
break;
|
||||
|
|
@ -600,6 +587,11 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
}
|
||||
break;
|
||||
|
||||
case OPT_DEPRECATED:
|
||||
cerr << "W: the --" << longopts[longindex].name
|
||||
<< " option has been deprecated and will be removed in a future version\n";
|
||||
break;
|
||||
|
||||
case OPT_HELP:
|
||||
cout << option_help;
|
||||
exit(EXIT_SUCCESS);
|
||||
|
|
@ -630,7 +622,13 @@ int parse_args(int argc, char **argv, int& idx)
|
|||
void generate_version_text(void)
|
||||
{
|
||||
ostringstream s;
|
||||
s << PACKAGE_NAME << ' ' << PACKAGE_VERSION << "\n\nSystem: ";
|
||||
s << PACKAGE_STRING << '\n'
|
||||
<< "Copyright (c) 2008 " << PACKAGE_AUTHORS << '\n'
|
||||
<< "License GPLv2+: GNU GPL version 2 or later <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>\n"
|
||||
<< "This is free software: you are free to change and redistribute it.\n"
|
||||
<< "There is NO WARRANTY, to the extent permitted by law.\n";
|
||||
|
||||
s << "\nSystem: ";
|
||||
struct utsname u;
|
||||
if (uname(&u) != -1) {
|
||||
s << u.sysname << ' ' << u.nodename
|
||||
|
|
@ -764,29 +762,21 @@ double speed_test(int converter, unsigned repeat)
|
|||
return repeat / (t0.tv_sec + t0.tv_nsec/1e9);
|
||||
}
|
||||
|
||||
void setup_signal_handlers(void)
|
||||
static void setup_signal_handlers(void)
|
||||
{
|
||||
struct sigaction action;
|
||||
memset(&action, 0, sizeof(struct sigaction));
|
||||
|
||||
action.sa_handler = SIG_DFL;
|
||||
// no child stopped notifications, no zombies
|
||||
#ifdef __CYGWIN__
|
||||
action.sa_flags = SA_NOCLDSTOP;
|
||||
action.sa_handler = SIG_IGN;
|
||||
#else
|
||||
action.sa_handler = SIG_DFL;
|
||||
action.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT;
|
||||
#endif
|
||||
sigaction(SIGCHLD, &action, NULL);
|
||||
action.sa_flags = 0;
|
||||
|
||||
// undo xmlrpc-c's signal handling
|
||||
#if USE_XMLRPC
|
||||
sigaction(SIGTERM, &action, NULL);
|
||||
sigaction(SIGINT, &action, NULL);
|
||||
sigaction(SIGHUP, &action, NULL);
|
||||
sigaction(SIGUSR1, &action, NULL);
|
||||
#endif
|
||||
|
||||
action.sa_handler = handle_signal;
|
||||
sigaction(SIGSEGV, &action, NULL);
|
||||
sigaction(SIGILL, &action, NULL);
|
||||
|
|
@ -798,6 +788,5 @@ void setup_signal_handlers(void)
|
|||
|
||||
sigemptyset(&action.sa_mask);
|
||||
sigaddset(&action.sa_mask, SIGUSR2);
|
||||
pthread_sigmask((GET_THREAD_ID() == FLMAIN_TID ? SIG_BLOCK : SIG_UNBLOCK),
|
||||
&action.sa_mask, NULL);
|
||||
pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -261,6 +261,9 @@ mfsk::mfsk(trx_mode mfsk_mode) : modem()
|
|||
createRxViewer();
|
||||
activate_mfsk_image_item(true);
|
||||
}
|
||||
afcmetric = 0.0;
|
||||
datashreg = 1;
|
||||
|
||||
init();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -327,6 +327,7 @@ ARQ_SOCKET_Server::~ARQ_SOCKET_Server()
|
|||
delete arq_socket_thread;
|
||||
arq_socket_thread = 0;
|
||||
}
|
||||
delete server_socket;
|
||||
}
|
||||
|
||||
bool ARQ_SOCKET_Server::start(const char* node, const char* service)
|
||||
|
|
@ -370,7 +371,12 @@ void* ARQ_SOCKET_Server::thread_func(void*)
|
|||
{
|
||||
SET_THREAD_ID(ARQSOCKET_TID);
|
||||
|
||||
setup_signal_handlers();
|
||||
{
|
||||
sigset_t usr2;
|
||||
sigemptyset(&usr2);
|
||||
sigaddset(&usr2, SIGUSR2);
|
||||
pthread_sigmask(SIG_UNBLOCK, &usr2, NULL);
|
||||
}
|
||||
|
||||
while (inst->run) {
|
||||
try {
|
||||
|
|
|
|||
Plik diff jest za duży
Load Diff
|
|
@ -119,7 +119,7 @@ void debug::log(level_e level, const char* func, const char* srcf, int line, con
|
|||
|
||||
void debug::elog(const char* func, const char* srcf, int line, const char* text)
|
||||
{
|
||||
log(ERROR_LEVEL, func, srcf, line, "%s: %s", strerror(errno));
|
||||
log(ERROR_LEVEL, func, srcf, line, "%s: %s", text, strerror(errno));
|
||||
}
|
||||
|
||||
void debug::show(void)
|
||||
|
|
|
|||
|
|
@ -77,3 +77,35 @@ int set_cloexec(int fd, unsigned char v)
|
|||
f = fcntl(fd, F_SETFD, f | (v ? FD_CLOEXEC : 0));
|
||||
return f;
|
||||
}
|
||||
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#ifndef NSIG
|
||||
# define NSIG 64
|
||||
#endif
|
||||
static size_t nsig = 0;
|
||||
static struct sigaction* sigact = 0;
|
||||
static pthread_mutex_t sigmutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
void save_signals(void)
|
||||
{
|
||||
pthread_mutex_lock(&sigmutex);
|
||||
if (!sigact)
|
||||
sigact = new struct sigaction[NSIG];
|
||||
for (nsig = 1; nsig <= NSIG; nsig++)
|
||||
if (sigaction(nsig, NULL, &sigact[nsig-1]) == -1)
|
||||
break;
|
||||
pthread_mutex_unlock(&sigmutex);
|
||||
}
|
||||
|
||||
void restore_signals(void)
|
||||
{
|
||||
pthread_mutex_lock(&sigmutex);
|
||||
for (size_t i = 1; i <= nsig; i++)
|
||||
if (sigaction(i, &sigact[i-1], NULL) == -1)
|
||||
break;
|
||||
delete [] sigact;
|
||||
sigact = 0;
|
||||
nsig = 0;
|
||||
pthread_mutex_unlock(&sigmutex);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ XML_RPC_Server::XML_RPC_Server()
|
|||
server_thread = new pthread_t;
|
||||
run = true;
|
||||
}
|
||||
|
||||
XML_RPC_Server::~XML_RPC_Server()
|
||||
{
|
||||
run = false;
|
||||
|
|
@ -94,6 +95,7 @@ XML_RPC_Server::~XML_RPC_Server()
|
|||
server_thread = 0;
|
||||
}
|
||||
delete methods;
|
||||
delete server_socket;
|
||||
methods = 0;
|
||||
}
|
||||
|
||||
|
|
@ -137,14 +139,21 @@ void* XML_RPC_Server::thread_func(void*)
|
|||
for (methods_t::iterator i = methods->begin(); i != methods->end(); ++i)
|
||||
reg.addMethod(i->name, i->method);
|
||||
|
||||
save_signals();
|
||||
xmlrpc_c::serverAbyss server(xmlrpc_c::serverAbyss::constrOpt()
|
||||
.registryP(®)
|
||||
#ifndef NDEBUG
|
||||
.logFileName(HomeDir + "xmlrpc.log")
|
||||
#endif
|
||||
);
|
||||
restore_signals();
|
||||
|
||||
setup_signal_handlers();
|
||||
{
|
||||
sigset_t usr2;
|
||||
sigemptyset(&usr2);
|
||||
sigaddset(&usr2, SIGUSR2);
|
||||
pthread_sigmask(SIG_UNBLOCK, &usr2, NULL);
|
||||
}
|
||||
|
||||
while (inst->run) {
|
||||
try {
|
||||
|
|
@ -507,15 +516,13 @@ static Fl_Valuator* get_bw_val(void)
|
|||
if (!(active_modem->get_cap() & modem::CAP_BW))
|
||||
throw xmlrpc_c::fault("Operation not supported by modem");
|
||||
|
||||
switch (active_modem->get_mode()) {
|
||||
case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5:
|
||||
case MODE_HELLX9: case MODE_FSKHELL: case MODE_FSKH105: case MODE_HELL80:
|
||||
trx_mode m = active_modem->get_mode();
|
||||
if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST)
|
||||
return sldrHellBW;
|
||||
case MODE_CW:
|
||||
else if (m == MODE_CW)
|
||||
return sldrCWbandwidth;
|
||||
default:
|
||||
throw xmlrpc_c::fault("Unknown CAP_BW modem");
|
||||
}
|
||||
|
||||
throw xmlrpc_c::fault("Unknown CAP_BW modem");
|
||||
}
|
||||
|
||||
class Modem_get_bw : public xmlrpc_c::method
|
||||
|
|
@ -722,7 +729,7 @@ public:
|
|||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
double rfc = wf->rfcarrier();
|
||||
qsy((long long int)params.getDouble(0, 0.0), active_modem->get_freq());
|
||||
qsy((long long int)params.getDouble(0, 0.0));
|
||||
*retval = xmlrpc_c::value_double(rfc);
|
||||
}
|
||||
};
|
||||
|
|
@ -738,7 +745,7 @@ public:
|
|||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
double rfc = wf->rfcarrier() + params.getDouble(0);
|
||||
qsy((long long int)rfc, active_modem->get_freq());
|
||||
qsy((long long int)rfc);
|
||||
*retval = xmlrpc_c::value_double(rfc);
|
||||
}
|
||||
};
|
||||
|
|
@ -866,8 +873,8 @@ public:
|
|||
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
|
||||
{
|
||||
double v = sldrSquelch->value();
|
||||
// Squelch slider min/max are reversed when !twoscopes. Argh.
|
||||
if (twoscopes)
|
||||
// Squelch slider min/max are reversed when !docked_scope. Argh.
|
||||
if (progdefaults.docked_scope)
|
||||
REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->minimum(), sldrSquelch->maximum()));
|
||||
else
|
||||
REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->maximum(), sldrSquelch->minimum()));
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@ Rig::Rig(rig_model_t rig_model) {
|
|||
}
|
||||
|
||||
Rig::~Rig() {
|
||||
riglist.clear();
|
||||
rignames.clear();
|
||||
if (theRig)
|
||||
rig_cleanup(theRig);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ using namespace std;
|
|||
|
||||
Cserial rigio;
|
||||
static pthread_mutex_t rigCAT_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_t rigCAT_thread;
|
||||
static pthread_t *rigCAT_thread = 0;
|
||||
|
||||
static bool rigCAT_exit = false;
|
||||
static bool rigCAT_open = false;
|
||||
|
|
@ -446,7 +446,7 @@ void rigCAT_setfreq(long long f)
|
|||
return;
|
||||
}
|
||||
|
||||
LOG_DEBUG("set frequency %ld", f);
|
||||
LOG_DEBUG("set frequency %lld", f);
|
||||
|
||||
itrCmd = commands.begin();
|
||||
while (itrCmd != commands.end()) {
|
||||
|
|
@ -997,8 +997,10 @@ bool rigCAT_init()
|
|||
|
||||
rigCAT_bypass = false;
|
||||
rigCAT_exit = false;
|
||||
|
||||
rigCAT_thread = new pthread_t;
|
||||
|
||||
if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) {
|
||||
if (pthread_create(rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) {
|
||||
LOG_ERROR("pthread_create failed");
|
||||
rigio.ClosePort();
|
||||
return false;
|
||||
|
|
@ -1034,6 +1036,8 @@ void rigCAT_close(void)
|
|||
}
|
||||
}
|
||||
rigio.ClosePort();
|
||||
delete rigCAT_thread;
|
||||
rigCAT_thread = 0;
|
||||
}
|
||||
|
||||
bool rigCAT_active(void)
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ void MixerOSS::initValues()
|
|||
|
||||
LOG_DEBUG("Sound mixer initial state:\n" "Dev mask: %02x\n"
|
||||
"Rec mask: %02x\n" "Rec src: %02x\n" "Current input source #: %s\n"
|
||||
"Line level: %d\n" "Mic level: %d\n" "Pcm level: %d\n" "Vol level: %d\n",
|
||||
"Line level: %f\n" "Mic level: %f\n" "Pcm level: %f\n" "Vol level: %f\n",
|
||||
devmask, recmask, recsrc, GetInputSourceName(inpsrc0),
|
||||
linelevel0, miclevel0, pcmlevel0, vollevel0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1501,7 +1501,7 @@ void SoundPort::pa_perror(int err, const char* str)
|
|||
LOG_ERROR("Possible OSS error %d: %s", errno, strerror(errno));
|
||||
}
|
||||
else
|
||||
LOG_ERROR("%s error %d: %s", Pa_GetHostApiInfo(i)->name,
|
||||
LOG_ERROR("%s error %ld: %s", Pa_GetHostApiInfo(i)->name,
|
||||
hosterr->errorCode, hosterr->errorText);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -472,7 +472,8 @@ int Digiscope::handle(int event)
|
|||
}
|
||||
return 1;
|
||||
case FL_MOUSEWHEEL:
|
||||
change_modem_param(FL_CTRL);
|
||||
if ((event = Fl::event_dy()) || (event = Fl::event_dx()))
|
||||
wf->handle_mouse_wheel(waterfall::WF_AFC_BW, event);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
#include "Viewer.h"
|
||||
#include "macros.h"
|
||||
#include "arq_io.h"
|
||||
#include "confdialog.h"
|
||||
|
||||
extern modem *active_modem;
|
||||
|
||||
|
|
@ -132,6 +133,9 @@ WFdisp::WFdisp (int x0, int y0, int w0, int h0, char *lbl) :
|
|||
tmp_carrier = false;
|
||||
ptrCB = 0;
|
||||
ptrFFTbuff = 0;
|
||||
|
||||
for (int i = 0; i < 256; i++)
|
||||
mag2RGBI[i].I = mag2RGBI[i].R = mag2RGBI[i].G = mag2RGBI[i].B = 0;
|
||||
}
|
||||
|
||||
WFdisp::~WFdisp() {
|
||||
|
|
@ -279,7 +283,7 @@ void WFdisp::setcolors() {
|
|||
|
||||
|
||||
void WFdisp::initmaps() {
|
||||
for (int i = 0; i < image_area; i++) fft_db[i] = log2disp(-1000);
|
||||
for (int i = 0; i < image_area; i++) fft_db[i] = tmp_fft_db[i] = log2disp(-1000);
|
||||
|
||||
memset (fft_img, 0, image_area * sizeof(RGBI) );
|
||||
memset (scaleimage, 0, scale_width * WFSCALE);
|
||||
|
|
@ -631,7 +635,10 @@ void WFdisp::update_waterfall() {
|
|||
short int *p1, *p2;
|
||||
RGBI *p3, *p4;
|
||||
p1 = tmp_fft_db + offset;
|
||||
p2 = p1;
|
||||
p3 = fft_img;
|
||||
p4 = p3;
|
||||
|
||||
short* limit = tmp_fft_db + image_area - step + 1;
|
||||
|
||||
for (int row = 0; row < image_height; row++) {
|
||||
|
|
@ -1391,7 +1398,8 @@ int waterfall::handle(int event)
|
|||
Fl_Valuator* v[] = { sldrSquelch, wfcarrier, wfRefLevel, wfAmpSpan, valRcvMixer, valXmtMixer };
|
||||
for (size_t i = 0; i < sizeof(v)/sizeof(v[0]); i++) {
|
||||
if (Fl::event_inside(v[i])) {
|
||||
if ((v[i] == sldrSquelch && !twoscopes) || v[i] == valRcvMixer || v[i] == valXmtMixer)
|
||||
if ((v[i] == sldrSquelch && !progdefaults.docked_scope) ||
|
||||
v[i] == valRcvMixer || v[i] == valXmtMixer)
|
||||
d = -d;
|
||||
v[i]->value(v[i]->clamp(v[i]->increment(v[i]->value(), -d)));
|
||||
v[i]->do_callback();
|
||||
|
|
@ -1551,10 +1559,25 @@ int WFdisp::handle(int event)
|
|||
break;
|
||||
|
||||
case FL_MOUSEWHEEL:
|
||||
change_modem_param(Fl::event_state());
|
||||
{
|
||||
int d;
|
||||
if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) )
|
||||
break;
|
||||
int state = Fl::event_state();
|
||||
if (state & FL_CTRL)
|
||||
wf->handle_mouse_wheel(waterfall::WF_AFC_BW, d);
|
||||
else if (state & (FL_META | FL_ALT))
|
||||
wf->handle_mouse_wheel(waterfall::WF_SIGNAL_SEARCH, d);
|
||||
else if (state & FL_SHIFT)
|
||||
wf->handle_mouse_wheel(waterfall::WF_SQUELCH, d);
|
||||
else {
|
||||
if (progdefaults.WaterfallQSY && Fl::event_inside(x(), y(), w(), WFTEXT+WFSCALE+WFMARKER))
|
||||
qsy(wf->rfcarrier() - 500*d);
|
||||
else
|
||||
wf->handle_mouse_wheel(progdefaults.WaterfallWheelAction, d);
|
||||
}
|
||||
return handle(FL_MOVE);
|
||||
break;
|
||||
|
||||
}
|
||||
case FL_SHORTCUT:
|
||||
if (Fl::event_inside(this))
|
||||
take_focus();
|
||||
|
|
@ -1606,3 +1629,71 @@ int WFdisp::handle(int event)
|
|||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void waterfall::handle_mouse_wheel(int what, int d)
|
||||
{
|
||||
if (d == 0)
|
||||
return;
|
||||
|
||||
Fl_Valuator *val = 0;
|
||||
const char* msg_fmt = 0, *msg_label = 0;
|
||||
|
||||
switch (what) {
|
||||
case WF_NOP:
|
||||
return;
|
||||
case WF_AFC_BW:
|
||||
{
|
||||
trx_mode m = active_modem->get_mode();
|
||||
if (m >= MODE_PSK_FIRST && m <= MODE_PSK_LAST)
|
||||
val = mailserver ? cntServerOffset : cntSearchRange;
|
||||
else if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST)
|
||||
val = sldrHellBW;
|
||||
else if (m == MODE_CW)
|
||||
val = sldrCWbandwidth;
|
||||
msg_fmt = "%s = %2.0f Hz";
|
||||
msg_label = val->label();
|
||||
break;
|
||||
}
|
||||
case WF_SIGNAL_SEARCH:
|
||||
if (d > 0)
|
||||
active_modem->searchDown();
|
||||
else
|
||||
active_modem->searchUp();
|
||||
return;
|
||||
case WF_SQUELCH:
|
||||
val = sldrSquelch;
|
||||
if (!progdefaults.docked_scope)
|
||||
d = -d;
|
||||
msg_fmt = "%s = %2.0f %%";
|
||||
msg_label = "Squelch";
|
||||
break;
|
||||
case WF_CARRIER:
|
||||
val = wfcarrier;
|
||||
break;
|
||||
case WF_MODEM:
|
||||
init_modem(d > 0 ? MODE_NEXT : MODE_PREV);
|
||||
return;
|
||||
case WF_SCROLL:
|
||||
(d > 0 ? right : left)->do_callback();
|
||||
return;
|
||||
}
|
||||
|
||||
val->value(val->clamp(val->increment(val->value(), -d)));
|
||||
bool changed_save = progdefaults.changed;
|
||||
val->do_callback();
|
||||
progdefaults.changed = changed_save;
|
||||
if (val == cntServerOffset || val == cntSearchRange)
|
||||
active_modem->set_sigsearch(SIGSEARCH);
|
||||
else if (val == sldrSquelch) // sldrSquelch gives focus to TransmitText
|
||||
take_focus();
|
||||
|
||||
if (msg_fmt) {
|
||||
char msg[60];
|
||||
snprintf(msg, sizeof(msg), msg_fmt, msg_label, val->value());
|
||||
put_status(msg, 2.0);
|
||||
}
|
||||
}
|
||||
|
||||
const char waterfall::wf_wheel_action[] = "None|AFC range or BW|"
|
||||
"Signal search|Squelch level|"
|
||||
"Modem carrier|Modem|Scroll";
|
||||
|
|
|
|||
|
|
@ -381,8 +381,8 @@ void Fl_Text_Display_mod::resize(int X, int Y, int W, int H) {
|
|||
text_area.y = Y+BOTTOM_MARGIN;
|
||||
text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN;
|
||||
text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN;
|
||||
int i;
|
||||
|
||||
int i = 0;
|
||||
|
||||
/* Find the new maximum font height for this text display */
|
||||
for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++)
|
||||
mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size));
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue