kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Merge with upstream
commit
1232776ed2
5
README
5
README
|
@ -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
|
||||
|
||||
|
|
|
@ -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])
|
||||
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" },
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
|
@ -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
|
|
@ -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 }, }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Ładowanie…
Reference in New Issue