From a9831c865c8c43ee34b5d85c5f3e68a9a7d4b698 Mon Sep 17 00:00:00 2001 From: Stelios Bounanos Date: Mon, 15 Oct 2007 23:32:59 +0100 Subject: [PATCH] Upstream version 2.0pre2 --- ChangeLog | 4 +- src/cw_rtty/rtty.cxx | 4 +- src/dialogs/fl_digi.cxx | 142 ++++++++++++++++++++---------------- src/dominoex/dominoex.cxx | 2 +- src/feld/feld.cxx | 4 +- src/include/fl_digi.h | 9 ++- src/include/version.h | 2 +- src/main.cxx | 16 +++- src/mfsk/mfsk.cxx | 8 +- src/olivia/olivia.cxx | 4 +- src/psk/psk.cxx | 2 +- src/trx/modem.cxx | 12 ++- src/waterfall/waterfall.cxx | 14 +++- src/widgets/FTextView.cxx | 12 +-- src/widgets/TextView.cxx | 6 +- 15 files changed, 144 insertions(+), 97 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7d6b894b..5a0a780c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,7 @@ Change Log: -1.38 1) Increased TxPPM to +/- 50000 to match the RxPPM range +2.0 1) Increased TxPPM to +/- 50000 to match the RxPPM range 2) Changed all audio i/o to separate 2 channel control (stereo) 3) Added right channel CW QRQ signal 4) Added right channel pseudo FSK signal @@ -73,7 +73,7 @@ Change Log: this will cause fldigi to enter the TUNE mode for a very brief 100 milliseconds. 27) Abandoned the original fldigi.def configuration file and changed to - an xml based configuration file. New file is $HOME/.fldigi/fldigi_cfg.xml + an xml based configuration file. New file is $HOME/.fldigi/fldigi_def.xml You may delete all occurances of $HOME/.fldigi/fldigi.def, and $HOME/.fldigi/FLDIGI_XML.DEF diff --git a/src/cw_rtty/rtty.cxx b/src/cw_rtty/rtty.cxx index 3723c4a7..510cc3a2 100644 --- a/src/cw_rtty/rtty.cxx +++ b/src/cw_rtty/rtty.cxx @@ -652,8 +652,8 @@ int rtty::tx_process() return 0; } -// send idle character if c == 0 - if (!c) { +// send idle character if c == -1 + if (c == -1) { send_idle(); txmode = LETTERS; return 0; diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index eaf51825..af1e7b50 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -86,6 +86,8 @@ Fl_Double_Window *fl_digi_main=(Fl_Double_Window *)0; cMixer mixer; +bool useCheckButtons = false; + Fl_Button *btnTune = (Fl_Button *)0; Fl_Tile_check *TiledGroup = 0; ReceiveWidget *ReceiveText = 0; @@ -102,6 +104,8 @@ Fl_Button *btnMacro[10]; Fl_Button *btnAltMacros; Fl_Light_Button *afconoff; Fl_Light_Button *sqlonoff; +Fl_Check_Button *chk_afconoff; +Fl_Check_Button *chk_sqlonoff; Fl_Input *inpFreq; Fl_ComboBox *cboBand; Fl_Button *btnSideband; @@ -1074,7 +1078,8 @@ void cb_cboBand(Fl_Widget *w, void *d) void afconoff_cb(Fl_Widget *w, void *vi) { FL_LOCK_D(); - Fl_Light_Button *b = (Fl_Light_Button *)w; + Fl_Button *b = (Fl_Button *)w; +// Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); active_modem->set_afcOnOff( v ? true : false ); @@ -1084,7 +1089,8 @@ void afconoff_cb(Fl_Widget *w, void *vi) void sqlonoff_cb(Fl_Widget *w, void *vi) { FL_LOCK_D(); - Fl_Light_Button *b = (Fl_Light_Button *)w; + Fl_Button *b = (Fl_Button *)w; +// Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); FL_UNLOCK_D(); active_modem->set_sqlchOnOff( v ? true : false ); @@ -1488,23 +1494,37 @@ void create_fl_digi_main() { WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); - afconoff = new Fl_Light_Button( - WNOM - bwAfcOnOff - bwSqlOnOff, - Hmenu+Hrcvtxt+Hxmttxt+Hwfall, - bwAfcOnOff, Hstatus, "Afc"); - afconoff->callback(afconoff_cb, 0); - afconoff->value(1); - afconoff->selection_color(FL_DARK_GREEN); - afconoff->tooltip("AFC on/off"); - - sqlonoff = new Fl_Light_Button( - WNOM - bwSqlOnOff, - Hmenu+Hrcvtxt+Hxmttxt+Hwfall, - bwSqlOnOff, Hstatus, "Sql"); - sqlonoff->callback(sqlonoff_cb, 0); - sqlonoff->value(1); - sqlonoff->selection_color(FL_DARK_GREEN); - sqlonoff->tooltip("SQL on/off"); + if (useCheckButtons) { + chk_afconoff = new Fl_Check_Button( + WNOM - bwAfcOnOff - bwSqlOnOff, + Hmenu+Hrcvtxt+Hxmttxt+Hwfall, + bwAfcOnOff, Hstatus, "Afc"); + chk_afconoff->callback(afconoff_cb, 0); + chk_afconoff->value(1); + chk_afconoff->tooltip("AFC on/off"); + chk_sqlonoff = new Fl_Check_Button( + WNOM - bwSqlOnOff, + Hmenu+Hrcvtxt+Hxmttxt+Hwfall, + bwSqlOnOff, Hstatus, "Sql"); + chk_sqlonoff->callback(sqlonoff_cb, 0); + chk_sqlonoff->value(1); + chk_sqlonoff->tooltip("SQL on/off"); + } else { + afconoff = new Fl_Light_Button( + WNOM - bwAfcOnOff - bwSqlOnOff, + Hmenu+Hrcvtxt+Hxmttxt+Hwfall, + bwAfcOnOff, Hstatus, "Afc"); + afconoff->callback(afconoff_cb, 0); + afconoff->value(1); + afconoff->tooltip("AFC on/off"); + sqlonoff = new Fl_Light_Button( + WNOM - bwSqlOnOff, + Hmenu+Hrcvtxt+Hxmttxt+Hwfall, + bwSqlOnOff, Hstatus, "Sql"); + sqlonoff->callback(sqlonoff_cb, 0); + sqlonoff->value(1); + sqlonoff->tooltip("SQL on/off"); + } Fl_Group::current()->resizable(StatusBar); hpack->end(); @@ -1714,51 +1734,51 @@ void put_rx_data(int *data, int len) FHdisp->data(data, len); } -char get_tx_char(void) +int get_tx_char(void) { - char chr; - static bool lfpending = false; - static bool ctlpending = false; - - if (pskmail_text_available == true) + if (pskmail_text_available) return pskmail_get_char(); - - if (lfpending == true) { - lfpending = false; - return '\n'; - } - chr = TransmitText->nextChar(); - - if (chr == '\n') { - lfpending = true; - return '\r'; - } - if (ctlpending == true) { - switch (chr) { - case 0x00: - break; - case 'r': - case 'R' : - chr = 0x03; - ctlpending = false; - QUEUE_SYNC(CMP_CB(&TransmitWidget::clear, TransmitText)); //TransmitText->clear(); - break; - case '^' : - ctlpending = false; - break; - default : - ctlpending = false; - chr = 0x00; - } - return chr; - } - if (chr == '^') { - ctlpending = true; - chr = 0x00; - } - return chr; -} + int c; + static int pending = -1; + if (pending >= 0) { + c = pending; + pending = -1; + return c; + } + + enum { STATE_CHAR, STATE_CTRL }; + static int state = STATE_CHAR; + + switch (c = TransmitText->nextChar()) { + case '\n': + pending = '\n'; + return '\r'; + case '^': + if (state == STATE_CTRL) + break; + state = STATE_CTRL; + return -1; + case 'r': case 'R': + if (state != STATE_CTRL) + break; + QUEUE_SYNC(CMP_CB(&TransmitWidget::clear, TransmitText)); + state = STATE_CHAR; + c = 3; // ETX + break; + case -1: + break; + default: + if (state == STATE_CTRL) { + state = STATE_CHAR; + pending = c; + return '^'; + } + } + + pending = -1; + return c; +} void put_echo_char(unsigned int data) { diff --git a/src/dominoex/dominoex.cxx b/src/dominoex/dominoex.cxx index 0aa3d1c7..dbb14d4d 100644 --- a/src/dominoex/dominoex.cxx +++ b/src/dominoex/dominoex.cxx @@ -538,7 +538,7 @@ int dominoex::tx_process() break; case TX_STATE_DATA: i = get_tx_char(); - if (i == 0) + if (i == -1) sendsecondary(); else if (i == 3) txstate = TX_STATE_END; diff --git a/src/feld/feld.cxx b/src/feld/feld.cxx index 2381ff6c..fa8bb12e 100644 --- a/src/feld/feld.cxx +++ b/src/feld/feld.cxx @@ -445,7 +445,7 @@ void feld::tx_char(char c) int feld::tx_process() { - char c; + int c; bool hdkey; FL_LOCK_D(); @@ -486,7 +486,7 @@ int feld::tx_process() // if TX buffer empty // send idle character - if (c == 0) + if (c == -1) if (progdefaults.FELD_IDLE == true) c = '.'; else { diff --git a/src/include/fl_digi.h b/src/include/fl_digi.h index ee2b5bf6..b17feaf7 100644 --- a/src/include/fl_digi.h +++ b/src/include/fl_digi.h @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include "combo.h" #include "TextView.h" @@ -82,7 +84,12 @@ extern Fl_Button *qsoSave; extern Fl_Button *btnMacroTimer; extern Fl_Slider *valRcvMixer; extern Fl_Slider *valXmtMixer; +extern Fl_Light_Button *afconoff; +extern Fl_Light_Button *sqlonoff; +extern Fl_Check_Button *chk_afconoff; +extern Fl_Check_Button *chk_sqlonoff; +extern bool useCheckButtons; extern bool altMacros; extern waterfall *wf; @@ -115,7 +122,7 @@ extern void put_Status2(const char *msg); extern void put_WARNstatus(double); extern void put_rx_data(int *data, int len); -extern char get_tx_char(); +extern int get_tx_char(); extern int get_secondary_char(); extern void put_echo_char(unsigned int data); extern void resetRTTY(); diff --git a/src/include/version.h b/src/include/version.h index 8a837413..7e2d3964 100644 --- a/src/include/version.h +++ b/src/include/version.h @@ -2,6 +2,6 @@ #define _VERSION_H #define FLDIGI_NAME "fldigi" -#define FLDIGI_VERSION "2.0" +#define FLDIGI_VERSION "2.0pre2" #endif diff --git a/src/main.cxx b/src/main.cxx index aca6bfb9..aef24a9e 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -393,7 +393,6 @@ void generate_option_help(void) { << " -to, -tooltips or -not, -notooltips" << "Enable or disable tooltips\n"; - help << "\nAdditional options:\n" << setw(width) << setiosflags(ios::left) @@ -409,7 +408,11 @@ void generate_option_help(void) { << setw(width) << setiosflags(ios::left) << "" << "``minimal'', widget sizes will be adjusted\n" << setw(width) << setiosflags(ios::left) - << "" << "for a minimal screen footprint.\n"; + << "" << "for a minimal screen footprint.\n" + + << setw(width) << setiosflags(ios::left) + << " --usechkbtns" + << "Use check buttons for AFC / SQL\n"; option_help = help.str(); @@ -423,7 +426,7 @@ int parse_args(int argc, char **argv, int& idx) enum { ZERO, RX_IPC_KEY, TX_IPC_KEY, CONFIG_DIR, FAST_TEXT, FONT, WFALL_WIDTH, WFALL_HEIGHT, WINDOW_WIDTH, WINDOW_HEIGHT, PROFILE, - HELP, VERSION }; + USE_CHECK, HELP, VERSION }; const char shortopts[] = "+"; static struct option longopts[] = { @@ -431,13 +434,14 @@ int parse_args(int argc, char **argv, int& idx) { "tx-ipc-key", 1, 0, TX_IPC_KEY }, { "config-dir", 1, 0, CONFIG_DIR }, { "fast-text", 0, 0, FAST_TEXT }, - { "font", 1, 0, FONT }, + { "font", 1, 0, FONT }, { "wfall-width", 1, 0, WFALL_WIDTH }, { "wfall-height", 1, 0, WFALL_HEIGHT }, { "window-width", 1, 0, WINDOW_WIDTH }, { "window-height", 1, 0, WINDOW_HEIGHT }, { "profile", 1, 0, PROFILE }, + { "usechkbtns", 0, 0, USE_CHECK }, { "help", 0, 0, HELP }, { "version", 0, 0, VERSION }, @@ -520,6 +524,10 @@ int parse_args(int argc, char **argv, int& idx) } idx += 2; return 2; + case USE_CHECK: + useCheckButtons = true; + idx += 1; + return 1; case HELP: cerr << option_help; diff --git a/src/mfsk/mfsk.cxx b/src/mfsk/mfsk.cxx index 855f7bc6..cc723003 100644 --- a/src/mfsk/mfsk.cxx +++ b/src/mfsk/mfsk.cxx @@ -750,11 +750,11 @@ int mfsk::tx_process() flushtx(); startpic = false; txstate = TX_STATE_PICTURE_START; - } else if (xmtbyte == -1) - sendidle(); - else if ( xmtbyte == 0x03 || stopflag) { - txstate = TX_STATE_FLUSH; } + else if ( xmtbyte == 0x03 || stopflag) + txstate = TX_STATE_FLUSH; + else if (xmtbyte == -1) + sendidle(); else sendchar(xmtbyte); break; diff --git a/src/olivia/olivia.cxx b/src/olivia/olivia.cxx index 368bcfb7..a2195311 100644 --- a/src/olivia/olivia.cxx +++ b/src/olivia/olivia.cxx @@ -178,6 +178,8 @@ int olivia::tx_process() Tx->Stop(); } else { /* Replace un-representable characters with a dot */ + if (c == -1) + c = 0; if (c > (olivia_esc ? 255 : 127)) c = '.'; if (c > 127) { @@ -186,7 +188,7 @@ int olivia::tx_process() } Tx->PutChar(c); } - } + } if (Tx->GetChar(ch) > 0) if ((c = unescape(ch)) != -1) diff --git a/src/psk/psk.cxx b/src/psk/psk.cxx index 0a348fd4..c4355834 100644 --- a/src/psk/psk.cxx +++ b/src/psk/psk.cxx @@ -638,7 +638,7 @@ int psk::tx_process() return -1; /* we're done */ } - if (!c) + if (c == -1) tx_bit(0); else { tx_char(c); diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index b1e2b7a0..e026054f 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -187,17 +187,20 @@ void modem::set_samplerate(int smprate) samplerate = smprate; } +//mbuffer _mdm_scdbl; + void modem::ModulateXmtr(double *buffer, int len) { scard->write_samples(buffer, len); return; // if (progdefaults.viewXmtSignal) // for (int i = 0; i < len; i++) { -// scdata[scptr] = buffer[i] * 0.01; +// _mdm_scdbl[scptr] = buffer[i] * 0.1; // scptr++; // if (scptr == 512) { -// wf->sig_data(scdata, 512); +// QUEUE(CMP_CB(&waterfall::sig_data, wf, _mdm_scdbl.c_array(), 512)); //wf->sig_data(scdata, 512); // scptr = 0; +// _mdm_scdbl.next(); // change buffers // } // } } @@ -208,11 +211,12 @@ void modem::ModulateStereo(double *left, double *right, int len) return; // if (progdefaults.viewXmtSignal) // for (int i = 0; i < len; i++) { -// scdata[scptr] = left[i] * 0.01; +// _mdm_scdbl[scptr] = left[i] * 0.1; // scptr++; // if (scptr == 512) { -// wf->sig_data(scdata, 512); +// QUEUE(CMP_CB(&waterfall::sig_data, wf, _mdm_scdbl.c_array(), 512)); //wf->sig_data(scdata, 512); // scptr = 0; +// _mdm_scdbl.next(); // change buffers // } // } } diff --git a/src/waterfall/waterfall.cxx b/src/waterfall/waterfall.cxx index 8805bd12..a8f23fb3 100644 --- a/src/waterfall/waterfall.cxx +++ b/src/waterfall/waterfall.cxx @@ -1182,14 +1182,14 @@ waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) : xmtlock = new Fl_Light_Button(xpos, buttonrow, bwXmtLock, BTN_HEIGHT, "Lk"); xmtlock->callback(xmtlock_cb, 0); xmtlock->value(0); - xmtlock->selection_color(FL_DARK_RED); + xmtlock->selection_color(FL_RED); xmtlock->tooltip("Xmt freq locked"); xpos = xpos + bwXmtLock + wSpace; btnRev = new Fl_Light_Button(xpos, buttonrow, bwRev, BTN_HEIGHT, "Rv"); btnRev->callback(btnRev_cb, 0); btnRev->value(0); - btnRev->selection_color(FL_DARK_GREEN); + btnRev->selection_color(FL_GREEN); btnRev->tooltip("Reverse"); reverse = false; @@ -1241,8 +1241,14 @@ int waterfall::handle(int event) { break; bool toggle = !active_modem->get_afcOnOff(); active_modem->set_afcOnOff(toggle); - extern Fl_Light_Button *afconoff; - afconoff->value(toggle); +// extern Fl_Light_Button *afconoff; +// extern Fl_Check_Button *chk_afconoff; +// extern bool useCheckButtons; +// extern Fl_Light_Button *afconoff; + if (useCheckButtons) + chk_afconoff->value(toggle); + else + afconoff->value(toggle); break; } break; diff --git a/src/widgets/FTextView.cxx b/src/widgets/FTextView.cxx index 1889755d..94e9bbd5 100644 --- a/src/widgets/FTextView.cxx +++ b/src/widgets/FTextView.cxx @@ -728,7 +728,7 @@ void FTextEdit::clear(void) /// int FTextEdit::nextChar(void) { - char c; + int c; if (bkspaces) { --bkspaces; @@ -739,11 +739,11 @@ int FTextEdit::nextChar(void) c = 0x03; } else if (insert_position() <= txpos) // empty buffer or cursor inside transmitted text - c = '\0'; + c = -1; else { if ((c = tbuf->character(txpos))) { ++txpos; - QUEUE(CMP_CB(FTextEdit::changed_cb, 0, 0, 0, 0, + QUEUE(CMP_CB(FTextEdit::changed_cb, txpos, 0, 0, 0, static_cast(0), this)); } } @@ -994,10 +994,10 @@ void FTextEdit::changed_cb(int pos, int nins, int ndel, int nsty, const char *dt FTextEdit *e = reinterpret_cast(arg); if (nins == 0 && ndel == 0) { - if (pos == 0 && nsty == 0) { // update transmitted text style + if (nsty == 0) { // update transmitted text style char s[] = { FTEXT_DEF + XMIT, '\0' }; - e->sbuf->replace(e->txpos - 1, e->txpos, s); - e->redisplay_range(e->txpos - 1, e->txpos); + e->sbuf->replace(pos - 1, pos, s); + e->redisplay_range(pos - 1, pos); } else if (nsty > 0) // restyled, e.g. selected, text return e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, diff --git a/src/widgets/TextView.cxx b/src/widgets/TextView.cxx index fbdffad2..bc2dd15c 100644 --- a/src/widgets/TextView.cxx +++ b/src/widgets/TextView.cxx @@ -1129,11 +1129,11 @@ int TextEdit::nextChar() PauseBreak = false; return 0x03; } - if (buff.empty()) return 0; - if (xmtidx == buff.length()) return 0; + if (buff.empty()) return -1; + if (xmtidx == buff.length()) return -1; if (attr[xmtidx] == -1) { xmtidx++; - if (xmtidx == buff.length()) return 0; + if (xmtidx == buff.length()) return -1; } FL_LOCK_D(); QUEUE(CMP_CB(&TextEdit::update_xmit_text, this, xmtidx));