flmsg/flamp stream processing

* added parsing of cmd line parameters when opening flmsg
    upon completion of wrap file extraction
  * added parsing of flamp text streams
  * modified socket arq to separate socket i/o from both
    signal processing and main thread.
pull/1/head
David Freese 2012-09-11 15:55:17 -05:00
rodzic 385c33094e
commit 14346a7c51
9 zmienionych plików z 282 dodań i 235 usunięć

Wyświetl plik

@ -3193,13 +3193,6 @@ static void cb_chk_open_flmsg_print(Fl_Check_Button* o, void*) {
progdefaults.changed = true; 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; Fl_Input2 *txt_flmsg_pathname=(Fl_Input2 *)0;
static void cb_txt_flmsg_pathname(Fl_Input2* o, void*) { 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(); 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_Group *tabPskmail=(Fl_Group *)0;
Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0; Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0;
@ -7306,7 +7306,7 @@ d frequency"));
} // Fl_Check_Button* chk_open_wrap_folder } // Fl_Check_Button* chk_open_wrap_folder
o->end(); o->end();
} // Fl_Group* o } // 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->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); 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")); { 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); chk_open_flmsg_print->callback((Fl_Callback*)cb_chk_open_flmsg_print);
o->value(progdefaults.open_flmsg_print); o->value(progdefaults.open_flmsg_print);
} // Fl_Check_Button* chk_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)")); { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(74, 200, 330, 24, _("flmsg:"));
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:"));
txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg")); txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg"));
txt_flmsg_pathname->box(FL_DOWN_BOX); txt_flmsg_pathname->box(FL_DOWN_BOX);
txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR); txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR);
@ -7349,10 +7335,24 @@ d frequency"));
txt_flmsg_pathname->when(FL_WHEN_CHANGED); txt_flmsg_pathname->when(FL_WHEN_CHANGED);
o->value(progdefaults.flmsg_pathname.c_str()); o->value(progdefaults.flmsg_pathname.c_str());
} // Fl_Input2* txt_flmsg_pathname } // 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->tooltip(_("Locate flmsg executable"));
btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg); btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg);
} // Fl_Button* 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(); o->end();
} // Fl_Group* o } // Fl_Group* o
tabNBEMS->end(); tabNBEMS->end();

Wyświetl plik

@ -3979,7 +3979,7 @@ progdefaults.changed = true;}
} }
Fl_Group {} { Fl_Group {} {
label {Reception of flmsg file} open 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 { Fl_Check_Button chk_open_flmsg {
label {Open with 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 tooltip {Open file with default browser} xywh {322 171 136 20} down_box DOWN_BOX
code0 {o->value(progdefaults.open_flmsg_print);} 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 { Fl_Input txt_flmsg_pathname {
label {flmsg:} label {flmsg:}
callback {progdefaults.flmsg_pathname = o->value(); callback {progdefaults.flmsg_pathname = o->value();
progdefaults.changed = true;} 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());} code0 {o->value(progdefaults.flmsg_pathname.c_str());}
class Fl_Input2 class Fl_Input2
} }
Fl_Button btn_select_flmsg { Fl_Button btn_select_flmsg {
label {Locate flmsg} label {Locate flmsg}
callback {select_flmsg_pathname();} 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 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 */ code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */
if( ( w->value() != NULL ) && ( ! w->shown() ) ) { 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 */ code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */
if( ( w->value() != NULL ) && ( ! w->shown() ) ) { if( ( w->value() != NULL ) && ( ! w->shown() ) ) {
@ -4669,5 +4669,4 @@ if( ( w->value() != NULL ) && ( ! w->shown() ) ) {
}} {} }} {}
} }
Function {make_window()} {open Function {make_window()} {} {}
} {}

Wyświetl plik

@ -6037,7 +6037,7 @@ static void put_rx_char_flmain(unsigned int data, int style)
asc = ascii2; asc = ascii2;
if (mode == MODE_RTTY || mode == MODE_CW) if (mode == MODE_RTTY || mode == MODE_CW)
asc = ascii; asc = ascii;
if (extracting) { if (extract_wrap || extract_flamp) {
asc = ascii3; asc = ascii3;
style = FTextBase::RECV; style = FTextBase::RECV;
} }
@ -6051,7 +6051,7 @@ static void put_rx_char_flmain(unsigned int data, int style)
speak(data); speak(data);
if (extracting) { if (extract_wrap || extract_flamp) {
add_rx_char(data); add_rx_char(data);
ReceiveText->add(asc[data & 0xFF], style); ReceiveText->add(asc[data & 0xFF], style);
} else if ((data & 0x80) == 0x80) { } else if ((data & 0x80) == 0x80) {

Wyświetl plik

@ -426,10 +426,10 @@ extern Fl_Check_Button *chkAutoExtract;
extern Fl_Check_Button *chk_open_wrap_folder; extern Fl_Check_Button *chk_open_wrap_folder;
extern Fl_Check_Button *chk_open_flmsg; extern Fl_Check_Button *chk_open_flmsg;
extern Fl_Check_Button *chk_open_flmsg_print; extern Fl_Check_Button *chk_open_flmsg_print;
#include <FL/Fl_Value_Slider.H>
extern Fl_Value_Slider *sldr_extract_timeout;
extern Fl_Input2 *txt_flmsg_pathname; extern Fl_Input2 *txt_flmsg_pathname;
extern Fl_Button *btn_select_flmsg; extern Fl_Button *btn_select_flmsg;
#include <FL/Fl_Value_Slider.H>
extern Fl_Value_Slider *sldr_extract_timeout;
extern Fl_Group *tabPskmail; extern Fl_Group *tabPskmail;
extern Fl_Counter2 *cntServerCarrier; extern Fl_Counter2 *cntServerCarrier;
extern Fl_Counter2 *cntServerOffset; extern Fl_Counter2 *cntServerOffset;

Wyświetl plik

@ -47,6 +47,10 @@ extern std::string FLMSG_ICS_dir;
extern std::string FLMSG_ICS_msg_dir; extern std::string FLMSG_ICS_msg_dir;
extern std::string FLMSG_ICS_tmp_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 xmlfname;
extern std::string scDevice[2]; extern std::string scDevice[2];

Wyświetl plik

@ -26,6 +26,7 @@ extern const char *txtWrapInfo;
extern void rx_extract_add(int c); extern void rx_extract_add(int c);
extern void select_flmsg_pathname(); extern void select_flmsg_pathname();
extern bool extracting; extern bool extract_wrap;
extern bool extract_flamp;
#endif #endif

Wyświetl plik

@ -42,8 +42,8 @@
using namespace std; using namespace std;
const char *beg = "[WRAP:beg]"; const char *wrap_beg = "[WRAP:beg]";
const char *end = "[WRAP:end]"; const char *wrap_end = "[WRAP:end]";
const char *flmsg = "<flmsg>"; const char *flmsg = "<flmsg>";
#ifdef __WIN32__ #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]; char rx_extract_buff[bufsize + 1];
string rx_buff; string rx_buff;
string rx_extract_msg; string rx_extract_msg;
bool extracting = false;
bool extract_wrap = false;
bool extract_flamp = false;
bool bInit = false; bool bInit = false;
char dttm[64]; char dttm[64];
@ -72,7 +75,8 @@ void rx_extract_reset()
rx_buff.clear(); rx_buff.clear();
memset(rx_extract_buff, ' ', bufsize); memset(rx_extract_buff, ' ', bufsize);
rx_extract_buff[bufsize] = 0; rx_extract_buff[bufsize] = 0;
extracting = false; extract_wrap = false;
extract_flamp = false;
} }
void rx_extract_timer(void *) void rx_extract_timer(void *)
@ -92,35 +96,10 @@ void rx_remove_timer()
Fl::remove_timeout(rx_extract_timer); Fl::remove_timeout(rx_extract_timer);
} }
void rx_extract_add(int c) void invoke_flmsg()
{ {
if (!c) return; string cmd = progdefaults.flmsg_pathname;
check_nbems_dirs();
if (!bInit) {
rx_extract_reset();
bInit = true;
}
char ch = (char)c;
memmove(rx_extract_buff, &rx_extract_buff[1], bufsize - 1);
rx_extract_buff[bufsize - 1] = ch;
if ( strstr(rx_extract_buff, beg) != NULL ) {
rx_buff = beg;
rx_extract_msg = "Extracting";
put_status(rx_extract_msg.c_str(), 60, STATUS_CLEAR);
memset(rx_extract_buff, ' ', bufsize);
extracting = true;
REQ(rx_remove_timer);
REQ(rx_add_timer);
} else if (extracting) {
rx_buff += ch;
REQ(rx_remove_timer);
REQ(rx_add_timer);
if (strstr(rx_extract_buff, end) != NULL) {
REQ(rx_remove_timer); REQ(rx_remove_timer);
struct tm tim; struct tm tim;
time_t t; time_t t;
@ -147,7 +126,7 @@ void rx_extract_add(int c)
if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) && if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) &&
(rx_buff.find(flmsg) != string::npos) && (rx_buff.find(flmsg) != string::npos) &&
!progdefaults.flmsg_pathname.empty()) { !progdefaults.flmsg_pathname.empty()) {
string cmd = progdefaults.flmsg_pathname;
#ifdef __MINGW32__ #ifdef __MINGW32__
cmd.append(" -title ").append(dttm); cmd.append(" -title ").append(dttm);
cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\""); cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\"");
@ -286,6 +265,49 @@ void rx_extract_add(int c)
} }
#endif #endif
} }
}
static const char flamp_beg[] = "<FLAMP";
static const char flamp_end[] = "{EOT}";
void rx_extract_add(int c)
{
if (!c) return;
check_nbems_dirs();
if (!bInit) {
rx_extract_reset();
bInit = true;
}
char ch = (char)c;
memmove(rx_extract_buff, &rx_extract_buff[1], bufsize - 1);
rx_extract_buff[bufsize - 1] = ch;
if ( strstr(rx_extract_buff, wrap_beg) && !extract_flamp) {
rx_buff.assign(wrap_beg);
rx_extract_msg = "Extract WRAP";
put_status(rx_extract_msg.c_str(), 60, STATUS_CLEAR);
memset(rx_extract_buff, ' ', bufsize);
extract_wrap = true;
REQ(rx_remove_timer);
REQ(rx_add_timer);
} else if (extract_wrap) {
rx_buff += ch;
REQ(rx_remove_timer);
REQ(rx_add_timer);
if (strstr(rx_extract_buff, wrap_end) != NULL) {
invoke_flmsg();
rx_extract_reset();
}
} else if (strstr(rx_extract_buff, flamp_beg) && ! extract_wrap) {
extract_flamp = true;
} else if (extract_flamp == true) {
REQ(rx_remove_timer);
REQ(rx_add_timer);
if (strstr(rx_extract_buff, flamp_end) != NULL) {
rx_extract_reset(); rx_extract_reset();
} }
} }
@ -313,3 +335,4 @@ void select_flmsg_pathname()
} }
#endif #endif
} }

Wyświetl plik

@ -272,11 +272,6 @@ int main(int argc, char ** argv)
} }
#endif #endif
} }
generate_option_help();
int arg_idx;
if (Fl::args(argc, argv, arg_idx, parse_args) != argc)
arg_error(argv[0], NULL, false);
{ {
#ifdef __WOE32__ #ifdef __WOE32__
@ -291,6 +286,11 @@ int main(int argc, char ** argv)
if (FLMSG_dir.empty()) FLMSG_dir_default = NBEMS_dir; if (FLMSG_dir.empty()) FLMSG_dir_default = NBEMS_dir;
#endif #endif
} }
generate_option_help();
int arg_idx;
if (Fl::args(argc, argv, arg_idx, parse_args) != argc)
arg_error(argv[0], NULL, false);
if (main_window_title.empty()) if (main_window_title.empty())
main_window_title = PACKAGE_TARNAME; main_window_title = PACKAGE_TARNAME;

Wyświetl plik

@ -68,7 +68,7 @@ using namespace std;
//====================================================================== //======================================================================
// test code for pskmail eol issues // test code for pskmail eol issues
const char *asc[256] = { static const char *asc[128] = {
"<NUL>", "<SOH>", "<STX>", "<ETX>", "<NUL>", "<SOH>", "<STX>", "<ETX>",
"<EOT>", "<ENQ>", "<ACK>", "<BEL>", "<EOT>", "<ENQ>", "<ACK>", "<BEL>",
"<BS>", "<TAB>", "<LF>", "<VT>", "<BS>", "<TAB>", "<LF>", "<VT>",
@ -107,7 +107,7 @@ string noctrl(string src)
{ {
static string retstr; static string retstr;
retstr.clear(); 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; return retstr;
} }
@ -653,14 +653,6 @@ void WriteARQSysV(unsigned char data)
} }
#endif #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 // 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_exit = false;
static bool arq_enabled; 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) static void *arq_loop(void *args)
{ {
SET_THREAD_ID(ARQ_TID); SET_THREAD_ID(ARQ_TID);
@ -695,6 +703,18 @@ static void *arq_loop(void *args)
pthread_mutex_lock (&arq_mutex); 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) if (bSend0x06)
send0x06(); send0x06();
@ -709,8 +729,8 @@ static void *arq_loop(void *args)
if (!Socket_arqRx()) if (!Socket_arqRx())
WRAP_auto_arqRx(); WRAP_auto_arqRx();
#endif #endif
pthread_mutex_unlock (&arq_mutex); // pthread_mutex_unlock (&arq_mutex);
MilliSleep(50); MilliSleep(100);
} }
// exit the arq thread // exit the arq thread