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
following modes:
BPSK and QPSK 31, 63, 125, and 250
CW speeds from 5 to 200 wpm
DEX 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
MFSK 8 and 16; images can be sent and received in MFSK-16 mode
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
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
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
m4_define(FLDIGI_MAJOR, [2])
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])

Wyświetl plik

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

Wyświetl plik

@ -284,6 +284,17 @@ static void cb_sldrVideowidth(Fl_Value_Slider* o, void*) {
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;
static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) {
@ -884,42 +895,42 @@ static void cb_cntPostTiming(Fl_Counter* o, void*) {
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*) {
progdefaults.DEXsecText = o->value();
static void cb_txtTHORSecondary(Fl_Input* o, void*) {
progdefaults.THORsecText = o->value();
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*) {
progdefaults.DEX_BW = o->value();
resetDEX();
static void cb_valTHOR_BW(Fl_Counter* o, void*) {
progdefaults.THOR_BW = o->value();
resetTHOR();
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*) {
progdefaults.DEX_FILTER = o->value();
resetDEX();
static void cb_valTHOR_FILTER(Fl_Check_Button* o, void*) {
progdefaults.THOR_FILTER = o->value();
resetTHOR();
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*) {
progdefaults.DEX_PATHS = (int)o->value();
static void cb_valTHOR_PATHS(Fl_Counter* o, void*) {
progdefaults.THOR_PATHS = (int)o->value();
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*) {
progdefaults.DEX_SOFT = o->value();
static void cb_valTHOR_SOFT(Fl_Check_Button* o, void*) {
progdefaults.THOR_SOFT = o->value();
progdefaults.changed = true;
}
@ -979,46 +990,55 @@ static void cb_sldrHellBW(Fl_Value_Slider*, void*) {
Fl_Check_Button *btnHellXmtWidth=(Fl_Check_Button *)0;
static void cb_btnHellXmtWidth(Fl_Check_Button*, void*) {
progdefaults.changed = true;
static void cb_btnHellXmtWidth(Fl_Check_Button* o, void*) {
progdefaults.HellXmtWidth=o->value();
progdefaults.changed = true;
}
Fl_Check_Button *btnHellRcvWidth=(Fl_Check_Button *)0;
static void cb_btnHellRcvWidth(Fl_Check_Button*, void*) {
progdefaults.changed = true;
static void cb_btnHellRcvWidth(Fl_Check_Button* o, void*) {
progdefaults.HellRcvWidth=o->value();
progdefaults.changed = true;
}
Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0;
static void cb_btnBlackboard(Fl_Check_Button*, void*) {
progdefaults.changed = true;
static void cb_btnBlackboard(Fl_Check_Button* o, void*) {
progdefaults.HellBlackboard=o->value();
progdefaults.changed = true;
}
Fl_Check_Button *btnHellFastAttack=(Fl_Check_Button *)0;
static void cb_btnHellFastAttack(Fl_Check_Button* o, void*) {
if (o->value() == 1)
if (o->value() == 1) {
btnHellSlowAttack->value(0);
else
progdefaults.HellPulseFast = true;
}else{
btnHellSlowAttack->value(1);
progdefaults.HellPulseFast = false;
}
progdefaults.changed = true;
}
Fl_Check_Button *btnHellSlowAttack=(Fl_Check_Button *)0;
static void cb_btnHellSlowAttack(Fl_Check_Button* o, void*) {
if (o->value() == 1)
if (o->value() == 1) {
btnHellFastAttack->value(0);
else
progdefaults.HellPulseFast = false;
}else{
btnHellFastAttack->value(1);
progdefaults.HellPulseFast = true;
}
progdefaults.changed = true;
}
Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0;
static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) {
progdefaults.FELD_IDLE=o->value();
progdefaults.HellXmtIdle=o->value();
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->color((Fl_Color)51);
tabVideo->selection_color((Fl_Color)51);
tabVideo->hide();
{ Fl_Group* o = new Fl_Group(5, 40, 390, 67, "Video Preamble");
{ Fl_Group* o = new Fl_Group(5, 40, 390, 77, "Video Preamble");
o->box(FL_ENGRAVED_FRAME);
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
{ btnsendid = new Fl_Check_Button(11, 57, 115, 20, "Xmt Mode ID");
btnsendid->down_box(FL_DOWN_BOX);
btnsendid->callback((Fl_Callback*)cb_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->callback((Fl_Callback*)cb_btnsendvideotext);
o->value(progdefaults.sendtextid);
} // 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->callback((Fl_Callback*)cb_valVideotext);
valVideotext->align(FL_ALIGN_TOP_LEFT);
o->value(progdefaults.strTextid.c_str());
} // 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->type(1);
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->align(FL_ALIGN_TOP);
o->value(progdefaults.videowidth);
if (progdefaults.ID_SMALL) o->deactivate();
} // 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();
} // 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->callback((Fl_Callback*)cb_btnViewXmtSignal);
o->value(progdefaults.viewXmtSignal);
} // 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->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->callback((Fl_Callback*)cb_btnCWID);
o->value(progdefaults.CWid);
} // 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->color((Fl_Color)26);
sldrCWIDwpm->minimum(15);
@ -1947,6 +1973,7 @@ l with your sound hardware.");
{ tabModems = new Fl_Group(0, 25, 401, 195, "Modem");
tabModems->color((Fl_Color)51);
tabModems->selection_color((Fl_Color)51);
tabModems->hide();
{ tabsModems = new Fl_Tabs(0, 25, 401, 195);
tabsModems->color((Fl_Color)51);
tabsModems->selection_color((Fl_Color)10);
@ -2100,46 +2127,47 @@ l with your sound hardware.");
} // Fl_Counter* cntPostTiming
tabCWQSK->end();
} // Fl_Group* tabCWQSK
{ tabDEX = new Fl_Group(0, 44, 400, 170, "Dex");
tabDEX->color((Fl_Color)51);
tabDEX->selection_color((Fl_Color)51);
{ txtDEXSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text");
txtDEXSecondary->type(4);
txtDEXSecondary->callback((Fl_Callback*)cb_txtDEXSecondary);
txtDEXSecondary->align(FL_ALIGN_TOP_LEFT);
txtDEXSecondary->when(FL_WHEN_CHANGED);
} // Fl_Input* txtDEXSecondary
{ Fl_Counter* o = valDEX_BW = new Fl_Counter(20, 130, 63, 21, "BW factor:");
valDEX_BW->type(1);
valDEX_BW->minimum(1);
valDEX_BW->maximum(2);
valDEX_BW->step(0.1);
valDEX_BW->value(1.5);
valDEX_BW->callback((Fl_Callback*)cb_valDEX_BW);
o->value(progdefaults.DEX_BW);
} // Fl_Counter* valDEX_BW
{ Fl_Check_Button* o = valDEX_FILTER = new Fl_Check_Button(110, 130, 83, 19, "Filter ON");
valDEX_FILTER->down_box(FL_DOWN_BOX);
valDEX_FILTER->value(1);
valDEX_FILTER->callback((Fl_Callback*)cb_valDEX_FILTER);
o->value(progdefaults.DEX_FILTER);
} // Fl_Check_Button* valDEX_FILTER
{ Fl_Counter* o = valDEX_PATHS = new Fl_Counter(20, 174, 63, 21, "Paths");
valDEX_PATHS->type(1);
valDEX_PATHS->minimum(4);
valDEX_PATHS->maximum(8);
valDEX_PATHS->step(1);
valDEX_PATHS->value(5);
valDEX_PATHS->callback((Fl_Callback*)cb_valDEX_PATHS);
o->value(progdefaults.DEX_PATHS);
} // Fl_Counter* valDEX_PATHS
{ Fl_Check_Button* o = valDEX_SOFT = new Fl_Check_Button(110, 177, 70, 15, "Soft decode");
valDEX_SOFT->down_box(FL_DOWN_BOX);
valDEX_SOFT->callback((Fl_Callback*)cb_valDEX_SOFT);
o->value(progdefaults.DEX_SOFT);
} // Fl_Check_Button* valDEX_SOFT
tabDEX->end();
} // Fl_Group* tabDEX
{ tabTHOR = new Fl_Group(0, 44, 400, 170, "Thor");
tabTHOR->color((Fl_Color)51);
tabTHOR->selection_color((Fl_Color)51);
tabTHOR->hide();
{ txtTHORSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text");
txtTHORSecondary->type(4);
txtTHORSecondary->callback((Fl_Callback*)cb_txtTHORSecondary);
txtTHORSecondary->align(FL_ALIGN_TOP_LEFT);
txtTHORSecondary->when(FL_WHEN_CHANGED);
} // Fl_Input* txtTHORSecondary
{ Fl_Counter* o = valTHOR_BW = new Fl_Counter(20, 130, 63, 21, "BW factor:");
valTHOR_BW->type(1);
valTHOR_BW->minimum(1);
valTHOR_BW->maximum(2);
valTHOR_BW->step(0.1);
valTHOR_BW->value(1.5);
valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW);
o->value(progdefaults.THOR_BW);
} // Fl_Counter* valTHOR_BW
{ Fl_Check_Button* o = valTHOR_FILTER = new Fl_Check_Button(110, 130, 83, 19, "Filter ON");
valTHOR_FILTER->down_box(FL_DOWN_BOX);
valTHOR_FILTER->value(1);
valTHOR_FILTER->callback((Fl_Callback*)cb_valTHOR_FILTER);
o->value(progdefaults.THOR_FILTER);
} // Fl_Check_Button* valTHOR_FILTER
{ Fl_Counter* o = valTHOR_PATHS = new Fl_Counter(20, 174, 63, 21, "Paths");
valTHOR_PATHS->type(1);
valTHOR_PATHS->minimum(4);
valTHOR_PATHS->maximum(8);
valTHOR_PATHS->step(1);
valTHOR_PATHS->value(5);
valTHOR_PATHS->callback((Fl_Callback*)cb_valTHOR_PATHS);
o->value(progdefaults.THOR_PATHS);
} // Fl_Counter* valTHOR_PATHS
{ Fl_Check_Button* o = valTHOR_SOFT = new Fl_Check_Button(110, 177, 70, 15, "Soft decode");
valTHOR_SOFT->down_box(FL_DOWN_BOX);
valTHOR_SOFT->callback((Fl_Callback*)cb_valTHOR_SOFT);
o->value(progdefaults.THOR_SOFT);
} // Fl_Check_Button* valTHOR_SOFT
tabTHOR->end();
} // Fl_Group* tabTHOR
{ tabDomEX = new Fl_Group(0, 50, 400, 170, "Dom");
tabDomEX->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->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:");
selHellFont->down_box(FL_BORDER_BOX);
selHellFont->labelfont(4);
@ -2205,17 +2232,20 @@ l with your sound hardware.");
sldrHellBW->align(FL_ALIGN_TOP_LEFT);
o->value(progdefaults.HELL_BW);
} // 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->callback((Fl_Callback*)cb_btnHellXmtWidth);
o->value(progdefaults.HellXmtWidth);
} // 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->callback((Fl_Callback*)cb_btnHellRcvWidth);
o->value(progdefaults.HellRcvWidth);
} // 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->callback((Fl_Callback*)cb_btnBlackboard);
o->value(progdefaults.HellBlackboard);
} // Fl_Check_Button* btnBlackboard
{ Fl_Group* o = new Fl_Group(175, 90, 195, 85, "Pulse Shape");
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)");
btnHellFastAttack->down_box(FL_DOWN_BOX);
btnHellFastAttack->callback((Fl_Callback*)cb_btnHellFastAttack);
o->value(0);
o->value(progdefaults.HellPulseFast);
} // Fl_Check_Button* btnHellFastAttack
{ Fl_Check_Button* o = btnHellSlowAttack = new Fl_Check_Button(185, 131, 70, 15, "Slow Attack (4 msec)");
btnHellSlowAttack->down_box(FL_DOWN_BOX);
btnHellSlowAttack->value(1);
btnHellSlowAttack->callback((Fl_Callback*)cb_btnHellSlowAttack);
o->value(1);
o->value(!progdefaults.HellPulseFast);
} // Fl_Check_Button* btnHellSlowAttack
o->end();
} // Fl_Group* o
@ -2237,7 +2267,7 @@ l with your sound hardware.");
btnFeldHellIdle->down_box(FL_DOWN_BOX);
btnFeldHellIdle->value(1);
btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle);
o->value(progdefaults.FELD_IDLE);
o->value(progdefaults.HellXmtIdle);
} // Fl_Check_Button* btnFeldHellIdle
tabFeld->end();
} // Fl_Group* tabFeld

Wyświetl plik

@ -325,12 +325,12 @@ progdefaults.changed = true;
}
}
Fl_Group tabVideo {
label Video
xywh {0 25 400 195} color 51 selection_color 51 hide
label Video open
xywh {0 25 400 195} color 51 selection_color 51
} {
Fl_Group {} {
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 {
label {Xmt Mode ID}
@ -342,47 +342,59 @@ progdefaults.changed = true;}
label {Xmt Video Text}
callback {progdefaults.sendtextid=o->value();
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);}
}
Fl_Input valVideotext {
label {Video Text:}
callback {progdefaults.strTextid = o->value();
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());}
}
Fl_Value_Slider sldrVideowidth {
label {Video Width:}
callback {progdefaults.videowidth = (int)o->value();
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);}
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 {
label {View Xmt Signal}
callback {progdefaults.viewXmtSignal=o->value();
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);}
}
Fl_Group sld {
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 {
label {Xmt CWID}
callback {progdefaults.CWid = o->value();
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);}
}
Fl_Value_Slider sldrCWIDwpm {
label {CWID wpm:}
callback {progdefaults.CWIDwpm = (int)o->value();
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);}
}
}
@ -1054,45 +1066,45 @@ progdefaults.changed = true;}
code1 {o->maximum((int)(2400/progdefaults.CWspeed)/2.0);}
}
}
Fl_Group tabDEX {
label Dex open
xywh {0 44 400 170} color 51 selection_color 51
Fl_Group tabTHOR {
label Thor open
xywh {0 44 400 170} color 51 selection_color 51 hide
} {
Fl_Input txtDEXSecondary {
Fl_Input txtTHORSecondary {
label {Secondary Text}
callback {progdefaults.DEXsecText = o->value();
callback {progdefaults.THORsecText = o->value();
progdefaults.changed = true;}
xywh {20 75 360 44} type Multiline align 5 when 1
}
Fl_Counter valDEX_BW {
Fl_Counter valTHOR_BW {
label {BW factor:}
callback {progdefaults.DEX_BW = o->value();
resetDEX();
callback {progdefaults.THOR_BW = o->value();
resetTHOR();
progdefaults.changed = true;}
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}
callback {progdefaults.DEX_FILTER = o->value();
resetDEX();
callback {progdefaults.THOR_FILTER = o->value();
resetTHOR();
progdefaults.changed = true;}
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
callback {progdefaults.DEX_PATHS = (int)o->value();
callback {progdefaults.THOR_PATHS = (int)o->value();
progdefaults.changed = true;}
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}
callback {progdefaults.DEX_SOFT = o->value();
progdefaults.changed = true;} selected
callback {progdefaults.THOR_SOFT = o->value();
progdefaults.changed = true;}
xywh {110 177 70 15} down_box DOWN_BOX
code0 {o->value(progdefaults.DEX_SOFT);}
code0 {o->value(progdefaults.THOR_SOFT);}
}
}
Fl_Group tabDomEX {
@ -1138,7 +1150,7 @@ progdefaults.changed = true;}
}
Fl_Group tabFeld {
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 {
label {Feld Hell Font:}
@ -1157,18 +1169,24 @@ progdefaults.changed = true;} open
}
Fl_Check_Button btnHellXmtWidth {
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
code0 {o->value(progdefaults.HellXmtWidth);}
}
Fl_Check_Button btnHellRcvWidth {
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
code0 {o->value(progdefaults.HellRcvWidth);}
}
Fl_Check_Button btnBlackboard {
label blackboard
callback {progdefaults.changed = true;}
callback {progdefaults.HellBlackboard=o->value();
progdefaults.changed = true;}
xywh {40 134 100 15} down_box DOWN_BOX
code0 {o->value(progdefaults.HellBlackboard);}
}
Fl_Group {} {
label {Pulse Shape} open
@ -1176,31 +1194,37 @@ progdefaults.changed = true;} open
} {
Fl_Check_Button btnHellFastAttack {
label {Fast Attack (2 msec)}
callback {if (o->value() == 1)
callback {if (o->value() == 1) {
btnHellSlowAttack->value(0);
else
progdefaults.HellPulseFast = true;
}else{
btnHellSlowAttack->value(1);
progdefaults.HellPulseFast = false;
}
progdefaults.changed = true;}
xywh {185 110 169 15} down_box DOWN_BOX
code0 {o->value(0);}
code0 {o->value(progdefaults.HellPulseFast);}
}
Fl_Check_Button btnHellSlowAttack {
label {Slow Attack (4 msec)}
callback {if (o->value() == 1)
callback {if (o->value() == 1) {
btnHellFastAttack->value(0);
else
progdefaults.HellPulseFast = false;
}else{
btnHellFastAttack->value(1);
progdefaults.HellPulseFast = true;
}
progdefaults.changed = true;}
xywh {185 131 70 15} down_box DOWN_BOX value 1
code0 {o->value(1);}
code0 {o->value(!progdefaults.HellPulseFast);}
}
}
Fl_Check_Button btnFeldHellIdle {
label {Xmt (.) Idle Char}
callback {progdefaults.FELD_IDLE=o->value();
callback {progdefaults.HellXmtIdle=o->value();
progdefaults.changed = true;}
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 {

Wyświetl plik

@ -65,7 +65,7 @@
#include "mt63.h"
#include "rtty.h"
#include "olivia.h"
#include "dex.h"
#include "thor.h"
#include "dominoex.h"
#include "feld.h"
#include "throb.h"
@ -202,14 +202,14 @@ Fl_Menu_Item quick_change_mt63[] = {
{ 0 }
};
Fl_Menu_Item quick_change_dex[] = {
{ mode_info[MODE_DEX4].name, 0, cb_init_mode, (void *)MODE_DEX4 },
{ mode_info[MODE_DEX5].name, 0, cb_init_mode, (void *)MODE_DEX5 },
{ mode_info[MODE_DEX8].name, 0, cb_init_mode, (void *)MODE_DEX8 },
{ mode_info[MODE_DEX11].name, 0, cb_init_mode, (void *)MODE_DEX11 },
{ mode_info[MODE_DSX11].name, 0, cb_init_mode, (void *)MODE_DSX11 },
{ mode_info[MODE_DEX16].name, 0, cb_init_mode, (void *)MODE_DEX16 },
{ mode_info[MODE_DEX22].name, 0, cb_init_mode, (void *)MODE_DEX22 },
Fl_Menu_Item quick_change_thor[] = {
{ mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4 },
{ mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5 },
{ mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8 },
{ mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11 },
{ mode_info[MODE_TSOR11].name, 0, cb_init_mode, (void *)MODE_TSOR11 },
{ mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16 },
{ mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22 },
{ 0 }
};
@ -403,12 +403,12 @@ void init_modem(trx_mode mode)
modem_config_tab = tabCW;
break;
case MODE_DEX4: case MODE_DEX5: case MODE_DEX8:
case MODE_DEX11: case MODE_DSX11: case MODE_DEX16: case MODE_DEX22:
case MODE_THOR4: case MODE_THOR5: case MODE_THOR8:
case MODE_THOR11: case MODE_TSOR11: case MODE_THOR16: case MODE_THOR22:
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
*mode_info[mode].modem = new dex(mode));
quick_change = quick_change_dex;
modem_config_tab = tabDEX;
*mode_info[mode].modem = new thor(mode));
quick_change = quick_change_thor;
modem_config_tab = tabTHOR;
break;
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},
{"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},
{ 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},
@ -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},
{"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},
{ 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},
@ -1960,15 +1960,15 @@ void resetOLIVIA() {
active_modem->restart();
}
void resetDEX() {
void resetTHOR() {
trx_mode md = active_modem->get_mode();
if (md == MODE_DEX4 ||
md == MODE_DEX5 ||
md == MODE_DEX8 ||
md == MODE_DEX11 ||
md == MODE_DSX11 ||
md == MODE_DEX16 ||
md == MODE_DEX22 ) {
if (md == MODE_THOR4 ||
md == MODE_THOR5 ||
md == MODE_THOR8 ||
md == MODE_THOR11 ||
md == MODE_TSOR11 ||
md == MODE_THOR16 ||
md == MODE_THOR22 ) {
active_modem->restart();
}
}

Wyświetl plik

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

Wyświetl plik

@ -48,13 +48,13 @@ const char *state_names[] = {
const struct mode_info_t mode_info[NUM_MODES] = {
{ MODE_CW, &cw_modem, "CW", "CW", "CW", "CW" },
{ MODE_DEX4, &dex4_modem, "DEX4", "DEX 4", "DEX4", "DEX" },
{ MODE_DEX5, &dex5_modem, "DEX5", "DEX 5", "DEX5", "DEX" },
{ MODE_DEX8, &dex8_modem, "DEX8", "DEX 8", "DEX8", "DEX" },
{ MODE_DEX11, &dex11_modem, "DEX11", "DEX 11", "DEX11", "DEX" },
{ MODE_DSX11, &dsx11_modem, "DSX11", "DSX 11", "DSX11", "DEX" },
{ MODE_DEX16, &dex16_modem, "DEX16", "DEX 16", "DEX16", "DEX" },
{ MODE_DEX22, &dex22_modem, "DEX22", "DEX 22", "DEX22", "DEX" },
{ MODE_THOR4, &thor4_modem, "THOR4", "THOR 4", "THOR4", "THOR" },
{ MODE_THOR5, &thor5_modem, "THOR5", "THOR 5", "THOR5", "THOR" },
{ MODE_THOR8, &thor8_modem, "THOR8", "THOR 8", "THOR8", "THOR" },
{ MODE_THOR11, &thor11_modem, "THOR11", "THOR 11", "THOR11", "THOR" },
{ MODE_TSOR11, &tsor11_modem, "TSOR11", "TSOR 11", "TSOR11", "TSOR" },
{ MODE_THOR16, &thor16_modem, "THOR16", "THOR 16", "THOR16", "THOR" },
{ MODE_THOR22, &thor22_modem, "THOR22", "THOR 22", "THOR22", "THOR" },
{ MODE_DOMINOEX4, &dominoex4_modem, "DomEX4", "DominoEX 4", "DOMINOEX4", "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;
#include <FL/Fl_Value_Slider.H>
extern Fl_Value_Slider *sldrVideowidth;
extern Fl_Check_Button *chkID_SMALL;
extern Fl_Check_Button *btnViewXmtSignal;
extern Fl_Group *sld;
extern Fl_Check_Button *btnCWID;
@ -137,12 +138,12 @@ extern Fl_Group *tabCWQSK;
extern Fl_Check_Button *btnQSK;
extern Fl_Counter *cntPreTiming;
extern Fl_Counter *cntPostTiming;
extern Fl_Group *tabDEX;
extern Fl_Input *txtDEXSecondary;
extern Fl_Counter *valDEX_BW;
extern Fl_Check_Button *valDEX_FILTER;
extern Fl_Counter *valDEX_PATHS;
extern Fl_Check_Button *valDEX_SOFT;
extern Fl_Group *tabTHOR;
extern Fl_Input *txtTHORSecondary;
extern Fl_Counter *valTHOR_BW;
extern Fl_Check_Button *valTHOR_FILTER;
extern Fl_Counter *valTHOR_PATHS;
extern Fl_Check_Button *valTHOR_SOFT;
extern Fl_Group *tabDomEX;
extern Fl_Input *txtSecondary;
extern Fl_Counter *valDominoEX_BW;

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -37,13 +37,13 @@ modem *qpsk125_modem = 0;
modem *qpsk250_modem = 0;
modem *olivia_modem = 0;
modem *rtty_modem = 0;
modem *dex4_modem = 0;
modem *dex5_modem = 0;
modem *dex8_modem = 0;
modem *dex11_modem = 0;
modem *dsx11_modem = 0;
modem *dex16_modem = 0;
modem *dex22_modem = 0;
modem *thor4_modem = 0;
modem *thor5_modem = 0;
modem *thor8_modem = 0;
modem *thor11_modem = 0;
modem *tsor11_modem = 0;
modem *thor16_modem = 0;
modem *thor22_modem = 0;
modem *dominoex4_modem = 0;
modem *dominoex5_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
//===========================================================================
@ -672,3 +415,498 @@ void modem::cwid()
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)
{
const char *fn = FSEL::saveas("Save text as", "Text\t*.txt");
const char *fn = FSEL::saveas("Save text as", "Text\t*.txt");
if (fn) {
#ifdef __CYGWIN__
ofstream tfile(fn);