kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Packet Modem
Merged 3.22.0 with berlios/pu/cs development work on packet modempull/1/head
rodzic
b74102f9c6
commit
4931d1d150
|
@ -366,6 +366,8 @@ fldigi_SOURCES += \
|
|||
include/rsid.h \
|
||||
include/rtty.h \
|
||||
include/view_rtty.h \
|
||||
include/pkt.h \
|
||||
include/nco.h \
|
||||
include/rx_extract.h \
|
||||
include/speak.h \
|
||||
include/serial.h \
|
||||
|
@ -477,6 +479,7 @@ fldigi_SOURCES += \
|
|||
spot/spot.cxx \
|
||||
ssb/ssb.cxx \
|
||||
throb/throb.cxx \
|
||||
packet/pkt.cxx \
|
||||
trx/modem.cxx \
|
||||
trx/trx.cxx \
|
||||
waterfall/colorbox.cxx \
|
||||
|
|
|
@ -170,7 +170,7 @@ void rtty::restart()
|
|||
case 4 : rtty_parity = RTTY_PARITY_ONE; break;
|
||||
default : rtty_parity = RTTY_PARITY_NONE; break;
|
||||
}
|
||||
rtty_stop = progdefaults.rtty_stop;
|
||||
// (exists below already) rtty_stop = progdefaults.rtty_stop;
|
||||
|
||||
txmode = LETTERS;
|
||||
rxmode = LETTERS;
|
||||
|
|
|
@ -955,6 +955,49 @@ Fl_Group *tabModems=(Fl_Group *)0;
|
|||
|
||||
Fl_Tabs *tabsModems=(Fl_Tabs *)0;
|
||||
|
||||
Fl_Group *tabContestia=(Fl_Group *)0;
|
||||
|
||||
Fl_Choice *mnuContestia_Bandwidth=(Fl_Choice *)0;
|
||||
|
||||
static void cb_mnuContestia_Bandwidth(Fl_Choice* o, void*) {
|
||||
progdefaults.contestiabw = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetOLIVIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Choice *mnuContestia_Tones=(Fl_Choice *)0;
|
||||
|
||||
static void cb_mnuContestia_Tones(Fl_Choice* o, void*) {
|
||||
progdefaults.contestiatones = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *cntContestia_smargin=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_cntContestia_smargin(Fl_Counter2* o, void*) {
|
||||
progdefaults.contestiasmargin = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *cntContestia_sinteg=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_cntContestia_sinteg(Fl_Counter2* o, void*) {
|
||||
progdefaults.contestiasinteg = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnContestia_8bit=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) {
|
||||
progdefaults.contestia8bit = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabCW=(Fl_Group *)0;
|
||||
|
||||
Fl_Tabs *tabsCW=(Fl_Tabs *)0;
|
||||
|
@ -1450,49 +1493,6 @@ static void cb_btnOlivia_8bit(Fl_Check_Button* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabContestia=(Fl_Group *)0;
|
||||
|
||||
Fl_Choice *mnuContestia_Bandwidth=(Fl_Choice *)0;
|
||||
|
||||
static void cb_mnuContestia_Bandwidth(Fl_Choice* o, void*) {
|
||||
progdefaults.contestiabw = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetOLIVIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Choice *mnuContestia_Tones=(Fl_Choice *)0;
|
||||
|
||||
static void cb_mnuContestia_Tones(Fl_Choice* o, void*) {
|
||||
progdefaults.contestiatones = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *cntContestia_smargin=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_cntContestia_smargin(Fl_Counter2* o, void*) {
|
||||
progdefaults.contestiasmargin = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *cntContestia_sinteg=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_cntContestia_sinteg(Fl_Counter2* o, void*) {
|
||||
progdefaults.contestiasinteg = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnContestia_8bit=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) {
|
||||
progdefaults.contestia8bit = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabPSK=(Fl_Group *)0;
|
||||
|
||||
Fl_Tabs *tabsPSK=(Fl_Tabs *)0;
|
||||
|
@ -1701,6 +1701,105 @@ static void cb_valTHOR_PATHS(Fl_Counter2* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabPacket=(Fl_Group *)0;
|
||||
|
||||
Fl_Choice *selPacket_Baud=(Fl_Choice *)0;
|
||||
|
||||
static void cb_selPacket_Baud(Fl_Choice* o, void*) {
|
||||
progdefaults.PKT_BAUD_SELECT = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *valPacket_LoSig_RXGain=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_valPacket_LoSig_RXGain(Fl_Counter2* o, void*) {
|
||||
progdefaults.PKT_LOSIG_RXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *valPacket_HiSig_RXGain=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_valPacket_HiSig_RXGain(Fl_Counter2* o, void*) {
|
||||
progdefaults.PKT_HISIG_RXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *valPacket_LoSig_TXGain=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_valPacket_LoSig_TXGain(Fl_Counter2* o, void*) {
|
||||
progdefaults.PKT_LOSIG_TXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Counter2 *valPacket_HiSig_TXGain=(Fl_Counter2 *)0;
|
||||
|
||||
static void cb_valPacket_HiSig_TXGain(Fl_Counter2* o, void*) {
|
||||
progdefaults.PKT_HISIG_TXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktRXTimestamp=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktRXTimestamp(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_RXTimestamp=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktexpandCmp=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktexpandCmp(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_expandCmp=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktexpandMicE=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktexpandMicE(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_expandMicE=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktexpandPHG=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktexpandPHG(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_expandPHG=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktunitsSI=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktunitsSI(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_unitsSI=o->value();
|
||||
if (progdefaults.PKT_unitsSI) {
|
||||
progdefaults.PKT_unitsEnglish=false;
|
||||
btnPktunitsEnglish->value(false);
|
||||
}
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktunitsEnglish=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktunitsEnglish(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_unitsEnglish=o->value();
|
||||
if (progdefaults.PKT_unitsSI) {
|
||||
progdefaults.PKT_unitsSI=false;
|
||||
btnPktunitsSI->value(false);
|
||||
}
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Check_Button *btnPktPreferXhairScope=(Fl_Check_Button *)0;
|
||||
|
||||
static void cb_btnPktPreferXhairScope(Fl_Check_Button* o, void*) {
|
||||
progdefaults.PKT_PreferXhairScope=o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabRig=(Fl_Group *)0;
|
||||
|
||||
Fl_Tabs *tabsRig=(Fl_Tabs *)0;
|
||||
|
@ -2905,6 +3004,7 @@ static const char szOliviaTones[] = "2|4|8|16|32|64|128|256";
|
|||
static const char szOliviaBandwidth[] = "125|250|500|1000|2000";
|
||||
static const char szContestiaTones[] = "2|4|8|16|32|64|128|256";
|
||||
static const char szContestiaBandwidth[] = "125|250|500|1000|2000";
|
||||
static const char szPktBauds[] = "1200|300|2400";
|
||||
static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800";
|
||||
static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";
|
||||
{ Fl_Double_Window* o = new Fl_Double_Window(500, 400, _("Fldigi configuration"));
|
||||
|
@ -2913,7 +3013,7 @@ static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";
|
|||
o->selection_color((Fl_Color)51);
|
||||
o->labelsize(18);
|
||||
o->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE);
|
||||
{ tabsConfigure = new Fl_Tabs(-4, 0, 521, 372);
|
||||
{ tabsConfigure = new Fl_Tabs(-4, 0, 544, 372);
|
||||
tabsConfigure->color((Fl_Color)FL_LIGHT1);
|
||||
tabsConfigure->selection_color((Fl_Color)FL_LIGHT1);
|
||||
{ tabOperator = new Fl_Group(0, 25, 500, 345, _("Operator"));
|
||||
|
@ -3340,7 +3440,6 @@ ab and newline are automatically included."));
|
|||
tabMBars->end();
|
||||
} // Fl_Group* tabMBars
|
||||
{ tabContest = new Fl_Group(0, 50, 500, 320, _("Contest"));
|
||||
tabContest->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 80, _("Exchanges"));
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
|
@ -3577,6 +3676,7 @@ ab and newline are automatically included."));
|
|||
tabWF_UI->end();
|
||||
} // Fl_Group* tabWF_UI
|
||||
{ tabRxText = new Fl_Group(0, 50, 500, 320, _("Rx Text"));
|
||||
tabRxText->hide();
|
||||
{ Fl_Check_Button* o = btn_rx_lowercase = new Fl_Check_Button(27, 75, 389, 20, _("Print CW / RTTY / THROB / CONTESTIA in lowercase"));
|
||||
btn_rx_lowercase->down_box(FL_DOWN_BOX);
|
||||
btn_rx_lowercase->callback((Fl_Callback*)cb_btn_rx_lowercase);
|
||||
|
@ -3903,11 +4003,83 @@ an merging"));
|
|||
} // Fl_Tabs* tabsWaterfall
|
||||
tabWaterfall->end();
|
||||
} // Fl_Group* tabWaterfall
|
||||
{ tabModems = new Fl_Group(-4, 25, 521, 347, _("Modems"));
|
||||
{ tabModems = new Fl_Group(-4, 25, 544, 347, _("Modems"));
|
||||
tabModems->hide();
|
||||
{ tabsModems = new Fl_Tabs(-4, 25, 521, 347);
|
||||
{ tabsModems = new Fl_Tabs(-4, 25, 544, 347);
|
||||
tabsModems->selection_color((Fl_Color)FL_LIGHT1);
|
||||
tabsModems->align(FL_ALIGN_TOP_RIGHT);
|
||||
{ tabContestia = new Fl_Group(0, 50, 500, 320, _("Contestia"));
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 200);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ Fl_Choice* o = mnuContestia_Bandwidth = new Fl_Choice(60, 80, 85, 20, _("Bandwidth"));
|
||||
mnuContestia_Bandwidth->tooltip(_("Select bandwidth"));
|
||||
mnuContestia_Bandwidth->down_box(FL_BORDER_BOX);
|
||||
mnuContestia_Bandwidth->callback((Fl_Callback*)cb_mnuContestia_Bandwidth);
|
||||
mnuContestia_Bandwidth->align(FL_ALIGN_RIGHT);
|
||||
o->add(szContestiaBandwidth);
|
||||
o->value(2);
|
||||
} // Fl_Choice* mnuContestia_Bandwidth
|
||||
{ Fl_Choice* o = mnuContestia_Tones = new Fl_Choice(321, 80, 70, 20, _("Tones"));
|
||||
mnuContestia_Tones->tooltip(_("Select number of tones"));
|
||||
mnuContestia_Tones->down_box(FL_BORDER_BOX);
|
||||
mnuContestia_Tones->callback((Fl_Callback*)cb_mnuContestia_Tones);
|
||||
mnuContestia_Tones->align(FL_ALIGN_RIGHT);
|
||||
o->add(szContestiaTones);
|
||||
o->value(2);
|
||||
} // Fl_Choice* mnuContestia_Tones
|
||||
{ Fl_Group* o = new Fl_Group(60, 119, 379, 100, _("Receive synchronizer"));
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Counter2* o = cntContestia_smargin = new Fl_Counter2(80, 150, 70, 20, _("Tune margin (tone frequency spacing)"));
|
||||
cntContestia_smargin->tooltip(_("Change ONLY to experiment"));
|
||||
cntContestia_smargin->type(1);
|
||||
cntContestia_smargin->box(FL_UP_BOX);
|
||||
cntContestia_smargin->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
cntContestia_smargin->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
cntContestia_smargin->labeltype(FL_NORMAL_LABEL);
|
||||
cntContestia_smargin->labelfont(0);
|
||||
cntContestia_smargin->labelsize(14);
|
||||
cntContestia_smargin->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntContestia_smargin->minimum(2);
|
||||
cntContestia_smargin->maximum(128);
|
||||
cntContestia_smargin->step(1);
|
||||
cntContestia_smargin->value(8);
|
||||
cntContestia_smargin->callback((Fl_Callback*)cb_cntContestia_smargin);
|
||||
cntContestia_smargin->align(FL_ALIGN_RIGHT);
|
||||
cntContestia_smargin->when(FL_WHEN_CHANGED);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* cntContestia_smargin
|
||||
{ Fl_Counter2* o = cntContestia_sinteg = new Fl_Counter2(80, 180, 70, 20, _("Integration period (FEC blocks)"));
|
||||
cntContestia_sinteg->tooltip(_("Change ONLY to experiment"));
|
||||
cntContestia_sinteg->type(1);
|
||||
cntContestia_sinteg->box(FL_UP_BOX);
|
||||
cntContestia_sinteg->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
cntContestia_sinteg->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
cntContestia_sinteg->labeltype(FL_NORMAL_LABEL);
|
||||
cntContestia_sinteg->labelfont(0);
|
||||
cntContestia_sinteg->labelsize(14);
|
||||
cntContestia_sinteg->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntContestia_sinteg->minimum(2);
|
||||
cntContestia_sinteg->maximum(128);
|
||||
cntContestia_sinteg->step(1);
|
||||
cntContestia_sinteg->value(4);
|
||||
cntContestia_sinteg->callback((Fl_Callback*)cb_cntContestia_sinteg);
|
||||
cntContestia_sinteg->align(FL_ALIGN_RIGHT);
|
||||
cntContestia_sinteg->when(FL_WHEN_CHANGED);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* cntContestia_sinteg
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
{ btnContestia_8bit = new Fl_Check_Button(60, 229, 200, 20, _("8-bit extended characters"));
|
||||
btnContestia_8bit->tooltip(_("Enable this for Latin-1 accented characters"));
|
||||
btnContestia_8bit->down_box(FL_DOWN_BOX);
|
||||
btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit);
|
||||
btnContestia_8bit->hide();
|
||||
} // Fl_Check_Button* btnContestia_8bit
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
tabContestia->end();
|
||||
} // Fl_Group* tabContestia
|
||||
{ tabCW = new Fl_Group(0, 50, 504, 320, _("CW"));
|
||||
tabCW->hide();
|
||||
{ tabsCW = new Fl_Tabs(0, 50, 504, 320);
|
||||
|
@ -4307,7 +4479,7 @@ an merging"));
|
|||
} // Fl_Tabs* tabsCW
|
||||
tabCW->end();
|
||||
} // Fl_Group* tabCW
|
||||
{ tabDomEX = new Fl_Group(0, 50, 500, 320, _("DomEX"));
|
||||
{ tabDomEX = new Fl_Group(0, 50, 500, 320, _("Dom"));
|
||||
tabDomEX->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 180);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
|
@ -4401,7 +4573,7 @@ an merging"));
|
|||
} // Fl_Group* o
|
||||
tabDomEX->end();
|
||||
} // Fl_Group* tabDomEX
|
||||
{ tabFeld = new Fl_Group(0, 50, 500, 320, _("Feldhell"));
|
||||
{ tabFeld = new Fl_Group(0, 50, 500, 320, _("FH"));
|
||||
tabFeld->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 145);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
|
@ -4623,80 +4795,8 @@ an merging"));
|
|||
} // Fl_Group* o
|
||||
tabOlivia->end();
|
||||
} // Fl_Group* tabOlivia
|
||||
{ tabContestia = new Fl_Group(0, 50, 500, 320, _("Contestia"));
|
||||
tabContestia->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 200);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ Fl_Choice* o = mnuContestia_Bandwidth = new Fl_Choice(60, 80, 85, 20, _("Bandwidth"));
|
||||
mnuContestia_Bandwidth->tooltip(_("Select bandwidth"));
|
||||
mnuContestia_Bandwidth->down_box(FL_BORDER_BOX);
|
||||
mnuContestia_Bandwidth->callback((Fl_Callback*)cb_mnuContestia_Bandwidth);
|
||||
mnuContestia_Bandwidth->align(FL_ALIGN_RIGHT);
|
||||
o->add(szContestiaBandwidth);
|
||||
o->value(2);
|
||||
} // Fl_Choice* mnuContestia_Bandwidth
|
||||
{ Fl_Choice* o = mnuContestia_Tones = new Fl_Choice(321, 80, 70, 20, _("Tones"));
|
||||
mnuContestia_Tones->tooltip(_("Select number of tones"));
|
||||
mnuContestia_Tones->down_box(FL_BORDER_BOX);
|
||||
mnuContestia_Tones->callback((Fl_Callback*)cb_mnuContestia_Tones);
|
||||
mnuContestia_Tones->align(FL_ALIGN_RIGHT);
|
||||
o->add(szContestiaTones);
|
||||
o->value(2);
|
||||
} // Fl_Choice* mnuContestia_Tones
|
||||
{ Fl_Group* o = new Fl_Group(60, 119, 379, 100, _("Receive synchronizer"));
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE);
|
||||
{ Fl_Counter2* o = cntContestia_smargin = new Fl_Counter2(80, 150, 70, 20, _("Tune margin (tone frequency spacing)"));
|
||||
cntContestia_smargin->tooltip(_("Change ONLY to experiment"));
|
||||
cntContestia_smargin->type(1);
|
||||
cntContestia_smargin->box(FL_UP_BOX);
|
||||
cntContestia_smargin->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
cntContestia_smargin->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
cntContestia_smargin->labeltype(FL_NORMAL_LABEL);
|
||||
cntContestia_smargin->labelfont(0);
|
||||
cntContestia_smargin->labelsize(14);
|
||||
cntContestia_smargin->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntContestia_smargin->minimum(2);
|
||||
cntContestia_smargin->maximum(128);
|
||||
cntContestia_smargin->step(1);
|
||||
cntContestia_smargin->value(8);
|
||||
cntContestia_smargin->callback((Fl_Callback*)cb_cntContestia_smargin);
|
||||
cntContestia_smargin->align(FL_ALIGN_RIGHT);
|
||||
cntContestia_smargin->when(FL_WHEN_CHANGED);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* cntContestia_smargin
|
||||
{ Fl_Counter2* o = cntContestia_sinteg = new Fl_Counter2(80, 180, 70, 20, _("Integration period (FEC blocks)"));
|
||||
cntContestia_sinteg->tooltip(_("Change ONLY to experiment"));
|
||||
cntContestia_sinteg->type(1);
|
||||
cntContestia_sinteg->box(FL_UP_BOX);
|
||||
cntContestia_sinteg->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
cntContestia_sinteg->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
cntContestia_sinteg->labeltype(FL_NORMAL_LABEL);
|
||||
cntContestia_sinteg->labelfont(0);
|
||||
cntContestia_sinteg->labelsize(14);
|
||||
cntContestia_sinteg->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
cntContestia_sinteg->minimum(2);
|
||||
cntContestia_sinteg->maximum(128);
|
||||
cntContestia_sinteg->step(1);
|
||||
cntContestia_sinteg->value(4);
|
||||
cntContestia_sinteg->callback((Fl_Callback*)cb_cntContestia_sinteg);
|
||||
cntContestia_sinteg->align(FL_ALIGN_RIGHT);
|
||||
cntContestia_sinteg->when(FL_WHEN_CHANGED);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* cntContestia_sinteg
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
{ btnContestia_8bit = new Fl_Check_Button(60, 229, 200, 20, _("8-bit extended characters"));
|
||||
btnContestia_8bit->tooltip(_("Enable this for Latin-1 accented characters"));
|
||||
btnContestia_8bit->down_box(FL_DOWN_BOX);
|
||||
btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit);
|
||||
btnContestia_8bit->hide();
|
||||
} // Fl_Check_Button* btnContestia_8bit
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
tabContestia->end();
|
||||
} // Fl_Group* tabContestia
|
||||
{ tabPSK = new Fl_Group(-4, 50, 521, 322, _("PSK"));
|
||||
tabPSK->hide();
|
||||
{ tabsPSK = new Fl_Tabs(-4, 50, 521, 322);
|
||||
tabsPSK->selection_color((Fl_Color)FL_LIGHT1);
|
||||
{ Fl_Group* o = new Fl_Group(0, 75, 500, 295, _("General"));
|
||||
|
@ -5055,6 +5155,141 @@ an merging"));
|
|||
} // Fl_Group* o
|
||||
tabTHOR->end();
|
||||
} // Fl_Group* tabTHOR
|
||||
{ tabPacket = new Fl_Group(0, 50, 540, 320, _("Packet"));
|
||||
tabPacket->hide();
|
||||
{ Fl_Group* o = new Fl_Group(5, 60, 490, 296);
|
||||
o->box(FL_ENGRAVED_FRAME);
|
||||
{ Fl_Choice* o = selPacket_Baud = new Fl_Choice(44, 85, 100, 20, _("Baud rate"));
|
||||
selPacket_Baud->tooltip(_("Select packet baudrate"));
|
||||
selPacket_Baud->down_box(FL_BORDER_BOX);
|
||||
selPacket_Baud->callback((Fl_Callback*)cb_selPacket_Baud);
|
||||
selPacket_Baud->align(FL_ALIGN_RIGHT);
|
||||
selPacket_Baud->when(FL_WHEN_CHANGED);
|
||||
o->add(szPktBauds);
|
||||
o->value(progdefaults.PKT_BAUD_SELECT);
|
||||
} // Fl_Choice* selPacket_Baud
|
||||
{ Fl_Counter2* o = valPacket_LoSig_RXGain = new Fl_Counter2(42, 120, 63, 20, _("RX Low Freq Gain"));
|
||||
valPacket_LoSig_RXGain->tooltip(_("Processing gain to apply to lower tone (in dB)"));
|
||||
valPacket_LoSig_RXGain->type(1);
|
||||
valPacket_LoSig_RXGain->box(FL_UP_BOX);
|
||||
valPacket_LoSig_RXGain->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
valPacket_LoSig_RXGain->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
valPacket_LoSig_RXGain->labeltype(FL_NORMAL_LABEL);
|
||||
valPacket_LoSig_RXGain->labelfont(0);
|
||||
valPacket_LoSig_RXGain->labelsize(14);
|
||||
valPacket_LoSig_RXGain->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valPacket_LoSig_RXGain->minimum(-6);
|
||||
valPacket_LoSig_RXGain->maximum(6);
|
||||
valPacket_LoSig_RXGain->step(0.5);
|
||||
valPacket_LoSig_RXGain->callback((Fl_Callback*)cb_valPacket_LoSig_RXGain);
|
||||
valPacket_LoSig_RXGain->align(FL_ALIGN_RIGHT);
|
||||
valPacket_LoSig_RXGain->when(FL_WHEN_CHANGED);
|
||||
o->value(progdefaults.PKT_LOSIG_RXGAIN);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* valPacket_LoSig_RXGain
|
||||
{ Fl_Counter2* o = valPacket_HiSig_RXGain = new Fl_Counter2(42, 145, 63, 20, _("RX High Freq Gain"));
|
||||
valPacket_HiSig_RXGain->tooltip(_("Processing gain to apply to higher tone (in dB)"));
|
||||
valPacket_HiSig_RXGain->type(1);
|
||||
valPacket_HiSig_RXGain->box(FL_UP_BOX);
|
||||
valPacket_HiSig_RXGain->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
valPacket_HiSig_RXGain->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
valPacket_HiSig_RXGain->labeltype(FL_NORMAL_LABEL);
|
||||
valPacket_HiSig_RXGain->labelfont(0);
|
||||
valPacket_HiSig_RXGain->labelsize(14);
|
||||
valPacket_HiSig_RXGain->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valPacket_HiSig_RXGain->minimum(-6);
|
||||
valPacket_HiSig_RXGain->maximum(6);
|
||||
valPacket_HiSig_RXGain->step(0.5);
|
||||
valPacket_HiSig_RXGain->callback((Fl_Callback*)cb_valPacket_HiSig_RXGain);
|
||||
valPacket_HiSig_RXGain->align(FL_ALIGN_RIGHT);
|
||||
valPacket_HiSig_RXGain->when(FL_WHEN_CHANGED);
|
||||
o->value(progdefaults.PKT_HISIG_RXGAIN);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* valPacket_HiSig_RXGain
|
||||
{ Fl_Counter2* o = valPacket_LoSig_TXGain = new Fl_Counter2(268, 120, 63, 20, _("TX Low Freq Gain"));
|
||||
valPacket_LoSig_TXGain->tooltip(_("Processing gain to apply to lower tone (in dB)"));
|
||||
valPacket_LoSig_TXGain->type(1);
|
||||
valPacket_LoSig_TXGain->box(FL_UP_BOX);
|
||||
valPacket_LoSig_TXGain->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
valPacket_LoSig_TXGain->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
valPacket_LoSig_TXGain->labeltype(FL_NORMAL_LABEL);
|
||||
valPacket_LoSig_TXGain->labelfont(0);
|
||||
valPacket_LoSig_TXGain->labelsize(14);
|
||||
valPacket_LoSig_TXGain->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valPacket_LoSig_TXGain->minimum(-6);
|
||||
valPacket_LoSig_TXGain->maximum(6);
|
||||
valPacket_LoSig_TXGain->step(0.5);
|
||||
valPacket_LoSig_TXGain->callback((Fl_Callback*)cb_valPacket_LoSig_TXGain);
|
||||
valPacket_LoSig_TXGain->align(FL_ALIGN_RIGHT);
|
||||
valPacket_LoSig_TXGain->when(FL_WHEN_CHANGED);
|
||||
o->value(progdefaults.PKT_LOSIG_TXGAIN);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* valPacket_LoSig_TXGain
|
||||
{ Fl_Counter2* o = valPacket_HiSig_TXGain = new Fl_Counter2(268, 145, 63, 20, _("TX High Freq Gain"));
|
||||
valPacket_HiSig_TXGain->tooltip(_("Processing gain to apply to higher tone (in dB)"));
|
||||
valPacket_HiSig_TXGain->type(1);
|
||||
valPacket_HiSig_TXGain->box(FL_UP_BOX);
|
||||
valPacket_HiSig_TXGain->color((Fl_Color)FL_BACKGROUND_COLOR);
|
||||
valPacket_HiSig_TXGain->selection_color((Fl_Color)FL_INACTIVE_COLOR);
|
||||
valPacket_HiSig_TXGain->labeltype(FL_NORMAL_LABEL);
|
||||
valPacket_HiSig_TXGain->labelfont(0);
|
||||
valPacket_HiSig_TXGain->labelsize(14);
|
||||
valPacket_HiSig_TXGain->labelcolor((Fl_Color)FL_FOREGROUND_COLOR);
|
||||
valPacket_HiSig_TXGain->minimum(-6);
|
||||
valPacket_HiSig_TXGain->maximum(6);
|
||||
valPacket_HiSig_TXGain->step(0.5);
|
||||
valPacket_HiSig_TXGain->callback((Fl_Callback*)cb_valPacket_HiSig_TXGain);
|
||||
valPacket_HiSig_TXGain->align(FL_ALIGN_RIGHT);
|
||||
valPacket_HiSig_TXGain->when(FL_WHEN_CHANGED);
|
||||
o->value(progdefaults.PKT_HISIG_TXGAIN);
|
||||
o->labelsize(FL_NORMAL_SIZE);
|
||||
} // Fl_Counter2* valPacket_HiSig_TXGain
|
||||
{ Fl_Check_Button* o = btnPktRXTimestamp = new Fl_Check_Button(39, 180, 165, 20, _("add RX timestamps"));
|
||||
btnPktRXTimestamp->tooltip(_("Prepend timestamp to each RX packet"));
|
||||
btnPktRXTimestamp->down_box(FL_DOWN_BOX);
|
||||
btnPktRXTimestamp->callback((Fl_Callback*)cb_btnPktRXTimestamp);
|
||||
o->value(progdefaults.PKT_RXTimestamp);
|
||||
} // Fl_Check_Button* btnPktRXTimestamp
|
||||
{ Fl_Check_Button* o = btnPktexpandCmp = new Fl_Check_Button(268, 180, 190, 20, _("decode Compressed data"));
|
||||
btnPktexpandCmp->tooltip(_("Decode received Compressed Position data"));
|
||||
btnPktexpandCmp->down_box(FL_DOWN_BOX);
|
||||
btnPktexpandCmp->callback((Fl_Callback*)cb_btnPktexpandCmp);
|
||||
o->value(progdefaults.PKT_expandCmp);
|
||||
} // Fl_Check_Button* btnPktexpandCmp
|
||||
{ Fl_Check_Button* o = btnPktexpandMicE = new Fl_Check_Button(39, 206, 165, 20, _("decode Mic-E data"));
|
||||
btnPktexpandMicE->tooltip(_("Decode received Mic-E data"));
|
||||
btnPktexpandMicE->down_box(FL_DOWN_BOX);
|
||||
btnPktexpandMicE->callback((Fl_Callback*)cb_btnPktexpandMicE);
|
||||
o->value(progdefaults.PKT_expandMicE);
|
||||
} // Fl_Check_Button* btnPktexpandMicE
|
||||
{ Fl_Check_Button* o = btnPktexpandPHG = new Fl_Check_Button(39, 233, 165, 20, _("decode PHG data"));
|
||||
btnPktexpandPHG->tooltip(_("Decode received PHG data"));
|
||||
btnPktexpandPHG->down_box(FL_DOWN_BOX);
|
||||
btnPktexpandPHG->callback((Fl_Callback*)cb_btnPktexpandPHG);
|
||||
o->value(progdefaults.PKT_expandPHG);
|
||||
} // Fl_Check_Button* btnPktexpandPHG
|
||||
{ Fl_Check_Button* o = btnPktunitsSI = new Fl_Check_Button(39, 260, 165, 20, _("use SI units"));
|
||||
btnPktunitsSI->tooltip(_("Display decoded data values in SI units"));
|
||||
btnPktunitsSI->down_box(FL_DOWN_BOX);
|
||||
btnPktunitsSI->callback((Fl_Callback*)cb_btnPktunitsSI);
|
||||
o->value(progdefaults.PKT_unitsSI);
|
||||
} // Fl_Check_Button* btnPktunitsSI
|
||||
{ Fl_Check_Button* o = btnPktunitsEnglish = new Fl_Check_Button(39, 287, 165, 20, _("use English units"));
|
||||
btnPktunitsEnglish->tooltip(_("Display decoded data in English units"));
|
||||
btnPktunitsEnglish->down_box(FL_DOWN_BOX);
|
||||
btnPktunitsEnglish->callback((Fl_Callback*)cb_btnPktunitsEnglish);
|
||||
o->value(progdefaults.PKT_unitsEnglish);
|
||||
} // Fl_Check_Button* btnPktunitsEnglish
|
||||
{ Fl_Check_Button* o = btnPktPreferXhairScope = new Fl_Check_Button(268, 206, 165, 20, _("Use cross-hair scope"));
|
||||
btnPktPreferXhairScope->tooltip(_("Defaults to syncscope instead of phase (cross-hair) scope"));
|
||||
btnPktPreferXhairScope->down_box(FL_DOWN_BOX);
|
||||
btnPktPreferXhairScope->callback((Fl_Callback*)cb_btnPktPreferXhairScope);
|
||||
o->value(progdefaults.PKT_PreferXhairScope);
|
||||
} // Fl_Check_Button* btnPktPreferXhairScope
|
||||
o->end();
|
||||
} // Fl_Group* o
|
||||
tabPacket->end();
|
||||
} // Fl_Group* tabPacket
|
||||
tabsModems->end();
|
||||
} // Fl_Tabs* tabsModems
|
||||
tabModems->end();
|
||||
|
|
|
@ -94,18 +94,20 @@ static const char szOliviaTones[] = "2|4|8|16|32|64|128|256";
|
|||
static const char szOliviaBandwidth[] = "125|250|500|1000|2000";
|
||||
static const char szContestiaTones[] = "2|4|8|16|32|64|128|256";
|
||||
static const char szContestiaBandwidth[] = "125|250|500|1000|2000";
|
||||
static const char szPktBauds[] = "1200|300|2400";
|
||||
static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800";
|
||||
static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {}
|
||||
static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {selected
|
||||
}
|
||||
Fl_Window {} {
|
||||
label {Fldigi configuration} open
|
||||
xywh {616 61 500 400} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible
|
||||
} {
|
||||
Fl_Tabs tabsConfigure {open
|
||||
xywh {-4 0 521 372} color 50 selection_color 50
|
||||
xywh {-4 0 544 372} color 50 selection_color 50
|
||||
} {
|
||||
Fl_Group tabOperator {
|
||||
label Operator
|
||||
callback {progdefaults.changed = true;} selected
|
||||
callback {progdefaults.changed = true;}
|
||||
tooltip {Operator information} xywh {0 25 500 345} when 1
|
||||
} {
|
||||
Fl_Group {} {
|
||||
|
@ -583,7 +585,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabContest {
|
||||
label Contest
|
||||
xywh {0 50 500 320} hide
|
||||
xywh {0 50 500 320}
|
||||
} {
|
||||
Fl_Group {} {
|
||||
label Exchanges open
|
||||
|
@ -862,7 +864,7 @@ WF_UI();}
|
|||
}
|
||||
Fl_Group tabRxText {
|
||||
label {Rx Text} open
|
||||
xywh {0 50 500 320}
|
||||
xywh {0 50 500 320} hide
|
||||
} {
|
||||
Fl_Check_Button btn_rx_lowercase {
|
||||
label {Print CW / RTTY / THROB / CONTESTIA in lowercase}
|
||||
|
@ -1189,11 +1191,69 @@ behaves inside the waterfall} xywh {15 196 150 22} down_box BORDER_BOX align 8
|
|||
}
|
||||
Fl_Group tabModems {
|
||||
label Modems open
|
||||
xywh {-4 25 521 347} hide
|
||||
xywh {-4 25 544 347} hide
|
||||
} {
|
||||
Fl_Tabs tabsModems {open
|
||||
xywh {-4 25 521 347} selection_color 50 align 9
|
||||
xywh {-4 25 544 347} selection_color 50 align 9
|
||||
} {
|
||||
Fl_Group tabContestia {
|
||||
label Contestia open
|
||||
xywh {0 50 500 320}
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 490 200} box ENGRAVED_FRAME
|
||||
} {
|
||||
Fl_Choice mnuContestia_Bandwidth {
|
||||
label Bandwidth
|
||||
callback {progdefaults.contestiabw = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetOLIVIA();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Select bandwidth} xywh {60 80 85 20} down_box BORDER_BOX align 8
|
||||
code0 {o->add(szContestiaBandwidth);}
|
||||
code1 {o->value(2);}
|
||||
} {}
|
||||
Fl_Choice mnuContestia_Tones {
|
||||
label Tones
|
||||
callback {progdefaults.contestiatones = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Select number of tones} xywh {321 80 70 20} down_box BORDER_BOX align 8
|
||||
code0 {o->add(szContestiaTones);}
|
||||
code1 {o->value(2);}
|
||||
} {}
|
||||
Fl_Group {} {
|
||||
label {Receive synchronizer} open
|
||||
xywh {60 119 379 100} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Counter cntContestia_smargin {
|
||||
label {Tune margin (tone frequency spacing)}
|
||||
callback {progdefaults.contestiasmargin = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Change ONLY to experiment} xywh {80 150 70 20} type Simple align 8 minimum 2 maximum 128 step 1 value 8
|
||||
code0 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Counter cntContestia_sinteg {
|
||||
label {Integration period (FEC blocks)}
|
||||
callback {progdefaults.contestiasinteg = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Change ONLY to experiment} xywh {80 180 70 20} type Simple align 8 minimum 2 maximum 128 step 1 value 4
|
||||
code0 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
}
|
||||
Fl_Check_Button btnContestia_8bit {
|
||||
label {8-bit extended characters}
|
||||
callback {progdefaults.contestia8bit = o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Enable this for Latin-1 accented characters} xywh {60 229 200 20} down_box DOWN_BOX hide
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabCW {
|
||||
label CW
|
||||
xywh {0 50 504 320} hide
|
||||
|
@ -1590,7 +1650,7 @@ progdefaults.changed = true;} open
|
|||
}
|
||||
}
|
||||
Fl_Group tabDomEX {
|
||||
label DomEX
|
||||
label Dom
|
||||
xywh {0 50 500 320} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
|
@ -1651,7 +1711,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
Fl_Group tabFeld {
|
||||
label Feldhell
|
||||
label FH
|
||||
xywh {0 50 500 320} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
|
@ -1856,67 +1916,9 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabContestia {
|
||||
label Contestia open
|
||||
xywh {0 50 500 320} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 490 200} box ENGRAVED_FRAME
|
||||
} {
|
||||
Fl_Choice mnuContestia_Bandwidth {
|
||||
label Bandwidth
|
||||
callback {progdefaults.contestiabw = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetOLIVIA();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Select bandwidth} xywh {60 80 85 20} down_box BORDER_BOX align 8
|
||||
code0 {o->add(szContestiaBandwidth);}
|
||||
code1 {o->value(2);}
|
||||
} {}
|
||||
Fl_Choice mnuContestia_Tones {
|
||||
label Tones
|
||||
callback {progdefaults.contestiatones = o->value();
|
||||
set_contestia_default_integ();
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Select number of tones} xywh {321 80 70 20} down_box BORDER_BOX align 8
|
||||
code0 {o->add(szContestiaTones);}
|
||||
code1 {o->value(2);}
|
||||
} {}
|
||||
Fl_Group {} {
|
||||
label {Receive synchronizer} open
|
||||
xywh {60 119 379 100} box ENGRAVED_FRAME align 21
|
||||
} {
|
||||
Fl_Counter cntContestia_smargin {
|
||||
label {Tune margin (tone frequency spacing)}
|
||||
callback {progdefaults.contestiasmargin = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Change ONLY to experiment} xywh {80 150 70 20} type Simple align 8 minimum 2 maximum 128 step 1 value 8
|
||||
code0 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Counter cntContestia_sinteg {
|
||||
label {Integration period (FEC blocks)}
|
||||
callback {progdefaults.contestiasinteg = (int)(o->value());
|
||||
resetCONTESTIA();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Change ONLY to experiment} xywh {80 180 70 20} type Simple align 8 minimum 2 maximum 128 step 1 value 4
|
||||
code0 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
}
|
||||
Fl_Check_Button btnContestia_8bit {
|
||||
label {8-bit extended characters}
|
||||
callback {progdefaults.contestia8bit = o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Enable this for Latin-1 accented characters} xywh {60 229 200 20} down_box DOWN_BOX hide
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabPSK {
|
||||
label PSK open
|
||||
xywh {-4 50 521 322}
|
||||
xywh {-4 50 521 322} hide
|
||||
} {
|
||||
Fl_Tabs tabsPSK {open
|
||||
xywh {-4 50 521 322} selection_color 50
|
||||
|
@ -2202,6 +2204,121 @@ progdefaults.changed = true;}
|
|||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabPacket {
|
||||
label Packet open
|
||||
xywh {0 50 540 320} hide
|
||||
} {
|
||||
Fl_Group {} {open
|
||||
xywh {5 60 490 296} box ENGRAVED_FRAME
|
||||
} {
|
||||
Fl_Choice selPacket_Baud {
|
||||
label {Baud rate}
|
||||
callback {progdefaults.PKT_BAUD_SELECT = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;} open
|
||||
tooltip {Select packet baudrate} xywh {44 85 100 20} down_box BORDER_BOX align 8 when 1
|
||||
code0 {o->add(szPktBauds);}
|
||||
code1 {o->value(progdefaults.PKT_BAUD_SELECT);}
|
||||
} {}
|
||||
Fl_Counter valPacket_LoSig_RXGain {
|
||||
label {RX Low Freq Gain}
|
||||
callback {progdefaults.PKT_LOSIG_RXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Processing gain to apply to lower tone (in dB)} xywh {42 120 63 20} type Simple align 8 minimum -6 maximum 6 step 0.5
|
||||
code0 {o->value(progdefaults.PKT_LOSIG_RXGAIN);}
|
||||
code1 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Counter valPacket_HiSig_RXGain {
|
||||
label {RX High Freq Gain}
|
||||
callback {progdefaults.PKT_HISIG_RXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Processing gain to apply to higher tone (in dB)} xywh {42 145 63 20} type Simple align 8 minimum -6 maximum 6 step 0.5
|
||||
code0 {o->value(progdefaults.PKT_HISIG_RXGAIN);}
|
||||
code1 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Counter valPacket_LoSig_TXGain {
|
||||
label {TX Low Freq Gain}
|
||||
callback {progdefaults.PKT_LOSIG_TXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Processing gain to apply to lower tone (in dB)} xywh {268 120 63 20} type Simple align 8 minimum -6 maximum 6 step 0.5
|
||||
code0 {o->value(progdefaults.PKT_LOSIG_TXGAIN);}
|
||||
code1 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Counter valPacket_HiSig_TXGain {
|
||||
label {TX High Freq Gain}
|
||||
callback {progdefaults.PKT_HISIG_TXGAIN = o->value();
|
||||
updatePACKET();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Processing gain to apply to higher tone (in dB)} xywh {268 145 63 20} type Simple align 8 minimum -6 maximum 6 step 0.5
|
||||
code0 {o->value(progdefaults.PKT_HISIG_TXGAIN);}
|
||||
code1 {o->labelsize(FL_NORMAL_SIZE);}
|
||||
class Fl_Counter2
|
||||
}
|
||||
Fl_Check_Button btnPktRXTimestamp {
|
||||
label {add RX timestamps}
|
||||
callback {progdefaults.PKT_RXTimestamp=o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Prepend timestamp to each RX packet} xywh {39 180 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_RXTimestamp);}
|
||||
}
|
||||
Fl_Check_Button btnPktexpandCmp {
|
||||
label {decode Compressed data}
|
||||
callback {progdefaults.PKT_expandCmp=o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Decode received Compressed Position data} xywh {268 180 190 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_expandCmp);}
|
||||
}
|
||||
Fl_Check_Button btnPktexpandMicE {
|
||||
label {decode Mic-E data}
|
||||
callback {progdefaults.PKT_expandMicE=o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Decode received Mic-E data} xywh {39 206 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_expandMicE);}
|
||||
}
|
||||
Fl_Check_Button btnPktexpandPHG {
|
||||
label {decode PHG data}
|
||||
callback {progdefaults.PKT_expandPHG=o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Decode received PHG data} xywh {39 233 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_expandPHG);}
|
||||
}
|
||||
Fl_Check_Button btnPktunitsSI {
|
||||
label {use SI units}
|
||||
callback {progdefaults.PKT_unitsSI=o->value();
|
||||
if (progdefaults.PKT_unitsSI) {
|
||||
progdefaults.PKT_unitsEnglish=false;
|
||||
btnPktunitsEnglish->value(false);
|
||||
}
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Display decoded data values in SI units} xywh {39 260 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_unitsSI);}
|
||||
}
|
||||
Fl_Check_Button btnPktunitsEnglish {
|
||||
label {use English units}
|
||||
callback {progdefaults.PKT_unitsEnglish=o->value();
|
||||
if (progdefaults.PKT_unitsSI) {
|
||||
progdefaults.PKT_unitsSI=false;
|
||||
btnPktunitsSI->value(false);
|
||||
}
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Display decoded data in English units} xywh {39 287 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_unitsEnglish);}
|
||||
}
|
||||
Fl_Check_Button btnPktPreferXhairScope {
|
||||
label {Use cross-hair scope}
|
||||
callback {progdefaults.PKT_PreferXhairScope=o->value();
|
||||
progdefaults.changed = true;}
|
||||
tooltip {Defaults to syncscope instead of phase (cross-hair) scope} xywh {268 206 165 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.PKT_PreferXhairScope);}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Fl_Group tabRig {
|
||||
|
|
|
@ -90,6 +90,7 @@
|
|||
#include "dominoex.h"
|
||||
#include "feld.h"
|
||||
#include "throb.h"
|
||||
#include "pkt.h"
|
||||
#include "wwv.h"
|
||||
#include "analysis.h"
|
||||
#include "ssb.h"
|
||||
|
@ -431,6 +432,10 @@ void cb_rtty75N(Fl_Widget *w, void *arg);
|
|||
void cb_rtty75W(Fl_Widget *w, void *arg);
|
||||
void cb_rttyCustom(Fl_Widget *w, void *arg);
|
||||
|
||||
void cb_pkt1200(Fl_Widget *w, void *arg);
|
||||
void cb_pkt300(Fl_Widget *w, void *arg);
|
||||
void cb_pkt2400(Fl_Widget *w, void *arg);
|
||||
|
||||
Fl_Widget *modem_config_tab;
|
||||
Fl_Menu_Item *quick_change;
|
||||
|
||||
|
@ -559,6 +564,13 @@ Fl_Menu_Item quick_change_rtty[] = {
|
|||
{ 0 }
|
||||
};
|
||||
|
||||
Fl_Menu_Item quick_change_pkt[] = {
|
||||
{ "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET },
|
||||
{ " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET },
|
||||
{ "2400 baud", 0, cb_pkt2400, (void *)MODE_PACKET },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
inline int minmax(int val, int min, int max)
|
||||
{
|
||||
val = val < max ? val : max;
|
||||
|
@ -812,6 +824,31 @@ void set_dominoex_tab_widgets()
|
|||
chkDominoEX_FEC->value(progdefaults.DOMINOEX_FEC);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
void cb_pkt1200(Fl_Widget *w, void *arg)
|
||||
{
|
||||
progdefaults.PKT_BAUD_SELECT = 0;
|
||||
selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT);
|
||||
cb_init_mode(w, arg);
|
||||
}
|
||||
|
||||
void cb_pkt300(Fl_Widget *w, void *arg)
|
||||
{
|
||||
progdefaults.PKT_BAUD_SELECT = 1;
|
||||
selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT);
|
||||
cb_init_mode(w, arg);
|
||||
}
|
||||
|
||||
void cb_pkt2400(Fl_Widget *w, void *arg)
|
||||
{
|
||||
progdefaults.PKT_BAUD_SELECT = 2;
|
||||
selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT);
|
||||
cb_init_mode(w, arg);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
static void busy_cursor(void*)
|
||||
{
|
||||
Fl::first_window()->cursor(FL_CURSOR_WAIT);
|
||||
|
@ -1062,6 +1099,13 @@ void init_modem(trx_mode mode, int freq)
|
|||
quick_change = quick_change_throb;
|
||||
break;
|
||||
|
||||
case MODE_PACKET:
|
||||
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
|
||||
*mode_info[mode].modem = new pkt(mode), freq);
|
||||
modem_config_tab = tabPacket;
|
||||
quick_change = quick_change_pkt;
|
||||
break;
|
||||
|
||||
case MODE_WWV:
|
||||
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
|
||||
*mode_info[mode].modem = new wwv, freq);
|
||||
|
@ -1079,7 +1123,12 @@ void init_modem(trx_mode mode, int freq)
|
|||
|
||||
default:
|
||||
LOG_ERROR("Unknown mode: %" PRIdPTR, mode);
|
||||
return init_modem(MODE_PSK31, freq);
|
||||
mode = MODE_PSK31;
|
||||
startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem :
|
||||
*mode_info[mode].modem = new psk(mode), freq);
|
||||
quick_change = quick_change_psk;
|
||||
modem_config_tab = tabPSK;
|
||||
break;
|
||||
}
|
||||
|
||||
#if BENCHMARK_MODE
|
||||
|
@ -2985,6 +3034,10 @@ Fl_Menu_Item menu_[] = {
|
|||
{ mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{0,0,0,0,0,0,0,0,0},
|
||||
|
||||
//{ "Packet", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ "Packet", 0, cb_init_mode, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
//{0,0,0,0,0,0,0,0,0},
|
||||
|
||||
{"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
{ mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0},
|
||||
|
@ -5717,6 +5770,11 @@ void resetCONTESTIA() {
|
|||
trx_start_modem(active_modem);
|
||||
}
|
||||
|
||||
void updatePACKET() {
|
||||
if (active_modem->get_mode() == MODE_PACKET)
|
||||
trx_start_modem(active_modem);
|
||||
}
|
||||
|
||||
void resetTHOR() {
|
||||
trx_mode md = active_modem->get_mode();
|
||||
if (md == MODE_THOR4 || md == MODE_THOR5 || md == MODE_THOR8 ||
|
||||
|
|
|
@ -479,7 +479,13 @@ complex *sfft::run(const complex& input)
|
|||
|
||||
goertzel::goertzel(int n, double freq, double sr)
|
||||
{
|
||||
reset(n, freq, sr);
|
||||
double w;
|
||||
w = 2 * M_PI * freq / sr;
|
||||
k1 = cos(w);
|
||||
k2 = sin(w);
|
||||
k3 = 2.0 * k1;
|
||||
Q0 = Q1 = Q2 = 0.0;
|
||||
count = N = n;
|
||||
}
|
||||
|
||||
goertzel::~goertzel()
|
||||
|
@ -496,42 +502,38 @@ void goertzel::reset()
|
|||
void goertzel::reset(int n, double freq, double sr)
|
||||
{
|
||||
double w;
|
||||
SR = sr;
|
||||
FREQ = freq;
|
||||
K = FREQ / SR;
|
||||
N = n;
|
||||
w = 2 * M_PI * FREQ / SR;
|
||||
w = 2 * M_PI * freq / sr;
|
||||
k1 = cos(w);
|
||||
k2 = sin(w);
|
||||
k3 = 2.0 * k1;
|
||||
Q0 = Q1 = Q2 = 0.0;
|
||||
count = N;
|
||||
count = N = n;
|
||||
isvalid = false;
|
||||
}
|
||||
|
||||
bool goertzel::run(double sample)
|
||||
{
|
||||
Q0 = sample + k3*Q1 - Q2;
|
||||
Q2 = Q1;
|
||||
Q1 = Q0;
|
||||
if (!isvalid && --count == 0) {
|
||||
// count = N;
|
||||
isvalid = true;
|
||||
}
|
||||
return isvalid;
|
||||
Q0 = sample + k3*Q1 - Q2;
|
||||
Q2 = Q1;
|
||||
Q1 = Q0;
|
||||
if (--count == 0) {
|
||||
count = N;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
double goertzel::real()
|
||||
{
|
||||
return ((0.5*k3*Q1 - Q2)/N);
|
||||
return ((0.5*k3*Q1 - Q2)/N);
|
||||
}
|
||||
|
||||
double goertzel::imag()
|
||||
{
|
||||
return ((k2*Q1)/N);
|
||||
return ((k2*Q1)/N);
|
||||
}
|
||||
|
||||
double goertzel::mag()
|
||||
{
|
||||
return (Q2*Q2 + Q1*Q1 - k3*Q2*Q1);
|
||||
return (Q2*Q2 + Q1*Q1 - k3*Q2*Q1);
|
||||
}
|
||||
|
|
|
@ -110,6 +110,8 @@ const struct mode_info_t mode_info[NUM_MODES] = {
|
|||
{ MODE_THROBX2, &throbx2_modem, "THRBX2", "ThrobX 2", "", "THRBX", "TX2" },
|
||||
{ MODE_THROBX4, &throbx4_modem, "THRBX4", "ThrobX 4", "", "THRBX", "TX4" },
|
||||
|
||||
{ MODE_PACKET, &pkt_modem, "PACKET", "Packet", "", "PKT", "PKT" },
|
||||
|
||||
{ MODE_SSB, &ssb_modem, "SSB", "SSB", "", "SSB", "" },
|
||||
{ MODE_WWV, &wwv_modem, "WWV", "WWV", "", "", "" },
|
||||
{ MODE_ANALYSIS, &anal_modem, "ANALYSIS", _("Freq Analysis"), "", "", "" }
|
||||
|
|
|
@ -138,6 +138,12 @@ extern Fl_Input2 *inpWaterfallClickText;
|
|||
extern Fl_Choice *mnuWaterfallWheelAction;
|
||||
extern Fl_Group *tabModems;
|
||||
extern Fl_Tabs *tabsModems;
|
||||
extern Fl_Group *tabContestia;
|
||||
extern Fl_Choice *mnuContestia_Bandwidth;
|
||||
extern Fl_Choice *mnuContestia_Tones;
|
||||
extern Fl_Counter2 *cntContestia_smargin;
|
||||
extern Fl_Counter2 *cntContestia_sinteg;
|
||||
extern Fl_Check_Button *btnContestia_8bit;
|
||||
extern Fl_Group *tabCW;
|
||||
extern Fl_Tabs *tabsCW;
|
||||
extern Fl_Value_Slider2 *sldrCWbandwidth;
|
||||
|
@ -198,12 +204,6 @@ extern Fl_Choice *mnuOlivia_Tones;
|
|||
extern Fl_Counter2 *cntOlivia_smargin;
|
||||
extern Fl_Counter2 *cntOlivia_sinteg;
|
||||
extern Fl_Check_Button *btnOlivia_8bit;
|
||||
extern Fl_Group *tabContestia;
|
||||
extern Fl_Choice *mnuContestia_Bandwidth;
|
||||
extern Fl_Choice *mnuContestia_Tones;
|
||||
extern Fl_Counter2 *cntContestia_smargin;
|
||||
extern Fl_Counter2 *cntContestia_sinteg;
|
||||
extern Fl_Check_Button *btnContestia_8bit;
|
||||
extern Fl_Group *tabPSK;
|
||||
extern Fl_Tabs *tabsPSK;
|
||||
extern Fl_Counter2 *cntSearchRange;
|
||||
|
@ -233,6 +233,19 @@ extern Fl_Check_Button *valTHOR_FILTER;
|
|||
extern Fl_Counter2 *valTHOR_BW;
|
||||
extern Fl_Value_Slider2 *valThorCWI;
|
||||
extern Fl_Counter2 *valTHOR_PATHS;
|
||||
extern Fl_Group *tabPacket;
|
||||
extern Fl_Choice *selPacket_Baud;
|
||||
extern Fl_Counter2 *valPacket_LoSig_RXGain;
|
||||
extern Fl_Counter2 *valPacket_HiSig_RXGain;
|
||||
extern Fl_Counter2 *valPacket_LoSig_TXGain;
|
||||
extern Fl_Counter2 *valPacket_HiSig_TXGain;
|
||||
extern Fl_Check_Button *btnPktRXTimestamp;
|
||||
extern Fl_Check_Button *btnPktexpandCmp;
|
||||
extern Fl_Check_Button *btnPktexpandMicE;
|
||||
extern Fl_Check_Button *btnPktexpandPHG;
|
||||
extern Fl_Check_Button *btnPktunitsSI;
|
||||
extern Fl_Check_Button *btnPktunitsEnglish;
|
||||
extern Fl_Check_Button *btnPktPreferXhairScope;
|
||||
extern Fl_Group *tabRig;
|
||||
extern Fl_Tabs *tabsRig;
|
||||
extern Fl_Group *grpHWPTT;
|
||||
|
|
|
@ -448,6 +448,44 @@
|
|||
ELEM_(double, ThorCWI, "THORCWI", \
|
||||
"CWI threshold (CWI detection and suppression)", \
|
||||
0.0) \
|
||||
/* PACKET */ \
|
||||
ELEM_(int, PKT_BAUD_SELECT, "PKTBAUDSELECT", \
|
||||
"Packet baud rate. Values are as follows:\n" \
|
||||
" 0: 1200 (V/UHF); 1: 300 (HF); 2: 2400 (V/UHF)", \
|
||||
0) /* 1200 baud (V/UHF) default. */ \
|
||||
ELEM_(double, PKT_LOSIG_RXGAIN, "LOSIGRXGAIN", \
|
||||
"Signal gain for lower frequency (Mark) tone (in dB)", \
|
||||
0.0) \
|
||||
ELEM_(double, PKT_HISIG_RXGAIN, "HISIGRXGAIN", \
|
||||
"Signal gain for higher frequency (Space) tone (in dB)", \
|
||||
0.0) \
|
||||
ELEM_(double, PKT_LOSIG_TXGAIN, "LOSIGTXGAIN", \
|
||||
"Signal gain for Mark (lower frequency) tone (in dB)", \
|
||||
0.0) \
|
||||
ELEM_(double, PKT_HISIG_TXGAIN, "HISIGTXGAIN", \
|
||||
"Signal gain for Space (higher frequency) tone (in dB)", \
|
||||
0.0) \
|
||||
ELEM_(bool, PKT_PreferXhairScope, "PKTPREFERXHAIRSCOPE", \
|
||||
"Default to syncscope (detected symbol scope)", \
|
||||
false) ELEM_(bool, PKT_RXTimestamp, "PKTRXTIMESTAMP", \
|
||||
"No timestamps on RX packets by default", \
|
||||
false) \
|
||||
\
|
||||
ELEM_(bool, PKT_expandMicE, "PKTEXPANDMICE", \
|
||||
"decode received Mic-E data", \
|
||||
false) \
|
||||
ELEM_(bool, PKT_expandPHG, "PKTEXPANDPHG", \
|
||||
"decode received PHG data", \
|
||||
false) \
|
||||
ELEM_(bool, PKT_expandCmp, "PKTEXPANDCMP", \
|
||||
"decode received Compressed Position data", \
|
||||
false) \
|
||||
ELEM_(bool, PKT_unitsSI, "PKTUNITSSI", \
|
||||
"display decoded data in SI units", \
|
||||
false) \
|
||||
ELEM_(bool, PKT_unitsEnglish, "PKTUNITSENGLISH", \
|
||||
"display decoded data in English units", \
|
||||
false) \
|
||||
/* DOMINOEX */ \
|
||||
ELEM_(double, DOMINOEX_BW, "DOMINOEXBW", \
|
||||
"Filter bandwidth factor (bandwidth relative to signal width)", \
|
||||
|
|
|
@ -140,9 +140,6 @@ public:
|
|||
|
||||
class goertzel {
|
||||
private:
|
||||
double SR;
|
||||
double FREQ;
|
||||
double K;
|
||||
int N;
|
||||
int count;
|
||||
double Q0;
|
||||
|
|
|
@ -226,6 +226,7 @@ extern void resetOLIVIA();
|
|||
extern void resetCONTESTIA();
|
||||
extern void resetTHOR();
|
||||
extern void resetDOMEX();
|
||||
extern void updatePACKET();
|
||||
extern void resetSoundCard();
|
||||
extern void restoreFocus(Fl_Widget* w = 0);
|
||||
extern void setReverse(int);
|
||||
|
|
|
@ -120,7 +120,6 @@ enum {
|
|||
MODE_THOR5,
|
||||
MODE_THOR8,
|
||||
MODE_THOR11,
|
||||
// MODE_TSOR11,
|
||||
MODE_THOR16,
|
||||
MODE_THOR22,
|
||||
MODE_THOR_FIRST = MODE_THOR4,
|
||||
|
@ -135,6 +134,8 @@ enum {
|
|||
MODE_THROB_FIRST = MODE_THROB1,
|
||||
MODE_THROB_LAST = MODE_THROBX4,
|
||||
|
||||
MODE_PACKET,
|
||||
|
||||
MODE_SSB,
|
||||
MODE_WWV,
|
||||
MODE_ANALYSIS,
|
||||
|
|
|
@ -233,6 +233,7 @@ extern modem *psk250r_modem;
|
|||
extern modem *psk500r_modem;
|
||||
|
||||
extern modem *rtty_modem;
|
||||
extern modem *pkt_modem;
|
||||
|
||||
extern modem *olivia_modem;
|
||||
extern modem *contestia_modem;
|
||||
|
@ -241,7 +242,6 @@ 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;
|
||||
|
||||
|
|
|
@ -0,0 +1,138 @@
|
|||
// ---------------------------------------------------------------------
|
||||
// nco.h -- a generic NCO class
|
||||
//
|
||||
//
|
||||
// This file is a proposed part of fldigi.
|
||||
//
|
||||
// Copyright (C) 2010
|
||||
// Dave Freese, W1HKJ
|
||||
// Chris Sylvain, KB3CS
|
||||
//
|
||||
// fldigi is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// fldigi is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with fldigi; if not, write to the Free Software
|
||||
// Foundation, Inc.
|
||||
// 59 Temple Place
|
||||
// Suite 330
|
||||
// Boston, MA 02111-1307 USA
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
#ifndef NCO_H
|
||||
#define NCO_H
|
||||
|
||||
#include "complex.h"
|
||||
|
||||
class NCO {
|
||||
#define NCO_SINETABLE_LEN (1<<8) // == 256
|
||||
private:
|
||||
double SampleRate;
|
||||
double Frequency;
|
||||
double Phase;
|
||||
double Phase_incr;
|
||||
|
||||
bool sinetable_ready;
|
||||
double sinetable[NCO_SINETABLE_LEN+1];
|
||||
|
||||
public:
|
||||
NCO() { sinetable_ready = false; }
|
||||
~NCO() { };
|
||||
|
||||
void init(double freq, double phase, double sr) {
|
||||
SampleRate = sr;
|
||||
Frequency = freq;
|
||||
Phase = phase / TWOPI; // normalize radians to [0,1]
|
||||
Phase_incr = freq / sr;
|
||||
|
||||
if (sinetable_ready == false) {
|
||||
double step = 1.0 / NCO_SINETABLE_LEN;
|
||||
|
||||
for (int i = 0; i < NCO_SINETABLE_LEN; i++)
|
||||
sinetable[i] = sin(step * i * TWOPI);
|
||||
|
||||
sinetable[NCO_SINETABLE_LEN] = sinetable[0]; /* == 0.0 */
|
||||
|
||||
sinetable_ready = true;
|
||||
}
|
||||
}
|
||||
|
||||
inline void setfreq(double freq) {
|
||||
Frequency = freq;
|
||||
Phase_incr = freq / SampleRate;
|
||||
}
|
||||
|
||||
inline double getfreq() { return Frequency; }
|
||||
|
||||
inline void setphase(double phase) { Phase = phase / TWOPI; }
|
||||
|
||||
inline double getphase() { return Phase * TWOPI; }
|
||||
|
||||
inline void setphaseacc(double phase) { Phase = phase; }
|
||||
|
||||
inline double getphaseacc() { return Phase; }
|
||||
|
||||
#ifndef NDEBUG
|
||||
double interpolate(double phase) {
|
||||
#else
|
||||
inline double interpolate(double phase) {
|
||||
#endif
|
||||
int iphase;
|
||||
double frac1, frac2;
|
||||
|
||||
iphase = (int) floor(phase * NCO_SINETABLE_LEN);
|
||||
frac1 = (phase * NCO_SINETABLE_LEN) - iphase;
|
||||
frac2 = 1.0 - frac1;
|
||||
|
||||
iphase %= NCO_SINETABLE_LEN;
|
||||
|
||||
return (sinetable[iphase] * frac2) + (sinetable[iphase+1] * frac1);
|
||||
}
|
||||
|
||||
double sample() {
|
||||
double sample = interpolate(Phase);
|
||||
|
||||
Phase += Phase_incr;
|
||||
|
||||
if (Phase > 1) {
|
||||
Phase -= 1;
|
||||
// Phase might be .le. abs(machine-epsilon)
|
||||
if (Phase < 0.0) Phase = 0.0;
|
||||
}
|
||||
|
||||
return sample;
|
||||
}
|
||||
|
||||
complex complex_sample() {
|
||||
complex sample;
|
||||
|
||||
// M_PI_2 / TWOPI = M_PI / 2 / 2 / M_PI = 1 / 4
|
||||
double t = Phase + 0.25;
|
||||
if (t > 1.0) {
|
||||
t -= 1;
|
||||
// Phase might be .le. abs(machine-epsilon)
|
||||
if (t < 0.0) t = 0.0;
|
||||
}
|
||||
|
||||
sample.re = interpolate(t); // cos
|
||||
sample.im = interpolate(Phase); // sin
|
||||
|
||||
Phase += Phase_incr;
|
||||
|
||||
if (Phase > 1.0) {
|
||||
Phase -= 1;
|
||||
if (Phase < 0.0) Phase = 0.0;
|
||||
}
|
||||
|
||||
return sample;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,240 @@
|
|||
// ---------------------------------------------------------------------
|
||||
// pkt.h -- 1200/300/2400 baud AX.25
|
||||
//
|
||||
//
|
||||
// This file is a proposed part of fldigi. Adapted very liberally from
|
||||
// rtty.h, with many thanks to John Hansen, W2FS, who wrote
|
||||
// 'dcc.doc' and 'dcc2.doc', GNU Octave, GNU Radio Companion, and finally
|
||||
// Bartek Kania (bk.gnarf.org) whose 'aprs.c' expository coding style helped
|
||||
// shape this implementation.
|
||||
//
|
||||
// Copyright (C) 2010
|
||||
// Dave Freese, W1HKJ
|
||||
// Chris Sylvain, KB3CS
|
||||
//
|
||||
// fldigi is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// fldigi is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with fldigi; if not, write to the Free Software
|
||||
// Foundation, Inc.
|
||||
// 59 Temple Place
|
||||
// Suite 330
|
||||
// Boston, MA 02111-1307 USA
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
#ifndef PKT_H
|
||||
#define PKT_H
|
||||
|
||||
#include "complex.h"
|
||||
#include "modem.h"
|
||||
#include "globals.h"
|
||||
#include "debug.h"
|
||||
//#include "filters.h"
|
||||
//#include "fftfilt.h"
|
||||
#include "digiscope.h"
|
||||
#include "waterfall.h"
|
||||
#include "trx.h"
|
||||
#include "nco.h"
|
||||
|
||||
#define PKT_SampleRate 12000
|
||||
|
||||
#define PKT_MinBaudRate 300
|
||||
#define PKT_MaxSymbolLen (PKT_SampleRate / PKT_MinBaudRate)
|
||||
|
||||
#define PKT_DetectLen 16
|
||||
#define PKT_SyncDispLen 24
|
||||
#define PKT_IdleLen 120
|
||||
|
||||
#define PKT_MinSignalPwr 0.1
|
||||
|
||||
// is adjval too small? maybe 0.25 ? too large?
|
||||
#define PKT_PLLAdjVal 0.1
|
||||
|
||||
// special and unique start+end of AX.25 frame symbol
|
||||
#define PKT_Flag 0x7e
|
||||
// number of mark bits prior to start of frame at 1200 baud
|
||||
#define PKT_MarkBits 320
|
||||
// number of flags used indicate start or end of frame at 1200 baud
|
||||
#define PKT_StartFlags 24
|
||||
#define PKT_EndFlags 12
|
||||
|
||||
// 70 bytes addr + 256 payload + 2 FCS + 1 Control + 1 Protocol ID
|
||||
#define MAXOCTETS 340
|
||||
// 136 bits minimum (including start and end flags) - AX.25 v2.2 section 3.9
|
||||
// == 15 octets. we count only one of the two flags, though.
|
||||
#define MINOCTETS 14
|
||||
|
||||
enum PKT_RX_STATE {
|
||||
PKT_RX_STATE_IDLE = 0,
|
||||
PKT_RX_STATE_DROP,
|
||||
PKT_RX_STATE_START,
|
||||
PKT_RX_STATE_DATA,
|
||||
PKT_RX_STATE_STOP
|
||||
};
|
||||
|
||||
enum PKT_MicE_field {
|
||||
Null = 0x00,
|
||||
Space = 0x20,
|
||||
Zero = 0x30,
|
||||
One,
|
||||
Two,
|
||||
Three,
|
||||
Four,
|
||||
Five,
|
||||
Six,
|
||||
Seven,
|
||||
Eight,
|
||||
Nine,
|
||||
P0 = 0x40,
|
||||
P100,
|
||||
North = 0x50,
|
||||
East,
|
||||
South,
|
||||
West,
|
||||
Invalid = 0xFF
|
||||
};
|
||||
|
||||
struct PKT_PHG_table {
|
||||
const char *s;
|
||||
unsigned char l;
|
||||
};
|
||||
|
||||
class pkt : public modem {
|
||||
public:
|
||||
static const double CENTER[];
|
||||
static const double SHIFT[];
|
||||
static const int BAUD[];
|
||||
static const int BITS[];
|
||||
|
||||
private:
|
||||
int symbollen;
|
||||
|
||||
int pkt_stoplen, pkt_detectlen;
|
||||
int pkt_syncdisplen, pkt_idlelen;
|
||||
int pkt_startlen;
|
||||
|
||||
double pkt_shift;
|
||||
int pkt_baud;
|
||||
int pkt_nbits;
|
||||
double pkt_ctrfreq;
|
||||
double pkt_squelch;
|
||||
double pkt_BW;
|
||||
bool pkt_reverse;
|
||||
|
||||
int scounter; // audio sample counter
|
||||
double lo_signal_gain, hi_signal_gain;
|
||||
NCO *nco_lo, *nco_hi, *nco_mid;
|
||||
|
||||
PKT_RX_STATE rxstate;
|
||||
|
||||
double idle_signal_pwr, *idle_signal_buf;
|
||||
int idle_signal_buf_ptr;
|
||||
|
||||
void idle_signal_power(double sample);
|
||||
|
||||
complex lo_signal_energy, *lo_signal_buf;
|
||||
complex hi_signal_energy, *hi_signal_buf;
|
||||
complex mid_signal_energy, *mid_signal_buf;
|
||||
double lo_signal_corr, hi_signal_corr, mid_signal_corr;
|
||||
int correlate_buf_ptr;
|
||||
|
||||
double signal_gain, signal_pwr, *signal_buf;
|
||||
int signal_buf_ptr;
|
||||
|
||||
double *pipe, *dsppipe; // SyncScope
|
||||
int pipeptr;
|
||||
|
||||
// SCBLOCKSIZE * 2 = 1024 ( == MAX_ZLEN )
|
||||
complex QI[MAX_ZLEN]; // PhaseScope
|
||||
int QIptr;
|
||||
|
||||
double yt_avg;
|
||||
bool clear_zdata;
|
||||
|
||||
double signal_power, noise_power, power_ratio, snr_avg;
|
||||
|
||||
double corr_power(complex v);
|
||||
void correlate(double sample);
|
||||
|
||||
int detect_drop;
|
||||
void detect_signal();
|
||||
|
||||
double lo_sync, hi_sync, mid_symbol;
|
||||
int lo_sync_ptr, hi_sync_ptr;
|
||||
bool prev_symbol, pll_symbol;
|
||||
void do_sync();
|
||||
|
||||
int seq_ones; // number of sequential ones in data
|
||||
|
||||
int select_val;
|
||||
void set_pkt_modem_params(int i);
|
||||
|
||||
void rx_data();
|
||||
void rx(bool bit);
|
||||
|
||||
void Metric();
|
||||
|
||||
unsigned char bitreverse(unsigned char in, int n);
|
||||
|
||||
unsigned char rxbuf[MAXOCTETS], *cbuf;
|
||||
|
||||
unsigned int computeFCS(unsigned char *h, unsigned char *t);
|
||||
bool checkFCS(unsigned char *cp);
|
||||
|
||||
void do_put_rx_char(unsigned char *cp);
|
||||
|
||||
void clear_syncscope();
|
||||
void update_syncscope();
|
||||
|
||||
|
||||
// inline complex mixer(complex in);
|
||||
|
||||
// MicE encodings:
|
||||
// 3 char groups,
|
||||
// max 12 char values per group,
|
||||
// 5 encodings per char value
|
||||
static PKT_MicE_field MicE_table[][12][5];
|
||||
void expand_MicE(unsigned char *I, unsigned char *E);
|
||||
|
||||
static PKT_PHG_table PHG_table[];
|
||||
void expand_PHG(unsigned char *I);
|
||||
|
||||
void expand_Cmp(unsigned char *I);
|
||||
|
||||
// transmit
|
||||
|
||||
int preamble, pretone, postamble;
|
||||
double lo_txgain, hi_txgain;
|
||||
NCO *lo_tone, *hi_tone;
|
||||
|
||||
void send_symbol(bool bit);
|
||||
|
||||
int tx_char_count, nr_ones;
|
||||
bool currbit, nostuff, did_pkt_head;
|
||||
void send_char(unsigned char c);
|
||||
|
||||
unsigned char txbuf[MAXOCTETS], *tx_cbuf;
|
||||
void send_msg(unsigned char c);
|
||||
|
||||
public:
|
||||
pkt(trx_mode mode);
|
||||
~pkt();
|
||||
void init();
|
||||
void rx_init();
|
||||
void tx_init(SoundBase *sc);
|
||||
void restart();
|
||||
int rx_process(const double *buf, int len);
|
||||
int tx_process();
|
||||
|
||||
void set_freq(double);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -909,7 +909,7 @@ void configuration::testCommPorts()
|
|||
snprintf(ttyname, sizeof(ttyname), "/dev/%s", dp->d_name);
|
||||
if (stat(ttyname, &st) == -1 || !S_ISCHR(st.st_mode))
|
||||
continue;
|
||||
LOG_INFO("Found serial port %s", ttyname);
|
||||
LOG_VERBOSE("Found serial port %s", ttyname);
|
||||
inpTTYdev->add(ttyname);
|
||||
#if USE_HAMLIB
|
||||
inpRIGdev->add(ttyname);
|
||||
|
@ -971,7 +971,7 @@ out:
|
|||
# endif
|
||||
# endif // __WOE32__
|
||||
|
||||
LOG_INFO("Found serial port %s", ttyname);
|
||||
LOG_VERBOSE("Found serial port %s", ttyname);
|
||||
inpTTYdev->add(ttyname);
|
||||
# if USE_HAMLIB
|
||||
inpRIGdev->add(ttyname);
|
||||
|
@ -984,7 +984,7 @@ out:
|
|||
if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) ||
|
||||
strstr(gbuf.gl_pathv[j], "modem") )
|
||||
continue;
|
||||
LOG_INFO("Found serial port %s", gbuf.gl_pathv[j]);
|
||||
LOG_VERBOSE("Found serial port %s", gbuf.gl_pathv[j]);
|
||||
inpTTYdev->add(gbuf.gl_pathv[j]);
|
||||
# if USE_HAMLIB
|
||||
inpRIGdev->add(gbuf.gl_pathv[j]);
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -91,12 +91,12 @@ modem *olivia_modem = 0;
|
|||
modem *contestia_modem = 0;
|
||||
|
||||
modem *rtty_modem = 0;
|
||||
modem *pkt_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;
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue