diff --git a/src/dialogs/confdialog.cxx b/src/dialogs/confdialog.cxx index 3a91963c..a9a1cb37 100644 --- a/src/dialogs/confdialog.cxx +++ b/src/dialogs/confdialog.cxx @@ -3193,13 +3193,6 @@ static void cb_chk_open_flmsg_print(Fl_Check_Button* o, void*) { progdefaults.changed = true; } -Fl_Value_Slider *sldr_extract_timeout=(Fl_Value_Slider *)0; - -static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) { - progdefaults.extract_timeout=o->value(); -progdefaults.changed=true; -} - Fl_Input2 *txt_flmsg_pathname=(Fl_Input2 *)0; static void cb_txt_flmsg_pathname(Fl_Input2* o, void*) { @@ -3213,6 +3206,13 @@ static void cb_btn_select_flmsg(Fl_Button*, void*) { select_flmsg_pathname(); } +Fl_Value_Slider *sldr_extract_timeout=(Fl_Value_Slider *)0; + +static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) { + progdefaults.extract_timeout=o->value(); +progdefaults.changed=true; +} + Fl_Group *tabPskmail=(Fl_Group *)0; Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0; @@ -7306,7 +7306,7 @@ d frequency")); } // Fl_Check_Button* chk_open_wrap_folder o->end(); } // Fl_Group* o - { Fl_Group* o = new Fl_Group(6, 136, 588, 140, _("Reception of flmsg file")); + { Fl_Group* o = new Fl_Group(6, 136, 588, 145, _("Reception of flmsg file")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_open_flmsg = new Fl_Check_Button(88, 171, 136, 20, _("Open with flmsg")); @@ -7321,21 +7321,7 @@ d frequency")); chk_open_flmsg_print->callback((Fl_Callback*)cb_chk_open_flmsg_print); o->value(progdefaults.open_flmsg_print); } // Fl_Check_Button* chk_open_flmsg_print - { Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(40, 207, 364, 21, _("Timeout (secs)")); - sldr_extract_timeout->tooltip(_("Extract times out after NN seconds of inactivity.")); - sldr_extract_timeout->type(5); - sldr_extract_timeout->color(FL_LIGHT3); - sldr_extract_timeout->selection_color(FL_FOREGROUND_COLOR); - sldr_extract_timeout->minimum(1); - sldr_extract_timeout->maximum(10); - sldr_extract_timeout->step(0.5); - sldr_extract_timeout->value(4); - sldr_extract_timeout->textsize(14); - sldr_extract_timeout->callback((Fl_Callback*)cb_sldr_extract_timeout); - sldr_extract_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); - o->value(progdefaults.extract_timeout); - } // Fl_Value_Slider* sldr_extract_timeout - { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(74, 242, 330, 24, _("flmsg:")); + { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(74, 200, 330, 24, _("flmsg:")); txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg")); txt_flmsg_pathname->box(FL_DOWN_BOX); txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR); @@ -7349,10 +7335,24 @@ d frequency")); txt_flmsg_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.flmsg_pathname.c_str()); } // Fl_Input2* txt_flmsg_pathname - { btn_select_flmsg = new Fl_Button(433, 242, 100, 24, _("Locate flmsg")); + { btn_select_flmsg = new Fl_Button(411, 200, 100, 24, _("Locate flmsg")); btn_select_flmsg->tooltip(_("Locate flmsg executable")); btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg); } // Fl_Button* btn_select_flmsg + { Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(40, 239, 364, 21, _("Timeout (secs)")); + sldr_extract_timeout->tooltip(_("Extract times out after NN seconds of inactivity.")); + sldr_extract_timeout->type(5); + sldr_extract_timeout->color(FL_LIGHT3); + sldr_extract_timeout->selection_color(FL_FOREGROUND_COLOR); + sldr_extract_timeout->minimum(1); + sldr_extract_timeout->maximum(10); + sldr_extract_timeout->step(0.5); + sldr_extract_timeout->value(4); + sldr_extract_timeout->textsize(14); + sldr_extract_timeout->callback((Fl_Callback*)cb_sldr_extract_timeout); + sldr_extract_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); + o->value(progdefaults.extract_timeout); + } // Fl_Value_Slider* sldr_extract_timeout o->end(); } // Fl_Group* o tabNBEMS->end(); diff --git a/src/dialogs/confdialog.fl b/src/dialogs/confdialog.fl index b47143e7..e21d18f3 100644 --- a/src/dialogs/confdialog.fl +++ b/src/dialogs/confdialog.fl @@ -3979,7 +3979,7 @@ progdefaults.changed = true;} } Fl_Group {} { label {Reception of flmsg file} open - xywh {6 136 588 140} box ENGRAVED_FRAME align 21 + xywh {6 136 588 145} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_open_flmsg { label {Open with flmsg} @@ -3995,25 +3995,25 @@ progdefaults.changed = true;} tooltip {Open file with default browser} xywh {322 171 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg_print);} } - Fl_Value_Slider sldr_extract_timeout { - label {Timeout (secs)} - callback {progdefaults.extract_timeout=o->value(); -progdefaults.changed=true;} - tooltip {Extract times out after NN seconds of inactivity.} xywh {40 207 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 10 step 0.5 value 4 textsize 14 - code0 {o->value(progdefaults.extract_timeout);} - } Fl_Input txt_flmsg_pathname { label {flmsg:} callback {progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true;} - tooltip {Enter full path-filename for flmsg} xywh {74 242 330 24} when 1 + tooltip {Enter full path-filename for flmsg} xywh {74 200 330 24} when 1 code0 {o->value(progdefaults.flmsg_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flmsg { label {Locate flmsg} callback {select_flmsg_pathname();} - tooltip {Locate flmsg executable} xywh {433 242 100 24} + tooltip {Locate flmsg executable} xywh {411 200 100 24} + } + Fl_Value_Slider sldr_extract_timeout { + label {Timeout (secs)} + callback {progdefaults.extract_timeout=o->value(); +progdefaults.changed=true;} + tooltip {Extract times out after NN seconds of inactivity.} xywh {40 239 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 10 step 0.5 value 4 textsize 14 + code0 {o->value(progdefaults.extract_timeout);} } } } @@ -4649,7 +4649,7 @@ Function {createConfig()} {open return_type void decl {class Fl_File_Chooser ;} {public global } -Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {open return_type void +Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { @@ -4659,7 +4659,7 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { }} {} } -Function {NvtxCatalogSet(Fl_File_Chooser *w, void *userdata)} {open return_type void +Function {NvtxCatalogSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { @@ -4669,5 +4669,4 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { }} {} } -Function {make_window()} {open -} {} +Function {make_window()} {} {} diff --git a/src/dialogs/fl_digi.cxx b/src/dialogs/fl_digi.cxx index 89faedc5..a180e4b0 100644 --- a/src/dialogs/fl_digi.cxx +++ b/src/dialogs/fl_digi.cxx @@ -6037,7 +6037,7 @@ static void put_rx_char_flmain(unsigned int data, int style) asc = ascii2; if (mode == MODE_RTTY || mode == MODE_CW) asc = ascii; - if (extracting) { + if (extract_wrap || extract_flamp) { asc = ascii3; style = FTextBase::RECV; } @@ -6051,7 +6051,7 @@ static void put_rx_char_flmain(unsigned int data, int style) speak(data); - if (extracting) { + if (extract_wrap || extract_flamp) { add_rx_char(data); ReceiveText->add(asc[data & 0xFF], style); } else if ((data & 0x80) == 0x80) { diff --git a/src/include/confdialog.h b/src/include/confdialog.h index 25ca8c7b..9313a98d 100644 --- a/src/include/confdialog.h +++ b/src/include/confdialog.h @@ -426,10 +426,10 @@ extern Fl_Check_Button *chkAutoExtract; extern Fl_Check_Button *chk_open_wrap_folder; extern Fl_Check_Button *chk_open_flmsg; extern Fl_Check_Button *chk_open_flmsg_print; -#include -extern Fl_Value_Slider *sldr_extract_timeout; extern Fl_Input2 *txt_flmsg_pathname; extern Fl_Button *btn_select_flmsg; +#include +extern Fl_Value_Slider *sldr_extract_timeout; extern Fl_Group *tabPskmail; extern Fl_Counter2 *cntServerCarrier; extern Fl_Counter2 *cntServerOffset; diff --git a/src/include/main.h b/src/include/main.h index 8446f5a5..3cd24a90 100644 --- a/src/include/main.h +++ b/src/include/main.h @@ -47,6 +47,10 @@ extern std::string FLMSG_ICS_dir; extern std::string FLMSG_ICS_msg_dir; extern std::string FLMSG_ICS_tmp_dir; +extern std::string FLAMP_dir; +extern std::string FLAMP_rx_dir; +extern std::string FLAMP_tx_dir; + extern std::string xmlfname; extern std::string scDevice[2]; diff --git a/src/include/rx_extract.h b/src/include/rx_extract.h index 49554a04..c255bc14 100644 --- a/src/include/rx_extract.h +++ b/src/include/rx_extract.h @@ -26,6 +26,7 @@ extern const char *txtWrapInfo; extern void rx_extract_add(int c); extern void select_flmsg_pathname(); -extern bool extracting; +extern bool extract_wrap; +extern bool extract_flamp; #endif diff --git a/src/logger/rx_extract.cxx b/src/logger/rx_extract.cxx index 6e5890fb..dad3bfff 100644 --- a/src/logger/rx_extract.cxx +++ b/src/logger/rx_extract.cxx @@ -42,8 +42,8 @@ using namespace std; -const char *beg = "[WRAP:beg]"; -const char *end = "[WRAP:end]"; +const char *wrap_beg = "[WRAP:beg]"; +const char *wrap_end = "[WRAP:end]"; const char *flmsg = ""; #ifdef __WIN32__ @@ -62,7 +62,10 @@ Save tags and all enclosed text to date-time stamped file, ie:\n\ char rx_extract_buff[bufsize + 1]; string rx_buff; string rx_extract_msg; -bool extracting = false; + +bool extract_wrap = false; +bool extract_flamp = false; + bool bInit = false; char dttm[64]; @@ -72,7 +75,8 @@ void rx_extract_reset() rx_buff.clear(); memset(rx_extract_buff, ' ', bufsize); rx_extract_buff[bufsize] = 0; - extracting = false; + extract_wrap = false; + extract_flamp = false; } void rx_extract_timer(void *) @@ -92,6 +96,180 @@ void rx_remove_timer() Fl::remove_timeout(rx_extract_timer); } +void invoke_flmsg() +{ + string cmd = progdefaults.flmsg_pathname; + + REQ(rx_remove_timer); + struct tm tim; + time_t t; + time(&t); + gmtime_r(&t, &tim); + strftime(dttm, sizeof(dttm), "%Y%m%d-%H%M%S", &tim); + + string outfilename = FLMSG_WRAP_recv_dir; + outfilename.append("extract-"); + outfilename.append(dttm); + outfilename.append(".wrap"); + ofstream extractstream(outfilename.c_str(), ios::binary); + if (extractstream) { + extractstream << rx_buff; + extractstream.close(); + } + rx_extract_msg = "File saved in "; + rx_extract_msg.append(FLMSG_WRAP_recv_dir); + put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); + + if (progdefaults.open_nbems_folder) + open_recv_folder(FLMSG_WRAP_recv_dir.c_str()); + + if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) && + (rx_buff.find(flmsg) != string::npos) && + !progdefaults.flmsg_pathname.empty()) { + +#ifdef __MINGW32__ + cmd.append(" -title ").append(dttm); + cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\""); + + if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) + cmd.append(" --b"); + else if (progdefaults.open_flmsg_print) + cmd.append(" --p"); + cmd.append(" \"").append(outfilename).append("\""); + char *cmdstr = strdup(cmd.c_str()); + STARTUPINFO si; + PROCESS_INFORMATION pi; + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + memset(&pi, 0, sizeof(pi)); + if (!CreateProcess( NULL, cmdstr, + NULL, NULL, FALSE, + CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) + LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + free (cmdstr); +#else + string params = ""; + static string ap[10];// = cmd;//""; + string param = ""; + + size_t p = cmd.find(" -"); + if (p != string::npos) { + param.assign(cmd.substr(p)); + cmd = cmd.substr(0,p); + } + for (int i = 0; i < 10; i++) ap[i].clear(); + + int n = 0; + ap[n++] = "-title"; ap[n++] = dttm; + ap[n++] = "--flmsg-dir"; ap[n++] = FLMSG_dir; + if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) + ap[n++] = " --b";//params = " --b"; + else if (progdefaults.open_flmsg_print) + ap[n++] = " --p";//params = " --p"; + ap[n++] = outfilename; + + switch (fork()) { + case 0: +# ifndef NDEBUG + unsetenv("MALLOC_CHECK_"); + unsetenv("MALLOC_PERTURB_"); +# endif + switch (n) { + case 1: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), + (char*)0); + break; + case 2: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)0); + break; + case 3: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), + (char*)0); + break; + case 4: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)0); + break; + case 5: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), + (char*)0); + break; + case 6: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), (char*)ap[5].c_str(), + (char*)0); + break; + case 7: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), (char*)ap[5].c_str(), + (char*)ap[6].c_str(), + (char*)0); + break; + case 8: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), (char*)ap[5].c_str(), + (char*)ap[6].c_str(), (char*)ap[7].c_str(), + (char*)0); + break; + case 9: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), (char*)ap[5].c_str(), + (char*)ap[6].c_str(), (char*)ap[7].c_str(), + (char*)ap[8].c_str(), + (char*)0); + break; + case 10: + execlp( + (char*)cmd.c_str(), (char*)cmd.c_str(), + (char*)ap[0].c_str(), (char*)ap[1].c_str(), + (char*)ap[2].c_str(), (char*)ap[3].c_str(), + (char*)ap[4].c_str(), (char*)ap[5].c_str(), + (char*)ap[6].c_str(), (char*)ap[7].c_str(), + (char*)ap[8].c_str(), (char*)ap[9].c_str(), + (char*)0); + break; + default : ; + } + exit(EXIT_FAILURE); + case -1: + fl_alert2(_("Could not start flmsg")); + } +#endif + } +} + +static const char flamp_beg[] = "", "", "", "", "", "", "", "", "", "", "", "", @@ -107,7 +107,7 @@ string noctrl(string src) { static string retstr; retstr.clear(); - for (size_t i = 0; i < src.length(); i++) retstr.append(asc[(int)src[i]]); + for (size_t i = 0; i < src.length(); i++) retstr.append(asc[(int)src[i] & 0x7F]); return retstr; } @@ -653,14 +653,6 @@ void WriteARQSysV(unsigned char data) } #endif -void WriteARQ(unsigned char data) -{ - WriteARQsocket(&data, 1); -#if !defined(__WOE32__) && !defined(__APPLE__) - WriteARQSysV(data); -#endif -} - //----------------------------------------------------------------------------- // Write End of Transmit character to ARQ client //----------------------------------------------------------------------------- @@ -684,6 +676,22 @@ static void *arq_loop(void *args); static bool arq_exit = false; static bool arq_enabled; +string tosend = ""; +string enroute = ""; + +void WriteARQ(unsigned char data) +{ + pthread_mutex_lock (&arq_mutex); + tosend += data; + pthread_mutex_unlock (&arq_mutex); + return; + +// WriteARQsocket(&data, 1); +//#if !defined(__WOE32__) && !defined(__APPLE__) +// WriteARQSysV(data); +//#endif +} + static void *arq_loop(void *args) { SET_THREAD_ID(ARQ_TID); @@ -695,6 +703,18 @@ static void *arq_loop(void *args) pthread_mutex_lock (&arq_mutex); + if (!tosend.empty()) { + enroute = tosend; + tosend.clear(); + pthread_mutex_unlock (&arq_mutex); + WriteARQsocket((unsigned char*)enroute.c_str(), enroute.length()); +#if !defined(__WOE32__) && !defined(__APPLE__) + for (size_t i = 0; i < enroute.length(); i++) + WriteARQSysV((unsigned char)enroute[i]); +#endif + } else + pthread_mutex_unlock (&arq_mutex); + if (bSend0x06) send0x06(); @@ -709,8 +729,8 @@ static void *arq_loop(void *args) if (!Socket_arqRx()) WRAP_auto_arqRx(); #endif - pthread_mutex_unlock (&arq_mutex); - MilliSleep(50); +// pthread_mutex_unlock (&arq_mutex); + MilliSleep(100); } // exit the arq thread