Merge with upstream

pull/2/head
Stelios Bounanos 2008-05-17 04:27:12 +01:00
commit 1232776ed2
20 zmienionych plików z 974 dodań i 642 usunięć

5
README
Wyświetl plik

@ -2,16 +2,17 @@ Fldigi is a software modem for Amateur Radio use. It is a sound card based
program that is used for both transmitting and receiving data in any of the program that is used for both transmitting and receiving data in any of the
following modes: following modes:
BPSK and QPSK 31, 63, 125, and 250
CW speeds from 5 to 200 wpm CW speeds from 5 to 200 wpm
DEX 4, 5, 8, 11, 16 and 22 DEX 4, 5, 8, 11, 16 and 22
DominoEX 4, 5, 8, 11, 16 and 22 DominoEX 4, 5, 8, 11, 16 and 22
Hellschreiber Feld Hell, Slow Hell, Hell x5/x9, FSKHell(-105) and Hell 80 Hellschreiber Feld Hell, Slow Hell, Hell x5/x9, FSKHell(-105) and Hell 80
MFSK 8 and 16; images can be sent and received in MFSK-16 mode MFSK 8 and 16; images can be sent and received in MFSK-16 mode
MT63 500, 1000 and 2000 MT63 500, 1000 and 2000
BPSK and QPSK 31, 63, 125, and 250
Throb and ThrobX 1, 2, and 4
OLIVIA various tones and bandwidths OLIVIA various tones and bandwidths
RTTY various baud rates, shifts, nbr. of data bits, etc. RTTY various baud rates, shifts, nbr. of data bits, etc.
THOR 4, 5, 8, 11, 16 and 22
Throb and ThrobX 1, 2, and 4
WWV receive only - calibrate your sound card to WWV WWV receive only - calibrate your sound card to WWV
Frequency Analysis receive only - measure the frequency of a carrier Frequency Analysis receive only - measure the frequency of a carrier

Wyświetl plik

@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may
dnl contain other characters or be empty dnl contain other characters or be empty
m4_define(FLDIGI_MAJOR, [2]) m4_define(FLDIGI_MAJOR, [2])
m4_define(FLDIGI_MINOR, [11]) m4_define(FLDIGI_MINOR, [11])
m4_define(FLDIGI_PATCH, [AG]) m4_define(FLDIGI_PATCH, [AH])
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com]) AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])

Wyświetl plik

@ -120,8 +120,8 @@ fldigi_SOURCES += \
dialogs/fl_digi.cxx \ dialogs/fl_digi.cxx \
dialogs/font_browser.cxx \ dialogs/font_browser.cxx \
dialogs/Viewer.cxx \ dialogs/Viewer.cxx \
dex/dex.cxx \ thor/thor.cxx \
dex/dexvaricode.cxx \ thor/thorvaricode.cxx \
dominoex/dominoex.cxx \ dominoex/dominoex.cxx \
dominoex/dominovar.cxx \ dominoex/dominovar.cxx \
feld/feld.cxx \ feld/feld.cxx \
@ -153,8 +153,8 @@ fldigi_SOURCES += \
include/configuration.h \ include/configuration.h \
include/cw.h \ include/cw.h \
include/digiscope.h \ include/digiscope.h \
include/dex.h \ include/thor.h \
include/dexvaricode.h \ include/thorvaricode.h \
include/dominoex.h \ include/dominoex.h \
include/dominovar.h \ include/dominovar.h \
include/feld.h \ include/feld.h \

Wyświetl plik

@ -284,6 +284,17 @@ static void cb_sldrVideowidth(Fl_Value_Slider* o, void*) {
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *chkID_SMALL=(Fl_Check_Button *)0;
static void cb_chkID_SMALL(Fl_Check_Button* o, void*) {
progdefaults.ID_SMALL=o->value();
if (o->value() == 1)
sldrVideowidth->deactivate();
else
sldrVideowidth->activate();
progdefaults.changed = true;
}
Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0; Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0;
static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) { static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) {
@ -884,42 +895,42 @@ static void cb_cntPostTiming(Fl_Counter* o, void*) {
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Group *tabDEX=(Fl_Group *)0; Fl_Group *tabTHOR=(Fl_Group *)0;
Fl_Input *txtDEXSecondary=(Fl_Input *)0; Fl_Input *txtTHORSecondary=(Fl_Input *)0;
static void cb_txtDEXSecondary(Fl_Input* o, void*) { static void cb_txtTHORSecondary(Fl_Input* o, void*) {
progdefaults.DEXsecText = o->value(); progdefaults.THORsecText = o->value();
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Counter *valDEX_BW=(Fl_Counter *)0; Fl_Counter *valTHOR_BW=(Fl_Counter *)0;
static void cb_valDEX_BW(Fl_Counter* o, void*) { static void cb_valTHOR_BW(Fl_Counter* o, void*) {
progdefaults.DEX_BW = o->value(); progdefaults.THOR_BW = o->value();
resetDEX(); resetTHOR();
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *valDEX_FILTER=(Fl_Check_Button *)0; Fl_Check_Button *valTHOR_FILTER=(Fl_Check_Button *)0;
static void cb_valDEX_FILTER(Fl_Check_Button* o, void*) { static void cb_valTHOR_FILTER(Fl_Check_Button* o, void*) {
progdefaults.DEX_FILTER = o->value(); progdefaults.THOR_FILTER = o->value();
resetDEX(); resetTHOR();
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Counter *valDEX_PATHS=(Fl_Counter *)0; Fl_Counter *valTHOR_PATHS=(Fl_Counter *)0;
static void cb_valDEX_PATHS(Fl_Counter* o, void*) { static void cb_valTHOR_PATHS(Fl_Counter* o, void*) {
progdefaults.DEX_PATHS = (int)o->value(); progdefaults.THOR_PATHS = (int)o->value();
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *valDEX_SOFT=(Fl_Check_Button *)0; Fl_Check_Button *valTHOR_SOFT=(Fl_Check_Button *)0;
static void cb_valDEX_SOFT(Fl_Check_Button* o, void*) { static void cb_valTHOR_SOFT(Fl_Check_Button* o, void*) {
progdefaults.DEX_SOFT = o->value(); progdefaults.THOR_SOFT = o->value();
progdefaults.changed = true; progdefaults.changed = true;
} }
@ -979,46 +990,55 @@ static void cb_sldrHellBW(Fl_Value_Slider*, void*) {
Fl_Check_Button *btnHellXmtWidth=(Fl_Check_Button *)0; Fl_Check_Button *btnHellXmtWidth=(Fl_Check_Button *)0;
static void cb_btnHellXmtWidth(Fl_Check_Button*, void*) { static void cb_btnHellXmtWidth(Fl_Check_Button* o, void*) {
progdefaults.changed = true; progdefaults.HellXmtWidth=o->value();
progdefaults.changed = true;
} }
Fl_Check_Button *btnHellRcvWidth=(Fl_Check_Button *)0; Fl_Check_Button *btnHellRcvWidth=(Fl_Check_Button *)0;
static void cb_btnHellRcvWidth(Fl_Check_Button*, void*) { static void cb_btnHellRcvWidth(Fl_Check_Button* o, void*) {
progdefaults.changed = true; progdefaults.HellRcvWidth=o->value();
progdefaults.changed = true;
} }
Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0; Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0;
static void cb_btnBlackboard(Fl_Check_Button*, void*) { static void cb_btnBlackboard(Fl_Check_Button* o, void*) {
progdefaults.changed = true; progdefaults.HellBlackboard=o->value();
progdefaults.changed = true;
} }
Fl_Check_Button *btnHellFastAttack=(Fl_Check_Button *)0; Fl_Check_Button *btnHellFastAttack=(Fl_Check_Button *)0;
static void cb_btnHellFastAttack(Fl_Check_Button* o, void*) { static void cb_btnHellFastAttack(Fl_Check_Button* o, void*) {
if (o->value() == 1) if (o->value() == 1) {
btnHellSlowAttack->value(0); btnHellSlowAttack->value(0);
else progdefaults.HellPulseFast = true;
}else{
btnHellSlowAttack->value(1); btnHellSlowAttack->value(1);
progdefaults.HellPulseFast = false;
}
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *btnHellSlowAttack=(Fl_Check_Button *)0; Fl_Check_Button *btnHellSlowAttack=(Fl_Check_Button *)0;
static void cb_btnHellSlowAttack(Fl_Check_Button* o, void*) { static void cb_btnHellSlowAttack(Fl_Check_Button* o, void*) {
if (o->value() == 1) if (o->value() == 1) {
btnHellFastAttack->value(0); btnHellFastAttack->value(0);
else progdefaults.HellPulseFast = false;
}else{
btnHellFastAttack->value(1); btnHellFastAttack->value(1);
progdefaults.HellPulseFast = true;
}
progdefaults.changed = true; progdefaults.changed = true;
} }
Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0; Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0;
static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) { static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) {
progdefaults.FELD_IDLE=o->value(); progdefaults.HellXmtIdle=o->value();
progdefaults.changed = true; progdefaults.changed = true;
} }
@ -1514,26 +1534,25 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
{ tabVideo = new Fl_Group(0, 25, 400, 195, "Video"); { tabVideo = new Fl_Group(0, 25, 400, 195, "Video");
tabVideo->color((Fl_Color)51); tabVideo->color((Fl_Color)51);
tabVideo->selection_color((Fl_Color)51); tabVideo->selection_color((Fl_Color)51);
tabVideo->hide(); { Fl_Group* o = new Fl_Group(5, 40, 390, 77, "Video Preamble");
{ Fl_Group* o = new Fl_Group(5, 40, 390, 67, "Video Preamble");
o->box(FL_ENGRAVED_FRAME); o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
{ btnsendid = new Fl_Check_Button(11, 57, 115, 20, "Xmt Mode ID"); { btnsendid = new Fl_Check_Button(11, 57, 115, 20, "Xmt Mode ID");
btnsendid->down_box(FL_DOWN_BOX); btnsendid->down_box(FL_DOWN_BOX);
btnsendid->callback((Fl_Callback*)cb_btnsendid); btnsendid->callback((Fl_Callback*)cb_btnsendid);
} // Fl_Check_Button* btnsendid } // Fl_Check_Button* btnsendid
{ Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(11, 82, 115, 20, "Xmt Video Text"); { Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(11, 89, 115, 20, "Xmt Video Text");
btnsendvideotext->down_box(FL_DOWN_BOX); btnsendvideotext->down_box(FL_DOWN_BOX);
btnsendvideotext->callback((Fl_Callback*)cb_btnsendvideotext); btnsendvideotext->callback((Fl_Callback*)cb_btnsendvideotext);
o->value(progdefaults.sendtextid); o->value(progdefaults.sendtextid);
} // Fl_Check_Button* btnsendvideotext } // Fl_Check_Button* btnsendvideotext
{ Fl_Input* o = valVideotext = new Fl_Input(159, 82, 94, 20, "Video Text:"); { Fl_Input* o = valVideotext = new Fl_Input(159, 89, 120, 20, "Video Text:");
valVideotext->tooltip("Limit to a few characters as in CQEM or IOTA etc."); valVideotext->tooltip("Limit to a few characters as in CQEM or IOTA etc.");
valVideotext->callback((Fl_Callback*)cb_valVideotext); valVideotext->callback((Fl_Callback*)cb_valVideotext);
valVideotext->align(FL_ALIGN_TOP_LEFT); valVideotext->align(FL_ALIGN_TOP_LEFT);
o->value(progdefaults.strTextid.c_str()); o->value(progdefaults.strTextid.c_str());
} // Fl_Input* valVideotext } // Fl_Input* valVideotext
{ Fl_Value_Slider* o = sldrVideowidth = new Fl_Value_Slider(286, 82, 101, 20, "Video Width:"); { Fl_Value_Slider* o = sldrVideowidth = new Fl_Value_Slider(290, 89, 95, 20, "Video Width:");
sldrVideowidth->tooltip("Set the # of chars per row"); sldrVideowidth->tooltip("Set the # of chars per row");
sldrVideowidth->type(1); sldrVideowidth->type(1);
sldrVideowidth->color((Fl_Color)26); sldrVideowidth->color((Fl_Color)26);
@ -1545,23 +1564,30 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
sldrVideowidth->callback((Fl_Callback*)cb_sldrVideowidth); sldrVideowidth->callback((Fl_Callback*)cb_sldrVideowidth);
sldrVideowidth->align(FL_ALIGN_TOP); sldrVideowidth->align(FL_ALIGN_TOP);
o->value(progdefaults.videowidth); o->value(progdefaults.videowidth);
if (progdefaults.ID_SMALL) o->deactivate();
} // Fl_Value_Slider* sldrVideowidth } // Fl_Value_Slider* sldrVideowidth
{ Fl_Check_Button* o = chkID_SMALL = new Fl_Check_Button(290, 49, 100, 20, "small font");
chkID_SMALL->down_box(FL_DOWN_BOX);
chkID_SMALL->value(1);
chkID_SMALL->callback((Fl_Callback*)cb_chkID_SMALL);
o->value(progdefaults.ID_SMALL);
} // Fl_Check_Button* chkID_SMALL
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(11, 115, 135, 20, "View Xmt Signal"); { Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(11, 122, 135, 20, "View Xmt Signal");
btnViewXmtSignal->down_box(FL_DOWN_BOX); btnViewXmtSignal->down_box(FL_DOWN_BOX);
btnViewXmtSignal->callback((Fl_Callback*)cb_btnViewXmtSignal); btnViewXmtSignal->callback((Fl_Callback*)cb_btnViewXmtSignal);
o->value(progdefaults.viewXmtSignal); o->value(progdefaults.viewXmtSignal);
} // Fl_Check_Button* btnViewXmtSignal } // Fl_Check_Button* btnViewXmtSignal
{ sld = new Fl_Group(5, 143, 390, 70, "CW Postamble"); { sld = new Fl_Group(5, 150, 390, 63, "CW Postamble");
sld->box(FL_ENGRAVED_FRAME); sld->box(FL_ENGRAVED_FRAME);
sld->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); sld->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
{ Fl_Check_Button* o = btnCWID = new Fl_Check_Button(13, 179, 98, 15, "Xmt CWID"); { Fl_Check_Button* o = btnCWID = new Fl_Check_Button(13, 185, 98, 15, "Xmt CWID");
btnCWID->down_box(FL_DOWN_BOX); btnCWID->down_box(FL_DOWN_BOX);
btnCWID->callback((Fl_Callback*)cb_btnCWID); btnCWID->callback((Fl_Callback*)cb_btnCWID);
o->value(progdefaults.CWid); o->value(progdefaults.CWid);
} // Fl_Check_Button* btnCWID } // Fl_Check_Button* btnCWID
{ Fl_Value_Slider* o = sldrCWIDwpm = new Fl_Value_Slider(124, 176, 233, 20, "CWID wpm:"); { Fl_Value_Slider* o = sldrCWIDwpm = new Fl_Value_Slider(124, 182, 233, 20, "CWID wpm:");
sldrCWIDwpm->type(1); sldrCWIDwpm->type(1);
sldrCWIDwpm->color((Fl_Color)26); sldrCWIDwpm->color((Fl_Color)26);
sldrCWIDwpm->minimum(15); sldrCWIDwpm->minimum(15);
@ -1947,6 +1973,7 @@ l with your sound hardware.");
{ tabModems = new Fl_Group(0, 25, 401, 195, "Modem"); { tabModems = new Fl_Group(0, 25, 401, 195, "Modem");
tabModems->color((Fl_Color)51); tabModems->color((Fl_Color)51);
tabModems->selection_color((Fl_Color)51); tabModems->selection_color((Fl_Color)51);
tabModems->hide();
{ tabsModems = new Fl_Tabs(0, 25, 401, 195); { tabsModems = new Fl_Tabs(0, 25, 401, 195);
tabsModems->color((Fl_Color)51); tabsModems->color((Fl_Color)51);
tabsModems->selection_color((Fl_Color)10); tabsModems->selection_color((Fl_Color)10);
@ -2100,46 +2127,47 @@ l with your sound hardware.");
} // Fl_Counter* cntPostTiming } // Fl_Counter* cntPostTiming
tabCWQSK->end(); tabCWQSK->end();
} // Fl_Group* tabCWQSK } // Fl_Group* tabCWQSK
{ tabDEX = new Fl_Group(0, 44, 400, 170, "Dex"); { tabTHOR = new Fl_Group(0, 44, 400, 170, "Thor");
tabDEX->color((Fl_Color)51); tabTHOR->color((Fl_Color)51);
tabDEX->selection_color((Fl_Color)51); tabTHOR->selection_color((Fl_Color)51);
{ txtDEXSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text"); tabTHOR->hide();
txtDEXSecondary->type(4); { txtTHORSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text");
txtDEXSecondary->callback((Fl_Callback*)cb_txtDEXSecondary); txtTHORSecondary->type(4);
txtDEXSecondary->align(FL_ALIGN_TOP_LEFT); txtTHORSecondary->callback((Fl_Callback*)cb_txtTHORSecondary);
txtDEXSecondary->when(FL_WHEN_CHANGED); txtTHORSecondary->align(FL_ALIGN_TOP_LEFT);
} // Fl_Input* txtDEXSecondary txtTHORSecondary->when(FL_WHEN_CHANGED);
{ Fl_Counter* o = valDEX_BW = new Fl_Counter(20, 130, 63, 21, "BW factor:"); } // Fl_Input* txtTHORSecondary
valDEX_BW->type(1); { Fl_Counter* o = valTHOR_BW = new Fl_Counter(20, 130, 63, 21, "BW factor:");
valDEX_BW->minimum(1); valTHOR_BW->type(1);
valDEX_BW->maximum(2); valTHOR_BW->minimum(1);
valDEX_BW->step(0.1); valTHOR_BW->maximum(2);
valDEX_BW->value(1.5); valTHOR_BW->step(0.1);
valDEX_BW->callback((Fl_Callback*)cb_valDEX_BW); valTHOR_BW->value(1.5);
o->value(progdefaults.DEX_BW); valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW);
} // Fl_Counter* valDEX_BW o->value(progdefaults.THOR_BW);
{ Fl_Check_Button* o = valDEX_FILTER = new Fl_Check_Button(110, 130, 83, 19, "Filter ON"); } // Fl_Counter* valTHOR_BW
valDEX_FILTER->down_box(FL_DOWN_BOX); { Fl_Check_Button* o = valTHOR_FILTER = new Fl_Check_Button(110, 130, 83, 19, "Filter ON");
valDEX_FILTER->value(1); valTHOR_FILTER->down_box(FL_DOWN_BOX);
valDEX_FILTER->callback((Fl_Callback*)cb_valDEX_FILTER); valTHOR_FILTER->value(1);
o->value(progdefaults.DEX_FILTER); valTHOR_FILTER->callback((Fl_Callback*)cb_valTHOR_FILTER);
} // Fl_Check_Button* valDEX_FILTER o->value(progdefaults.THOR_FILTER);
{ Fl_Counter* o = valDEX_PATHS = new Fl_Counter(20, 174, 63, 21, "Paths"); } // Fl_Check_Button* valTHOR_FILTER
valDEX_PATHS->type(1); { Fl_Counter* o = valTHOR_PATHS = new Fl_Counter(20, 174, 63, 21, "Paths");
valDEX_PATHS->minimum(4); valTHOR_PATHS->type(1);
valDEX_PATHS->maximum(8); valTHOR_PATHS->minimum(4);
valDEX_PATHS->step(1); valTHOR_PATHS->maximum(8);
valDEX_PATHS->value(5); valTHOR_PATHS->step(1);
valDEX_PATHS->callback((Fl_Callback*)cb_valDEX_PATHS); valTHOR_PATHS->value(5);
o->value(progdefaults.DEX_PATHS); valTHOR_PATHS->callback((Fl_Callback*)cb_valTHOR_PATHS);
} // Fl_Counter* valDEX_PATHS o->value(progdefaults.THOR_PATHS);
{ Fl_Check_Button* o = valDEX_SOFT = new Fl_Check_Button(110, 177, 70, 15, "Soft decode"); } // Fl_Counter* valTHOR_PATHS
valDEX_SOFT->down_box(FL_DOWN_BOX); { Fl_Check_Button* o = valTHOR_SOFT = new Fl_Check_Button(110, 177, 70, 15, "Soft decode");
valDEX_SOFT->callback((Fl_Callback*)cb_valDEX_SOFT); valTHOR_SOFT->down_box(FL_DOWN_BOX);
o->value(progdefaults.DEX_SOFT); valTHOR_SOFT->callback((Fl_Callback*)cb_valTHOR_SOFT);
} // Fl_Check_Button* valDEX_SOFT o->value(progdefaults.THOR_SOFT);
tabDEX->end(); } // Fl_Check_Button* valTHOR_SOFT
} // Fl_Group* tabDEX tabTHOR->end();
} // Fl_Group* tabTHOR
{ tabDomEX = new Fl_Group(0, 50, 400, 170, "Dom"); { tabDomEX = new Fl_Group(0, 50, 400, 170, "Dom");
tabDomEX->color((Fl_Color)51); tabDomEX->color((Fl_Color)51);
tabDomEX->selection_color((Fl_Color)51); tabDomEX->selection_color((Fl_Color)51);
@ -2184,7 +2212,6 @@ l with your sound hardware.");
{ tabFeld = new Fl_Group(0, 50, 400, 170, "Feld"); { tabFeld = new Fl_Group(0, 50, 400, 170, "Feld");
tabFeld->color((Fl_Color)51); tabFeld->color((Fl_Color)51);
tabFeld->selection_color((Fl_Color)51); tabFeld->selection_color((Fl_Color)51);
tabFeld->hide();
{ Fl_Choice* o = selHellFont = new Fl_Choice(175, 62, 122, 20, "Feld Hell Font:"); { Fl_Choice* o = selHellFont = new Fl_Choice(175, 62, 122, 20, "Feld Hell Font:");
selHellFont->down_box(FL_BORDER_BOX); selHellFont->down_box(FL_BORDER_BOX);
selHellFont->labelfont(4); selHellFont->labelfont(4);
@ -2205,17 +2232,20 @@ l with your sound hardware.");
sldrHellBW->align(FL_ALIGN_TOP_LEFT); sldrHellBW->align(FL_ALIGN_TOP_LEFT);
o->value(progdefaults.HELL_BW); o->value(progdefaults.HELL_BW);
} // Fl_Value_Slider* sldrHellBW } // Fl_Value_Slider* sldrHellBW
{ btnHellXmtWidth = new Fl_Check_Button(40, 93, 113, 15, "2x Xmt Width"); { Fl_Check_Button* o = btnHellXmtWidth = new Fl_Check_Button(40, 93, 113, 15, "2x Xmt Width");
btnHellXmtWidth->down_box(FL_DOWN_BOX); btnHellXmtWidth->down_box(FL_DOWN_BOX);
btnHellXmtWidth->callback((Fl_Callback*)cb_btnHellXmtWidth); btnHellXmtWidth->callback((Fl_Callback*)cb_btnHellXmtWidth);
o->value(progdefaults.HellXmtWidth);
} // Fl_Check_Button* btnHellXmtWidth } // Fl_Check_Button* btnHellXmtWidth
{ btnHellRcvWidth = new Fl_Check_Button(40, 113, 130, 15, "1/2 x Rcv Width"); { Fl_Check_Button* o = btnHellRcvWidth = new Fl_Check_Button(40, 113, 130, 15, "1/2 x Rcv Width");
btnHellRcvWidth->down_box(FL_DOWN_BOX); btnHellRcvWidth->down_box(FL_DOWN_BOX);
btnHellRcvWidth->callback((Fl_Callback*)cb_btnHellRcvWidth); btnHellRcvWidth->callback((Fl_Callback*)cb_btnHellRcvWidth);
o->value(progdefaults.HellRcvWidth);
} // Fl_Check_Button* btnHellRcvWidth } // Fl_Check_Button* btnHellRcvWidth
{ btnBlackboard = new Fl_Check_Button(40, 134, 100, 15, "blackboard"); { Fl_Check_Button* o = btnBlackboard = new Fl_Check_Button(40, 134, 100, 15, "blackboard");
btnBlackboard->down_box(FL_DOWN_BOX); btnBlackboard->down_box(FL_DOWN_BOX);
btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard); btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard);
o->value(progdefaults.HellBlackboard);
} // Fl_Check_Button* btnBlackboard } // Fl_Check_Button* btnBlackboard
{ Fl_Group* o = new Fl_Group(175, 90, 195, 85, "Pulse Shape"); { Fl_Group* o = new Fl_Group(175, 90, 195, 85, "Pulse Shape");
o->box(FL_ENGRAVED_FRAME); o->box(FL_ENGRAVED_FRAME);
@ -2223,13 +2253,13 @@ l with your sound hardware.");
{ Fl_Check_Button* o = btnHellFastAttack = new Fl_Check_Button(185, 110, 169, 15, "Fast Attack (2 msec)"); { Fl_Check_Button* o = btnHellFastAttack = new Fl_Check_Button(185, 110, 169, 15, "Fast Attack (2 msec)");
btnHellFastAttack->down_box(FL_DOWN_BOX); btnHellFastAttack->down_box(FL_DOWN_BOX);
btnHellFastAttack->callback((Fl_Callback*)cb_btnHellFastAttack); btnHellFastAttack->callback((Fl_Callback*)cb_btnHellFastAttack);
o->value(0); o->value(progdefaults.HellPulseFast);
} // Fl_Check_Button* btnHellFastAttack } // Fl_Check_Button* btnHellFastAttack
{ Fl_Check_Button* o = btnHellSlowAttack = new Fl_Check_Button(185, 131, 70, 15, "Slow Attack (4 msec)"); { Fl_Check_Button* o = btnHellSlowAttack = new Fl_Check_Button(185, 131, 70, 15, "Slow Attack (4 msec)");
btnHellSlowAttack->down_box(FL_DOWN_BOX); btnHellSlowAttack->down_box(FL_DOWN_BOX);
btnHellSlowAttack->value(1); btnHellSlowAttack->value(1);
btnHellSlowAttack->callback((Fl_Callback*)cb_btnHellSlowAttack); btnHellSlowAttack->callback((Fl_Callback*)cb_btnHellSlowAttack);
o->value(1); o->value(!progdefaults.HellPulseFast);
} // Fl_Check_Button* btnHellSlowAttack } // Fl_Check_Button* btnHellSlowAttack
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
@ -2237,7 +2267,7 @@ l with your sound hardware.");
btnFeldHellIdle->down_box(FL_DOWN_BOX); btnFeldHellIdle->down_box(FL_DOWN_BOX);
btnFeldHellIdle->value(1); btnFeldHellIdle->value(1);
btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle); btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle);
o->value(progdefaults.FELD_IDLE); o->value(progdefaults.HellXmtIdle);
} // Fl_Check_Button* btnFeldHellIdle } // Fl_Check_Button* btnFeldHellIdle
tabFeld->end(); tabFeld->end();
} // Fl_Group* tabFeld } // Fl_Group* tabFeld

Wyświetl plik

@ -325,12 +325,12 @@ progdefaults.changed = true;
} }
} }
Fl_Group tabVideo { Fl_Group tabVideo {
label Video label Video open
xywh {0 25 400 195} color 51 selection_color 51 hide xywh {0 25 400 195} color 51 selection_color 51
} { } {
Fl_Group {} { Fl_Group {} {
label {Video Preamble} open label {Video Preamble} open
xywh {5 40 390 67} box ENGRAVED_FRAME align 21 xywh {5 40 390 77} box ENGRAVED_FRAME align 21
} { } {
Fl_Check_Button btnsendid { Fl_Check_Button btnsendid {
label {Xmt Mode ID} label {Xmt Mode ID}
@ -342,47 +342,59 @@ progdefaults.changed = true;}
label {Xmt Video Text} label {Xmt Video Text}
callback {progdefaults.sendtextid=o->value(); callback {progdefaults.sendtextid=o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {11 82 115 20} down_box DOWN_BOX xywh {11 89 115 20} down_box DOWN_BOX
code0 {o->value(progdefaults.sendtextid);} code0 {o->value(progdefaults.sendtextid);}
} }
Fl_Input valVideotext { Fl_Input valVideotext {
label {Video Text:} label {Video Text:}
callback {progdefaults.strTextid = o->value(); callback {progdefaults.strTextid = o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Limit to a few characters as in CQEM or IOTA etc.} xywh {159 82 94 20} align 5 tooltip {Limit to a few characters as in CQEM or IOTA etc.} xywh {159 89 120 20} align 5
code0 {o->value(progdefaults.strTextid.c_str());} code0 {o->value(progdefaults.strTextid.c_str());}
} }
Fl_Value_Slider sldrVideowidth { Fl_Value_Slider sldrVideowidth {
label {Video Width:} label {Video Width:}
callback {progdefaults.videowidth = (int)o->value(); callback {progdefaults.videowidth = (int)o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
tooltip {Set the \# of chars per row} xywh {286 82 101 20} type Horizontal color 26 align 1 minimum 1 maximum 4 step 1 value 1 textsize 14 tooltip {Set the \# of chars per row} xywh {290 89 95 20} type Horizontal color 26 align 1 minimum 1 maximum 4 step 1 value 1 textsize 14
code0 {o->value(progdefaults.videowidth);} code0 {o->value(progdefaults.videowidth);}
code1 {if (progdefaults.ID_SMALL) o->deactivate();}
}
Fl_Check_Button chkID_SMALL {
label {small font}
callback {progdefaults.ID_SMALL=o->value();
if (o->value() == 1)
sldrVideowidth->deactivate();
else
sldrVideowidth->activate();
progdefaults.changed = true;} selected
xywh {290 49 100 20} down_box DOWN_BOX value 1
code0 {o->value(progdefaults.ID_SMALL);}
} }
} }
Fl_Check_Button btnViewXmtSignal { Fl_Check_Button btnViewXmtSignal {
label {View Xmt Signal} label {View Xmt Signal}
callback {progdefaults.viewXmtSignal=o->value(); callback {progdefaults.viewXmtSignal=o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {11 115 135 20} down_box DOWN_BOX xywh {11 122 135 20} down_box DOWN_BOX
code0 {o->value(progdefaults.viewXmtSignal);} code0 {o->value(progdefaults.viewXmtSignal);}
} }
Fl_Group sld { Fl_Group sld {
label {CW Postamble} open label {CW Postamble} open
xywh {5 143 390 70} box ENGRAVED_FRAME align 21 xywh {5 150 390 63} box ENGRAVED_FRAME align 21
} { } {
Fl_Check_Button btnCWID { Fl_Check_Button btnCWID {
label {Xmt CWID} label {Xmt CWID}
callback {progdefaults.CWid = o->value(); callback {progdefaults.CWid = o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {13 179 98 15} down_box DOWN_BOX xywh {13 185 98 15} down_box DOWN_BOX
code0 {o->value(progdefaults.CWid);} code0 {o->value(progdefaults.CWid);}
} }
Fl_Value_Slider sldrCWIDwpm { Fl_Value_Slider sldrCWIDwpm {
label {CWID wpm:} label {CWID wpm:}
callback {progdefaults.CWIDwpm = (int)o->value(); callback {progdefaults.CWIDwpm = (int)o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {124 176 233 20} type Horizontal color 26 align 5 minimum 15 maximum 40 step 1 value 18 textsize 14 xywh {124 182 233 20} type Horizontal color 26 align 5 minimum 15 maximum 40 step 1 value 18 textsize 14
code0 {o->value(progdefaults.CWIDwpm);} code0 {o->value(progdefaults.CWIDwpm);}
} }
} }
@ -1054,45 +1066,45 @@ progdefaults.changed = true;}
code1 {o->maximum((int)(2400/progdefaults.CWspeed)/2.0);} code1 {o->maximum((int)(2400/progdefaults.CWspeed)/2.0);}
} }
} }
Fl_Group tabDEX { Fl_Group tabTHOR {
label Dex open label Thor open
xywh {0 44 400 170} color 51 selection_color 51 xywh {0 44 400 170} color 51 selection_color 51 hide
} { } {
Fl_Input txtDEXSecondary { Fl_Input txtTHORSecondary {
label {Secondary Text} label {Secondary Text}
callback {progdefaults.DEXsecText = o->value(); callback {progdefaults.THORsecText = o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {20 75 360 44} type Multiline align 5 when 1 xywh {20 75 360 44} type Multiline align 5 when 1
} }
Fl_Counter valDEX_BW { Fl_Counter valTHOR_BW {
label {BW factor:} label {BW factor:}
callback {progdefaults.DEX_BW = o->value(); callback {progdefaults.THOR_BW = o->value();
resetDEX(); resetTHOR();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {20 130 63 21} type Simple minimum 1 maximum 2 step 0.1 value 1.5 xywh {20 130 63 21} type Simple minimum 1 maximum 2 step 0.1 value 1.5
code0 {o->value(progdefaults.DEX_BW);} code0 {o->value(progdefaults.THOR_BW);}
} }
Fl_Check_Button valDEX_FILTER { Fl_Check_Button valTHOR_FILTER {
label {Filter ON} label {Filter ON}
callback {progdefaults.DEX_FILTER = o->value(); callback {progdefaults.THOR_FILTER = o->value();
resetDEX(); resetTHOR();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {110 130 83 19} down_box DOWN_BOX value 1 xywh {110 130 83 19} down_box DOWN_BOX value 1
code0 {o->value(progdefaults.DEX_FILTER);} code0 {o->value(progdefaults.THOR_FILTER);}
} }
Fl_Counter valDEX_PATHS { Fl_Counter valTHOR_PATHS {
label Paths label Paths
callback {progdefaults.DEX_PATHS = (int)o->value(); callback {progdefaults.THOR_PATHS = (int)o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {20 174 63 21} type Simple minimum 4 maximum 8 step 1 value 5 xywh {20 174 63 21} type Simple minimum 4 maximum 8 step 1 value 5
code0 {o->value(progdefaults.DEX_PATHS);} code0 {o->value(progdefaults.THOR_PATHS);}
} }
Fl_Check_Button valDEX_SOFT { Fl_Check_Button valTHOR_SOFT {
label {Soft decode} label {Soft decode}
callback {progdefaults.DEX_SOFT = o->value(); callback {progdefaults.THOR_SOFT = o->value();
progdefaults.changed = true;} selected progdefaults.changed = true;}
xywh {110 177 70 15} down_box DOWN_BOX xywh {110 177 70 15} down_box DOWN_BOX
code0 {o->value(progdefaults.DEX_SOFT);} code0 {o->value(progdefaults.THOR_SOFT);}
} }
} }
Fl_Group tabDomEX { Fl_Group tabDomEX {
@ -1138,7 +1150,7 @@ progdefaults.changed = true;}
} }
Fl_Group tabFeld { Fl_Group tabFeld {
label Feld open label Feld open
xywh {0 50 400 170} color 51 selection_color 51 hide xywh {0 50 400 170} color 51 selection_color 51
} { } {
Fl_Choice selHellFont { Fl_Choice selHellFont {
label {Feld Hell Font:} label {Feld Hell Font:}
@ -1157,18 +1169,24 @@ progdefaults.changed = true;} open
} }
Fl_Check_Button btnHellXmtWidth { Fl_Check_Button btnHellXmtWidth {
label {2x Xmt Width} label {2x Xmt Width}
callback {progdefaults.changed = true;} callback {progdefaults.HellXmtWidth=o->value();
progdefaults.changed = true;}
xywh {40 93 113 15} down_box DOWN_BOX xywh {40 93 113 15} down_box DOWN_BOX
code0 {o->value(progdefaults.HellXmtWidth);}
} }
Fl_Check_Button btnHellRcvWidth { Fl_Check_Button btnHellRcvWidth {
label {1/2 x Rcv Width} label {1/2 x Rcv Width}
callback {progdefaults.changed = true;} callback {progdefaults.HellRcvWidth=o->value();
progdefaults.changed = true;}
xywh {40 113 130 15} down_box DOWN_BOX xywh {40 113 130 15} down_box DOWN_BOX
code0 {o->value(progdefaults.HellRcvWidth);}
} }
Fl_Check_Button btnBlackboard { Fl_Check_Button btnBlackboard {
label blackboard label blackboard
callback {progdefaults.changed = true;} callback {progdefaults.HellBlackboard=o->value();
progdefaults.changed = true;}
xywh {40 134 100 15} down_box DOWN_BOX xywh {40 134 100 15} down_box DOWN_BOX
code0 {o->value(progdefaults.HellBlackboard);}
} }
Fl_Group {} { Fl_Group {} {
label {Pulse Shape} open label {Pulse Shape} open
@ -1176,31 +1194,37 @@ progdefaults.changed = true;} open
} { } {
Fl_Check_Button btnHellFastAttack { Fl_Check_Button btnHellFastAttack {
label {Fast Attack (2 msec)} label {Fast Attack (2 msec)}
callback {if (o->value() == 1) callback {if (o->value() == 1) {
btnHellSlowAttack->value(0); btnHellSlowAttack->value(0);
else progdefaults.HellPulseFast = true;
}else{
btnHellSlowAttack->value(1); btnHellSlowAttack->value(1);
progdefaults.HellPulseFast = false;
}
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {185 110 169 15} down_box DOWN_BOX xywh {185 110 169 15} down_box DOWN_BOX
code0 {o->value(0);} code0 {o->value(progdefaults.HellPulseFast);}
} }
Fl_Check_Button btnHellSlowAttack { Fl_Check_Button btnHellSlowAttack {
label {Slow Attack (4 msec)} label {Slow Attack (4 msec)}
callback {if (o->value() == 1) callback {if (o->value() == 1) {
btnHellFastAttack->value(0); btnHellFastAttack->value(0);
else progdefaults.HellPulseFast = false;
}else{
btnHellFastAttack->value(1); btnHellFastAttack->value(1);
progdefaults.HellPulseFast = true;
}
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {185 131 70 15} down_box DOWN_BOX value 1 xywh {185 131 70 15} down_box DOWN_BOX value 1
code0 {o->value(1);} code0 {o->value(!progdefaults.HellPulseFast);}
} }
} }
Fl_Check_Button btnFeldHellIdle { Fl_Check_Button btnFeldHellIdle {
label {Xmt (.) Idle Char} label {Xmt (.) Idle Char}
callback {progdefaults.FELD_IDLE=o->value(); callback {progdefaults.HellXmtIdle=o->value();
progdefaults.changed = true;} progdefaults.changed = true;}
xywh {40 155 70 15} down_box DOWN_BOX value 1 xywh {40 155 70 15} down_box DOWN_BOX value 1
code0 {o->value(progdefaults.FELD_IDLE);} code0 {o->value(progdefaults.HellXmtIdle);}
} }
} }
Fl_Group tabOlivia { Fl_Group tabOlivia {

Wyświetl plik

@ -65,7 +65,7 @@
#include "mt63.h" #include "mt63.h"
#include "rtty.h" #include "rtty.h"
#include "olivia.h" #include "olivia.h"
#include "dex.h" #include "thor.h"
#include "dominoex.h" #include "dominoex.h"
#include "feld.h" #include "feld.h"
#include "throb.h" #include "throb.h"
@ -202,14 +202,14 @@ Fl_Menu_Item quick_change_mt63[] = {
{ 0 } { 0 }
}; };
Fl_Menu_Item quick_change_dex[] = { Fl_Menu_Item quick_change_thor[] = {
{ mode_info[MODE_DEX4].name, 0, cb_init_mode, (void *)MODE_DEX4 }, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4 },
{ mode_info[MODE_DEX5].name, 0, cb_init_mode, (void *)MODE_DEX5 }, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5 },
{ mode_info[MODE_DEX8].name, 0, cb_init_mode, (void *)MODE_DEX8 }, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8 },
{ mode_info[MODE_DEX11].name, 0, cb_init_mode, (void *)MODE_DEX11 }, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11 },
{ mode_info[MODE_DSX11].name, 0, cb_init_mode, (void *)MODE_DSX11 }, { mode_info[MODE_TSOR11].name, 0, cb_init_mode, (void *)MODE_TSOR11 },
{ mode_info[MODE_DEX16].name, 0, cb_init_mode, (void *)MODE_DEX16 }, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16 },
{ mode_info[MODE_DEX22].name, 0, cb_init_mode, (void *)MODE_DEX22 }, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22 },
{ 0 } { 0 }
}; };
@ -403,12 +403,12 @@ void init_modem(trx_mode mode)
modem_config_tab = tabCW; modem_config_tab = tabCW;
break; break;
case MODE_DEX4: case MODE_DEX5: case MODE_DEX8: case MODE_THOR4: case MODE_THOR5: case MODE_THOR8:
case MODE_DEX11: case MODE_DSX11: case MODE_DEX16: case MODE_DEX22: case MODE_THOR11: case MODE_TSOR11: case MODE_THOR16: case MODE_THOR22:
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
*mode_info[mode].modem = new dex(mode)); *mode_info[mode].modem = new thor(mode));
quick_change = quick_change_dex; quick_change = quick_change_thor;
modem_config_tab = tabDEX; modem_config_tab = tabTHOR;
break; break;
case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8:
@ -1041,16 +1041,6 @@ Fl_Menu_Item menu_[] = {
{ mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"DEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX4].name, 0, cb_init_mode, (void *)MODE_DEX4, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX5].name, 0, cb_init_mode, (void *)MODE_DEX5, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX8].name, 0, cb_init_mode, (void *)MODE_DEX8, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX11].name, 0, cb_init_mode, (void *)MODE_DEX11, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DSX11].name, 0, cb_init_mode, (void *)MODE_DSX11, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX16].name, 0, cb_init_mode, (void *)MODE_DEX16, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DEX22].name, 0, cb_init_mode, (void *)MODE_DEX22, 0, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
{"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0},
@ -1096,6 +1086,16 @@ Fl_Menu_Item menu_[] = {
{ mode_info[MODE_RTTY].name, 0, cb_init_mode, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_RTTY].name, 0, cb_init_mode, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0},
{"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_TSOR11].name, 0, cb_init_mode, (void *)MODE_TSOR11, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0},
{"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0},
{ mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0},
@ -1960,15 +1960,15 @@ void resetOLIVIA() {
active_modem->restart(); active_modem->restart();
} }
void resetDEX() { void resetTHOR() {
trx_mode md = active_modem->get_mode(); trx_mode md = active_modem->get_mode();
if (md == MODE_DEX4 || if (md == MODE_THOR4 ||
md == MODE_DEX5 || md == MODE_THOR5 ||
md == MODE_DEX8 || md == MODE_THOR8 ||
md == MODE_DEX11 || md == MODE_THOR11 ||
md == MODE_DSX11 || md == MODE_TSOR11 ||
md == MODE_DEX16 || md == MODE_THOR16 ||
md == MODE_DEX22 ) { md == MODE_THOR22 ) {
active_modem->restart(); active_modem->restart();
} }
} }

Wyświetl plik

@ -142,8 +142,6 @@ feld::feld(trx_mode m)
if (filter_bandwidth != progdefaults.HELL_BW) if (filter_bandwidth != progdefaults.HELL_BW)
progdefaults.HELL_BW = filter_bandwidth; progdefaults.HELL_BW = filter_bandwidth;
std::cout << hell_bandwidth << ", " << progdefaults.HELL_BW << std::endl;
lp = 1.5 * filter_bandwidth / samplerate; lp = 1.5 * filter_bandwidth / samplerate;
bpfilt = new fftfilt(0, lp, 1024); bpfilt = new fftfilt(0, lp, 1024);
@ -275,10 +273,8 @@ int feld::rx_process(const double *buf, int len)
complex z, *zp; complex z, *zp;
int i, n; int i, n;
FL_LOCK_D(); halfwidth = progdefaults.HellRcvWidth;
halfwidth = btnHellRcvWidth->value(); blackboard = progdefaults.HellBlackboard;
blackboard = btnBlackboard->value();
FL_UNLOCK_D();
if (progdefaults.HELL_BW != filter_bandwidth) { if (progdefaults.HELL_BW != filter_bandwidth) {
double lp; double lp;
@ -414,7 +410,7 @@ void feld::send_symbol(int currsymb, int nextsymb)
outbuf[outlen++] = Amp * nco(tone); outbuf[outlen++] = Amp * nco(tone);
if (outlen >= OUTBUFSIZE) { if (outlen >= OUTBUFSIZE) {
std::cout << "feld reset\n"; std::cout.flush(); std::cout << "feld reset" << std::endl;
break; break;
} }
txcounter += upsampleinc; txcounter += upsampleinc;
@ -470,10 +466,9 @@ int feld::tx_process()
int c; int c;
bool hdkey; bool hdkey;
FL_LOCK_D(); dxmode = 1 + progdefaults.HellXmtWidth;
dxmode = 1 + btnHellXmtWidth->value(); hdkey = progdefaults.HellPulseFast;
hdkey = btnHellFastAttack->value();
FL_UNLOCK_D();
fntnbr = progdefaults.feldfontnbr; fntnbr = progdefaults.feldfontnbr;
if (hardkeying != hdkey) { if (hardkeying != hdkey) {
hardkeying = hdkey; hardkeying = hdkey;

Wyświetl plik

@ -48,13 +48,13 @@ const char *state_names[] = {
const struct mode_info_t mode_info[NUM_MODES] = { const struct mode_info_t mode_info[NUM_MODES] = {
{ MODE_CW, &cw_modem, "CW", "CW", "CW", "CW" }, { MODE_CW, &cw_modem, "CW", "CW", "CW", "CW" },
{ MODE_DEX4, &dex4_modem, "DEX4", "DEX 4", "DEX4", "DEX" }, { MODE_THOR4, &thor4_modem, "THOR4", "THOR 4", "THOR4", "THOR" },
{ MODE_DEX5, &dex5_modem, "DEX5", "DEX 5", "DEX5", "DEX" }, { MODE_THOR5, &thor5_modem, "THOR5", "THOR 5", "THOR5", "THOR" },
{ MODE_DEX8, &dex8_modem, "DEX8", "DEX 8", "DEX8", "DEX" }, { MODE_THOR8, &thor8_modem, "THOR8", "THOR 8", "THOR8", "THOR" },
{ MODE_DEX11, &dex11_modem, "DEX11", "DEX 11", "DEX11", "DEX" }, { MODE_THOR11, &thor11_modem, "THOR11", "THOR 11", "THOR11", "THOR" },
{ MODE_DSX11, &dsx11_modem, "DSX11", "DSX 11", "DSX11", "DEX" }, { MODE_TSOR11, &tsor11_modem, "TSOR11", "TSOR 11", "TSOR11", "TSOR" },
{ MODE_DEX16, &dex16_modem, "DEX16", "DEX 16", "DEX16", "DEX" }, { MODE_THOR16, &thor16_modem, "THOR16", "THOR 16", "THOR16", "THOR" },
{ MODE_DEX22, &dex22_modem, "DEX22", "DEX 22", "DEX22", "DEX" }, { MODE_THOR22, &thor22_modem, "THOR22", "THOR 22", "THOR22", "THOR" },
{ MODE_DOMINOEX4, &dominoex4_modem, "DomEX4", "DominoEX 4", "DOMINOEX4", "DOMINO" }, { MODE_DOMINOEX4, &dominoex4_modem, "DomEX4", "DominoEX 4", "DOMINOEX4", "DOMINO" },
{ MODE_DOMINOEX5, &dominoex5_modem, "DomEX5", "DominoEX 5", "DOMINOEX5", "DOMINO" }, { MODE_DOMINOEX5, &dominoex5_modem, "DomEX5", "DominoEX 5", "DOMINOEX5", "DOMINO" },

Wyświetl plik

@ -50,6 +50,7 @@ extern Fl_Check_Button *btnsendvideotext;
extern Fl_Input *valVideotext; extern Fl_Input *valVideotext;
#include <FL/Fl_Value_Slider.H> #include <FL/Fl_Value_Slider.H>
extern Fl_Value_Slider *sldrVideowidth; extern Fl_Value_Slider *sldrVideowidth;
extern Fl_Check_Button *chkID_SMALL;
extern Fl_Check_Button *btnViewXmtSignal; extern Fl_Check_Button *btnViewXmtSignal;
extern Fl_Group *sld; extern Fl_Group *sld;
extern Fl_Check_Button *btnCWID; extern Fl_Check_Button *btnCWID;
@ -137,12 +138,12 @@ extern Fl_Group *tabCWQSK;
extern Fl_Check_Button *btnQSK; extern Fl_Check_Button *btnQSK;
extern Fl_Counter *cntPreTiming; extern Fl_Counter *cntPreTiming;
extern Fl_Counter *cntPostTiming; extern Fl_Counter *cntPostTiming;
extern Fl_Group *tabDEX; extern Fl_Group *tabTHOR;
extern Fl_Input *txtDEXSecondary; extern Fl_Input *txtTHORSecondary;
extern Fl_Counter *valDEX_BW; extern Fl_Counter *valTHOR_BW;
extern Fl_Check_Button *valDEX_FILTER; extern Fl_Check_Button *valTHOR_FILTER;
extern Fl_Counter *valDEX_PATHS; extern Fl_Counter *valTHOR_PATHS;
extern Fl_Check_Button *valDEX_SOFT; extern Fl_Check_Button *valTHOR_SOFT;
extern Fl_Group *tabDomEX; extern Fl_Group *tabDomEX;
extern Fl_Input *txtSecondary; extern Fl_Input *txtSecondary;
extern Fl_Counter *valDominoEX_BW; extern Fl_Counter *valDominoEX_BW;

Wyświetl plik

@ -68,18 +68,23 @@ struct configuration {
// FELD-HELL // FELD-HELL
bool FELD_IDLE; bool FELD_IDLE;
double HELL_BW; double HELL_BW;
bool HellRcvWidth;
bool HellBlackboard;
bool HellXmtWidth;
bool HellXmtIdle;
bool HellPulseFast;
// OLIVIA // OLIVIA
int oliviatones; int oliviatones;
int oliviabw; int oliviabw;
int oliviasmargin; int oliviasmargin;
int oliviasinteg; int oliviasinteg;
bool olivia8bit; bool olivia8bit;
// DEX // THOR
double DEX_BW; double THOR_BW;
bool DEX_FILTER; bool THOR_FILTER;
string DEXsecText; string THORsecText;
int DEX_PATHS; int THOR_PATHS;
bool DEX_SOFT; bool THOR_SOFT;
// DOMINOEX // DOMINOEX
double DOMINOEX_BW; double DOMINOEX_BW;
bool DOMINOEX_FILTER; bool DOMINOEX_FILTER;
@ -110,6 +115,7 @@ struct configuration {
string strTextid; string strTextid;
bool macroCWid; bool macroCWid;
int videowidth; int videowidth;
bool ID_SMALL;
bool macrotextid; bool macrotextid;
int QRZ; int QRZ;
string QRZusername; string QRZusername;

Wyświetl plik

@ -133,7 +133,7 @@ extern int get_secondary_char();
extern void put_echo_char(unsigned int data); extern void put_echo_char(unsigned int data);
extern void resetRTTY(); extern void resetRTTY();
extern void resetOLIVIA(); extern void resetOLIVIA();
extern void resetDEX(); extern void resetTHOR();
extern void resetDOMEX(); extern void resetDOMEX();
extern void resetSoundCard(); extern void resetSoundCard();
extern void restoreFocus(); extern void restoreFocus();

Wyświetl plik

@ -51,13 +51,13 @@ enum {
MODE_CW, MODE_CW,
MODE_DEX4, MODE_THOR4,
MODE_DEX5, MODE_THOR5,
MODE_DEX8, MODE_THOR8,
MODE_DEX11, MODE_THOR11,
MODE_DSX11, MODE_TSOR11,
MODE_DEX16, MODE_THOR16,
MODE_DEX22, MODE_THOR22,
MODE_DOMINOEX4, MODE_DOMINOEX4,
MODE_DOMINOEX5, MODE_DOMINOEX5,

Wyświetl plik

@ -194,13 +194,13 @@ extern modem *qpsk125_modem;
extern modem *qpsk250_modem; extern modem *qpsk250_modem;
extern modem *rtty_modem; extern modem *rtty_modem;
extern modem *olivia_modem; extern modem *olivia_modem;
extern modem *dex4_modem; extern modem *thor4_modem;
extern modem *dex5_modem; extern modem *thor5_modem;
extern modem *dex8_modem; extern modem *thor8_modem;
extern modem *dex11_modem; extern modem *thor11_modem;
extern modem *dsx11_modem; extern modem *tsor11_modem;
extern modem *dex16_modem; extern modem *thor16_modem;
extern modem *dex22_modem; extern modem *thor22_modem;
extern modem *dominoex4_modem; extern modem *dominoex4_modem;
extern modem *dominoex5_modem; extern modem *dominoex5_modem;
extern modem *dominoex8_modem; extern modem *dominoex8_modem;

Wyświetl plik

@ -1,5 +1,5 @@
// //
// dex.h -- dex modem // thor.h -- thor modem
// //
// Copyright (C) 2008 // Copyright (C) 2008
// David Freese (w1hkj@w1hkj.com) // David Freese (w1hkj@w1hkj.com)
@ -19,8 +19,8 @@
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#ifndef _dex_H #ifndef _thor_H
#define _dex_H #define _thor_H
#include <string> #include <string>
@ -33,9 +33,9 @@
#include "mbuffer.h" #include "mbuffer.h"
// NASA coefficients for viterbi encode/decode algorithms // NASA coefficients for viterbi encode/decode algorithms
#define DEX_K 7 #define THOR_K 7
#define DEX_POLY1 0x6d #define THOR_POLY1 0x6d
#define DEX_POLY2 0x4f #define THOR_POLY2 0x4f
//#include "mfskvaricode.h" //#include "mfskvaricode.h"
#include "interleave.h" #include "interleave.h"
@ -44,18 +44,18 @@
using namespace std; using namespace std;
#define DEXNUMMTONES 18 #define THORNUMMTONES 18
#define DEXMAXFFTS 8 #define THORMAXFFTS 8
#define DEXBASEFREQ 500.0 #define THORBASEFREQ 500.0
#define DEXFIRSTIF 1000.0 #define THORFIRSTIF 1000.0
#define DEXSCOPESIZE 64 #define THORSCOPESIZE 64
struct DEXrxpipe { struct THORrxpipe {
complex vector[DEXMAXFFTS * DEXNUMMTONES * 6]; complex vector[THORMAXFFTS * THORNUMMTONES * 6];
}; };
class dex : public modem { class thor : public modem {
public: public:
enum { enum {
TX_STATE_PREAMBLE, TX_STATE_PREAMBLE,
@ -66,7 +66,7 @@ public:
}; };
protected: protected:
// common variables // common variables
double phase[DEXMAXFFTS + 1]; double phase[THORMAXFFTS + 1];
double txphase; double txphase;
int symlen; int symlen;
int doublespaced; int doublespaced;
@ -77,12 +77,12 @@ protected:
// rx variables // rx variables
C_FIR_filter *hilbert; C_FIR_filter *hilbert;
sfft *binsfft[DEXMAXFFTS]; sfft *binsfft[THORMAXFFTS];
fftfilt *fft; fftfilt *fft;
Cmovavg *vidfilter[DEXSCOPESIZE]; Cmovavg *vidfilter[THORSCOPESIZE];
Cmovavg *syncfilter; Cmovavg *syncfilter;
DEXrxpipe *pipe; THORrxpipe *pipe;
unsigned int pipeptr; unsigned int pipeptr;
unsigned int datashreg; unsigned int datashreg;
mbuffer<double, 0, 2> scopedata; mbuffer<double, 0, 2> scopedata;
@ -153,8 +153,8 @@ private:
void Clearbits(); void Clearbits();
public: public:
dex (trx_mode md); thor (trx_mode md);
~dex (); ~thor ();
void init(); void init();
void rx_init(); void rx_init();
void tx_init(SoundBase *sc); void tx_init(SoundBase *sc);

Wyświetl plik

@ -1,5 +1,5 @@
// //
// dexvaricode.h -- DEX Varicode // thorvaricode.h -- DEX Varicode
// //
// Copyright (C) 2008 // Copyright (C) 2008
// Dave Freese, W1HKJ // Dave Freese, W1HKJ
@ -24,7 +24,7 @@
#ifndef _DEXVARICODE_H #ifndef _DEXVARICODE_H
#define _DEXVARICODE_H #define _DEXVARICODE_H
extern const char *dexvarienc(int c, int secondary); extern const char *thorvarienc(int c, int secondary);
extern int dexvaridec(unsigned int symbol); extern int thorvaridec(unsigned int symbol);
#endif #endif

Wyświetl plik

@ -73,18 +73,23 @@ configuration progdefaults = {
// FELD-HELL // FELD-HELL
false, // bool FELD_IDLE; false, // bool FELD_IDLE;
150.0, // double HELL_BW; 150.0, // double HELL_BW;
false, // bool HellRcvWidth;
false, // bool HellBlackboard;
false, // bool HellXmtWidth;
true, // bool HellXmtIdle;
false, // bool HellPulseFast;
// OLIVIA // OLIVIA
2, // int oliviatones; 2, // int oliviatones;
2, // int oliviabw; 2, // int oliviabw;
8, // int oliviasmargin 8, // int oliviasmargin
4, // int oliviasinteg 4, // int oliviasinteg
false, // bool olivia8bit false, // bool olivia8bit
// DEX // THOR
2.0, // double DEX_BW; 2.0, // double THOR_BW;
true, // bool DEX_FILTER; true, // bool THOR_FILTER;
"fldigi-dex ", // string DEXsecText; "fldigi-thor ", // string THORsecText;
5, // int DEX_PATHS; 5, // int THOR_PATHS;
false, // bool DEX_SOFT; false, // bool THOR_SOFT;
// DOMINOEX // DOMINOEX
2.0, // double DOMINOEX_BW; 2.0, // double DOMINOEX_BW;
true, // bool DOMINOEX_FILTER true, // bool DOMINOEX_FILTER
@ -115,6 +120,7 @@ configuration progdefaults = {
"CQ", // string strTextid; "CQ", // string strTextid;
false, // bool macroCWid; false, // bool macroCWid;
1, // int videowidth; 1, // int videowidth;
true, // bool ID_SMALL;
false, // bool macrotextid; false, // bool macrotextid;
0, // int QRZ; 0, // int QRZ;
"", // string QRZusername; "", // string QRZusername;
@ -255,15 +261,16 @@ enum TAG { \
CWTRACK, CWRISETIME, CWDASH2DOT, CWTRACK, CWRISETIME, CWDASH2DOT,
XQSK, CWPRE, CWPOST, CWID, CWIDWPM, XQSK, CWPRE, CWPOST, CWID, CWIDWPM,
OLIVIATONES, OLIVIABW, OLIVIASMARGIN, OLIVIASINTEG, OLIVIA8BIT, OLIVIATONES, OLIVIABW, OLIVIASMARGIN, OLIVIASINTEG, OLIVIA8BIT,
DEXBW, DEXFILTER, DEXSECTEXT, DEXPATHS, DEXSOFT, THORBW, THORFILTER, THORSECTEXT, THORPATHS, THORSOFT,
DOMINOEXBW, DOMINOEXFILTER, DOMINOEXFEC, DOMINOEXPATHS, DOMINOEXBW, DOMINOEXFILTER, DOMINOEXFEC, DOMINOEXPATHS,
FELDFONTNBR, FELDIDLE, FELDFONTNBR, FELDIDLE,
HELLRCVWIDTH, HELLXMTWIDTH, HELLBLACKBOARD, HELLPULSEFAST, HELLXMTIDLE,
WFPREFILTER, LATENCY, WFPREFILTER, LATENCY,
USECURSORLINES, USECURSORCENTERLINE, USEBWTRACKS, USECURSORLINES, USECURSORCENTERLINE, USEBWTRACKS,
CLCOLORS, CLCOLORS,
CCCOLORS, CCCOLORS,
BWTCOLORS, BWTCOLORS,
VIEWXMTSIGNAL, SENDID, MACROID, SENDTEXTID, STRTEXTID, VIDEOWIDTH, VIEWXMTSIGNAL, SENDID, MACROID, SENDTEXTID, STRTEXTID, VIDEOWIDTH, IDSMALL,
QRZTYPE, QRZUSER, QRZPASSWORD, QRZTYPE, QRZUSER, QRZPASSWORD,
BTNUSB, BTNPTTIS, BTNUSB, BTNPTTIS,
RTSPTT, DTRPTT, RTSPLUS, DTRPLUS, RTSPTT, DTRPTT, RTSPLUS, DTRPLUS,
@ -272,7 +279,7 @@ enum TAG { \
HAMRIGNAME, HAMRIGDEVICE, HAMRIGBAUDRATE, HAMRIGNAME, HAMRIGDEVICE, HAMRIGBAUDRATE,
PTTDEV, PTTDEV,
SECONDARYTEXT, SECONDARYTEXT,
AUDIOIO, OSSDEVICE, PADEVICE, PORTINDEVICE, PORTININDEX, PORTOUTDEVICE, PORTOUTINDEX, PULSESERVER, AUDIOIO, OSSDEVICE, PADEVICE, PORTINDEVICE, PORTININTHOR, PORTOUTDEVICE, PORTOUTINTHOR, PULSESERVER,
SAMPLERATE, INSAMPLERATE, OUTSAMPLERATE, SAMPLECONVERTER, RXCORR, TXCORR, TXOFFSET, SAMPLERATE, INSAMPLERATE, OUTSAMPLERATE, SAMPLECONVERTER, RXCORR, TXCORR, TXOFFSET,
USELEADINGZEROS, CONTESTSTART, CONTESTDIGITS, USELEADINGZEROS, CONTESTSTART, CONTESTDIGITS,
USETIMER, MACRONUMBER, TIMEOUT, USETIMER, MACRONUMBER, TIMEOUT,
@ -396,11 +403,11 @@ void configuration::writeDefaultsXML()
writeXMLint(f, "OLIVIASINTEG", oliviasinteg); writeXMLint(f, "OLIVIASINTEG", oliviasinteg);
writeXMLbool(f, "OLIVIA8BIT", olivia8bit); writeXMLbool(f, "OLIVIA8BIT", olivia8bit);
writeXMLdbl(f, "DEXBW", DEX_BW); writeXMLdbl(f, "THORBW", THOR_BW);
writeXMLbool(f, "DEXFILTER", DEX_FILTER); writeXMLbool(f, "THORFILTER", THOR_FILTER);
writeXMLstr(f, "DEXSECTEXT", DEXsecText); writeXMLstr(f, "THORSECTEXT", THORsecText);
writeXMLint(f, "DEXPATHS", DEX_PATHS); writeXMLint(f, "THORPATHS", THOR_PATHS);
writeXMLbool(f, "DEXSOFT", DEX_SOFT); writeXMLbool(f, "THORSOFT", THOR_SOFT);
writeXMLdbl(f, "DOMINOEXBW", DOMINOEX_BW); writeXMLdbl(f, "DOMINOEXBW", DOMINOEX_BW);
writeXMLbool(f, "DOMINOEXFILTER", DOMINOEX_FILTER); writeXMLbool(f, "DOMINOEXFILTER", DOMINOEX_FILTER);
@ -409,6 +416,11 @@ void configuration::writeDefaultsXML()
writeXMLint(f, "FELDFONTNBR", feldfontnbr); writeXMLint(f, "FELDFONTNBR", feldfontnbr);
writeXMLbool(f, "FELDIDLE", FELD_IDLE); writeXMLbool(f, "FELDIDLE", FELD_IDLE);
writeXMLbool(f, "HELLRCVWIDTH", HellRcvWidth);
writeXMLbool(f, "HELLXMTWIDTH", HellXmtWidth);
writeXMLbool(f, "HELLBLACKBOARD", HellBlackboard);
writeXMLbool(f, "HELLPULSEFAST", HellPulseFast);
writeXMLbool(f, "HELLXMTIDLE", HellXmtIdle);
writeXMLint(f, "WFPREFILTER", wfPreFilter); writeXMLint(f, "WFPREFILTER", wfPreFilter);
writeXMLint(f, "LATENCY", latency); writeXMLint(f, "LATENCY", latency);
@ -433,6 +445,7 @@ void configuration::writeDefaultsXML()
writeXMLbool(f, "SENDTEXTID", sendtextid); writeXMLbool(f, "SENDTEXTID", sendtextid);
writeXMLstr(f, "STRTEXTID", strTextid); writeXMLstr(f, "STRTEXTID", strTextid);
writeXMLint(f, "VIDEOWIDTH", videowidth); writeXMLint(f, "VIDEOWIDTH", videowidth);
writeXMLbool(f, "IDSMALL", ID_SMALL);
writeXMLint(f, "QRZTYPE", QRZ); writeXMLint(f, "QRZTYPE", QRZ);
writeXMLstr(f, "QRZUSER", QRZusername); writeXMLstr(f, "QRZUSER", QRZusername);
writeXMLstr(f, "QRZPASSWORD", QRZuserpassword); writeXMLstr(f, "QRZPASSWORD", QRZuserpassword);
@ -456,9 +469,9 @@ void configuration::writeDefaultsXML()
writeXMLstr(f, "OSSDEVICE", OSSdevice); writeXMLstr(f, "OSSDEVICE", OSSdevice);
writeXMLstr(f, "PADEVICE", PAdevice); writeXMLstr(f, "PADEVICE", PAdevice);
writeXMLstr(f, "PORTINDEVICE", PortInDevice); writeXMLstr(f, "PORTINDEVICE", PortInDevice);
writeXMLint(f, "PORTININDEX", PortInIndex); writeXMLint(f, "PORTININTHOR", PortInIndex);
writeXMLstr(f, "PORTOUTDEVICE", PortOutDevice); writeXMLstr(f, "PORTOUTDEVICE", PortOutDevice);
writeXMLint(f, "PORTOUTINDEX", PortOutIndex); writeXMLint(f, "PORTOUTINTHOR", PortOutIndex);
writeXMLstr(f, "PULSESERVER", PulseServer); writeXMLstr(f, "PULSESERVER", PulseServer);
writeXMLint(f, "SAMPLERATE", sample_rate); writeXMLint(f, "SAMPLERATE", sample_rate);
writeXMLint(f, "INSAMPLERATE", in_sample_rate); writeXMLint(f, "INSAMPLERATE", in_sample_rate);
@ -694,20 +707,20 @@ bool configuration::readDefaultsXML()
case OLIVIA8BIT : case OLIVIA8BIT :
olivia8bit = atoi(xml->getNodeData()); olivia8bit = atoi(xml->getNodeData());
break; break;
case DEXBW : case THORBW :
DEX_BW = atof(xml->getNodeData()); THOR_BW = atof(xml->getNodeData());
break; break;
case DEXFILTER : case THORFILTER :
DEX_FILTER = atoi(xml->getNodeData()); THOR_FILTER = atoi(xml->getNodeData());
break; break;
case DEXSECTEXT : case THORSECTEXT :
DEXsecText = xml->getNodeData(); THORsecText = xml->getNodeData();
break; break;
case DEXPATHS : case THORPATHS :
DEX_PATHS = atoi(xml->getNodeData()); THOR_PATHS = atoi(xml->getNodeData());
break; break;
case DEXSOFT : case THORSOFT :
DEX_SOFT = atoi(xml->getNodeData()); THOR_SOFT = atoi(xml->getNodeData());
break; break;
case DOMINOEXBW : case DOMINOEXBW :
DOMINOEX_BW = atof(xml->getNodeData()); DOMINOEX_BW = atof(xml->getNodeData());
@ -727,6 +740,21 @@ bool configuration::readDefaultsXML()
case FELDIDLE : case FELDIDLE :
FELD_IDLE = atoi(xml->getNodeData()); FELD_IDLE = atoi(xml->getNodeData());
break; break;
case HELLRCVWIDTH :
HellRcvWidth = atoi(xml->getNodeData());
break;
case HELLXMTWIDTH :
HellXmtWidth = atoi(xml->getNodeData());
break;
case HELLBLACKBOARD :
HellBlackboard = atoi(xml->getNodeData());
break;
case HELLPULSEFAST :
HellPulseFast = atoi(xml->getNodeData());
break;
case HELLXMTIDLE :
HellXmtIdle = atoi(xml->getNodeData());
break;
case WFPREFILTER : case WFPREFILTER :
wfPreFilter = atoi(xml->getNodeData()); wfPreFilter = atoi(xml->getNodeData());
break; break;
@ -776,6 +804,8 @@ bool configuration::readDefaultsXML()
strTextid = xml->getNodeData(); strTextid = xml->getNodeData();
case VIDEOWIDTH : case VIDEOWIDTH :
videowidth = atoi(xml->getNodeData()); videowidth = atoi(xml->getNodeData());
case IDSMALL :
ID_SMALL = atoi(xml->getNodeData());
case QRZTYPE : case QRZTYPE :
QRZ = atoi(xml->getNodeData()); QRZ = atoi(xml->getNodeData());
break; break;
@ -842,13 +872,13 @@ bool configuration::readDefaultsXML()
case PORTINDEVICE : case PORTINDEVICE :
PortInDevice = xml->getNodeData(); PortInDevice = xml->getNodeData();
break; break;
case PORTININDEX : case PORTININTHOR :
PortInIndex = atoi(xml->getNodeData()); PortInIndex = atoi(xml->getNodeData());
break; break;
case PORTOUTDEVICE : case PORTOUTDEVICE :
PortOutDevice = xml->getNodeData(); PortOutDevice = xml->getNodeData();
break; break;
case PORTOUTINDEX : case PORTOUTINTHOR :
PortOutIndex = atoi(xml->getNodeData()); PortOutIndex = atoi(xml->getNodeData());
break; break;
case PULSESERVER : case PULSESERVER :
@ -1071,17 +1101,22 @@ bool configuration::readDefaultsXML()
else if (!strcmp("OLIVIASMARGIN", nodeName)) tag = OLIVIASMARGIN; else if (!strcmp("OLIVIASMARGIN", nodeName)) tag = OLIVIASMARGIN;
else if (!strcmp("OLIVIASINTEG", nodeName)) tag = OLIVIASINTEG; else if (!strcmp("OLIVIASINTEG", nodeName)) tag = OLIVIASINTEG;
else if (!strcmp("OLIVIA8BIT", nodeName)) tag = OLIVIA8BIT; else if (!strcmp("OLIVIA8BIT", nodeName)) tag = OLIVIA8BIT;
else if (!strcmp("DEXBW", nodeName)) tag = DEXBW; else if (!strcmp("THORBW", nodeName)) tag = THORBW;
else if (!strcmp("DEXFILTER", nodeName)) tag = DEXFILTER; else if (!strcmp("THORFILTER", nodeName)) tag = THORFILTER;
else if (!strcmp("DEXSECTEXT", nodeName)) tag = DEXSECTEXT; else if (!strcmp("THORSECTEXT", nodeName)) tag = THORSECTEXT;
else if (!strcmp("DEXPATHS", nodeName)) tag = DEXPATHS; else if (!strcmp("THORPATHS", nodeName)) tag = THORPATHS;
else if (!strcmp("DEXSOFT", nodeName)) tag = DEXSOFT; else if (!strcmp("THORSOFT", nodeName)) tag = THORSOFT;
else if (!strcmp("DOMINOEXBW", nodeName)) tag = DOMINOEXBW; else if (!strcmp("DOMINOEXBW", nodeName)) tag = DOMINOEXBW;
else if (!strcmp("DOMINOEXFILTER", nodeName)) tag = DOMINOEXFILTER; else if (!strcmp("DOMINOEXFILTER", nodeName)) tag = DOMINOEXFILTER;
else if (!strcmp("DOMINOEXFEC", nodeName)) tag = DOMINOEXFEC; else if (!strcmp("DOMINOEXFEC", nodeName)) tag = DOMINOEXFEC;
else if (!strcmp("DOMINOEXPATHS", nodeName)) tag = DOMINOEXPATHS; else if (!strcmp("DOMINOEXPATHS", nodeName)) tag = DOMINOEXPATHS;
else if (!strcmp("FELDFONTNBR", nodeName)) tag = FELDFONTNBR; else if (!strcmp("FELDFONTNBR", nodeName)) tag = FELDFONTNBR;
else if (!strcmp("FELDIDLE", nodeName)) tag = FELDIDLE; else if (!strcmp("FELDIDLE", nodeName)) tag = FELDIDLE;
else if (!strcmp("HELLRCVWIDTH", nodeName)) tag = HELLRCVWIDTH;
else if (!strcmp("HELLXMTWIDTH", nodeName)) tag = HELLXMTWIDTH;
else if (!strcmp("HELLBLACKBOARD", nodeName)) tag = HELLBLACKBOARD;
else if (!strcmp("HELLPULSEFAST", nodeName)) tag = HELLPULSEFAST;
else if (!strcmp("HELLXMTIDLE", nodeName)) tag = HELLXMTIDLE;
else if (!strcmp("WFPREFILTER", nodeName)) tag = WFPREFILTER; else if (!strcmp("WFPREFILTER", nodeName)) tag = WFPREFILTER;
else if (!strcmp("LATENCY", nodeName)) tag = LATENCY; else if (!strcmp("LATENCY", nodeName)) tag = LATENCY;
else if (!strcmp("USECURSORLINES", nodeName)) tag = USECURSORLINES; else if (!strcmp("USECURSORLINES", nodeName)) tag = USECURSORLINES;
@ -1096,6 +1131,7 @@ bool configuration::readDefaultsXML()
else if (!strcmp("SENDTEXTID", nodeName)) tag = SENDTEXTID; else if (!strcmp("SENDTEXTID", nodeName)) tag = SENDTEXTID;
else if (!strcmp("STRTEXTID", nodeName)) tag = STRTEXTID; else if (!strcmp("STRTEXTID", nodeName)) tag = STRTEXTID;
else if (!strcmp("VIDEOWIDTH", nodeName)) tag = VIDEOWIDTH; else if (!strcmp("VIDEOWIDTH", nodeName)) tag = VIDEOWIDTH;
else if (!strcmp("IDSMALL", nodeName)) tag = IDSMALL;
else if (!strcmp("QRZUSER", nodeName)) tag = QRZUSER; else if (!strcmp("QRZUSER", nodeName)) tag = QRZUSER;
else if (!strcmp("QRZPASSWORD", nodeName)) tag = QRZPASSWORD; else if (!strcmp("QRZPASSWORD", nodeName)) tag = QRZPASSWORD;
else if (!strcmp("QRZTYPE", nodeName)) tag = QRZTYPE; else if (!strcmp("QRZTYPE", nodeName)) tag = QRZTYPE;
@ -1118,9 +1154,9 @@ bool configuration::readDefaultsXML()
else if (!strcmp("OSSDEVICE", nodeName)) tag = OSSDEVICE; else if (!strcmp("OSSDEVICE", nodeName)) tag = OSSDEVICE;
else if (!strcmp("PADEVICE", nodeName)) tag = PADEVICE; else if (!strcmp("PADEVICE", nodeName)) tag = PADEVICE;
else if (!strcmp("PORTINDEVICE", nodeName)) tag = PORTINDEVICE; else if (!strcmp("PORTINDEVICE", nodeName)) tag = PORTINDEVICE;
else if (!strcmp("PORTININDEX", nodeName)) tag = PORTININDEX; else if (!strcmp("PORTININTHOR", nodeName)) tag = PORTININTHOR;
else if (!strcmp("PORTOUTDEVICE", nodeName)) tag = PORTOUTDEVICE; else if (!strcmp("PORTOUTDEVICE", nodeName)) tag = PORTOUTDEVICE;
else if (!strcmp("PORTOUTINDEX", nodeName)) tag = PORTOUTINDEX; else if (!strcmp("PORTOUTINTHOR", nodeName)) tag = PORTOUTINTHOR;
else if (!strcmp("SAMPLERATE", nodeName)) tag = SAMPLERATE; else if (!strcmp("SAMPLERATE", nodeName)) tag = SAMPLERATE;
else if (!strcmp("INSAMPLERATE", nodeName)) tag = INSAMPLERATE; else if (!strcmp("INSAMPLERATE", nodeName)) tag = INSAMPLERATE;
else if (!strcmp("OUTSAMPLERATE", nodeName)) tag = OUTSAMPLERATE; else if (!strcmp("OUTSAMPLERATE", nodeName)) tag = OUTSAMPLERATE;
@ -1261,7 +1297,7 @@ void configuration::saveDefaults() {
myQth = inpMyQth->value(); myQth = inpMyQth->value();
myLocator = inpMyLocator->value(); myLocator = inpMyLocator->value();
secText = txtSecondary->value(); secText = txtSecondary->value();
DEXsecText = txtDEXSecondary->value(); THORsecText = txtTHORSecondary->value();
PTTdev = inpTTYdev->value(); PTTdev = inpTTYdev->value();
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
@ -1290,11 +1326,11 @@ int configuration::setDefaults() {
txtSecondary->value(secText.c_str()); txtSecondary->value(secText.c_str());
txtDEXSecondary->value(DEXsecText.c_str()); txtTHORSecondary->value(THORsecText.c_str());
valDEX_BW->value(DEX_BW); valTHOR_BW->value(THOR_BW);
valDEX_FILTER->value(DEX_FILTER); valTHOR_FILTER->value(THOR_FILTER);
valDEX_PATHS->value(DEX_PATHS); valTHOR_PATHS->value(THOR_PATHS);
valDEX_SOFT->value(DEX_SOFT); valTHOR_SOFT->value(THOR_SOFT);
valDominoEX_BW->value(DOMINOEX_BW); valDominoEX_BW->value(DOMINOEX_BW);
valDominoEX_FILTER->value(DOMINOEX_FILTER); valDominoEX_FILTER->value(DOMINOEX_FILTER);
@ -1429,7 +1465,8 @@ int configuration::setDefaults() {
btnRTTY_USB->value(RTTY_USB); btnRTTY_USB->value(RTTY_USB);
btnsendid->value(sendid); btnsendid->value(sendid);
btnsendvideotext->value(sendtextid); btnsendvideotext->value(sendtextid);
chkID_SMALL->value(ID_SMALL);
FL_UNLOCK(); FL_UNLOCK();
ReceiveText->setFont((Fl_Font)RxFontnbr); ReceiveText->setFont((Fl_Font)RxFontnbr);

Wyświetl plik

@ -1,5 +1,5 @@
// //
// dex.cxx -- dex modem // thor.cxx -- thor modem
// //
// Copyright (C) 2008 // Copyright (C) 2008
// David Freese (w1hkj@w1hkj.com) // David Freese (w1hkj@w1hkj.com)
@ -28,19 +28,19 @@
#include "confdialog.h" #include "confdialog.h"
#include "status.h" #include "status.h"
#include "dex.h" #include "thor.h"
#include "trx.h" #include "trx.h"
#include "fft.h" #include "fft.h"
#include "filters.h" #include "filters.h"
#include "misc.h" #include "misc.h"
#include "sound.h" #include "sound.h"
#include "dexvaricode.h" #include "thorvaricode.h"
using namespace std; using namespace std;
char dexmsg[80]; char thormsg[80];
void dex::tx_init(SoundBase *sc) void thor::tx_init(SoundBase *sc)
{ {
scard = sc; scard = sc;
txstate = TX_STATE_PREAMBLE; txstate = TX_STATE_PREAMBLE;
@ -49,13 +49,13 @@ void dex::tx_init(SoundBase *sc)
counter = 0; counter = 0;
txphase = 0; txphase = 0;
videoText(); videoText();
strSecXmtText = progdefaults.DEXsecText; strSecXmtText = progdefaults.THORsecText;
if (strSecXmtText.length() == 0) if (strSecXmtText.length() == 0)
strSecXmtText = "fldigi "PACKAGE_VERSION" "; strSecXmtText = "fldigi "PACKAGE_VERSION" ";
cptr = 0; cptr = 0;
} }
void dex::rx_init() void thor::rx_init()
{ {
synccounter = 0; synccounter = 0;
symcounter = 0; symcounter = 0;
@ -64,7 +64,7 @@ void dex::rx_init()
counter = 0; counter = 0;
phase[0] = 0.0; phase[0] = 0.0;
currmag = prev1mag = prev2mag = 0.0; currmag = prev1mag = prev2mag = 0.0;
for (int i = 0; i < DEXMAXFFTS; i++) for (int i = 0; i < THORMAXFFTS; i++)
phase[i+1] = 0.0; phase[i+1] = 0.0;
put_MODEstatus(mode); put_MODEstatus(mode);
put_sec_char(0); put_sec_char(0);
@ -72,25 +72,25 @@ void dex::rx_init()
datashreg = 1; datashreg = 1;
} }
void dex::reset_filters() void thor::reset_filters()
{ {
// fft filter at first IF frequency // fft filter at first IF frequency
if (progdefaults.DEX_FILTER == false) { if (progdefaults.THOR_FILTER == false) {
fft->create_filter( (DEXFIRSTIF - 2.0 * bandwidth) / samplerate, fft->create_filter( (THORFIRSTIF - 2.0 * bandwidth) / samplerate,
(DEXFIRSTIF + 2.0 * bandwidth)/ samplerate ); (THORFIRSTIF + 2.0 * bandwidth)/ samplerate );
} else { } else {
fft->create_filter( (DEXFIRSTIF - 0.5 * progdefaults.DEX_BW * bandwidth) / samplerate, fft->create_filter( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate,
(DEXFIRSTIF + 0.5 * progdefaults.DEX_BW * bandwidth)/ samplerate ); (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate );
} }
filter_reset = false; filter_reset = false;
} }
void dex::restart() void thor::restart()
{ {
filter_reset = true; filter_reset = true;
} }
void dex::init() void thor::init()
{ {
modem::init(); modem::init();
reset_filters(); reset_filters();
@ -99,15 +99,15 @@ void dex::init()
set_scope_mode(Digiscope::DOMDATA); set_scope_mode(Digiscope::DOMDATA);
} }
dex::~dex() thor::~thor()
{ {
if (hilbert) delete hilbert; if (hilbert) delete hilbert;
for (int i = 0; i < DEXMAXFFTS; i++) { for (int i = 0; i < THORMAXFFTS; i++) {
if (binsfft[i]) delete binsfft[i]; if (binsfft[i]) delete binsfft[i];
} }
for (int i = 0; i < DEXSCOPESIZE; i++) { for (int i = 0; i < THORSCOPESIZE; i++) {
if (vidfilter[i]) delete vidfilter[i]; if (vidfilter[i]) delete vidfilter[i];
} }
if (syncfilter) delete syncfilter; if (syncfilter) delete syncfilter;
@ -122,7 +122,7 @@ dex::~dex()
} }
dex::dex(trx_mode md) thor::thor(trx_mode md)
{ {
int basetone, lotone, hitone; int basetone, lotone, hitone;
@ -130,42 +130,42 @@ dex::dex(trx_mode md)
switch (mode) { switch (mode) {
// 11.025 kHz modes // 11.025 kHz modes
case MODE_DEX5: case MODE_THOR5:
symlen = 2048; symlen = 2048;
doublespaced = 1; doublespaced = 1;
samplerate = 11025; samplerate = 11025;
break; break;
case MODE_DEX11: case MODE_THOR11:
symlen = 1024; symlen = 1024;
doublespaced = 0; doublespaced = 0;
samplerate = 11025; samplerate = 11025;
break; break;
case MODE_DSX11: case MODE_TSOR11:
symlen = 1024; symlen = 1024;
doublespaced = 1; doublespaced = 1;
samplerate = 11025; samplerate = 11025;
break; break;
case MODE_DEX22: case MODE_THOR22:
symlen = 512; symlen = 512;
doublespaced = 0; doublespaced = 0;
samplerate = 11025; samplerate = 11025;
break; break;
// 8kHz modes // 8kHz modes
case MODE_DEX4: case MODE_THOR4:
symlen = 2048; symlen = 2048;
doublespaced = 1; doublespaced = 1;
samplerate = 8000; samplerate = 8000;
break; break;
case MODE_DEX8: case MODE_THOR8:
symlen = 1024; symlen = 1024;
doublespaced = 1; doublespaced = 1;
samplerate = 8000; samplerate = 8000;
break; break;
case MODE_DEX16: case MODE_THOR16:
default: default:
symlen = 512; symlen = 512;
doublespaced = 0; doublespaced = 0;
@ -173,37 +173,37 @@ dex::dex(trx_mode md)
} }
basetone = (int)floor(DEXBASEFREQ * symlen / samplerate + 0.5); basetone = (int)floor(THORBASEFREQ * symlen / samplerate + 0.5);
lotone = basetone - (DEXNUMMTONES/2) * (doublespaced ? 2 : 1); lotone = basetone - (THORNUMMTONES/2) * (doublespaced ? 2 : 1);
hitone = basetone + 3 * (DEXNUMMTONES/2) * (doublespaced ? 2 : 1); hitone = basetone + 3 * (THORNUMMTONES/2) * (doublespaced ? 2 : 1);
tonespacing = (double) (samplerate * ((doublespaced) ? 2 : 1)) / symlen; tonespacing = (double) (samplerate * ((doublespaced) ? 2 : 1)) / symlen;
bandwidth = DEXNUMMTONES * tonespacing; bandwidth = THORNUMMTONES * tonespacing;
hilbert = new C_FIR_filter(); hilbert = new C_FIR_filter();
hilbert->init_hilbert(37, 1); hilbert->init_hilbert(37, 1);
paths = progdefaults.DEX_PATHS; paths = progdefaults.THOR_PATHS;
for (int i = 0; i < DEXMAXFFTS; i++) for (int i = 0; i < THORMAXFFTS; i++)
binsfft[i] = new sfft (symlen, lotone, hitone); binsfft[i] = new sfft (symlen, lotone, hitone);
// fft filter at first if frequency // fft filter at first if frequency
fft = new fftfilt( (DEXFIRSTIF - 0.5 * progdefaults.DEX_BW * bandwidth) / samplerate, fft = new fftfilt( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate,
(DEXFIRSTIF + 0.5 * progdefaults.DEX_BW * bandwidth)/ samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate,
1024 ); 1024 );
for (int i = 0; i < DEXSCOPESIZE; i++) for (int i = 0; i < THORSCOPESIZE; i++)
vidfilter[i] = new Cmovavg(16); vidfilter[i] = new Cmovavg(16);
syncfilter = new Cmovavg(8); syncfilter = new Cmovavg(8);
twosym = 2 * symlen; twosym = 2 * symlen;
pipe = new DEXrxpipe[twosym]; pipe = new THORrxpipe[twosym];
scopedata.alloc(DEXSCOPESIZE); scopedata.alloc(THORSCOPESIZE);
videodata.alloc((DEXMAXFFTS * DEXNUMMTONES * 2 * (doublespaced?2:1) )); videodata.alloc((THORMAXFFTS * THORNUMMTONES * 2 * (doublespaced?2:1) ));
pipeptr = 0; pipeptr = 0;
@ -216,8 +216,8 @@ dex::dex(trx_mode md)
prev1symbol = prev2symbol = 0; prev1symbol = prev2symbol = 0;
Enc = new encoder (DEX_K, DEX_POLY1, DEX_POLY2); Enc = new encoder (THOR_K, THOR_POLY1, THOR_POLY2);
Dec = new viterbi (DEX_K, DEX_POLY1, DEX_POLY2); Dec = new viterbi (THOR_K, THOR_POLY1, THOR_POLY2);
Dec->settraceback (45); Dec->settraceback (45);
Dec->setchunksize (1); Dec->setchunksize (1);
Txinlv = new interleave (4, INTERLEAVE_FWD); // 4x4x10 Txinlv = new interleave (4, INTERLEAVE_FWD); // 4x4x10
@ -232,17 +232,17 @@ dex::dex(trx_mode md)
//===================================================================== //=====================================================================
// rx modules // rx modules
complex dex::mixer(int n, complex in) complex thor::mixer(int n, complex in)
{ {
complex z; complex z;
double f; double f;
// first IF mixer (n == 0) plus // first IF mixer (n == 0) plus
// DEXMAXFFTS mixers are supported each separated by 1/DEXMAXFFTS bin size // THORMAXFFTS mixers are supported each separated by 1/THORMAXFFTS bin size
// n == 1, 2, 3, 4 ... DEXMAXFFTS // n == 1, 2, 3, 4 ... THORMAXFFTS
if (n == 0) if (n == 0)
f = frequency - DEXFIRSTIF; f = frequency - THORFIRSTIF;
else else
f = DEXFIRSTIF - DEXBASEFREQ - bandwidth/2 + (samplerate / symlen) * (1.0 * n / paths ); f = THORFIRSTIF - THORBASEFREQ - bandwidth/2 + (samplerate / symlen) * (1.0 * n / paths );
z.re = cos(phase[n]); z.re = cos(phase[n]);
z.im = sin(phase[n]); z.im = sin(phase[n]);
z = z * in; z = z * in;
@ -254,7 +254,7 @@ complex dex::mixer(int n, complex in)
return z; return z;
} }
void dex::recvchar(int c) void thor::recvchar(int c)
{ {
if (c == -1) if (c == -1)
return; return;
@ -268,7 +268,7 @@ void dex::recvchar(int c)
// Receive // Receive
//============================================================================= //=============================================================================
void dex::decodePairs(unsigned char symbol) void thor::decodePairs(unsigned char symbol)
{ {
int c, ch, met; int c, ch, met;
@ -289,13 +289,13 @@ void dex::decodePairs(unsigned char symbol)
datashreg = (datashreg << 1) | !!c; datashreg = (datashreg << 1) | !!c;
if ((datashreg & 7) == 1) { if ((datashreg & 7) == 1) {
ch = dexvaridec(datashreg >> 1); ch = thorvaridec(datashreg >> 1);
recvchar(ch); recvchar(ch);
datashreg = 1; datashreg = 1;
} }
} }
void dex::decodeEX(int ch) void thor::decodeEX(int ch)
{ {
unsigned char symbols[4]; unsigned char symbols[4];
int c = ch; int c = ch;
@ -312,7 +312,7 @@ void dex::decodeEX(int ch)
} }
void dex::decodesymbol() void thor::decodesymbol()
{ {
int c; int c;
double fdiff; double fdiff;
@ -324,7 +324,7 @@ void dex::decodesymbol()
if (doublespaced) fdiff /= 2 * paths; if (doublespaced) fdiff /= 2 * paths;
else fdiff /= paths; else fdiff /= paths;
c = (int)floor(fdiff + .5) - 2; c = (int)floor(fdiff + .5) - 2;
if (c < 0) c += DEXNUMMTONES; if (c < 0) c += THORNUMMTONES;
// decodeEX(c); // decodeEX(c);
@ -335,7 +335,7 @@ void dex::decodesymbol()
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
// hard symbol decode // hard symbol decode
if (progdefaults.DEX_SOFT == false) { if (progdefaults.THOR_SOFT == false) {
if ((c & 1) == 1) symbols[3-i] = 255; if ((c & 1) == 1) symbols[3-i] = 255;
else symbols[3-i] = 1; else symbols[3-i] = 1;
// soft symbol decode // soft symbol decode
@ -351,11 +351,11 @@ void dex::decodesymbol()
} }
int dex::harddecode() int thor::harddecode()
{ {
double x, max = 0.0; double x, max = 0.0;
int symbol = 0; int symbol = 0;
for (int i = 0; i < (paths * DEXNUMMTONES * 2 * (doublespaced ? 2 : 1) ); i++) { for (int i = 0; i < (paths * THORNUMMTONES * 2 * (doublespaced ? 2 : 1) ); i++) {
x = pipe[pipeptr].vector[i].mag(); x = pipe[pipeptr].vector[i].mag();
if (x > max) { if (x > max) {
max = x; max = x;
@ -365,22 +365,22 @@ int dex::harddecode()
return symbol; return symbol;
} }
void dex::update_syncscope() void thor::update_syncscope()
{ {
double max = 0, min = 1e6, range, mag; double max = 0, min = 1e6, range, mag;
// dom waterfall // dom waterfall
memset(videodata, 0, (paths * DEXNUMMTONES * 2 * (doublespaced?2:1) ) * sizeof(double)); memset(videodata, 0, (paths * THORNUMMTONES * 2 * (doublespaced?2:1) ) * sizeof(double));
if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) {
for (int i = 0; i < (paths * DEXNUMMTONES * 2 * (doublespaced?2:1) ); i++ ) { for (int i = 0; i < (paths * THORNUMMTONES * 2 * (doublespaced?2:1) ); i++ ) {
mag = pipe[pipeptr].vector[i].mag(); mag = pipe[pipeptr].vector[i].mag();
if (max < mag) max = mag; if (max < mag) max = mag;
if (min > mag) min = mag; if (min > mag) min = mag;
} }
range = max - min; range = max - min;
for (int i = 0; i < (paths * DEXNUMMTONES * 2 * (doublespaced?2:1) ); i++ ) { for (int i = 0; i < (paths * THORNUMMTONES * 2 * (doublespaced?2:1) ); i++ ) {
if (range > 2) { if (range > 2) {
mag = (pipe[pipeptr].vector[i].mag() - min) / range + 0.0001; mag = (pipe[pipeptr].vector[i].mag() - min) / range + 0.0001;
mag = 1 + 2 * log10(mag); mag = 1 + 2 * log10(mag);
@ -390,24 +390,24 @@ void dex::update_syncscope()
videodata[i] = 255*mag; videodata[i] = 255*mag;
} }
} }
set_video(videodata, (paths * DEXNUMMTONES * 2 * (doublespaced?2:1) ), false); set_video(videodata, (paths * THORNUMMTONES * 2 * (doublespaced?2:1) ), false);
videodata.next(); videodata.next();
// set_scope(scopedata, twosym); // set_scope(scopedata, twosym);
// 64 data points is sufficient to show the signal progression through the // 64 data points is sufficient to show the signal progression through the
// convolution filter. // convolution filter.
memset(scopedata, 0, DEXSCOPESIZE * sizeof(double)); memset(scopedata, 0, THORSCOPESIZE * sizeof(double));
if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) {
for (unsigned int i = 0, j = 0; i < DEXSCOPESIZE; i++) { for (unsigned int i = 0, j = 0; i < THORSCOPESIZE; i++) {
j = (pipeptr + i * twosym / DEXSCOPESIZE + 1) % (twosym); j = (pipeptr + i * twosym / THORSCOPESIZE + 1) % (twosym);
scopedata[i] = vidfilter[i]->run(pipe[j].vector[prev1symbol].mag()); scopedata[i] = vidfilter[i]->run(pipe[j].vector[prev1symbol].mag());
} }
} }
set_scope(scopedata, DEXSCOPESIZE); set_scope(scopedata, THORSCOPESIZE);
scopedata.next(); scopedata.next();
} }
void dex::synchronize() void thor::synchronize()
{ {
// int syn = -1; // int syn = -1;
double syn = -1; double syn = -1;
@ -428,20 +428,20 @@ void dex::synchronize()
} }
syn = syncfilter->run(syn); syn = syncfilter->run(syn);
synccounter += (int) floor(1.0 * (syn - symlen) / DEXNUMMTONES + 0.5); synccounter += (int) floor(1.0 * (syn - symlen) / THORNUMMTONES + 0.5);
} }
void dex::eval_s2n() void thor::eval_s2n()
{ {
if (currsymbol != prev1symbol && prev1symbol != prev2symbol) { if (currsymbol != prev1symbol && prev1symbol != prev2symbol) {
sig = pipe[pipeptr].vector[currsymbol].mag(); sig = pipe[pipeptr].vector[currsymbol].mag();
noise = 0.0; noise = 0.0;
for (int i = 0; i < paths * DEXNUMMTONES * 2 * (doublespaced?2:1); i++) { for (int i = 0; i < paths * THORNUMMTONES * 2 * (doublespaced?2:1); i++) {
if (i != currsymbol) if (i != currsymbol)
noise += pipe[pipeptr].vector[i].mag(); noise += pipe[pipeptr].vector[i].mag();
} }
noise /= (paths * DEXNUMMTONES * 2 * (doublespaced?2:1) - 1); noise /= (paths * THORNUMMTONES * 2 * (doublespaced?2:1) - 1);
if (noise) if (noise)
s2n = decayavg( s2n, sig / noise, 8); s2n = decayavg( s2n, sig / noise, 8);
@ -450,20 +450,20 @@ void dex::eval_s2n()
display_metric(metric); display_metric(metric);
snprintf(dexmsg, sizeof(dexmsg), "s/n %3.0f dB", metric / 3.0 - 2.0); snprintf(thormsg, sizeof(thormsg), "s/n %3.0f dB", metric / 3.0 - 2.0);
put_Status1(dexmsg); put_Status1(thormsg);
} }
} }
int dex::rx_process(const double *buf, int len) int thor::rx_process(const double *buf, int len)
{ {
complex zref, z, *zp, *bins = 0; complex zref, z, *zp, *bins = 0;
int n; int n;
if (filter_reset) reset_filters(); if (filter_reset) reset_filters();
if (paths != progdefaults.DEX_PATHS) { if (paths != progdefaults.THOR_PATHS) {
paths = progdefaults.DEX_PATHS; paths = progdefaults.THOR_PATHS;
reset_filters(); reset_filters();
} }
@ -477,14 +477,14 @@ int dex::rx_process(const double *buf, int len)
if (n) { if (n) {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
// process DEXMAXFFTS sets of sliding FFTs spaced at 1/DEXMAXFFTS bin intervals each of which // process THORMAXFFTS sets of sliding FFTs spaced at 1/THORMAXFFTS bin intervals each of which
// is a matched filter for the current symbol length // is a matched filter for the current symbol length
for (int n = 0; n < paths; n++) { for (int n = 0; n < paths; n++) {
// shift in frequency to base band for the sliding DFTs // shift in frequency to base band for the sliding DFTs
z = mixer(n + 1, zp[i]); z = mixer(n + 1, zp[i]);
bins = binsfft[n]->run(z); bins = binsfft[n]->run(z);
// copy current vector to the pipe interleaving the FFT vectors // copy current vector to the pipe interleaving the FFT vectors
for (int i = 0; i < DEXNUMMTONES * 2 * (doublespaced ? 2 : 1); i++) { for (int i = 0; i < THORNUMMTONES * 2 * (doublespaced ? 2 : 1); i++) {
pipe[pipeptr].vector[n + paths * i] = bins[i]; pipe[pipeptr].vector[n + paths * i] = bins[i];
} }
} }
@ -516,7 +516,7 @@ int dex::rx_process(const double *buf, int len)
// Transmit methods // Transmit methods
//============================================================================= //=============================================================================
int dex::get_secondary_char() int thor::get_secondary_char()
{ {
char chr; char chr;
if (cptr > strSecXmtText.length()) cptr = 0; if (cptr > strSecXmtText.length()) cptr = 0;
@ -525,7 +525,7 @@ int dex::get_secondary_char()
return chr; return chr;
} }
void dex::sendtone(int tone, int duration) void thor::sendtone(int tone, int duration)
{ {
double f, phaseincr; double f, phaseincr;
f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2;
@ -543,25 +543,25 @@ void dex::sendtone(int tone, int duration)
} }
} }
void dex::sendsymbol(int sym) void thor::sendsymbol(int sym)
{ {
complex z; complex z;
int tone; int tone;
tone = (txprevtone + 2 + sym) % DEXNUMMTONES; tone = (txprevtone + 2 + sym) % THORNUMMTONES;
txprevtone = tone; txprevtone = tone;
if (reverse) if (reverse)
tone = (DEXNUMMTONES - 1) - tone; tone = (THORNUMMTONES - 1) - tone;
sendtone(tone, 1); sendtone(tone, 1);
} }
// Send DEX FEC varicode // Send THOR FEC varicode
void dex::sendchar(unsigned char c, int secondary) void thor::sendchar(unsigned char c, int secondary)
{ {
const char *code; const char *code;
code = dexvarienc(c, secondary); code = thorvarienc(c, secondary);
while (*code) { while (*code) {
int data = Enc->encode(*code++ - '0'); int data = Enc->encode(*code++ - '0');
@ -580,18 +580,18 @@ void dex::sendchar(unsigned char c, int secondary)
put_echo_char(c); put_echo_char(c);
} }
void dex::sendidle() void thor::sendidle()
{ {
sendchar(0, 0); // <NUL> sendchar(0, 0); // <NUL>
} }
void dex::sendsecondary() void thor::sendsecondary()
{ {
int c = get_secondary_char(); int c = get_secondary_char();
sendchar(c & 0xFF, 1); sendchar(c & 0xFF, 1);
} }
void dex::Clearbits() void thor::Clearbits()
{ {
int data = Enc->encode(0); int data = Enc->encode(0);
for (int k = 0; k < 100; k++) { for (int k = 0; k < 100; k++) {
@ -607,7 +607,7 @@ void dex::Clearbits()
} }
} }
void dex::flushtx() void thor::flushtx()
{ {
// flush the varicode decoder at the other end // flush the varicode decoder at the other end
// flush the convolutional encoder and interleaver // flush the convolutional encoder and interleaver
@ -616,7 +616,7 @@ void dex::flushtx()
bitstate = 0; bitstate = 0;
} }
int dex::tx_process() int thor::tx_process()
{ {
int i; int i;
@ -624,12 +624,12 @@ int dex::tx_process()
case TX_STATE_PREAMBLE: case TX_STATE_PREAMBLE:
Clearbits(); Clearbits();
for (int j = 0; j < 16; j++) sendsymbol(0); for (int j = 0; j < 16; j++) sendsymbol(0);
// sendtone(DEXNUMMTONES/2, 4); // sendtone(THORNUMMTONES/2, 4);
// for (int k = 0; k < 3; k++) { // for (int k = 0; k < 3; k++) {
// sendtone(DEXNUMMTONES, 3); // sendtone(THORNUMMTONES, 3);
// sendtone(0, 3); // sendtone(0, 3);
// } // }
// sendtone(DEXNUMMTONES/2, 4); // sendtone(THORNUMMTONES/2, 4);
sendidle(); sendidle();
txstate = TX_STATE_START; txstate = TX_STATE_START;

Wyświetl plik

@ -1,6 +1,6 @@
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// //
// dexvaricode.cxx -- DEX Varicode // thorvaricode.cxx -- THOR Varicode
// //
// Copyright (C) 2009 // Copyright (C) 2009
// Dave Freese, W1HKJ // Dave Freese, W1HKJ
@ -25,9 +25,9 @@
#include <config.h> #include <config.h>
#include "mfskvaricode.h" #include "mfskvaricode.h"
#include "dexvaricode.h" #include "thorvaricode.h"
// DEX varicode is an extended set of the IZ8BLY MFSK varicode that uses the // THOR varicode is an extended set of the IZ8BLY MFSK varicode that uses the
// unallocated remaining 12 bit codes for a secondary character set. // unallocated remaining 12 bit codes for a secondary character set.
// Primary character set (same as MFSK) // Primary character set (same as MFSK)
@ -37,7 +37,7 @@
// encoding table // encoding table
static const char *dex_varicode[] = { static const char *thor_varicode[] = {
"101110000000", /* 032 - <SPC> */ "101110000000", /* 032 - <SPC> */
"101110100000", /* 033 - ! */ "101110100000", /* 033 - ! */
"101110101000", /* 034 - '"' */ "101110101000", /* 034 - '"' */
@ -152,7 +152,7 @@ static char *unused[] = {
// decoding table // decoding table
static const unsigned int dex_varidecode[] = { static const unsigned int thor_varidecode[] = {
0xB80, 0xBA0, 0xBA8, 0xBAC, 0xBB0, 0xBB4, 0xBB8, 0xBBC, 0xB80, 0xBA0, 0xBA8, 0xBAC, 0xBB0, 0xBB4, 0xBB8, 0xBBC,
0xBC0, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE8, 0xBEC, 0xBC0, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE8, 0xBEC,
0xBF0, 0xBF4, 0xBF8, 0xBFC, 0xC00, 0xD00, 0xD40, 0xD54, 0xBF0, 0xBF4, 0xBF8, 0xBFC, 0xC00, 0xD00, 0xD40, 0xD54,
@ -167,18 +167,18 @@ static const unsigned int dex_varidecode[] = {
0xFA8, 0xFAC, 0xFB0 0xFA8, 0xFAC, 0xFB0
}; };
const char *dexvarienc(int c, int sec) const char *thorvarienc(int c, int sec)
{ {
if (sec == 0) if (sec == 0)
return varienc(c); // mfsk varicode return varienc(c); // mfsk varicode
else else
if (c >= ' ' && c <= 'z') if (c >= ' ' && c <= 'z')
return dex_varicode[c - ' ']; return thor_varicode[c - ' '];
return varienc(0); // return code for NULL if not in tables return varienc(0); // return code for NULL if not in tables
} }
int dexvaridec(unsigned int symbol) int thorvaridec(unsigned int symbol)
{ {
int i; int i;
@ -186,7 +186,7 @@ int dexvaridec(unsigned int symbol)
return varidec(symbol); // find in the MFSK decode table return varidec(symbol); // find in the MFSK decode table
for (i = 0; i < 92; i++) for (i = 0; i < 92; i++)
if (symbol == dex_varidecode[i]) if (symbol == thor_varidecode[i])
return (' ' + i + 0x100); // found in the extended decode table return (' ' + i + 0x100); // found in the extended decode table
return -1; // not found return -1; // not found

Wyświetl plik

@ -37,13 +37,13 @@ modem *qpsk125_modem = 0;
modem *qpsk250_modem = 0; modem *qpsk250_modem = 0;
modem *olivia_modem = 0; modem *olivia_modem = 0;
modem *rtty_modem = 0; modem *rtty_modem = 0;
modem *dex4_modem = 0; modem *thor4_modem = 0;
modem *dex5_modem = 0; modem *thor5_modem = 0;
modem *dex8_modem = 0; modem *thor8_modem = 0;
modem *dex11_modem = 0; modem *thor11_modem = 0;
modem *dsx11_modem = 0; modem *tsor11_modem = 0;
modem *dex16_modem = 0; modem *thor16_modem = 0;
modem *dex22_modem = 0; modem *thor22_modem = 0;
modem *dominoex4_modem = 0; modem *dominoex4_modem = 0;
modem *dominoex5_modem = 0; modem *dominoex5_modem = 0;
modem *dominoex8_modem = 0; modem *dominoex8_modem = 0;
@ -278,263 +278,6 @@ void modem::videoText()
} }
} }
//=====================================================================
// transmit processing of waterfall video id
//=====================================================================
#define MAXCHARS 4
#define NUMCOLS 8
#define NUMROWS 14
#define CHARSPACE 2
#define TONESPACING 8
#define IDSYMLEN 2048
#define RISETIME 20
struct mfntchr { char c; int byte[14];};//NUMROWS]; };
extern mfntchr idch[];
C_FIR_filter vidfilt;
void modem::wfid_make_pulse()
{
double risetime = (samplerate / 1000) * RISETIME;
for (int i = 0; i < IDSYMLEN; i++)
wfid_txpulse[i] = 1.0;
for (int i = 0; i < risetime; i++)
wfid_txpulse[i] = wfid_txpulse[IDSYMLEN - 1 - i] =
0.5 * (1 - cos(M_PI * i / risetime));
}
void modem::wfid_make_tones()
{
double f, flo, fhi;
f = TONESPACING * ( progdefaults.videowidth * (NUMCOLS - 1) + (progdefaults.videowidth) * CHARSPACE) / 2.0;
f = 2.0 * floor((frequency + f)/2.0);
fhi = f + 2 * TONESPACING;
flo = f - (progdefaults.videowidth * (NUMCOLS + CHARSPACE) + 2) * TONESPACING;
for (int i = 0; i < NUMCOLS * progdefaults.videowidth; i++) {
wfid_w[i] = f * 2.0 * M_PI / samplerate;
f -= TONESPACING;
if ( (i > 0) && (i % NUMCOLS == 0) )
f -= TONESPACING * CHARSPACE;
}
vidfilt.init_bandpass( 1024, 1, flo/samplerate, fhi/samplerate) ;
}
void modem::wfid_send(long int symbol)
{
int i, j;
int sym;
double val;
for (i = 0; i < IDSYMLEN; i++) {
wfid_outbuf[i] = 0.0;
val = 0.0;
sym = symbol;
for (j = 0; j < NUMCOLS * progdefaults.videowidth; j++) {
if ((sym & 1) == 1)
val += sin(wfid_w[j] * i);
sym = sym >> 1;
}
// soft limit the signal
wfid_outbuf[i] = 0.707 * (1.0 - exp(fabs(val)/-3.0)) * (val >= 0.0 ? 1 : -1);
}
// band pass filter the hard limited signal
for (i = 0; i < IDSYMLEN; i++) {
val = wfid_outbuf[i];
vidfilt.Irun (val, val);
wfid_outbuf[i] = val * wfid_txpulse[i];
}
ModulateXmtr(wfid_outbuf, IDSYMLEN);
}
void modem::wfid_sendchar(char c)
{
// send rows from bottom to top so they appear to scroll down the waterfall correctly
long int symbol;
unsigned int n;
if (c < ' ' || c > '~') return;
n = c - ' ';
for (int row = 0; row < NUMROWS; row++) {
symbol = (idch[n].byte[NUMROWS - 1 - row]) >> (16 - NUMCOLS);
wfid_send (symbol);
if (stopflag)
return;
}
}
void modem::wfid_sendchars(string s)
{
long int symbol;
int len;
unsigned int n[progdefaults.videowidth];
int c;
while (s[0] == ' ') s.erase(0);
len = s.length();
for (int i = 0; i < len; i++) { //progdefaults.videowidth; i++) {
c = s[i];
if (c > '~' || c < ' ') c = ' ';
c -= ' ';
n[i] = c;
}
// send rows from bottom to top so they appear to scroll down the waterfall correctly
for (int row = 0; row < NUMROWS; row++) {
symbol = 0;
for (int i = 0; i < len; i++) {//progdefaults.videowidth; i++) {
symbol |= (idch[n[i]].byte[NUMROWS - 1 -row] >> (16 - NUMCOLS));
if (i != (len - 1) )
symbol = symbol << NUMCOLS;
}
if (len < progdefaults.videowidth)
symbol = symbol << NUMCOLS * (progdefaults.videowidth - len) / 2;
wfid_send (symbol);
if (stopflag)
return;
}
}
void modem::wfid_text(string s)
{
int len = s.length();
string video = "Video text: ";
video += s;
wfid_make_pulse();
wfid_make_tones();
put_status(video.c_str());
if (progdefaults.videowidth == 1) {
for (int i = len - 1; i >= 0; i--) {
wfid_sendchar(s[i]);
}
} else {
int numlines = 0;
string tosend;
while (numlines < len) numlines += progdefaults.videowidth;
numlines -= progdefaults.videowidth;
while (numlines >= 0) {
tosend = s.substr(numlines, progdefaults.videowidth);
wfid_sendchars(tosend);
numlines -= progdefaults.videowidth;
if (stopflag)
break;
}
}
put_status("");
}
double modem::wfid_txpulse[IDSYMLEN];
double modem::wfid_outbuf[IDSYMLEN];
double modem::wfid_w[NUMCOLS * MAXCHARS];
mfntchr idch[] = {
{' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, },
{'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, },
{'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, },
{'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, },
{'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, },
{ 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, },
{')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, },
{'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, },
{',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000 }, },
{'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, },
{'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'0', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8C00, 0x9C00, 0xB400, 0xE400, 0xC400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'1', { 0x0000, 0x0000, 0x1000, 0x3000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'2', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'3', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0C00, 0x1800, 0x1C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'4', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4800, 0xC800, 0x8800, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{'5', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'6', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'7', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'8', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'9', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7800, 0x0000, 0x0000 }, },
{':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, },
{'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, },
{'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, },
{'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'@', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xB200, 0xBE00, 0xBC00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'A', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'B', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'C', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, },
{'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xF800, 0xF000, 0x0000, 0x0000 }, },
{'E', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'F', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'G', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8400, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, },
{'H', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'J', { 0x0000, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'K', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'N', { 0x0000, 0x0000, 0x8400, 0xC400, 0xE400, 0xB400, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'O', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xCC00, 0x7800, 0x3000, 0x0000, 0x0000 }, },
{'P', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'Q', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0x7800, 0x0800, 0x0800 }, },
{'R', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'S', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8000, 0xF800, 0x7C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'U', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x4400, 0x6C00, 0x2800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, },
{'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'Z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, },
{'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, },
{'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'_', { 0x0000, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0x0000 }, },
{'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, },
{'d', { 0x0000, 0x0000, 0x0400, 0x0400, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, },
{'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF800, 0xF800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, },
{'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800, 0x0000 }, },
{'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, },
{'k', { 0x0000, 0x0000, 0x8000, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, },
{'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xC400, 0xFC00, 0xB800, 0x8000, 0x8000, 0x8000 }, },
{'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x0400, 0x0400 }, },
{'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, },
{'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0000, 0x0000 }, },
{'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, },
{'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, },
{'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, },
{'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800 }, },
{'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, },
{'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, },
{'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }
};
// CW ID transmit routines // CW ID transmit routines
//=========================================================================== //===========================================================================
@ -672,3 +415,498 @@ void modem::cwid()
progdefaults.macroCWid = false; progdefaults.macroCWid = false;
} }
} }
//=====================================================================
// transmit processing of waterfall video id
//=====================================================================
int NUMROWS;
int NUMCOLS;
int NUMTONES;
int TONESPACING;
int IDSYMLEN;
int RISETIME;
int CHARSPACE;
int MAXCHARS;
int NUMCHARS;
bool useIDSMALL = true;
#define MAXROWS 14
#define MAXIDSYMLEN 4096
#define MAXTONES 32
struct mfntchr { char c; int byte[MAXROWS]; };
extern mfntchr idch1[]; // original id font definition
extern mfntchr idch2[]; // extended id font definition
extern int mask[1024];
C_FIR_filter vidfilt;
void modem::wfid_make_pulse()
{
double risetime = (samplerate / 1000) * RISETIME;
for (int i = 0; i < IDSYMLEN; i++)
wfid_txpulse[i] = 1.0;
for (int i = 0; i < risetime; i++) {
wfid_txpulse[i] = wfid_txpulse[IDSYMLEN - 1 - i] =
0.5 * (1 - cos(M_PI * i / risetime));
}
}
void modem::wfid_make_tones()
{
if (useIDSMALL) {
double f;
double frequency = get_txfreq_woffset();
for (int j = 0; j < NUMCHARS; j++)
for (int i = 0; i < NUMTONES; i++) {
f = frequency + TONESPACING * (NUMTONES - i - j * (NUMTONES + 3));
wfid_w[i + NUMTONES * j] = 2 * M_PI * f / samplerate;
}
} else {
double f, flo, fhi;
f = TONESPACING * ( progdefaults.videowidth * (NUMCOLS - 1) + (progdefaults.videowidth) * CHARSPACE) / 2.0;
f = 2.0 * floor((frequency + f)/2.0);
fhi = f + 2 * TONESPACING;
flo = f - (progdefaults.videowidth * (NUMCOLS + CHARSPACE) + 2) * TONESPACING;
for (int i = 0; i < NUMCOLS * progdefaults.videowidth; i++) {
wfid_w[i] = f * 2.0 * M_PI / samplerate;
f -= TONESPACING;
if ( (i > 0) && (i % NUMCOLS == 0) )
f -= TONESPACING * CHARSPACE;
}
vidfilt.init_bandpass( 1024, 1, flo/samplerate, fhi/samplerate) ;
}
}
void modem::wfid_send(long int symbol)
{
if (useIDSMALL) {
int i, j;
int sym;
int msk;
double maximum = 0.0;
for (i = 0; i < IDSYMLEN; i++) {
wfid_outbuf[i] = 0.0;
sym = symbol;
msk = mask[symbol];
for (j = 0; j < NUMTONES * NUMCHARS; j++) {
if (sym & 1 == 1)
wfid_outbuf[i] += ((msk & 1 == 1 ? -1 : 1 ) * sin(wfid_w[j] * i) * wfid_txpulse[i]);
sym = sym >> 1;
msk = msk >> 1;
}
if (fabs(wfid_outbuf[i]) > maximum)
maximum = fabs(wfid_outbuf[i]);
}
if (maximum > 0.0)
for (i = 0; i < IDSYMLEN; i++)
wfid_outbuf[i] = 0.9 * wfid_outbuf[i] / maximum;
ModulateXmtr(wfid_outbuf, IDSYMLEN);
} else {
int i, j;
int sym;
double val;
for (i = 0; i < IDSYMLEN; i++) {
wfid_outbuf[i] = 0.0;
val = 0.0;
sym = symbol;
for (j = 0; j < NUMCOLS * progdefaults.videowidth; j++) {
if ((sym & 1) == 1)
val += sin(wfid_w[j] * i);
sym = sym >> 1;
}
// soft limit the signal
wfid_outbuf[i] = 0.707 * (1.0 - exp(fabs(val)/-3.0)) * (val >= 0.0 ? 1 : -1);
}
// band pass filter the hard limited signal
for (i = 0; i < IDSYMLEN; i++) {
val = wfid_outbuf[i];
vidfilt.Irun (val, val);
wfid_outbuf[i] = val * wfid_txpulse[i];
}
ModulateXmtr(wfid_outbuf, IDSYMLEN);
}
}
void modem::wfid_sendchar(char c)
{
// send rows from bottom to top so they appear to scroll down the waterfall correctly
long int symbol;
unsigned int n;
if (c < ' ' || c > '~') return;
n = c - ' ';
for (int row = 0; row < NUMROWS; row++) {
symbol = (idch2[n].byte[NUMROWS - 1 - row]) >> (16 - NUMCOLS);
wfid_send (symbol);
if (stopflag)
return;
}
}
void modem::wfid_sendchars(string s)
{
if (useIDSMALL) {
long int symbol;
int len = s.length();
int n[NUMCHARS];
int c;
while (len++ < NUMCHARS) s.insert(0," ");
for (int i = 0; i < NUMCHARS; i++) {
c = s[i];
if (c > 'z' || c < ' ') c = ' ';
c = toupper(c) - ' ';
n[i] = c;
}
for (int row = 0; row < NUMROWS; row++) {
symbol = 0;
for (int i = 0; i < NUMCHARS; i++) {
symbol |= (idch1[n[i]].byte[NUMROWS - 1 -row] >> 3);
if (i != (NUMCHARS - 1) )
symbol = symbol << 5;
}
wfid_send (symbol);
}
wfid_send (0); // row of no tones
} else {
long int symbol;
int len;
unsigned int n[progdefaults.videowidth];
int c;
while (s[0] == ' ') s.erase(0);
len = s.length();
for (int i = 0; i < len; i++) { //progdefaults.videowidth; i++) {
c = s[i];
if (c > '~' || c < ' ') c = ' ';
c -= ' ';
n[i] = c;
}
// send rows from bottom to top so they appear to scroll down the waterfall correctly
for (int row = 0; row < NUMROWS; row++) {
symbol = 0;
for (int i = 0; i < len; i++) {//progdefaults.videowidth; i++) {
symbol |= (idch2[n[i]].byte[NUMROWS - 1 -row] >> (16 - NUMCOLS));
if (i != (len - 1) )
symbol = symbol << NUMCOLS;
}
if (len < progdefaults.videowidth)
symbol = symbol << NUMCOLS * (progdefaults.videowidth - len) / 2;
wfid_send (symbol);
if (stopflag)
return;
}
}
}
void modem::wfid_text(string s)
{
int len = s.length();
string video = "Video text: ";
video += s;
if (progdefaults.ID_SMALL) {
NUMROWS = 5;
NUMCHARS = 2;
NUMTONES = 5;
TONESPACING = 6;
IDSYMLEN = 3072;
RISETIME =20;
useIDSMALL = true;
} else {
NUMROWS = 14;
NUMCOLS = 8;
TONESPACING = 8;
IDSYMLEN = 2048;
RISETIME = 20;
CHARSPACE = 2;
MAXCHARS = 4;
useIDSMALL = false;
}
wfid_make_pulse();
wfid_make_tones();
put_status(video.c_str());
if (useIDSMALL) {
int numlines = 0;
string tosend;
while (numlines < len) numlines += NUMCHARS;
numlines -= NUMCHARS;
while (numlines >= 0) {
tosend = s.substr(numlines, NUMCHARS);
wfid_sendchars(tosend);
numlines -= NUMCHARS;
if (stopflag)
break;
}
put_status("");
} else {
if (progdefaults.videowidth == 1) {
for (int i = len - 1; i >= 0; i--) {
wfid_sendchar(s[i]);
}
} else {
int numlines = 0;
string tosend;
while (numlines < len) numlines += progdefaults.videowidth;
numlines -= progdefaults.videowidth;
while (numlines >= 0) {
tosend = s.substr(numlines, progdefaults.videowidth);
wfid_sendchars(tosend);
numlines -= progdefaults.videowidth;
if (stopflag)
break;
}
}
put_status("");
}
}
double modem::wfid_txpulse[MAXIDSYMLEN];
double modem::wfid_outbuf[MAXIDSYMLEN];
double modem::wfid_w[MAXTONES];
mfntchr idch1[] = {
{' ', { 0x00, 0x00, 0x00, 0x00, 0x00 }, },
{'!', { 0x80, 0x80, 0x80, 0x00, 0x80 }, },
{'"', { 0xA0, 0x00, 0x00, 0x00, 0x00 }, },
{'#', { 0x50, 0xF8, 0x50, 0xF8, 0x50 }, },
{'$', { 0x78, 0xA0, 0x70, 0x28, 0xF0 }, },
{'%', { 0xC8, 0x10, 0x20, 0x40, 0x98 }, },
{'&', { 0x40, 0xE0, 0x68, 0x90, 0x78 }, },
{ 39, { 0xC0, 0x40, 0x80, 0x00, 0x00 }, },
{'(', { 0x60, 0x80, 0x80, 0x80, 0x60 }, },
{')', { 0xC0, 0x20, 0x20, 0x20, 0xC0 }, },
{'*', { 0xA8, 0x70, 0xF8, 0x70, 0xA8 }, },
{'+', { 0x00, 0x20, 0xF8, 0x20, 0x00 }, },
{',', { 0x00, 0x00, 0x00, 0xC0, 0x40 }, },
{'-', { 0x00, 0x00, 0xF8, 0x00, 0x00 }, },
{'.', { 0x00, 0x00, 0x00, 0x00, 0xC0 }, },
{'/', { 0x08, 0x10, 0x20, 0x40, 0x80 }, },
{'0', { 0x70, 0x98, 0xA8, 0xC8, 0x70 }, },
{'1', { 0x60, 0xA0, 0x20, 0x20, 0x20 }, },
{'2', { 0xE0, 0x10, 0x20, 0x40, 0xF8 }, },
{'3', { 0xF0, 0x08, 0x30, 0x08, 0xF0 }, },
{'4', { 0x90, 0x90, 0xF8, 0x10, 0x10 }, },
{'5', { 0xF8, 0x80, 0xF0, 0x08, 0xF0 }, },
{'6', { 0x70, 0x80, 0xF0, 0x88, 0x70 }, },
{'7', { 0xF8, 0x08, 0x10, 0x20, 0x40 }, },
{'8', { 0x70, 0x88, 0x70, 0x88, 0x70 }, },
{'9', { 0x70, 0x88, 0x78, 0x08, 0x70 }, },
{':', { 0x00, 0xC0, 0x00, 0xC0, 0x00 }, },
{';', { 0xC0, 0x00, 0xC0, 0x40, 0x80 }, },
{'<', { 0x08, 0x30, 0xC0, 0x30, 0x08 }, },
{'=', { 0x00, 0xF8, 0x00, 0xF8, 0x00 }, },
{'>', { 0x80, 0x60, 0x18, 0x60, 0x80 }, },
{'?', { 0xE0, 0x10, 0x20, 0x00, 0x20 }, },
{'@', { 0x70, 0x88, 0xB0, 0x80, 0x78 }, },
{'A', { 0x70, 0x88, 0xF8, 0x88, 0x88 }, },
{'B', { 0xF0, 0x48, 0x70, 0x48, 0xF0 }, },
{'C', { 0x78, 0x80, 0x80, 0x80, 0x78 }, },
{'D', { 0xF0, 0x88, 0x88, 0x88, 0xF0 }, },
{'E', { 0xF8, 0x80, 0xE0, 0x80, 0xF8 }, },
{'F', { 0xF8, 0x80, 0xE0, 0x80, 0x80 }, },
{'G', { 0x78, 0x80, 0x98, 0x88, 0x78 }, },
{'H', { 0x88, 0x88, 0xF8, 0x88, 0x88 }, },
{'I', { 0xE0, 0x40, 0x40, 0x40, 0xE0 }, },
{'J', { 0x08, 0x08, 0x08, 0x88, 0x70 }, },
{'K', { 0x88, 0x90, 0xE0, 0x90, 0x88 }, },
{'L', { 0x80, 0x80, 0x80, 0x80, 0xF8 }, },
{'M', { 0x88, 0xD8, 0xA8, 0x88, 0x88 }, },
{'N', { 0x88, 0xC8, 0xA8, 0x98, 0x88 }, },
{'O', { 0x70, 0x88, 0x88, 0x88, 0x70 }, },
{'P', { 0xF0, 0x88, 0xF0, 0x80, 0x80 }, },
{'Q', { 0x70, 0x88, 0x88, 0xA8, 0x70 }, },
{'R', { 0xF0, 0x88, 0xF0, 0x90, 0x88 }, },
{'S', { 0x78, 0x80, 0x70, 0x08, 0xF0 }, },
{'T', { 0xF8, 0x20, 0x20, 0x20, 0x20 }, },
{'U', { 0x88, 0x88, 0x88, 0x88, 0x70 }, },
{'V', { 0x88, 0x90, 0xA0, 0xC0, 0x80 }, },
{'W', { 0x88, 0x88, 0xA8, 0xA8, 0x50 }, },
{'X', { 0x88, 0x50, 0x20, 0x50, 0x88 }, },
{'Y', { 0x88, 0x50, 0x20, 0x20, 0x20 }, },
{'Z', { 0xF8, 0x10, 0x20, 0x40, 0xF8 }, }
};
// MASK for optimizing power in Waterfall ID signal
int mask[1024] = {
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x03, 0x00, 0x01, 0x02, 0x02, 0x04, 0x04, 0x06, 0x04,
0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x06, 0x03, 0x00, 0x01, 0x02, 0x01, 0x04, 0x05, 0x0e, 0x02,
0x00, 0x00, 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x00, 0x09, 0x02, 0x03, 0x04, 0x05, 0x0c, 0x01,
0x00, 0x10, 0x12, 0x13, 0x04, 0x04, 0x14, 0x04, 0x18, 0x01, 0x1a, 0x02, 0x0c, 0x05, 0x08, 0x1d,
0x00, 0x01, 0x02, 0x03, 0x04, 0x04, 0x06, 0x04, 0x00, 0x08, 0x0a, 0x03, 0x08, 0x0d, 0x08, 0x02,
0x10, 0x01, 0x12, 0x02, 0x04, 0x05, 0x06, 0x16, 0x18, 0x10, 0x1a, 0x01, 0x18, 0x05, 0x02, 0x1b,
0x20, 0x20, 0x02, 0x02, 0x04, 0x04, 0x04, 0x05, 0x28, 0x20, 0x02, 0x20, 0x08, 0x09, 0x04, 0x0d,
0x10, 0x11, 0x22, 0x02, 0x04, 0x34, 0x02, 0x27, 0x38, 0x39, 0x20, 0x21, 0x14, 0x09, 0x2e, 0x28,
0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x04, 0x01, 0x08, 0x01, 0x08, 0x08, 0x0c, 0x04, 0x02, 0x0d,
0x10, 0x11, 0x12, 0x01, 0x10, 0x01, 0x04, 0x01, 0x10, 0x11, 0x1a, 0x01, 0x10, 0x05, 0x0e, 0x1d,
0x00, 0x21, 0x20, 0x22, 0x20, 0x25, 0x22, 0x01, 0x20, 0x09, 0x2a, 0x2a, 0x24, 0x20, 0x08, 0x09,
0x10, 0x11, 0x10, 0x33, 0x04, 0x04, 0x34, 0x13, 0x38, 0x11, 0x20, 0x19, 0x18, 0x19, 0x06, 0x0c,
0x40, 0x01, 0x40, 0x43, 0x04, 0x04, 0x40, 0x05, 0x40, 0x41, 0x42, 0x4b, 0x40, 0x4d, 0x0a, 0x41,
0x50, 0x11, 0x02, 0x12, 0x44, 0x41, 0x40, 0x41, 0x08, 0x10, 0x12, 0x53, 0x40, 0x5c, 0x16, 0x4f,
0x20, 0x61, 0x20, 0x01, 0x60, 0x25, 0x46, 0x05, 0x28, 0x28, 0x6a, 0x43, 0x40, 0x09, 0x42, 0x4c,
0x70, 0x31, 0x70, 0x33, 0x60, 0x25, 0x12, 0x50, 0x58, 0x39, 0x2a, 0x09, 0x5c, 0x60, 0x0c, 0x0d,
0x00, 0x01, 0x02, 0x02, 0x04, 0x01, 0x02, 0x06, 0x00, 0x09, 0x02, 0x08, 0x08, 0x09, 0x02, 0x0e,
0x10, 0x10, 0x12, 0x02, 0x04, 0x01, 0x04, 0x14, 0x08, 0x19, 0x08, 0x13, 0x10, 0x10, 0x0e, 0x1d,
0x20, 0x01, 0x02, 0x22, 0x20, 0x20, 0x22, 0x02, 0x28, 0x08, 0x2a, 0x29, 0x08, 0x0c, 0x0c, 0x0e,
0x10, 0x30, 0x32, 0x10, 0x14, 0x34, 0x06, 0x36, 0x28, 0x01, 0x02, 0x1a, 0x0c, 0x2d, 0x1c, 0x1d,
0x00, 0x41, 0x42, 0x41, 0x44, 0x04, 0x44, 0x06, 0x08, 0x09, 0x02, 0x41, 0x44, 0x48, 0x02, 0x06,
0x40, 0x01, 0x12, 0x12, 0x10, 0x11, 0x54, 0x13, 0x58, 0x01, 0x50, 0x5a, 0x04, 0x19, 0x12, 0x57,
0x60, 0x41, 0x40, 0x02, 0x20, 0x24, 0x02, 0x47, 0x08, 0x41, 0x08, 0x6a, 0x4c, 0x68, 0x6a, 0x47,
0x10, 0x71, 0x42, 0x43, 0x10, 0x55, 0x26, 0x50, 0x10, 0x58, 0x72, 0x28, 0x2c, 0x39, 0x1a, 0x4f,
0x80, 0x80, 0x82, 0x02, 0x04, 0x84, 0x02, 0x02, 0x88, 0x88, 0x08, 0x01, 0x08, 0x05, 0x04, 0x0d,
0x10, 0x01, 0x12, 0x90, 0x84, 0x94, 0x02, 0x90, 0x10, 0x98, 0x9a, 0x98, 0x14, 0x9c, 0x16, 0x0b,
0x20, 0x20, 0x80, 0xa3, 0x80, 0xa1, 0xa6, 0x87, 0x28, 0x29, 0xa8, 0xa8, 0x08, 0x09, 0x2a, 0x87,
0x10, 0x80, 0x82, 0x11, 0xb0, 0xa5, 0x32, 0x32, 0xb8, 0xa0, 0x2a, 0x11, 0x9c, 0x81, 0x8e, 0xa4,
0x40, 0xc0, 0xc2, 0x01, 0x40, 0xc5, 0x80, 0x05, 0xc0, 0x80, 0x4a, 0x09, 0x8c, 0x09, 0x0a, 0x09,
0x50, 0x41, 0xc0, 0x41, 0x40, 0xc0, 0x12, 0x87, 0x80, 0xc0, 0x82, 0x83, 0x9c, 0xd8, 0x98, 0x16,
0x20, 0x41, 0x82, 0x83, 0x80, 0xc0, 0x46, 0xc7, 0x48, 0xe0, 0x6a, 0x29, 0x4c, 0x29, 0xc0, 0x8e,
0x40, 0xc0, 0x50, 0x21, 0x74, 0xf4, 0x32, 0x25, 0x28, 0x98, 0x9a, 0x32, 0x74, 0x58, 0x8e, 0x83,
0x00, 0x00, 0x02, 0x01, 0x04, 0x05, 0x04, 0x06, 0x00, 0x09, 0x02, 0x02, 0x0c, 0x01, 0x06, 0x04,
0x00, 0x10, 0x12, 0x13, 0x14, 0x14, 0x12, 0x16, 0x10, 0x19, 0x12, 0x01, 0x04, 0x18, 0x16, 0x17,
0x20, 0x20, 0x22, 0x03, 0x04, 0x24, 0x24, 0x26, 0x20, 0x20, 0x20, 0x21, 0x0c, 0x2c, 0x2c, 0x24,
0x20, 0x10, 0x30, 0x20, 0x04, 0x10, 0x04, 0x31, 0x10, 0x28, 0x08, 0x33, 0x0c, 0x05, 0x0c, 0x3d,
0x40, 0x01, 0x40, 0x02, 0x04, 0x01, 0x44, 0x03, 0x40, 0x08, 0x0a, 0x08, 0x0c, 0x44, 0x4e, 0x44,
0x10, 0x50, 0x40, 0x11, 0x54, 0x14, 0x06, 0x56, 0x58, 0x49, 0x52, 0x49, 0x18, 0x4d, 0x56, 0x49,
0x20, 0x41, 0x02, 0x01, 0x44, 0x65, 0x64, 0x05, 0x20, 0x69, 0x6a, 0x23, 0x68, 0x0c, 0x0c, 0x27,
0x70, 0x50, 0x72, 0x71, 0x54, 0x54, 0x14, 0x56, 0x40, 0x21, 0x22, 0x33, 0x44, 0x79, 0x2e, 0x57,
0x00, 0x01, 0x80, 0x81, 0x84, 0x85, 0x84, 0x01, 0x88, 0x81, 0x8a, 0x8b, 0x80, 0x80, 0x02, 0x06,
0x10, 0x90, 0x12, 0x80, 0x94, 0x80, 0x80, 0x11, 0x88, 0x09, 0x90, 0x19, 0x0c, 0x11, 0x06, 0x13,
0xa0, 0x21, 0xa2, 0x21, 0xa4, 0x04, 0xa6, 0x24, 0x20, 0xa8, 0x8a, 0xa8, 0xa4, 0x85, 0x06, 0x06,
0x10, 0x20, 0xb2, 0xa0, 0x10, 0xb4, 0x12, 0xb6, 0xb8, 0xa0, 0x18, 0x81, 0x24, 0x85, 0xb6, 0x0c,
0xc0, 0xc1, 0xc0, 0x01, 0xc0, 0x44, 0x04, 0xc5, 0x08, 0xc0, 0x02, 0x0a, 0x4c, 0xc4, 0x8e, 0x03,
0x10, 0xd0, 0x82, 0x90, 0x50, 0x11, 0xd4, 0x11, 0x98, 0x88, 0x12, 0x53, 0xd4, 0x81, 0xc4, 0xd4,
0x20, 0x20, 0x62, 0xe2, 0x24, 0x85, 0xa6, 0xe5, 0x68, 0x69, 0xc0, 0xe9, 0xa0, 0xe9, 0x6c, 0x43,
0x70, 0x71, 0x60, 0xf1, 0x94, 0x31, 0xf2, 0xc5, 0xf0, 0xc9, 0x8a, 0x79, 0x18, 0x25, 0x68, 0xf6,
0x100, 0x01, 0x02, 0x100, 0x04, 0x01, 0x02, 0x05, 0x100, 0x08, 0x08, 0x100, 0x10c, 0x05, 0x04, 0x107,
0x110, 0x11, 0x110, 0x12, 0x10, 0x105, 0x100, 0x12, 0x100, 0x119, 0x0a, 0x119, 0x11c, 0x14, 0x1a, 0x10f,
0x20, 0x01, 0x02, 0x22, 0x24, 0x04, 0x24, 0x05, 0x100, 0x01, 0x120, 0x128, 0x28, 0x12c, 0x126, 0x2d,
0x110, 0x10, 0x122, 0x130, 0x104, 0x14, 0x14, 0x117, 0x100, 0x09, 0x138, 0x39, 0x0c, 0x09, 0x12e, 0x13c,
0x100, 0x40, 0x40, 0x02, 0x40, 0x141, 0x04, 0x107, 0x48, 0x108, 0x08, 0x140, 0x04, 0x140, 0x10e, 0x42,
0x50, 0x141, 0x102, 0x52, 0x150, 0x114, 0x54, 0x45, 0x10, 0x101, 0x12, 0x153, 0x54, 0x101, 0x44, 0x5a,
0x160, 0x161, 0x42, 0x101, 0x164, 0x105, 0x64, 0x65, 0x20, 0x121, 0x168, 0x10b, 0x10c, 0x10d, 0x120, 0x6a,
0x100, 0x101, 0x22, 0x103, 0x54, 0x31, 0x14, 0x33, 0x158, 0x101, 0x50, 0x72, 0x74, 0x105, 0x7a, 0x150,
0x80, 0x180, 0x82, 0x103, 0x184, 0x85, 0x100, 0x107, 0x80, 0x89, 0x8a, 0x09, 0x04, 0x101, 0x10e, 0x103,
0x180, 0x90, 0x100, 0x11, 0x194, 0x190, 0x12, 0x107, 0x118, 0x11, 0x12, 0x09, 0x14, 0x09, 0x118, 0x11c,
0x1a0, 0xa0, 0x1a2, 0x120, 0x1a4, 0x185, 0x126, 0x127, 0x1a0, 0x1a8, 0x8a, 0x123, 0x1a4, 0x18d, 0x2a, 0x22,
0x80, 0x81, 0x1b0, 0x11, 0x94, 0x1b4, 0x32, 0x25, 0x120, 0xa0, 0x28, 0x8b, 0x120, 0x39, 0x12e, 0x13c,
0x1c0, 0x1c0, 0x82, 0x41, 0x44, 0x180, 0x106, 0xc5, 0x100, 0x88, 0x180, 0x42, 0x1c4, 0xcd, 0xc4, 0x1c4,
0x90, 0x90, 0x1c0, 0x103, 0xd4, 0x180, 0x110, 0x52, 0x50, 0x49, 0x52, 0x158, 0x180, 0xd5, 0x1c4, 0x4d,
0x40, 0x101, 0x102, 0x21, 0x44, 0xc5, 0x1e4, 0xe2, 0x88, 0x1a1, 0x42, 0x22, 0x24, 0xac, 0x1a0, 0x127,
0x50, 0x41, 0x112, 0xf2, 0x180, 0xc0, 0x1d6, 0x1b0, 0x50, 0x51, 0x32, 0x160, 0x74, 0x1bc, 0x1b0, 0x16f
};
mfntchr idch2[] = {
{' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, },
{'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, },
{'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, },
{'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, },
{'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, },
{ 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, },
{')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, },
{'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, },
{',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000 }, },
{'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, },
{'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'0', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8C00, 0x9C00, 0xB400, 0xE400, 0xC400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'1', { 0x0000, 0x0000, 0x1000, 0x3000, 0x7000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'2', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'3', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0C00, 0x1800, 0x1C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'4', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4800, 0xC800, 0x8800, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{'5', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'6', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'7', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'8', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'9', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7800, 0x0000, 0x0000 }, },
{':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, },
{'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, },
{'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, },
{'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'@', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xB200, 0xBE00, 0xBC00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'A', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'B', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'C', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, },
{'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xF800, 0xF000, 0x0000, 0x0000 }, },
{'E', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'F', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'G', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8400, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, },
{'H', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'J', { 0x0000, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'K', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'N', { 0x0000, 0x0000, 0x8400, 0xC400, 0xE400, 0xB400, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'O', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xCC00, 0x7800, 0x3000, 0x0000, 0x0000 }, },
{'P', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'Q', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0x7800, 0x0800, 0x0800 }, },
{'R', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'S', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8000, 0xF800, 0x7C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, },
{'U', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x4400, 0x6C00, 0x2800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, },
{'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, },
{'Z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, },
{'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, },
{'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'_', { 0x0000, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0x0000 }, },
{'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, },
{'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, },
{'d', { 0x0000, 0x0000, 0x0400, 0x0400, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, },
{'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, },
{'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF800, 0xF800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, },
{'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800, 0x0000 }, },
{'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, },
{'k', { 0x0000, 0x0000, 0x8000, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, },
{'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, },
{'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, },
{'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, },
{'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, },
{'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xC400, 0xFC00, 0xB800, 0x8000, 0x8000, 0x8000 }, },
{'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x0400, 0x0400 }, },
{'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, },
{'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, },
{'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, },
{'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0000, 0x0000 }, },
{'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, },
{'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, },
{'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, },
{'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800 }, },
{'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, },
{'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, },
{'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, },
{'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, },
{'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }
};

Wyświetl plik

@ -209,7 +209,7 @@ void FTextBase::readFile(void)
/// ///
void FTextBase::saveFile(void) void FTextBase::saveFile(void)
{ {
const char *fn = FSEL::saveas("Save text as", "Text\t*.txt"); const char *fn = FSEL::saveas("Save text as", "Text\t*.txt");
if (fn) { if (fn) {
#ifdef __CYGWIN__ #ifdef __CYGWIN__
ofstream tfile(fn); ofstream tfile(fn);