kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Upstream version 2.0pre2
rodzic
f9e9820662
commit
a9831c865c
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
#include <FL/Fl_Progress.H>
|
||||
#include <FL/Fl_Input.H>
|
||||
#include <FL/Fl_Tile.H>
|
||||
#include <FL/Fl_Light_Button.H>
|
||||
#include <FL/Fl_Check_Button.H>
|
||||
|
||||
#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();
|
||||
|
|
|
@ -2,6 +2,6 @@
|
|||
#define _VERSION_H
|
||||
|
||||
#define FLDIGI_NAME "fldigi"
|
||||
#define FLDIGI_VERSION "2.0"
|
||||
#define FLDIGI_VERSION "2.0pre2"
|
||||
|
||||
#endif
|
||||
|
|
16
src/main.cxx
16
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -187,17 +187,20 @@ void modem::set_samplerate(int smprate)
|
|||
samplerate = smprate;
|
||||
}
|
||||
|
||||
//mbuffer<double, 512 * 2, 2> _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
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<const char *>(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<FTextEdit *>(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,
|
||||
|
|
|
@ -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));
|
||||
|
|
Ładowanie…
Reference in New Issue