diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index aab35f63..7604aa91 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -2120,6 +2120,14 @@ static void cb_chkRxStream(Fl_Check_Button* o, void*) { progdefaults.changed = true; } +Fl_Group *grpTalker=(Fl_Group *)0; + +Fl_Button *btnConnectTalker=(Fl_Button *)0; + +static void cb_btnConnectTalker(Fl_Button*, void*) { + open_talker(); +} + Fl_Group *tabQRZ=(Fl_Group *)0; Fl_Round_Button *btnQRZcdrom=(Fl_Round_Button *)0; @@ -2241,7 +2249,6 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 { tabOperator = new Fl_Group(0, 25, 500, 345, _("Operator")); tabOperator->callback((Fl_Callback*)cb_tabOperator); tabOperator->when(FL_WHEN_CHANGED); - tabOperator->hide(); { Fl_Group* o = new Fl_Group(5, 35, 490, 165, _("Station")); o->box(FL_ENGRAVED_FRAME); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); @@ -2831,7 +2838,6 @@ an merging")); tabsModems->selection_color(FL_LIGHT1); tabsModems->align(FL_ALIGN_TOP_RIGHT); { tabCW = new Fl_Group(0, 50, 500, 320, _("CW")); - tabCW->hide(); { tabsCW = new Fl_Tabs(0, 50, 500, 320); tabsCW->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 500, 295, _("General")); @@ -3299,6 +3305,7 @@ an merging")); tabOlivia->end(); } // Fl_Group* tabOlivia { tabPSK = new Fl_Group(0, 50, 517, 320, _("PSK")); + tabPSK->hide(); { tabsPSK = new Fl_Tabs(0, 50, 517, 320); tabsPSK->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 75, 500, 295, _("General")); @@ -3680,10 +3687,10 @@ an merging")); tabModems->end(); } // Fl_Group* tabModems { tabRig = new Fl_Group(0, 25, 500, 345, _("Rig")); + tabRig->hide(); { tabsRig = new Fl_Tabs(0, 25, 500, 345); tabsRig->selection_color(FL_LIGHT1); { Fl_Group* o = new Fl_Group(0, 50, 500, 320, _("Hardware PTT")); - o->hide(); { grpHWPTT = new Fl_Group(5, 100, 490, 265); grpHWPTT->box(FL_ENGRAVED_FRAME); { inpTTYdev = new Fl_Input_Choice(200, 209, 160, 22, _("Device:")); @@ -3857,6 +3864,7 @@ an merging")); o->end(); } // Fl_Group* o { tabHamlib = new Fl_Group(0, 50, 500, 320, _("Hamlib")); + tabHamlib->hide(); { chkUSEHAMLIB = new Fl_Check_Button(195, 60, 100, 20, _("Use Hamlib")); chkUSEHAMLIB->tooltip(_("Hamlib used for rig control")); chkUSEHAMLIB->down_box(FL_DOWN_BOX); @@ -4517,36 +4525,47 @@ d frequency")); } // 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")); + { Fl_Group* o = new Fl_Group(5, 60, 490, 119, _("Auto Extract files from rx stream")); o->box(FL_ENGRAVED_FRAME); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); - { Fl_Check_Button* o = chkAutoExtract = new Fl_Check_Button(136, 184, 227, 20, _("Enable detection && extraction")); + { Fl_Check_Button* o = chkAutoExtract = new Fl_Check_Button(136, 141, 227, 20, _("Enable detection && extraction")); chkAutoExtract->tooltip(_("Extract files for use with external \"wrap\" program")); chkAutoExtract->down_box(FL_DOWN_BOX); chkAutoExtract->callback((Fl_Callback*)cb_chkAutoExtract); o->value(progdefaults.autoextract); } // Fl_Check_Button* chkAutoExtract - { Fl_Box* o = new Fl_Box(15, 85, 465, 92, _("0\n1\n2\n3\n4")); + { Fl_Box* o = new Fl_Box(13, 85, 467, 62, _("0\n1\n2")); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); o->label(txtWrapInfo); } // Fl_Box* o o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(5, 218, 490, 144, _("Capture rx text to external file")); + { Fl_Group* o = new Fl_Group(5, 180, 490, 109, _("Capture rx text to external file")); o->box(FL_ENGRAVED_FRAME); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); - { Fl_Check_Button* o = chkRxStream = new Fl_Check_Button(136, 330, 175, 20, _("Enable rx text stream")); + { Fl_Check_Button* o = chkRxStream = new Fl_Check_Button(136, 260, 175, 20, _("Enable rx text stream")); chkRxStream->tooltip(_("Send rx text to file: textout.txt")); chkRxStream->down_box(FL_DOWN_BOX); chkRxStream->callback((Fl_Callback*)cb_chkRxStream); o->value(progdefaults.speak); } // Fl_Check_Button* chkRxStream - { Fl_Box* o = new Fl_Box(20, 241, 465, 69, _("0\n1\n2\n3")); + { Fl_Box* o = new Fl_Box(20, 203, 465, 60, _("0\n1\n2")); o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); o->label(txtTalkInfo); } // Fl_Box* o o->end(); } // Fl_Group* o + { grpTalker = new Fl_Group(5, 291, 490, 73, _("Talker Socket (MS only)")); + grpTalker->box(FL_ENGRAVED_FRAME); + grpTalker->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); + { btnConnectTalker = new Fl_Button(30, 319, 70, 20, _("Connect")); + btnConnectTalker->callback((Fl_Callback*)cb_btnConnectTalker); + } // Fl_Button* btnConnectTalker + { Fl_Box* o = new Fl_Box(109, 317, 368, 24, _("Connect to external Talker Program")); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + grpTalker->end(); + } // Fl_Group* grpTalker tabFileExtraction->end(); } // Fl_Group* tabFileExtraction tabsMisc->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index a6b2ede0..43cc3fec 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -89,8 +89,8 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600 } { Fl_Group tabOperator { label Operator - callback {progdefaults.changed = true;} open - xywh {0 25 500 345} when 1 hide + callback {progdefaults.changed = true;} open selected + xywh {0 25 500 345} when 1 } { Fl_Group {} { label Station open @@ -709,7 +709,7 @@ behaves inside the waterfall} xywh {15 196 150 22} down_box BORDER_BOX align 8 } { Fl_Group tabCW { label CW open - xywh {0 50 500 320} hide + xywh {0 50 500 320} } { Fl_Tabs tabsCW {open xywh {0 50 500 320} selection_color 50 @@ -1150,7 +1150,7 @@ progdefaults.changed = true;} } Fl_Group tabPSK { label PSK open - xywh {0 50 517 320} + xywh {0 50 517 320} hide } { Fl_Tabs tabsPSK {open xywh {0 50 517 320} selection_color 50 @@ -1508,14 +1508,14 @@ progdefaults.changed = true;} } Fl_Group tabRig { label Rig open - xywh {0 25 500 345} + xywh {0 25 500 345} hide } { Fl_Tabs tabsRig {open xywh {0 25 500 345} selection_color 50 } { Fl_Group {} { label {Hardware PTT} open - xywh {0 50 500 320} hide + xywh {0 50 500 320} } { Fl_Group grpHWPTT {open xywh {5 100 490 265} box ENGRAVED_FRAME @@ -1803,7 +1803,7 @@ progdefaults.changed = true;} } Fl_Group tabHamlib { label Hamlib open - xywh {0 50 500 320} + xywh {0 50 500 320} hide } { Fl_Check_Button chkUSEHAMLIB { label {Use Hamlib} @@ -1975,7 +1975,7 @@ btnInitHAMLIB->redraw_label();} Fl_Value_Slider valHamRigStopbits { label Stopbits callback {progdefaults.HamRigStopbits = (int)o->value(); -progdefaults.changed = true;} selected +progdefaults.changed = true;} xywh {424 162 60 22} type Horizontal color 7 selection_color 40 align 4 minimum 1 maximum 2 step 1 value 2 textsize 14 code0 {o->value(progdefaults.HamRigStopbits);} } @@ -2607,47 +2607,59 @@ progdefaults.changed = true;} } { Fl_Group {} { label {Auto Extract files from rx stream} open - xywh {5 60 490 155} box ENGRAVED_FRAME align 21 + xywh {5 60 490 119} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAutoExtract { label {Enable detection && extraction} callback {progdefaults.autoextract = o->value(); progdefaults.changed = true;} - tooltip {Extract files for use with external "wrap" program} xywh {136 184 227 20} down_box DOWN_BOX + tooltip {Extract files for use with external "wrap" program} xywh {136 141 227 20} down_box DOWN_BOX code0 {o->value(progdefaults.autoextract);} } Fl_Box {} { label {0 1 -2 -3 -4} - xywh {15 85 465 92} align 21 +2} + xywh {13 85 467 62} align 21 code0 {o->label(txtWrapInfo);} code1 {\#include "rx_extract.h"} } } Fl_Group {} { label {Capture rx text to external file} open - xywh {5 218 490 144} box ENGRAVED_FRAME align 21 + xywh {5 180 490 109} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRxStream { label {Enable rx text stream} callback {progdefaults.speak = o->value(); progdefaults.changed = true;} - tooltip {Send rx text to file: textout.txt} xywh {136 330 175 20} down_box DOWN_BOX + tooltip {Send rx text to file: textout.txt} xywh {136 260 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.speak);} } Fl_Box {} { label {0 1 -2 -3} - xywh {20 241 465 69} align 21 +2} + xywh {20 203 465 60} align 21 code0 {o->label(txtTalkInfo);} code1 {\#include "speak.h"} } } + Fl_Group grpTalker { + label {Talker Socket (MS only)} open + xywh {5 291 490 73} box ENGRAVED_FRAME align 21 + } { + Fl_Button btnConnectTalker { + label Connect + callback {open_talker();} + xywh {30 319 70 20} + code0 {extern void open_talker();} + } + Fl_Box {} { + label {Connect to external Talker Program} + xywh {109 317 368 24} align 20 + } + } } } } diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 62f0cd03..3b489e2f 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -3015,7 +3015,7 @@ static void put_rx_char_flmain(unsigned int data) style = FTextBase::ALTR; if (progdefaults.autoextract == true) rx_extract_add(data); - if (progdefaults.speak == true) speak(data); + speak(data); switch (data) { case '\n': diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 64d992f9..2b63cdf3 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -319,6 +319,9 @@ extern Fl_Check_Button *chkAutoExtract; #include "rx_extract.h" extern Fl_Check_Button *chkRxStream; #include "speak.h" +extern Fl_Group *grpTalker; +extern void open_talker(); +extern Fl_Button *btnConnectTalker; extern Fl_Group *tabQRZ; extern Fl_Round_Button *btnQRZcdrom; extern Fl_Input2 *txtQRZpathname; diff --git a/src/logger/speak.cxx b/src/logger/speak.cxx index 7d8307f9..9405f67b 100644 --- a/src/logger/speak.cxx +++ b/src/logger/speak.cxx @@ -1,5 +1,6 @@ // ==================================================================== // speak.cxx rx text data stream to file +// rx text data stream to client socket on MS // // Copyright W1HKJ, Dave Freese 2006 // @@ -33,32 +34,99 @@ #include "status.h" #include "fl_digi.h" #include "configuration.h" +#include "debug.h" + +#include "socket.h" +#include "icons.h" using namespace std; const char *txtTalkInfo = "\ Save all received text, one character at a time to the following file:\n\n\ fldigi.files\\talk\\textout.txt (Windows)\n\ - ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)"; + ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)"; string speakfname = ""; ofstream speakout; string speakbuffer = ""; +#ifndef __WIN32__ +void open_talker() +{ +} +#endif + +#ifdef __WIN32__ +#include "confdialog.h" + +string talkbuffer = ""; +Socket *talker_tcpip = 0; +string talker_address = "127.0.0.1"; +string talker_port = "1111"; +bool can_talk = true; + +void open_talker() +{ + try { + talker_tcpip = new Socket(Address(talker_address.c_str(), talker_port.c_str())); + talker_tcpip->set_timeout(0.01); + talker_tcpip->connect(); + btnConnectTalker->labelcolor(FL_FOREGROUND_COLOR); + btnConnectTalker->redraw_label(); + } + catch (const SocketException& e) { + LOG_INFO("Talker Server not available"); + btnConnectTalker->labelcolor(FL_RED); + btnConnectTalker->redraw_label(); + can_talk = false; + } +} + +void close_talker() +{ + talker_tcpip->close(); +} + void speak(int c) { + if (can_talk && !talker_tcpip) open_talker(); + if (!talker_tcpip) + return; + if (c < ' ' || c > 'z') c = ','; + talkbuffer += c; + try { + talker_tcpip->send(talkbuffer); + } + catch (const SocketException& e) { + LOG_INFO("Talker server not available"); + delete talker_tcpip; + talker_tcpip = 0; + btnConnectTalker->labelcolor(FL_RED); + btnConnectTalker->redraw_label(); + can_talk = false; + } + talkbuffer.clear(); +#else + +void speak(int c) +{ +#endif + if (!progdefaults.speak) + return; + if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } - if (c < ' ' || c > 'z') c = ','; + speakbuffer += c; + speakout.open(speakfname.c_str(), ios::app | ios::binary); if (!speakout) return; + for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); speakout.flush(); speakout.close(); } - diff --git a/src/main.cxx b/src/main.cxx index 6747bb59..5ce9c55f 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -347,6 +347,11 @@ int main(int argc, char ** argv) #endif arq_init(); +#ifdef __WIN32__ + open_talker(); +#else + grpTalker->hide(); +#endif #if USE_XMLRPC XML_RPC_Server::start(progdefaults.xmlrpc_address.c_str(), progdefaults.xmlrpc_port.c_str());