dl-fldigi/src/dialogs/fl_digi.cxx

1692 wiersze
39 KiB
C++

// ----------------------------------------------------------------------------
//
// fl_digi.cxx
//
// Copyright (C) 2006
// Dave Freese, W1HKJ
//
// This file is part of fldigi.
//
// fldigi is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// fldigi is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with fldigi; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ----------------------------------------------------------------------------
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string>
#include "fl_digi.h"
#include <FL/fl_ask.H>
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Image.H>
#include <FL/Fl_Tile.H>
#include "version.h"
#include "waterfall.h"
#include "raster.h"
#include "main.h"
#include "threads.h"
#include "trx.h"
#ifndef NOHAMLIB
#include "hamlib.h"
#endif
#include "rigCAT.h"
#include "psk.h"
#include "cw.h"
#include "mfsk.h"
#include "rtty.h"
#include "olivia.h"
#include "dominoex.h"
#include "feld.h"
#include "throb.h"
#include "wwv.h"
#include "analysis.h"
#include "ascii.h"
#include "globals.h"
#include "misc.h"
//#include "help.h"
#include "Config.h"
#include "configuration.h"
#include "macros.h"
#include "macroedit.h"
#include "logger.h"
#include "qrzcall.h"
#include "combo.h"
#include "font_browser.h"
#include "status.h"
#include "rigsupport.h"
Fl_Double_Window *fl_digi_main=(Fl_Double_Window *)0;
cMixer mixer;
Fl_Button *btnTune = (Fl_Button *)0;
Fl_Tile *TiledGroup = (Fl_Tile *)0;
TextView *ReceiveText=(TextView *)0;
TextEdit *TransmitText=(TextEdit *)0;
Fl_Text_Buffer *rcvBuffer = (Fl_Text_Buffer *)0;
Fl_Text_Buffer *xmtBuffer = (Fl_Text_Buffer *)0;
Raster *FHdisp;
Fl_Box *StatusBar = (Fl_Box *)0;
Fl_Box *IMDstatus = (Fl_Box *)0;
Fl_Box *S2Nstatus = (Fl_Box *)0;
Fl_Box *WARNstatus = (Fl_Box *)0;
Fl_Button *MODEstatus = (Fl_Button *)0;
Fl_Button *btnMacro[10];
Fl_Button *btnAltMacros;
Fl_Light_Button *afconoff;
Fl_Light_Button *sqlonoff;
Fl_Input *inpFreq;
Fl_ComboBox *cboBand;
Fl_Button *btnSideband;
Fl_Input *inpTime;
Fl_Input *inpCall;
Fl_Input *inpName;
Fl_Input *inpRstIn;
Fl_Input *inpRstOut;
Fl_Input *inpQth;
Fl_Input *inpLoc;
Fl_Input *inpNotes;
Fl_Input *inpAZ; // WA5ZNU
Fl_Button *qsoTime;
Fl_Button *qsoClear;
Fl_Button *qsoSave;
Fl_Button *btnMacroTimer;
Fl_Button *btnQRZ;
Fl_Slider *valRcvMixer;
Fl_Slider *valXmtMixer;
bool altMacros = false;
bool bSaveFreqList = false;
string strMacroName[10];
waterfall *wf = (waterfall *)0;
Digiscope *digiscope = (Digiscope *)0;
Fl_Slider *sldrSquelch = (Fl_Slider *)0;
Fl_Progress *pgrsSquelch = (Fl_Progress *)0;
Fl_RGB_Image *feld_image = 0;
void clearStatus()
{
clear_StatusMessages();
}
void startup_modem(modem *m)
{
trx_start_modem(m);
restoreFocus();
Fl::lock();
if (m == feld_modem ||
m == feld_FMmodem ||
m == feld_FM105modem ) {
ReceiveText->Hide();
FHdisp->show();
} else {
ReceiveText->Show();
FHdisp->hide();
}
Fl::unlock();
Fl::awake();
}
void cb_mnuOpenMacro(Fl_Menu_*, void*) {
macros.openMacroFile();
restoreFocus();
}
void cb_mnuSaveMacro(Fl_Menu_*, void*) {
macros.saveMacroFile();
restoreFocus();
}
bool logging = false;
void cb_mnuLogFile(Fl_Menu_ *, void *) {
logging = !logging;
restoreFocus();
}
void clean_exit() {
if (progdefaults.changed == true) {
if (fl_choice("Configuration changed, Save", "No", "Yes", 0) == 1)
progdefaults.saveDefaults();
}
if (macros.changed == true) {
if (fl_choice("Macros changed, Save", "No", "Yes", 0) == 1)
macros.saveMacroFile();
}
if (Maillogfile)
Maillogfile->log_to_file_stop();
if (logfile)
logfile->log_to_file_stop();
if (bSaveFreqList)
saveFreqList();
progStatus.saveLastState();
mixer.closeMixer();
active_modem->set_stopflag(true);
while (trx_state != STATE_RX)
MilliSleep(100);
// fl_lock (&trx_mutex);
// if (active_modem) {
// active_modem->shutdown();
// MilliSleep(100);
// delete active_modem;
// }
// active_modem = (modem *) 0;
// fl_unlock (&trx_mutex);
//#ifndef NOHAMLIB
// delete xcvr;
//#endif
// delete push2talk;
exit(0);
}
void cb_E(Fl_Menu_*, void*) {
clean_exit();
}
void cb_wMain( Fl_Widget *, void * )
{
if (Fl::event_key(FL_Escape)) {
TransmitText->clear();
active_modem->set_stopflag(true);
} else
clean_exit();
}
void initCW()
{
clearStatus();
if (!cw_modem)
cw_modem = new cw();
startup_modem (cw_modem);
progStatus.saveModeState(MODE_CW);
}
void cb_mnuCW(Fl_Menu_*, void*) {
initCW();
}
void initMFSK8()
{
clearStatus();
if (!mfsk8_modem)
mfsk8_modem = new mfsk(MODE_MFSK8);
startup_modem (mfsk8_modem);
progStatus.saveModeState(MODE_MFSK8);
}
void cb_mnuMFSK8(Fl_Menu_*, void*) {
initMFSK8();
}
void initMFSK16()
{
clearStatus();
if (!mfsk16_modem)
mfsk16_modem = new mfsk(MODE_MFSK16);
startup_modem (mfsk16_modem);
progStatus.saveModeState(MODE_MFSK16);
}
void cb_mnuMFSK16(Fl_Menu_*, void*) {
initMFSK16();
}
void initPSK31()
{
clearStatus();
if (!psk31_modem)
psk31_modem = new psk(MODE_BPSK31);
startup_modem (psk31_modem);
progStatus.saveModeState(MODE_BPSK31);
}
void cb_mnuPSK31(Fl_Menu_*, void*) {
initPSK31();
}
void initPSK63()
{
clearStatus();
if(!psk63_modem)
psk63_modem = new psk(MODE_PSK63);
startup_modem (psk63_modem);
progStatus.saveModeState(MODE_PSK63);
}
void cb_mnuPSK63(Fl_Menu_*, void*) {
initPSK63();
}
void initPSK125()
{
clearStatus();
if(!psk125_modem)
psk125_modem = new psk(MODE_PSK125);
startup_modem (psk125_modem);
progStatus.saveModeState(MODE_PSK125);
}
void cb_mnuPSK125(Fl_Menu_*, void*) {
initPSK125();
}
void initPSK250()
{
clearStatus();
if(!psk250_modem)
psk250_modem = new psk(MODE_PSK250);
startup_modem (psk250_modem);
progStatus.saveModeState(MODE_PSK250);
}
void cb_mnuPSK250(Fl_Menu_*, void*) {
initPSK250();
}
void initQPSK31()
{
clearStatus();
if (!qpsk31_modem)
qpsk31_modem = new psk(MODE_QPSK31);
startup_modem (qpsk31_modem);
progStatus.saveModeState(MODE_QPSK31);
}
void cb_mnuQPSK31(Fl_Menu_*, void*) {
initQPSK31();
}
void initQPSK63()
{
clearStatus();
if (!qpsk63_modem)
qpsk63_modem = new psk(MODE_QPSK63);
startup_modem (qpsk63_modem);
progStatus.saveModeState(MODE_QPSK63);
}
void cb_mnuQPSK63(Fl_Menu_*, void*) {
initQPSK63();
}
void initQPSK125()
{
clearStatus();
if (!qpsk125_modem)
qpsk125_modem = new psk(MODE_QPSK125);
startup_modem (qpsk125_modem);
progStatus.saveModeState(MODE_QPSK125);
}
void cb_mnuQPSK125(Fl_Menu_*, void*) {
initQPSK125();
}
void initQPSK250()
{
clearStatus();
if (!qpsk250_modem)
qpsk250_modem = new psk(MODE_QPSK250);
startup_modem (qpsk250_modem);
progStatus.saveModeState(MODE_QPSK250);
}
void cb_mnuQPSK250(Fl_Menu_*, void*) {
initQPSK250();
}
void initRTTY()
{
clearStatus();
if (!rtty_modem)
rtty_modem = new rtty(MODE_RTTY);
startup_modem (rtty_modem);
progStatus.saveModeState(MODE_RTTY);
}
void cb_mnuRTTY(Fl_Menu_*, void*) {
initRTTY();
}
void initOLIVIA()
{
clearStatus();
if (!olivia_modem)
olivia_modem = new olivia();
startup_modem (olivia_modem);
progStatus.saveModeState(MODE_OLIVIA);
}
void cb_mnuOlivia(Fl_Menu_*, void*) {
initOLIVIA();
}
void initDOMINOEX4()
{
clearStatus();
if (!dominoex4_modem) {
dominoex4_modem = new dominoex(MODE_DOMINOEX4);
}
startup_modem (dominoex4_modem);
progStatus.saveModeState(MODE_DOMINOEX4);
}
void cb_mnuDOMINOEX4(Fl_Menu_ *, void *) {
initDOMINOEX4();
}
void initDOMINOEX5()
{
clearStatus();
if (!dominoex5_modem) {
dominoex5_modem = new dominoex(MODE_DOMINOEX5);
}
startup_modem (dominoex5_modem);
progStatus.saveModeState(MODE_DOMINOEX5);
}
void cb_mnuDOMINOEX5(Fl_Menu_ *, void *) {
initDOMINOEX5();
}
void initDOMINOEX8()
{
clearStatus();
if (!dominoex8_modem)
dominoex8_modem = new dominoex(MODE_DOMINOEX8);
startup_modem (dominoex8_modem);
progStatus.saveModeState(MODE_DOMINOEX8);
}
void cb_mnuDOMINOEX8(Fl_Menu_ *, void *) {
initDOMINOEX8();
}
void initDOMINOEX11()
{
clearStatus();
if (!dominoex11_modem)
dominoex11_modem = new dominoex(MODE_DOMINOEX11);
startup_modem (dominoex11_modem);
progStatus.saveModeState(MODE_DOMINOEX11);
}
void cb_mnuDOMINOEX11(Fl_Menu_ *, void *) {
initDOMINOEX11();
}
void initDOMINOEX16()
{
clearStatus();
if (!dominoex16_modem)
dominoex16_modem = new dominoex(MODE_DOMINOEX16);
startup_modem (dominoex16_modem);
progStatus.saveModeState(MODE_DOMINOEX16);
}
void cb_mnuDOMINOEX16(Fl_Menu_ *, void *) {
initDOMINOEX16();
}
void initDOMINOEX22()
{
clearStatus();
if (!dominoex22_modem)
dominoex22_modem = new dominoex(MODE_DOMINOEX22);
startup_modem (dominoex22_modem);
progStatus.saveModeState(MODE_DOMINOEX22);
}
void cb_mnuDOMINOEX22(Fl_Menu_ *, void *) {
initDOMINOEX22();
}
void initFELDHELL()
{
clearStatus();
FHdisp->clear();
if (!feld_modem)
feld_modem = new feld(MODE_FELDHELL);
startup_modem (feld_modem);
progStatus.saveModeState(MODE_FELDHELL);
}
void cb_mnuFELDHELL(Fl_Menu_ *, void *) {
initFELDHELL();
}
void initFSKHELL()
{
clearStatus();
FHdisp->clear();
if (!feld_FMmodem)
feld_FMmodem = new feld(MODE_FSKHELL);
startup_modem (feld_FMmodem);
progStatus.saveModeState(MODE_FSKHELL);
}
void cb_mnuFSKHELL(Fl_Menu_ *, void *) {
initFSKHELL();
}
void initFSKHELL105()
{
clearStatus();
FHdisp->clear();
if (!feld_FM105modem)
feld_FM105modem = new feld(MODE_FSKH105);
startup_modem (feld_FM105modem);
progStatus.saveModeState(MODE_FSKH105);
}
void cb_mnuFSKHELL105(Fl_Menu_ *, void *) {
initFSKHELL105();
}
//void cb_mnuCMTHELL(Fl_Menu_ *, void *) {
// clearStatus();
// FHdisp->clear();
// if (!feld_CMTmodem)
// feld_CMTmodem = new feld(MODE_FMCMT);
// startup_modem (feld_CMTmodem);
//}
void initTHROB1()
{
clearStatus();
if (!throb1_modem)
throb1_modem = new throb(MODE_THROB1);
startup_modem (throb1_modem);
progStatus.saveModeState(MODE_THROB1);
}
void cb_mnuTHROB1(Fl_Menu_ *, void *) {
initTHROB1();
}
void initTHROB2()
{
clearStatus();
if (!throb2_modem)
throb2_modem = new throb(MODE_THROB2);
startup_modem (throb2_modem);
progStatus.saveModeState(MODE_THROB2);
}
void cb_mnuTHROB2(Fl_Menu_ *, void *) {
initTHROB2();
}
void initTHROB4()
{
clearStatus();
if (!throb4_modem)
throb4_modem = new throb(MODE_THROB4);
startup_modem (throb4_modem);
progStatus.saveModeState(MODE_THROB4);
}
void cb_mnuTHROB4(Fl_Menu_ *, void *) {
initTHROB4();
}
void initTHROBX1()
{
clearStatus();
if (!throbx1_modem)
throbx1_modem = new throb(MODE_THROBX1);
startup_modem (throbx1_modem);
progStatus.saveModeState(MODE_THROBX1);
}
void cb_mnuTHROBX1(Fl_Menu_ *, void *) {
initTHROBX1();
}
void initTHROBX2()
{
clearStatus();
if (!throbx2_modem)
throbx2_modem = new throb(MODE_THROBX2);
startup_modem (throbx2_modem);
progStatus.saveModeState(MODE_THROBX2);
}
void cb_mnuTHROBX2(Fl_Menu_ *, void *) {
initTHROBX2();
}
void initTHROBX4()
{
clearStatus();
if (!throbx4_modem)
throbx4_modem = new throb(MODE_THROBX4);
startup_modem (throbx4_modem);
progStatus.saveModeState(MODE_THROBX4);
}
void cb_mnuTHROBX4(Fl_Menu_ *, void *) {
initTHROBX4();
}
void initWWV()
{
clearStatus();
if (!wwv_modem)
wwv_modem = new wwv();
startup_modem (wwv_modem);
progStatus.saveModeState(MODE_WWV);
}
void cb_mnuWWV(Fl_Menu_ *, void *) {
initWWV();
}
void initANALYSIS()
{
clearStatus();
if (!anal_modem)
anal_modem = new anal();
startup_modem (anal_modem);
progStatus.saveModeState(MODE_ANALYSIS);
}
void cb_mnuANALYSIS(Fl_Menu_ *, void *) {
initANALYSIS();
}
void restoreFocus()
{
Fl::lock();
Fl::focus(TransmitText);
TransmitText->cursorON();
TransmitText->redraw();
Fl::unlock();
Fl::awake();
}
void macro_cb(Fl_Widget *w, void *v)
{
int b = (int)(reinterpret_cast<long> (v));
b += (altMacros ? 10 : 0);
int mouse = Fl::event_button();
if (mouse == 1 && !macros.text[b].empty())
macros.execute(b);
else if (mouse == 3)
editMacro(b);
restoreFocus();
}
void altmacro_cb(Fl_Widget *w, void *v)
{
altMacros = !altMacros;
Fl::lock();
for (int i = 0; i < 10; i++)
btnMacro[i]->label(macros.name[i + (altMacros ? 10: 0)].c_str());
Fl::unlock();
restoreFocus();
}
void cb_mnuConfigOperator(Fl_Menu_*, void*) {
progdefaults.loadDefaults();
tabsConfigure->value(tabOperator);
dlgConfig->show();
}
void cb_mnuConfigWaterfall(Fl_Menu_*, void*) {
progdefaults.loadDefaults();
tabsConfigure->value(tabWaterfall);
dlgConfig->show();
}
void cb_mnuConfigInterface(Fl_Menu_*, void*) {
progdefaults.loadDefaults();
tabsConfigure->value(tabInterface);
dlgConfig->show();
}
void cb_mnuConfigSoundCard(Fl_Menu_*, void*) {
progdefaults.loadDefaults();
tabsConfigure->value(tabSoundCard);
dlgConfig->show();
}
void cb_mnuConfigModems(Fl_Menu_*, void*) {
progdefaults.loadDefaults();
tabsConfigure->value(tabModems);
dlgConfig->show();
}
bool capval = false;
void cb_mnuCapture(Fl_Menu_ *m, void *d)
{
if (!scard) return;
capval = !capval;
scard->Capture(capval);
}
bool genval = false;
void cb_mnuGenerate(Fl_Menu_ *m, void *d)
{
if (!scard) return;
genval = !genval;
scard->Generate(genval);
}
bool playval = false;
void cb_mnuPlayback(Fl_Menu_ *m, void *d)
{
if (!scard) return;
playval = !playval;
scard->Playback(playval);
}
void cb_FontBrowser(Font_Browser*, void* v)
{
Font_Browser *ft= (Font_Browser*)v;
Fl_Font fnt = ft->fontNumber();
int size = ft->fontSize();
ReceiveText->setFont(fnt);
ReceiveText->setFontSize(size);
TransmitText->setFont(fnt);
TransmitText->setFontSize(size);
progdefaults.Fontnbr = (int)(fnt);
progdefaults.FontSize = size;
// progdefaults.FontColor = (int)clr;
ft->hide();
}
void cb_mnuConfigFonts(Fl_Menu_*, void *) {
static Font_Browser *b = (Font_Browser *)0;
if (!b) {
b = new Font_Browser;
b->fontNumber((Fl_Font)progdefaults.Fontnbr);
b->fontSize(progdefaults.FontSize);
// b->fontColor(progdefaults.FontColor);
}
b->callback((Fl_Callback*)cb_FontBrowser, (void*)(b));
b->show();
}
void cb_mnuSaveConfig(Fl_Menu_ *, void *) {
progdefaults.saveDefaults();
restoreFocus();
}
//void cb_mnuHelp(Fl_Menu_*,void*) {
// show_help();
// restoreFocus();
//}
void cb_mnuAbout(Fl_Menu_*,void*) {
fl_message ("fldigi @@W1HKJ\n\nw1hkj@@w1hkj.com\n\nVersion - %s", FLDIGI_VERSION);
restoreFocus();
}
void cbTune(Fl_Widget *w, void *) {
Fl_Button *b = (Fl_Button *)w;
if (active_modem == wwv_modem || active_modem == anal_modem) {
b->value(0);
return;
}
if (b->value() == 1) {
b->labelcolor(FL_RED);
fl_lock(&trx_mutex);
trx_state = STATE_TUNE;
fl_unlock(&trx_mutex);
} else {
b->labelcolor(FL_BLACK);
fl_lock(&trx_mutex);
trx_state = STATE_RX;
fl_unlock(&trx_mutex);
}
restoreFocus();
}
void cb_mnuRig(Fl_Menu_ *, void *) {
if (!rigcontrol)
createRigDialog();
rigcontrol->show();
}
void closeRigDialog() {
rigcontrol->hide();
}
double sldrSquelchValue;
void cb_sldrSquelch(Fl_Slider* o, void*) {
active_modem->set_squelch(o->value());
sldrSquelchValue = o->value();
restoreFocus();
}
char *zuluTime()
{
struct tm *tm;
time_t t;
static char logtime[10];
time(&t);
tm = gmtime(&t);
strftime(logtime, sizeof(logtime), "%H%M", tm);
return logtime;
}
void qsoTime_cb(Fl_Widget *b, void *)
{
Fl::lock();
inpTime->value(zuluTime());
Fl::unlock();
Fl::awake();
restoreFocus();
}
void clearQSO()
{
Fl::lock();
inpTime->value(zuluTime());
inpCall->value("");
inpName->value("");
inpRstIn->value("");
inpRstOut->value("");
inpQth->value("");
inpLoc->value("");
inpAZ->value(""); // WA5ZNU
inpNotes->value("");
Fl::unlock();
}
void qsoClear_cb(Fl_Widget *b, void *)
{
clearQSO();
Fl::awake();
restoreFocus();
}
void qsoSave_cb(Fl_Widget *b, void *)
{
submit_log();
restoreFocus();
}
void cb_QRZ(Fl_Widget *b, void *)
{
QRZquery();
}
void status_cb(Fl_Widget *b, void *)
{
progdefaults.loadDefaults();
tabsConfigure->value(tabModems);
switch (active_modem->get_mode()) {
case MODE_CW : tabsModems->value(tabCW); break;
case MODE_OLIVIA : tabsModems->value(tabOlivia); break;
case MODE_RTTY: tabsModems->value(tabRTTY); break;
case MODE_FELDHELL :
case MODE_FSKHELL :
case MODE_FSKH105 : tabsModems->value(tabFeld); break;
case MODE_DOMINOEX4 :
case MODE_DOMINOEX5 :
case MODE_DOMINOEX8 :
case MODE_DOMINOEX11 :
case MODE_DOMINOEX16 :
case MODE_DOMINOEX22 : tabsModems->value(tabDomEX); break;
case MODE_BPSK31 :
case MODE_QPSK31 :
case MODE_PSK63 :
case MODE_QPSK63 :
case MODE_PSK125 :
case MODE_QPSK125 :
case MODE_MFSK16:
case MODE_MFSK8:
case MODE_THROB1 :
case MODE_THROB2 :
case MODE_THROB4 :
case MODE_THROBX1 :
case MODE_THROBX2 :
case MODE_THROBX4 :
default :
tabsModems->value(tabCW);
}
dlgConfig->show();
}
void cb_cboBand(Fl_Widget *w, void *d)
{
Fl_ComboBox *cbBox = (Fl_ComboBox *) w;
wf->rfcarrier(atoi(cbBox->value())*1000L);
}
void afconoff_cb(Fl_Widget *w, void *vi)
{
Fl::lock();
Fl_Light_Button *b = (Fl_Light_Button *)w;
int v = b->value();
Fl::unlock();
active_modem->set_afcOnOff( v ? true : false );
}
void sqlonoff_cb(Fl_Widget *w, void *vi)
{
Fl::lock();
Fl_Light_Button *b = (Fl_Light_Button *)w;
int v = b->value();
Fl::unlock();
active_modem->set_sqlchOnOff( v ? true : false );
}
void cb_btnSideband(Fl_Widget *w, void *d)
{
Fl_Button *b = (Fl_Button *)w;
Fl::lock();
progdefaults.btnusb = !progdefaults.btnusb;
if (progdefaults.btnusb) {
b->label("U");
wf->USB(true);
} else {
b->label("L");
wf->USB(false);
}
b->redraw();
Fl::unlock();
}
void cbMacroTimerButton(Fl_Widget *w, void *d)
{
Fl_Button *b = (Fl_Button *)w;
progdefaults.useTimer = false;
Fl::lock();
b->hide();
Fl::unlock();
restoreFocus();
}
void cb_RcvMixer(Fl_Widget *w, void *d)
{
progdefaults.RcvMixer = valRcvMixer->value();
mixer.setRcvGain(progdefaults.RcvMixer);
}
void cb_XmtMixer(Fl_Widget *w, void *d)
{
progdefaults.XmtMixer = valXmtMixer->value();
mixer.setXmtLevel(progdefaults.XmtMixer);
}
// XPM Calendar Label
static const char *cal_16[] = {
// width height num_colors chars_per_pixel
" 15 14 3 1",
// colors
". c #000000",
"d c none",
"e c #ffffff",
// pixels
"ddddddddddddddd",
"d.............d",
"d.eeeeeeeeeee.d",
"d.............d",
"d.e.e.e.e.e.e.d",
"d.............d",
"d.e.e.e.e.e.e.d",
"d.............d",
"d.e.e.e.e.e.e.d",
"d.............d",
"d.e.e.e.e.e.e.d",
"d.............d",
"d.e.e.e.e.e.e.d",
"ddddddddddddddd",
};
Fl_Menu_Item menu_[] = {
{"&Files", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 0
{"Open Macros", 0, (Fl_Callback*)cb_mnuOpenMacro, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 1
{"Save Macros", 0, (Fl_Callback*)cb_mnuSaveMacro, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, // 2
{"Log File", 0, (Fl_Callback*)cb_mnuLogFile, 0, FL_MENU_DIVIDER | FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, // 3
{"E&xit", 0, (Fl_Callback*)cb_E, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 4
{0,0,0,0,0,0,0,0,0}, // 5
{"Op &Mode", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 6
{"CW", 0, (Fl_Callback*)cb_mnuCW, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 7
{"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 8
{"dominoex 4", 0, (Fl_Callback*)cb_mnuDOMINOEX4, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 9
{"dominoex 5", 0, (Fl_Callback*)cb_mnuDOMINOEX5, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 10
{"dominoex 8", 0, (Fl_Callback*)cb_mnuDOMINOEX8, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 11
{"dominoex 11", 0, (Fl_Callback*)cb_mnuDOMINOEX11, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 12
{"dominoex 16", 0, (Fl_Callback*)cb_mnuDOMINOEX16, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 13
{"dominoex 22", 0, (Fl_Callback*)cb_mnuDOMINOEX22, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 14
{0,0,0,0,0,0,0,0,0}, // 15
{"Hell", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 16
{"Feld-Hell", 0, (Fl_Callback*)cb_mnuFELDHELL, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 17
{"FSK-Hell", 0, (Fl_Callback*)cb_mnuFSKHELL, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 18
{"FSK-Hell-105", 0, (Fl_Callback*)cb_mnuFSKHELL105, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 19
{0,0,0,0,0,0,0,0,0}, // 20
{"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 21
{"mfsk 8", 0, (Fl_Callback*)cb_mnuMFSK8, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 22
{"mfsk 16", 0, (Fl_Callback*)cb_mnuMFSK16, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 23
{0,0,0,0,0,0,0,0,0}, // 24
{"Psk", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 25
{"psk 31", 0, (Fl_Callback*)cb_mnuPSK31, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 26
{"qpsk 31", 0, (Fl_Callback*)cb_mnuQPSK31, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 27
{"psk 63", 0, (Fl_Callback*)cb_mnuPSK63, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 28
{"qpsk 63", 0, (Fl_Callback*)cb_mnuQPSK63, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 29
{"psk 125", 0, (Fl_Callback*)cb_mnuPSK125, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 30
{"qpsk 125", 0, (Fl_Callback*)cb_mnuQPSK125, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 31
{"psk 250", 0, (Fl_Callback*)cb_mnuPSK250, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 32
{"qpsk 250", 0, (Fl_Callback*)cb_mnuQPSK250, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 33
{0,0,0,0,0,0,0,0,0}, // 34
{"Olivia", 0, (Fl_Callback*)cb_mnuOlivia, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 35
{"rtty", 0, (Fl_Callback*)cb_mnuRTTY, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 36
{"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 37
{"Throb 1", 0, (Fl_Callback*)cb_mnuTHROB1, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 38
{"Throb 2", 0, (Fl_Callback*)cb_mnuTHROB2, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 39
{"Throb 4", 0, (Fl_Callback*)cb_mnuTHROB4, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 40
{"ThrobX 1", 0, (Fl_Callback*)cb_mnuTHROBX1, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 41
{"ThrobX 2", 0, (Fl_Callback*)cb_mnuTHROBX2, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 42
{"ThrobX 4", 0, (Fl_Callback*)cb_mnuTHROBX4, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 43
{0,0,0,0,0,0,0,0,0}, // 44
{"WWV", 0, (Fl_Callback*)cb_mnuWWV, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 45
{"Freq Analysis", 0, (Fl_Callback*)cb_mnuANALYSIS, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 46
{0,0,0,0,0,0,0,0,0}, // 47
{"Configure", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 48
{"Defaults", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 49
{"Fonts", 0, (Fl_Callback*)cb_mnuConfigFonts, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 50
{"Interface", 0, (Fl_Callback*)cb_mnuConfigInterface, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 51
{"Operator", 0, (Fl_Callback*)cb_mnuConfigOperator, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 52
{"Sound Card", 0, (Fl_Callback*)cb_mnuConfigSoundCard, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 53
{"Waterfall", 0, (Fl_Callback*)cb_mnuConfigWaterfall, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 54
{0,0,0,0,0,0,0,0,0}, // 55
{"Modems", 0, (Fl_Callback*)cb_mnuConfigModems, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 56
{"Save Config", 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 57
{0,0,0,0,0,0,0,0,0}, // 58
{" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, // 59
{"Rig", 0, (Fl_Callback*)cb_mnuRig, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 60
{" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, // 61
{"Wav", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 62
{"Rx capture", 0, (Fl_Callback*)cb_mnuCapture, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},//63
{"Tx generate", 0, (Fl_Callback*)cb_mnuGenerate, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},//64
{"Playback", 0, (Fl_Callback*)cb_mnuPlayback, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0},//65
{0,0,0,0,0,0,0,0,0}, // 66
{"Help", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, // 66
{"About", 0, (Fl_Callback*)cb_mnuAbout, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, // 67
{0,0,0,0,0,0,0,0,0}, // 68
{0,0,0,0,0,0,0,0,0}, // 69
};
Fl_Menu_Bar *mnu;
void activate_rig_menu_item(bool b)
{
if (b) {
bSaveFreqList = true;
menu_[60].activate();
} else {
menu_[60].deactivate();
if (rigcontrol)
rigcontrol->hide();
}
mnu->redraw();
}
void activate_test_menu_item(bool b)
{
if (b)
menu_[60].show();
else
menu_[60].hide();
mnu->redraw();
}
void create_fl_digi_main() {
int Y = 0;
fl_digi_main = new Fl_Double_Window(WNOM, HNOM, "fldigi");
mnu = new Fl_Menu_Bar(0, 0, WNOM - 142, Hmenu);
mnu->menu(menu_);
#ifndef USE250
menu_[32].hide();
menu_[33].hide();
#endif
btnTune = new Fl_Button(WNOM - 142, 0, 60, Hmenu, "TUNE");
btnTune->type(FL_TOGGLE_BUTTON);
btnTune->callback(cbTune, 0);
btnMacroTimer = new Fl_Button(WNOM - 82, 0, 80, Hmenu);
btnMacroTimer->color(fl_rgb_color(255, 255, 100));
btnMacroTimer->labelcolor(FL_RED);
btnMacroTimer->callback(cbMacroTimerButton, 0);
btnMacroTimer->hide();
Fl_Box *bx = new Fl_Box(WNOM - 82, 0, 80, Hmenu,"");
bx->box(FL_UP_BOX);
Y += Hmenu;
Fl_Group *qsoFrame = new Fl_Group(0,Y, WNOM, Hqsoframe);
inpFreq = new Fl_Input(2,Y + Hqsoframe/2 - 2, 85, Hqsoframe/2,"Freq: ");
inpFreq->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpTime = new Fl_Input(89,Y + Hqsoframe/2 - 2, 45, Hqsoframe/2,"Time: ");
inpTime->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
qsoTime = new Fl_Button(136, Y + Hqsoframe/2 - 2, 24, Hqsoframe/2);
Fl_Image *pixmap = new Fl_Pixmap(cal_16);
qsoTime->image(pixmap);
qsoTime->callback(qsoTime_cb, 0);
inpCall = new Fl_Input(162,Y + Hqsoframe/2 - 2, 80,Hqsoframe/2,"Call: ");
inpCall->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpName = new Fl_Input(244,Y + Hqsoframe/2 - 2, 100,Hqsoframe/2,"Name: ");
inpName->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpRstIn = new Fl_Input(346,Y + Hqsoframe/2 - 2, 40,Hqsoframe/2,"Rst(r): ");
inpRstIn->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpRstOut = new Fl_Input(388,Y + Hqsoframe/2 - 2, 40,Hqsoframe/2,"Rst(s): ");
inpRstOut->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpQth = new Fl_Input(430,Y + Hqsoframe/2 - 2, WNOM - 430 - 126,Hqsoframe/2,"Qth: ");
inpQth->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
inpLoc = new Fl_Input(WNOM - 124,Y + Hqsoframe/2 - 2, 80,Hqsoframe/2,"Loc: ");
inpLoc->align(FL_ALIGN_TOP | FL_ALIGN_LEFT);
qsoClear = new Fl_Button(WNOM - 42, Y + Hqsoframe/2 + 1, 40, Hqsoframe/2 - 2, "Clear");
qsoClear->callback(qsoClear_cb, 0);
btnQRZ = new Fl_Button( WNOM - 42, Y + 1, 40, Hqsoframe/2 - 2, "QRZ");
btnQRZ->callback(cb_QRZ, 0);
qsoFrame->resizable(inpQth);
qsoFrame->end();
Y += Hqsoframe;
Fl_Group *qsoFrame2 = new Fl_Group(0,Y, WNOM, Hnotes);
inpNotes = new Fl_Input(136, Y, WNOM - 136 - 44 - 120, Hnotes,"Notes: ");
inpNotes->align(FL_ALIGN_LEFT);
cboBand = new Fl_ComboBox(2, Y, 110, Hnotes, "");
cboBand->hide();
btnSideband = new Fl_Button(112, Y+1, Hnotes-2, Hnotes-2, "U");
btnSideband->callback(cb_btnSideband, 0);
btnSideband->hide();
inpAZ = new Fl_Input(WNOM - 44 - 80, Y, 80, Hnotes, "AZ:"); // WA5ZNU
inpAZ->align(FL_ALIGN_LEFT);
qsoSave = new Fl_Button(WNOM - 42, Y + 1, 40, Hnotes- 2, "Save");
qsoSave->callback(qsoSave_cb, 0);
qsoFrame2->resizable(inpNotes);
qsoFrame2->end();
Y += Hnotes;
int sw = 15;
Fl_Group *MixerFrame = new Fl_Group(0,Y,sw, Hrcvtxt + Hxmttxt);
valRcvMixer = new Fl_Slider(0, Y, sw, (Htext)/2, "");
valRcvMixer->type(FL_VERT_NICE_SLIDER);
valRcvMixer->color(fl_rgb_color(0,110,30));
valRcvMixer->labeltype(FL_ENGRAVED_LABEL);
valRcvMixer->selection_color(fl_rgb_color(255,255,0));
valRcvMixer->range(1.0,0.0);
valRcvMixer->callback( (Fl_Callback *)cb_RcvMixer);
valXmtMixer = new Fl_Slider(0, Y + (Htext)/2, sw, (Htext)/2, "");
valXmtMixer->type(FL_VERT_NICE_SLIDER);
valXmtMixer->color(fl_rgb_color(110,0,30));
valXmtMixer->labeltype(FL_ENGRAVED_LABEL);
valXmtMixer->selection_color(fl_rgb_color(255,255,0));
valXmtMixer->range(1.0,0.0);
valXmtMixer->callback( (Fl_Callback *)cb_XmtMixer);
valRcvMixer->deactivate();
valXmtMixer->deactivate();
MixerFrame->end();
Fl_Tile *TiledGroup = new Fl_Tile(sw, Y, WNOM-sw, Htext);
int minRxHeight = Hrcvtxt;
int minTxHeight;
if (minRxHeight < 66) minRxHeight = 66;
minTxHeight = Htext - minRxHeight;
Fl_Box *minbox = new Fl_Box(sw,Y + 66, WNOM-sw, Htext - 66 - 32);
minbox->hide();
ReceiveText = new TextView(sw, Y, WNOM-sw, minRxHeight, "");
FHdisp = new Raster(sw, Y, WNOM-sw, minRxHeight);
FHdisp->hide();
Y += minRxHeight;
TransmitText = new TextEdit(sw, Y, WNOM-sw, minTxHeight);
Y += minTxHeight;
TiledGroup->resizable(minbox);
TiledGroup->end();
Fl_Group::current()->resizable(TiledGroup);
Fl_Box *macroFrame = new Fl_Box(0, Y, WNOM, Hmacros);
macroFrame->box(FL_ENGRAVED_FRAME);
int Wbtn = (WNOM - 30 - 8 - 4)/10;
int xpos = 2;
for (int i = 0; i < 10; i++) {
if (i == 4 || i == 8) {
bx = new Fl_Box(xpos, Y+2, 5, Hmacros - 4);
bx->box(FL_FLAT_BOX);
bx->color(FL_BLACK);
xpos += 4;
}
btnMacro[i] = new Fl_Button(xpos, Y+2, Wbtn, Hmacros - 4);
btnMacro[i]->callback(macro_cb, (void *)i);
btnMacro[i]->label( (macros.name[i]).c_str());
xpos += Wbtn;
}
bx = new Fl_Box(xpos, Y+2, WNOM - 32 - xpos, Hmacros - 4);
bx->box(FL_FLAT_BOX);
bx->color(FL_BLACK);
btnAltMacros = new Fl_Button(WNOM-32, Y+2, 30, Hmacros - 4, "Alt");
btnAltMacros->callback(altmacro_cb, 0);
Y += Hmacros;
Fl_Pack *wfpack = new Fl_Pack(0, Y, WNOM, Hwfall);
wfpack->type(1);
wf = new waterfall(0, Y, Wwfall, Hwfall);
wf->end();
Fl_Pack *ypack = new Fl_Pack(WNOM-(Hwfall-24), Y, Hwfall-24, Hwfall);
ypack->type(0);
digiscope = new Digiscope (WNOM-(Hwfall-24), Y, Hwfall-24, Hwfall-24);
pgrsSquelch = new Fl_Progress(
WNOM-(Hwfall-24), Y + Hwfall - 24,
Hwfall - 24, 12, "");
pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN);
sldrSquelch = new Fl_Slider(
FL_HOR_NICE_SLIDER,
WNOM-(Hwfall-24), Y + Hwfall - 12,
Hwfall - 24, 12, "");
sldrSquelch->minimum(0);
sldrSquelch->maximum(100);
sldrSquelch->step(1);
sldrSquelch->value(20);
sldrSquelchValue = 20.0;
sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch);
sldrSquelch->color(FL_INACTIVE_COLOR);
ypack->end();
Fl_Group::current()->resizable(wf);
wfpack->end();
Y += (Hwfall + 2);
Fl_Pack *hpack = new Fl_Pack(0, Y, WNOM, Hstatus);
hpack->type(1);
MODEstatus = new Fl_Button(0,Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wmode, Hstatus, "");
MODEstatus->box(FL_DOWN_BOX);
MODEstatus->color(FL_BACKGROUND2_COLOR);
MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
MODEstatus->callback(status_cb, (void *)0);
MODEstatus->tooltip("Open Modem Tab");
S2Nstatus = new Fl_Box(Wmode,Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Ws2n, Hstatus, "");
S2Nstatus->box(FL_DOWN_BOX);
S2Nstatus->color(FL_BACKGROUND2_COLOR);
S2Nstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
IMDstatus = new Fl_Box(Wmode+Ws2n, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wimd, Hstatus, "");
IMDstatus->box(FL_DOWN_BOX);
IMDstatus->color(FL_BACKGROUND2_COLOR);
IMDstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
StatusBar = new Fl_Box(
Wmode+Wimd+Ws2n, Hmenu+Hrcvtxt+Hxmttxt+Hwfall, Wstatus, Hstatus, "");
StatusBar->box(FL_DOWN_BOX);
StatusBar->color(FL_BACKGROUND2_COLOR);
StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
WARNstatus = new Fl_Box(
Wmode+Wimd+Ws2n+Wstatus, Hmenu+Hrcvtxt+Hxmttxt+Hwfall,
Wwarn, Hstatus, "");
WARNstatus->box(FL_DIAMOND_DOWN_BOX);
WARNstatus->color(FL_BACKGROUND_COLOR);
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->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();
fl_digi_main->size_range(WNOM, HNOM);
fl_digi_main->end();
fl_digi_main->callback(cb_wMain);
}
void put_freq(double frequency)
{
wf->carrier((int)floor(frequency + 0.5));
}
void put_Bandwidth(int bandwidth)
{
wf->Bandwidth ((int)bandwidth);
}
void display_metric(double metric)
{
Fl::lock();
pgrsSquelch->value(metric);
Fl::unlock();
Fl::awake();
}
void put_cwRcvWPM(double wpm)
{
// if (!prgsCWrcvWPM) return;
int U = progdefaults.CWupperlimit;
int L = progdefaults.CWlowerlimit;
double dWPM = 100.0*(wpm - L)/(U - L);
Fl::lock();
prgsCWrcvWPM->value(dWPM);
valCWrcvWPM->value((int)wpm);
Fl::unlock();
Fl::awake();
}
void set_scope(double *data, int len, bool autoscale)
{
if (digiscope)
digiscope->data(data, len, autoscale);
}
void set_phase(double phase, bool highlight)
{
if (digiscope)
digiscope->phase(phase, highlight);
}
void set_rtty(double flo, double fhi, double amp)
{
if (digiscope)
digiscope->rtty(flo, fhi, amp);
}
void set_video(double *data, int len)
{
if (digiscope)
digiscope->video(data, len);
}
void put_rx_char(unsigned int data)
{
static bool nulinepending = false;
const char **asc = ascii;
rxmsgid = msgget( (key_t) 9876, 0666);
if (mailclient || mailserver || rxmsgid != -1)
asc = ascii2;
if (data == '\r') {
ReceiveText->add(asc['\n' & 0x7F],1);
nulinepending = true;
} else if (nulinepending && data == '\r') {
ReceiveText->add(asc['\n' & 0x7F],1);
} else if (nulinepending && data == '\n') {
nulinepending = false;
} else if (nulinepending && data != '\n') {
ReceiveText->add(asc[data & 0x7F], 1);
nulinepending = false;
} else {
ReceiveText->add(asc[data & 0x7F],1);
}
if ( rxmsgid != -1) {
rxmsgst.msg_type = 1;
rxmsgst.c = data & 0x7F;
msgsnd (rxmsgid, (void *)&rxmsgst, 1, IPC_NOWAIT);
}
if (Maillogfile)
Maillogfile->log_to_file(cLogfile::LOG_RX, asc[data & 0x7F]);
if (logging)
logfile->log_to_file(cLogfile::LOG_RX, asc[data & 0x7F]);
}
string strSecText = "";
void put_sec_char( char chr )
{
if (chr >= ' ' && chr <= 'z') {
strSecText.append(1, chr);
if (strSecText.length() > 60)
strSecText.erase(0,1);
Fl::lock();
StatusBar->label(strSecText.c_str());
Fl::unlock();
Fl::awake();
}
}
void put_status(const char *msg)
{
if (!msg) return;
Fl::lock();
StatusBar->label(msg);
Fl::unlock();
Fl::awake();
}
void put_IMDstatus(char *msg)
{
if (!msg) return;
if (strlen(msg) > 60) msg[60] = 0;
Fl::lock();
IMDstatus->label(msg);
Fl::unlock();
Fl::awake();
}
void put_S2Nstatus(char *msg)
{
if (!msg) return;
if (strlen(msg) > 60) msg[60] = 0;
Fl::lock();
S2Nstatus->label(msg);
Fl::unlock();
Fl::awake();
}
void put_WARNstatus(double val)
{
Fl::lock();
if (val < 0.05)
WARNstatus->color(FL_BLACK);
if (val > 0.05)
WARNstatus->color(FL_DARK_GREEN);
if (val > 0.9)
WARNstatus->color(FL_YELLOW);
if (val > 0.98)
WARNstatus->color(FL_DARK_RED);
WARNstatus->redraw();
Fl::unlock();
}
void set_CWwpm()
{
Fl::lock();
sldrCWxmtWPM->value(progdefaults.CWspeed);
Fl::unlock();
}
void clear_StatusMessages()
{
Fl::lock();
StatusBar->label("");
S2Nstatus->label("");
IMDstatus->label("");
Fl::unlock();
Fl::awake();
}
void put_MODEstatus(trx_mode mode)
{
Fl::lock();
MODEstatus->label(mode_names[mode]);
Fl::unlock();
Fl::awake();
}
void put_rx_data(int *data, int len)
{
FHdisp->data(data, len);
}
char get_tx_char(void)
{
char chr;
static bool lfpending = false;
static bool ctlpending = false;
if (pskmail_text_available == true)
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;
TransmitText->clear();
break;
case '^' :
ctlpending = false;
break;
default :
ctlpending = false;
chr = 0x00;
}
return chr;
}
if (chr == '^') {
ctlpending = true;
chr = 0x00;
}
return chr;
}
void put_echo_char(unsigned int data)
{
static bool nulinepending = false;
const char **asc = ascii;
if (mailclient || mailserver || arqmode)
asc = ascii2;
if (data == '\r' && nulinepending) // reject multiple CRs
return;
if (data == '\r') nulinepending = true;
if (nulinepending && data == '\n') {
nulinepending = false;
}
ReceiveText->add(asc[data & 0x7F], 4);
if (Maillogfile)
Maillogfile->log_to_file(cLogfile::LOG_TX, asc[data & 0x7F]);
if (logging)
logfile->log_to_file(cLogfile::LOG_TX, asc[data & 0x7F]);
}
void resetRTTY() {
if (active_modem->get_mode() != MODE_RTTY) return;
trx_reset(scDevice.c_str());
active_modem->restart();
}
void resetOLIVIA() {
if (active_modem->get_mode() != MODE_OLIVIA) return;
trx_reset(scDevice.c_str());
active_modem->restart();
}
void resetDOMEX() {
trx_mode md = active_modem->get_mode();
if (md == MODE_DOMINOEX4 ||
md == MODE_DOMINOEX5 ||
md == MODE_DOMINOEX8 ||
md == MODE_DOMINOEX11 ||
md == MODE_DOMINOEX16 ||
md == MODE_DOMINOEX22 ) {
trx_reset(scDevice.c_str());
active_modem->restart();
}
}
void enableMixer(bool on)
{
Fl::lock();
if (on) {
progdefaults.EnableMixer = true;
mixer.openMixer(progdefaults.MXdevice.c_str());
mixer.PCMVolume(progdefaults.PCMvolume/100.0);
mixer.setXmtLevel(valXmtMixer->value());
mixer.setRcvGain(valRcvMixer->value());
if (progdefaults.LineIn == true)
setMixerInput(1);
else if (progdefaults.MicIn == true)
setMixerInput(2);
else
setMixerInput(0);
}else{
progdefaults.EnableMixer = false;
mixer.closeMixer();
}
resetMixerControls();
Fl::unlock();
}
void resetMixerControls()
{
if (progdefaults.EnableMixer) {
valRcvMixer->activate();
valXmtMixer->activate();
menuMix->activate();
btnLineIn->activate();
btnMicIn->activate();
btnMixer->value(1);
valPCMvolume->activate();
}
else {
valRcvMixer->deactivate();
valXmtMixer->deactivate();
menuMix->deactivate();
btnLineIn->deactivate();
btnMicIn->deactivate();
btnMixer->value(0);
valPCMvolume->deactivate();
}
}
void setPCMvolume(double vol)
{
mixer.PCMVolume(vol/100.0);
progdefaults.PCMvolume = vol;
}
void setMixerInput(int dev)
{
int n= -1;
switch (dev) {
case 0: n = mixer.InputSourceNbr("Vol");
break;
case 1: n = mixer.InputSourceNbr("Line");
break;
case 2: n = mixer.InputSourceNbr("Mic");
break;
default: n = mixer.InputSourceNbr("Vol");
}
if (n != -1)
mixer.SetCurrentInputSource(n);
}
void resetSoundCard()
{
bool mixer_enabled = progdefaults.EnableMixer;
enableMixer(false);
trx_reset(scDevice.c_str());
progdefaults.SCdevice = scDevice;
if (mixer_enabled)
enableMixer(true);
}
void setReverse(int rev) {
active_modem->set_reverse(rev);
}
void setAfcOnOff(bool b) {
Fl::lock();
afconoff->value(b);
Fl::unlock();
Fl::awake();
}
void setSqlOnOff(bool b) {
Fl::lock();
sqlonoff->value(b);
Fl::unlock();
Fl::awake();
}
bool QueryAfcOnOff() {
Fl::lock();
int v = afconoff->value();
Fl::unlock();
return v;
}
bool QuerySqlOnOff() {
Fl::lock();
int v = sqlonoff->value();
Fl::unlock();
return v;
}