More waterfall hacks

pull/2/head
Stelios Bounanos 2007-11-07 03:47:36 +00:00
rodzic 4cf9874ffd
commit aa71760df8
7 zmienionych plików z 266 dodań i 116 usunięć

Wyświetl plik

@ -908,6 +908,7 @@ Fl_Counter *cntSearchRange=(Fl_Counter *)0;
static void cb_cntSearchRange(Fl_Counter* o, void*) {
progdefaults.SearchRange = (int)o->value();
wf->redraw_marker();
progdefaults.changed = true;
}
@ -922,6 +923,7 @@ Fl_Counter *cntServerOffset=(Fl_Counter *)0;
static void cb_cntServerOffset(Fl_Counter* o, void*) {
progdefaults.ServerOffset = (int)o->value();
wf->redraw_marker();
progdefaults.changed = true;
}

Wyświetl plik

@ -1063,6 +1063,7 @@ progdefaults.changed = true;}
Fl_Counter cntSearchRange {
label {Search Range}
callback {progdefaults.SearchRange = (int)o->value();
wf->redraw_marker();
progdefaults.changed = true;}
xywh {25 69 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
code0 {o->value(progdefaults.SearchRange);}
@ -1081,6 +1082,7 @@ progdefaults.changed = true;}
Fl_Counter cntServerOffset {
label {Allowable Rx Carrier Offset}
callback {progdefaults.ServerOffset = (int)o->value();
wf->redraw_marker();
progdefaults.changed = true;}
xywh {31 162 80 21} type Simple align 8 minimum 10 maximum 500 step 10 value 200
code0 {o->value(progdefaults.SearchRange);}

Wyświetl plik

@ -147,11 +147,6 @@ int HNOM = DEFAULT_HNOM;
int WNOM = DEFAULT_WNOM;
void clearStatus()
{
clear_StatusMessages();
}
void startup_modem(modem *m)
{
trx_start_modem(m);
@ -251,7 +246,7 @@ void cb_wMain( Fl_Widget *, void * )
void initMFSK8()
{
clearStatus();
clear_StatusMessages();
if (!mfsk8_modem)
mfsk8_modem = new mfsk(MODE_MFSK8);
startup_modem (mfsk8_modem);
@ -264,7 +259,7 @@ void cb_mnuMFSK8(Fl_Menu_*, void*) {
void initMFSK16()
{
clearStatus();
clear_StatusMessages();
if (!mfsk16_modem)
mfsk16_modem = new mfsk(MODE_MFSK16);
startup_modem (mfsk16_modem);
@ -277,7 +272,7 @@ void cb_mnuMFSK16(Fl_Menu_*, void*) {
void initPSK31()
{
clearStatus();
clear_StatusMessages();
if (!psk31_modem)
psk31_modem = new psk(MODE_BPSK31);
startup_modem (psk31_modem);
@ -290,7 +285,7 @@ void cb_mnuPSK31(Fl_Menu_*, void*) {
void initPSK63()
{
clearStatus();
clear_StatusMessages();
if(!psk63_modem)
psk63_modem = new psk(MODE_PSK63);
startup_modem (psk63_modem);
@ -303,7 +298,7 @@ void cb_mnuPSK63(Fl_Menu_*, void*) {
void initPSK125()
{
clearStatus();
clear_StatusMessages();
if(!psk125_modem)
psk125_modem = new psk(MODE_PSK125);
startup_modem (psk125_modem);
@ -316,7 +311,7 @@ void cb_mnuPSK125(Fl_Menu_*, void*) {
void initPSK250()
{
clearStatus();
clear_StatusMessages();
if(!psk250_modem)
psk250_modem = new psk(MODE_PSK250);
startup_modem (psk250_modem);
@ -329,7 +324,7 @@ void cb_mnuPSK250(Fl_Menu_*, void*) {
void initQPSK31()
{
clearStatus();
clear_StatusMessages();
if (!qpsk31_modem)
qpsk31_modem = new psk(MODE_QPSK31);
startup_modem (qpsk31_modem);
@ -342,7 +337,7 @@ void cb_mnuQPSK31(Fl_Menu_*, void*) {
void initQPSK63()
{
clearStatus();
clear_StatusMessages();
if (!qpsk63_modem)
qpsk63_modem = new psk(MODE_QPSK63);
startup_modem (qpsk63_modem);
@ -355,7 +350,7 @@ void cb_mnuQPSK63(Fl_Menu_*, void*) {
void initQPSK125()
{
clearStatus();
clear_StatusMessages();
if (!qpsk125_modem)
qpsk125_modem = new psk(MODE_QPSK125);
startup_modem (qpsk125_modem);
@ -368,7 +363,7 @@ void cb_mnuQPSK125(Fl_Menu_*, void*) {
void initQPSK250()
{
clearStatus();
clear_StatusMessages();
if (!qpsk250_modem)
qpsk250_modem = new psk(MODE_QPSK250);
startup_modem (qpsk250_modem);
@ -381,7 +376,7 @@ void cb_mnuQPSK250(Fl_Menu_*, void*) {
void initCW()
{
clearStatus();
clear_StatusMessages();
if (!cw_modem)
cw_modem = new cw();
startup_modem (cw_modem);
@ -394,7 +389,7 @@ void cb_mnuCW(Fl_Menu_*, void*) {
void initRTTY()
{
clearStatus();
clear_StatusMessages();
if (!rtty_modem)
rtty_modem = new rtty(MODE_RTTY);
startup_modem (rtty_modem);
@ -407,7 +402,7 @@ void cb_mnuRTTY(Fl_Menu_*, void*) {
void initOLIVIA()
{
clearStatus();
clear_StatusMessages();
if (!olivia_modem)
olivia_modem = new olivia();
startup_modem (olivia_modem);
@ -420,7 +415,7 @@ void cb_mnuOlivia(Fl_Menu_*, void*) {
void initDOMINOEX4()
{
clearStatus();
clear_StatusMessages();
if (!dominoex4_modem) {
dominoex4_modem = new dominoex(MODE_DOMINOEX4);
}
@ -434,7 +429,7 @@ void cb_mnuDOMINOEX4(Fl_Menu_ *, void *) {
void initDOMINOEX5()
{
clearStatus();
clear_StatusMessages();
if (!dominoex5_modem) {
dominoex5_modem = new dominoex(MODE_DOMINOEX5);
}
@ -448,7 +443,7 @@ void cb_mnuDOMINOEX5(Fl_Menu_ *, void *) {
void initDOMINOEX8()
{
clearStatus();
clear_StatusMessages();
if (!dominoex8_modem)
dominoex8_modem = new dominoex(MODE_DOMINOEX8);
startup_modem (dominoex8_modem);
@ -461,7 +456,7 @@ void cb_mnuDOMINOEX8(Fl_Menu_ *, void *) {
void initDOMINOEX11()
{
clearStatus();
clear_StatusMessages();
if (!dominoex11_modem)
dominoex11_modem = new dominoex(MODE_DOMINOEX11);
startup_modem (dominoex11_modem);
@ -474,7 +469,7 @@ void cb_mnuDOMINOEX11(Fl_Menu_ *, void *) {
void initDOMINOEX16()
{
clearStatus();
clear_StatusMessages();
if (!dominoex16_modem)
dominoex16_modem = new dominoex(MODE_DOMINOEX16);
startup_modem (dominoex16_modem);
@ -487,7 +482,7 @@ void cb_mnuDOMINOEX16(Fl_Menu_ *, void *) {
void initDOMINOEX22()
{
clearStatus();
clear_StatusMessages();
if (!dominoex22_modem)
dominoex22_modem = new dominoex(MODE_DOMINOEX22);
startup_modem (dominoex22_modem);
@ -500,7 +495,7 @@ void cb_mnuDOMINOEX22(Fl_Menu_ *, void *) {
void initFELDHELL()
{
clearStatus();
clear_StatusMessages();
FHdisp->clear();
if (!feld_modem)
feld_modem = new feld(MODE_FELDHELL);
@ -514,7 +509,7 @@ void cb_mnuFELDHELL(Fl_Menu_ *, void *) {
void initFSKHELL()
{
clearStatus();
clear_StatusMessages();
FHdisp->clear();
if (!feld_FMmodem)
feld_FMmodem = new feld(MODE_FSKHELL);
@ -528,7 +523,7 @@ void cb_mnuFSKHELL(Fl_Menu_ *, void *) {
void initFSKHELL105()
{
clearStatus();
clear_StatusMessages();
FHdisp->clear();
if (!feld_FM105modem)
feld_FM105modem = new feld(MODE_FSKH105);
@ -541,7 +536,7 @@ void cb_mnuFSKHELL105(Fl_Menu_ *, void *) {
}
//void cb_mnuCMTHELL(Fl_Menu_ *, void *) {
// clearStatus();
// clear_StatusMessages();
// FHdisp->clear();
// if (!feld_CMTmodem)
// feld_CMTmodem = new feld(MODE_FMCMT);
@ -550,7 +545,7 @@ void cb_mnuFSKHELL105(Fl_Menu_ *, void *) {
void initTHROB1()
{
clearStatus();
clear_StatusMessages();
if (!throb1_modem)
throb1_modem = new throb(MODE_THROB1);
startup_modem (throb1_modem);
@ -563,7 +558,7 @@ void cb_mnuTHROB1(Fl_Menu_ *, void *) {
void initTHROB2()
{
clearStatus();
clear_StatusMessages();
if (!throb2_modem)
throb2_modem = new throb(MODE_THROB2);
startup_modem (throb2_modem);
@ -576,7 +571,7 @@ void cb_mnuTHROB2(Fl_Menu_ *, void *) {
void initTHROB4()
{
clearStatus();
clear_StatusMessages();
if (!throb4_modem)
throb4_modem = new throb(MODE_THROB4);
startup_modem (throb4_modem);
@ -589,7 +584,7 @@ void cb_mnuTHROB4(Fl_Menu_ *, void *) {
void initTHROBX1()
{
clearStatus();
clear_StatusMessages();
if (!throbx1_modem)
throbx1_modem = new throb(MODE_THROBX1);
startup_modem (throbx1_modem);
@ -602,7 +597,7 @@ void cb_mnuTHROBX1(Fl_Menu_ *, void *) {
void initTHROBX2()
{
clearStatus();
clear_StatusMessages();
if (!throbx2_modem)
throbx2_modem = new throb(MODE_THROBX2);
startup_modem (throbx2_modem);
@ -615,7 +610,7 @@ void cb_mnuTHROBX2(Fl_Menu_ *, void *) {
void initTHROBX4()
{
clearStatus();
clear_StatusMessages();
if (!throbx4_modem)
throbx4_modem = new throb(MODE_THROBX4);
startup_modem (throbx4_modem);
@ -628,7 +623,7 @@ void cb_mnuTHROBX4(Fl_Menu_ *, void *) {
void initWWV()
{
clearStatus();
clear_StatusMessages();
if (!wwv_modem)
wwv_modem = new wwv();
startup_modem (wwv_modem);
@ -641,7 +636,7 @@ void cb_mnuWWV(Fl_Menu_ *, void *) {
void initANALYSIS()
{
clearStatus();
clear_StatusMessages();
if (!anal_modem)
anal_modem = new anal();
startup_modem (anal_modem);
@ -1464,7 +1459,7 @@ void create_fl_digi_main() {
sldrSquelch = new Fl_Slider(
FL_HOR_NICE_SLIDER,
WNOM-(Hwfall-24), Y + Hwfall - 12,
Hwfall - 24, 12, "");
Hwfall - 24, 12, "Squelch");
sldrSquelch->minimum(0);
sldrSquelch->maximum(100);
@ -1621,7 +1616,7 @@ void put_rx_char(unsigned int data)
int style = ReceiveWidget::RECV;
if (asc == ascii2 && iscntrl(data))
style = ReceiveWidget::CTRL;
if (wf->tmp_carrier)
if (wf->tmp_carrier())
style = ReceiveWidget::ALTR;
data &= 0x7F;
@ -1665,7 +1660,12 @@ void put_sec_char( char chr )
}
}
void put_status(const char *msg)
void clear_status_cb(void *)
{
StatusBar->label("");
}
void put_status(const char *msg, double timeout)
{
static char m[60];
strncpy(m, msg, sizeof(m));
@ -1673,6 +1673,13 @@ void put_status(const char *msg)
FL_LOCK_D();
QUEUE(CMP_CB(&Fl_Box::label, StatusBar, m)); // StatusBar->label(m);
// While it is safe to call to use Fl::add_timeout without qrunner
// regardless of our caller's context, queuing ensures that clear_status_cb
// really gets called at least ``timeout'' seconds after the label is set.
if (timeout > 0 && !Fl::has_timeout(clear_status_cb)) { // clear after timeout
Fl::remove_timeout(clear_status_cb);
QUEUE(CMP_CB(&Fl::add_timeout, timeout, clear_status_cb, (void*)0));
}
FL_UNLOCK_D();
FL_AWAKE_D();
}

Wyświetl plik

@ -111,7 +111,8 @@ extern void set_CWwpm();
extern void put_rx_char(unsigned int data);
extern void put_sec_char( char chr );
extern void put_status(const char *msg);
extern void put_status(const char *msg, double timeout = 0);
extern void clear_status_cb(void *);
extern void clear_StatusMessages();
extern void put_MODEstatus(trx_mode mode);
extern void put_Status1(const char *msg);

Wyświetl plik

@ -159,6 +159,8 @@ public:
void initmaps();
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();
@ -272,7 +274,11 @@ private:
protected:
public:
bool wantcursor;
int cursorpos;
int cursorpos;
int newcarrier;
int oldcarrier;
bool tmp_carrier;
};
class waterfall: public Fl_Group {
@ -304,6 +310,7 @@ public:
void carrier(int f);
void rfcarrier(long long cf);
long long rfcarrier();
bool tmp_carrier(void) { return wfdisp->tmp_carrier; }
void set_XmtRcvBtn(bool val);
void USB(bool b);
bool USB();
@ -330,7 +337,7 @@ public:
void Carrier(int f);
void movetocenter() { wfdisp->movetocenter();}
void redraw_marker() { wfdisp->makeMarker(); }
void setPrefilter(int v) {wfdisp->setPrefilter(v);}
void setcolors() { wfdisp->setcolors(); }
@ -351,7 +358,6 @@ public:
/*
*/
Fl_Button *btnRev;
bool tmp_carrier;
private:
Fl_Box *bezel;
WFdisp *wfdisp;
@ -370,9 +376,6 @@ private:
Fl_Light_Button *xmtlock;
int buttonrow;
bool reverse;
int newcarrier;
int oldcarrier;
};
#endif

Wyświetl plik

@ -124,6 +124,9 @@ WFdisp::WFdisp (int x0, int y0, int w0, int h0, char *lbl) :
pwr[i] = 0.0;
carrier(1000);
oldcarrier = newcarrier = 0;
tmp_carrier = false;
}
WFdisp::~WFdisp() {
@ -152,9 +155,17 @@ void WFdisp::makeMarker() {
clrMin = markerimage + IMAGE_WIDTH;
clrMax = clrMin + (WFMARKER - 2) * IMAGE_WIDTH;
memset(clrMin, 0, RGBwidth * (WFMARKER - 2));
clrM = clrMin + (int)((double)carrierfreq + 0.5);
int bw = (int)((double) bandwidth / 2.0) + 1;
int bw = bandwidth;
if (active_modem) {
int mode = active_modem->get_mode();
if (mode >= MODE_BPSK31 && mode <= MODE_QPSK250)
bw += mailserver ? progdefaults.ServerOffset :
progdefaults.SearchRange;
}
bw = bw / 2.0 + 1;
RGBmarker.R = progdefaults.bwTrackRGBI.R;
RGBmarker.G = progdefaults.bwTrackRGBI.G;
RGBmarker.B = progdefaults.bwTrackRGBI.B;
@ -1103,7 +1114,7 @@ waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) :
y() + BEZEL,
w() - 2 * BEZEL,
h() - BTN_HEIGHT - 4 * BEZEL);
wfdisp->tooltip("Click to set tracking point");
// wfdisp->tooltip("Click to set tracking point");
xpos = x() + wSpace;
bwclr = new Fl_Button(xpos, buttonrow, bwColor, BTN_HEIGHT, "clr");
@ -1199,80 +1210,202 @@ waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) :
xmtrcv->selection_color(FL_RED);
xmtrcv->value(0);
xmtrcv->tooltip("Transmit/Receive");
oldcarrier = newcarrier = 0;
tmp_carrier = false;
}
int waterfall::handle(int event) {
if (Fl::event() == FL_LEAVE) {
wfdisp->wantcursor = false;
wfdisp->makeMarker();
return 1;
}
if (Fl::event_inside( wfdisp )) {
if (trx_state != STATE_RX)
return 1;
int xpos = Fl::event_x() - wfdisp->x();
int waterfall::handle(int event)
{
if (event != FL_MOUSEWHEEL || Fl::event_inside(wfdisp))
return Fl_Group::handle(event);
switch (event) {
case FL_MOVE:
wfdisp->wantcursor = true;
wfdisp->cursorpos = xpos;
wfdisp->makeMarker();
wfdisp->redrawCursor();
break;
case FL_DRAG: case FL_PUSH:
switch (Fl::event_button()) {
case FL_RIGHT_MOUSE:
wfdisp->wantcursor = false;
if (event == FL_PUSH) {
tmp_carrier = true;
oldcarrier = carrier();
}
// fall through
case FL_LEFT_MOUSE:
newcarrier = wfdisp->cursorFreq(xpos);
active_modem->set_freq(newcarrier);
active_modem->set_sigsearch(SIGSEARCH);
wfdisp->redrawCursor();
restoreFocus();
break;
case FL_MIDDLE_MOUSE:
if (event == FL_DRAG)
break;
Fl_Button *b = useCheckButtons ? chk_afconoff : afconoff;
b->value(!active_modem->get_afcOnOff());
b->do_callback();
int d;
if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) )
return 1;
Fl_Valuator *val;
if (Fl::event_inside(sldrSquelch) || Fl::event_inside(pgrsSquelch))
val = sldrSquelch;
else if (Fl::event_inside(wfcarrier))
val = wfcarrier;
else if (Fl::event_inside(wfRefLevel))
val = wfRefLevel;
else if (Fl::event_inside(wfAmpSpan))
val = wfAmpSpan;
else
return 0;//Fl_Group::handle(event);
val->value(val->clamp(val->increment(val->value(), d)));
val->do_callback();
return 1;
}
static void hide_cursor(void *w)
{
reinterpret_cast<Fl_Widget *>(w)->window()->cursor(FL_CURSOR_NONE);
}
int WFdisp::handle(int event)
{
if (!(event == FL_LEAVE || Fl::event_inside(this)))
return 0;
if (trx_state != STATE_RX)
return 1;
int xpos = Fl::event_x() - x();
switch (event) {
case FL_MOVE:
window()->cursor(FL_CURSOR_DEFAULT);
if (!Fl::has_timeout(hide_cursor, this))
Fl::add_timeout(1, hide_cursor, this);
wantcursor = true;
cursorpos = xpos;
makeMarker();
redrawCursor();
break;
case FL_DRAG: case FL_PUSH:
switch (Fl::event_button()) {
case FL_RIGHT_MOUSE:
wantcursor = false;
if (event == FL_PUSH) {
tmp_carrier = true;
oldcarrier = carrier();
}
// fall through
case FL_LEFT_MOUSE:
newcarrier = cursorFreq(xpos);
active_modem->set_freq(newcarrier);
active_modem->set_sigsearch(SIGSEARCH);
redrawCursor();
restoreFocus();
break;
case FL_RELEASE:
switch (Fl::event_button()) {
case FL_RIGHT_MOUSE:
tmp_carrier = false;
active_modem->set_freq(oldcarrier);
active_modem->set_sigsearch(3);
wfdisp->redrawCursor();
restoreFocus();
// fall through
case FL_LEFT_MOUSE:
oldcarrier = newcarrier;
case FL_MIDDLE_MOUSE:
if (event == FL_DRAG)
break;
}
break;
case FL_MOUSEWHEEL:
if (Fl::event_dy() > 0 || Fl::event_dx() > 0)
active_modem->searchUp();
else if (Fl::event_dy() < 0 || Fl::event_dx() < 0)
active_modem->searchDown();
Fl_Button *b = useCheckButtons ? chk_afconoff : afconoff;
b->value(!active_modem->get_afcOnOff());
b->do_callback();
}
break;
case FL_RELEASE:
switch (Fl::event_button()) {
case FL_RIGHT_MOUSE:
tmp_carrier = false;
active_modem->set_freq(oldcarrier);
active_modem->set_sigsearch(3);
redrawCursor();
restoreFocus();
// fall through
case FL_LEFT_MOUSE:
oldcarrier = newcarrier;
break;
}
return 1;
} else if (wfdisp->wantcursor == true) {
wfdisp->wantcursor = false;
wfdisp->makeMarker();
break;
case FL_MOUSEWHEEL:
handle_mouse_wheel(event);
return handle(FL_MOVE);
break;
case FL_SHORTCUT:
if (Fl::event_inside(this))
take_focus();
break;
case FL_KEYBOARD:
{
int d = (Fl::event_state() & FL_CTRL) ? 10 : 1;
switch (Fl::event_key()) {
case FL_Left:
if (xpos > 0) {
active_modem->set_freq(oldcarrier = newcarrier = carrier() - d);
redrawCursor();
}
break;
case FL_Right:
if (xpos < w()) {
active_modem->set_freq(oldcarrier = newcarrier = carrier() + d);
redrawCursor();
}
break;
case FL_Tab:
restoreFocus();
break;
}
break;
}
return Fl_Group::handle(event);
case FL_KEYUP:
{
if (Fl::event_inside(this)) {
int k = Fl::event_key();
if (k == FL_Shift_L || k == FL_Shift_R || k == FL_Control_L ||
k == FL_Control_R || k == FL_Meta_L || k == FL_Meta_R ||
k == FL_Alt_L || k == FL_Alt_R)
restoreFocus();
}
break;
}
case FL_LEAVE:
Fl::remove_timeout(hide_cursor, this);
window()->cursor(FL_CURSOR_DEFAULT);
wantcursor = false;
makeMarker();
// restoreFocus();
break;
}
return 1;
}
void WFdisp::handle_mouse_wheel(int event)
{
int d;
if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) )
return;
int state = Fl::event_state();
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?
extern Fl_Valuator *cntServerOffset, *cntSearchRange,
*sldrHellBW, *sldrCWbandwidth;
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;
val->value(val->clamp(val->increment(val->value(), d)));
val->do_callback();
if (val == cntServerOffset || val == cntSearchRange)
active_modem->set_sigsearch(SIGSEARCH);
else if (val == sldrSquelch) // sldrSquelch gives focus to TextWidget
take_focus();
char msg[60];
const char *suffix = val == sldrSquelch ? "%" : "Hz";
snprintf(msg, sizeof(msg), "%s = %2.0f %s", val->label(), val->value(), suffix);
put_status(msg, 2);
}

Wyświetl plik

@ -377,8 +377,10 @@ int FTextView::handle(int event)
if (Fl::compose(d))
return 1;
int k = Fl::event_key();
if (k == FL_BackSpace || k == FL_Tab)
if (k == FL_BackSpace)
return 1;
else if (k == FL_Tab)
return Fl_Widget::handle(event);
}
return FTextBase::handle(event);