diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index a7075d7b..2c628910 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -1137,6 +1137,13 @@ btnInitHWPTT->redraw(); progdefaults.changed = true; } +Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; + +static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { + progdefaults.PTTrightchannel = o->value(); +progdefaults.changed = true; +} + Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0; static void cb_chkUSERIGCAT(Fl_Check_Button* o, void*) { @@ -2179,6 +2186,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 { tabsUI = new Fl_Tabs(0, 25, 505, 345); tabsUI->selection_color(FL_LIGHT1); { tabUserInterface = new Fl_Group(0, 50, 500, 320, _("General")); + tabUserInterface->hide(); { Fl_Group* o = new Fl_Group(5, 60, 490, 301); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnShowTooltips = new Fl_Check_Button(15, 70, 120, 20, _("Show tooltips")); @@ -2315,7 +2323,6 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 tabWfallRestart->end(); } // Fl_Group* tabWfallRestart { 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); @@ -3434,44 +3441,43 @@ an merging")); tabsRig->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 50, 500, 320, _("Hardware PTT")); o->tooltip(_("Tottle DTR for ptt")); - o->hide(); - { btnPTT[0] = new Fl_Round_Button(181, 68, 138, 17, _("No PTT available")); + { btnPTT[0] = new Fl_Round_Button(45, 68, 138, 17, _("No h/w PTT available")); btnPTT[0]->down_box(FL_DIAMOND_DOWN_BOX); btnPTT[0]->value(1); btnPTT[0]->selection_color((Fl_Color)1); btnPTT[0]->callback((Fl_Callback*)cb_btnPTT); } // Fl_Round_Button* btnPTT[0] - { grpHWPTT = new Fl_Group(5, 105, 490, 190); + { grpHWPTT = new Fl_Group(5, 140, 490, 190); grpHWPTT->box(FL_ENGRAVED_FRAME); - { inpTTYdev = new Fl_Input_Choice(200, 152, 150, 22, _("Device:")); + { inpTTYdev = new Fl_Input_Choice(200, 183, 150, 22, _("Device:")); inpTTYdev->tooltip(_("Select serial port")); inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); } // Fl_Input_Choice* inpTTYdev - { btnRTSptt = new Fl_Round_Button(147, 192, 85, 20, _("Use RTS")); + { btnRTSptt = new Fl_Round_Button(147, 223, 85, 20, _("Use RTS")); btnRTSptt->tooltip(_("RTS is ptt signal line")); btnRTSptt->down_box(FL_DOWN_BOX); btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); } // Fl_Round_Button* btnRTSptt - { btnRTSplusV = new Fl_Round_Button(262, 192, 100, 20, _("RTS = +V")); + { btnRTSplusV = new Fl_Round_Button(262, 223, 100, 20, _("RTS = +V")); btnRTSplusV->tooltip(_("Initial voltage on RTS")); btnRTSplusV->down_box(FL_DOWN_BOX); btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); } // Fl_Round_Button* btnRTSplusV - { btnDTRptt = new Fl_Round_Button(147, 222, 85, 20, _("Use DTR")); + { btnDTRptt = new Fl_Round_Button(147, 253, 85, 20, _("Use DTR")); btnDTRptt->tooltip(_("DTR is ptt signal line")); btnDTRptt->down_box(FL_DOWN_BOX); btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); } // Fl_Round_Button* btnDTRptt - { btnDTRplusV = new Fl_Round_Button(262, 222, 100, 20, _("DTR = +V")); + { btnDTRplusV = new Fl_Round_Button(262, 253, 100, 20, _("DTR = +V")); btnDTRplusV->tooltip(_("Initial voltage on DTR")); btnDTRplusV->down_box(FL_DOWN_BOX); btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); } // Fl_Round_Button* btnDTRplusV - { btnInitHWPTT = new Fl_Button(188, 260, 113, 24, _("Initialize")); + { btnInitHWPTT = new Fl_Button(188, 291, 113, 24, _("Initialize")); btnInitHWPTT->tooltip(_("Initialize the ptt h/w interface")); btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); } // Fl_Button* btnInitHWPTT - { btnPTT[4] = new Fl_Round_Button(145, 120, 210, 20, _("Use separate serial port PTT")); + { btnPTT[4] = new Fl_Round_Button(145, 151, 210, 20, _("Use separate serial port PTT")); btnPTT[4]->tooltip(_("Serial port h/w used for PTT")); btnPTT[4]->down_box(FL_DIAMOND_DOWN_BOX); btnPTT[4]->selection_color(FL_SELECTION_COLOR); @@ -3479,10 +3485,17 @@ an merging")); } // Fl_Round_Button* btnPTT[4] grpHWPTT->end(); } // Fl_Group* grpHWPTT + { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(45, 105, 70, 15, _("Enable right audio channel PTT tone")); + btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); + btnPTTrightchannel->down_box(FL_DOWN_BOX); + btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); + o->value(progdefaults.PTTrightchannel); + } // Fl_Check_Button* btnPTTrightchannel o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 50, 500, 320, _("RigCAT")); o->tooltip(_("Rig Control using xml spec file")); + o->hide(); { chkUSERIGCAT = new Fl_Check_Button(195, 60, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); @@ -4074,6 +4087,7 @@ l with your sound hardware.")); { tabsMisc = new Fl_Tabs(0, 25, 500, 345); tabsMisc->selection_color(FL_LIGHT1); { tabSweetSpot = new Fl_Group(0, 50, 500, 320, _("Sweet Spot")); + tabSweetSpot->hide(); { Fl_Group* o = new Fl_Group(5, 60, 490, 75); o->box(FL_ENGRAVED_FRAME); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); @@ -4214,7 +4228,6 @@ l with your sound hardware.")); tabCPUspeed->end(); } // Fl_Group* tabCPUspeed { tabFileExtraction = new Fl_Group(0, 50, 500, 320, _("Text Capture")); - tabFileExtraction->hide(); { Fl_Group* o = new Fl_Group(5, 60, 490, 155, _("Auto Extract files from rx stream")); o->box(FL_ENGRAVED_FRAME); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index 33cacb7c..d1a07258 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -140,7 +140,7 @@ progdefaults.changed = true;} } { Fl_Group tabUserInterface { label General open - xywh {0 50 500 320} + xywh {0 50 500 320} hide } { Fl_Group {} {open xywh {5 60 490 301} box ENGRAVED_FRAME @@ -277,7 +277,7 @@ progdefaults.changed = true;} } Fl_Group tabContest { label Contest open - xywh {0 50 500 320} hide + xywh {0 50 500 320} } { Fl_Group {} { label Exchanges open @@ -1377,10 +1377,10 @@ progdefaults.changed = true;} } { Fl_Group {} { label {Hardware PTT} open - tooltip {Tottle DTR for ptt} xywh {0 50 500 320} hide + tooltip {Tottle DTR for ptt} xywh {0 50 500 320} } { Fl_Round_Button {btnPTT[0]} { - label {No PTT available} + label {No h/w PTT available} callback {btnPTT[1]->value(0); btnPTT[2]->value(0); btnPTT[3]->value(0); @@ -1390,52 +1390,52 @@ o->value(1); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - xywh {181 68 138 17} down_box DIAMOND_DOWN_BOX value 1 selection_color 1 + xywh {45 68 138 17} down_box DIAMOND_DOWN_BOX value 1 selection_color 1 } Fl_Group grpHWPTT {open - xywh {5 105 490 190} box ENGRAVED_FRAME + xywh {5 140 490 190} box ENGRAVED_FRAME } { Fl_Input_Choice inpTTYdev { label {Device:} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} open - tooltip {Select serial port} xywh {200 152 150 22} + tooltip {Select serial port} xywh {200 183 150 22} } {} Fl_Round_Button btnRTSptt { label {Use RTS} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - tooltip {RTS is ptt signal line} xywh {147 192 85 20} down_box DOWN_BOX + tooltip {RTS is ptt signal line} xywh {147 223 85 20} down_box DOWN_BOX } Fl_Round_Button btnRTSplusV { label {RTS = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - tooltip {Initial voltage on RTS} xywh {262 192 100 20} down_box DOWN_BOX + tooltip {Initial voltage on RTS} xywh {262 223 100 20} down_box DOWN_BOX } Fl_Round_Button btnDTRptt { label {Use DTR} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - tooltip {DTR is ptt signal line} xywh {147 222 85 20} down_box DOWN_BOX + tooltip {DTR is ptt signal line} xywh {147 253 85 20} down_box DOWN_BOX } Fl_Round_Button btnDTRplusV { label {DTR = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - tooltip {Initial voltage on DTR} xywh {262 222 100 20} down_box DOWN_BOX + tooltip {Initial voltage on DTR} xywh {262 253 100 20} down_box DOWN_BOX } Fl_Button btnInitHWPTT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} - tooltip {Initialize the ptt h/w interface} xywh {188 260 113 24} + tooltip {Initialize the ptt h/w interface} xywh {188 291 113 24} } Fl_Round_Button {btnPTT[4]} { label {Use separate serial port PTT} @@ -1451,13 +1451,20 @@ btnRigCatDTRptt->value(0); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} - tooltip {Serial port h/w used for PTT} xywh {145 120 210 20} down_box DIAMOND_DOWN_BOX selection_color 15 + tooltip {Serial port h/w used for PTT} xywh {145 151 210 20} down_box DIAMOND_DOWN_BOX selection_color 15 } } + Fl_Check_Button btnPTTrightchannel { + label {Enable right audio channel PTT tone} + callback {progdefaults.PTTrightchannel = o->value(); +progdefaults.changed = true;} + tooltip {Can be used in lieu of or in addition to other PTT types} xywh {45 105 70 15} down_box DOWN_BOX + code0 {o->value(progdefaults.PTTrightchannel);} + } } Fl_Group {} { label RigCAT open - tooltip {Rig Control using xml spec file} xywh {0 50 500 320} + tooltip {Rig Control using xml spec file} xywh {0 50 500 320} hide } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} @@ -2290,7 +2297,7 @@ OFF - limit search to +/- 200 Hz} xywh {215 246 270 20} down_box DOWN_BOX } { Fl_Group tabSweetSpot { label {Sweet Spot} open - xywh {0 50 500 320} + xywh {0 50 500 320} hide } { Fl_Group {} {open xywh {5 60 490 75} box ENGRAVED_FRAME align 21 @@ -2443,7 +2450,7 @@ progdefaults.changed = true;} } Fl_Group tabFileExtraction { label {Text Capture} open - xywh {0 50 500 320} hide + xywh {0 50 500 320} } { Fl_Group {} { label {Auto Extract files from rx stream} open diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 6e2f9a06..c76cbfae 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -182,6 +182,7 @@ extern Fl_Round_Button *btnRTSplusV; extern Fl_Round_Button *btnDTRptt; extern Fl_Round_Button *btnDTRplusV; extern Fl_Button *btnInitHWPTT; +extern Fl_Check_Button *btnPTTrightchannel; extern Fl_Check_Button *chkUSERIGCAT; extern Fl_Group *grpRigCAT; #include diff --git a/src/include/configuration.h b/src/include/configuration.h index 50e05bba..ba6eb633 100644 --- a/src/include/configuration.h +++ b/src/include/configuration.h @@ -186,6 +186,7 @@ ELEM_(bool, DTRptt, "DTRPTT", false) \ ELEM_(bool, RTSplus, "RTSPLUS", false) \ ELEM_(bool, DTRplus, "DTRPLUS", false) \ + ELEM_(bool, PTTrightchannel, "PTTRIGHTCHANNEL", false) \ ELEM_(int, choiceHAMLIBis, "CHOICEHAMLIBIS", 0) \ ELEM_(int, chkUSEMEMMAPis, "CHKUSEMEMMAPIS", 0) \ ELEM_(int, chkUSEHAMLIBis, "CHKUSEHAMLIBIS", 0) \ diff --git a/src/include/modem.h b/src/include/modem.h index 4bdc800b..77f3bb1a 100644 --- a/src/include/modem.h +++ b/src/include/modem.h @@ -41,6 +41,8 @@ protected: double rx_corr; double tx_corr; double tx_frequency; + double PTTphaseacc; + double PTTchannel[OUTBUFSIZE]; // for CW modem use only bool cwTrack; @@ -152,6 +154,8 @@ private: void wfid_sendchar(char c); void wfid_sendchars(std::string s); + + double PTTnco(); public: void wfid_text(const std::string& s); diff --git a/src/trx/modem.cxx b/src/trx/modem.cxx index 576f8813..832b659d 100644 --- a/src/trx/modem.cxx +++ b/src/trx/modem.cxx @@ -93,6 +93,7 @@ modem::modem() reverse = wfrev ^ !wfsb; historyON = false; cap = 0; + PTTphaseacc = 0.0; } void modem::init() @@ -232,10 +233,24 @@ void modem::set_samplerate(int smprate) samplerate = smprate; } +double modem::PTTnco() +{ + PTTphaseacc += TWOPI * 1000 / samplerate; + if (PTTphaseacc > M_PI) + PTTphaseacc -= TWOPI; + return sin(PTTphaseacc); +} + mbuffer _mdm_scdbl; void modem::ModulateXmtr(double *buffer, int len) { + if (progdefaults.PTTrightchannel) { + for (int i = 0; i < len; i++) + PTTchannel[i] = PTTnco(); + ModulateStereo( buffer, PTTchannel, len); + return; + } try { unsigned n = 4; while (scard->Write(buffer, len) == 0 && --n);