flmsg interface

* Added xmlrpc procedures to specifically to allow flmsg i/o
    using ARQ protocol.
    - main.flmsg_online
      main.flmsg_available
      main.flmsg_transfer
pull/4/head
David Freese 2016-05-03 08:25:32 -05:00
rodzic 5b367fb638
commit aa6592c59b
8 zmienionych plików z 311 dodań i 179 usunięć

Wyświetl plik

@ -107,7 +107,7 @@ over HF and VHF radio.Additional information on flarq is available here:
</ul>
The reception of a flwrap and flmsg files can be automated by selecting
the "Enable detection &amp; extraction" option. The wrap program
the "Enable detection" option. The wrap program
can then be used to test for validity and data extraction at some later
time. fldigi can recognize flmsg data files and automatically
open the flmsg program with the newly received data stream. It
@ -115,6 +115,10 @@ can also transfer the data stream to flmsg and instruct flmsg to save
the data file, unwrap and decode it, display the data in a fully
formatted html page and then exit. Pressing "Locate flmsg"
performs differently on the different OS that are supported.
The ability to transfer incoming flmsg data streams directly to an executing
flmsg was introduced with flmsg 3.0. Check that option if you are using flmsg
3.0 or greater.
<br>
<ul>

Wyświetl plik

@ -4858,6 +4858,13 @@ static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) {
progdefaults.changed=true;
}
Fl_Check_Button *chk_transfer__to_open_flmsg=(Fl_Check_Button *)0;
static void cb_chk_transfer__to_open_flmsg(Fl_Check_Button* o, void*) {
progdefaults.flmsg_transfer_direct = o->value();
progdefaults.changed = true;
}
Fl_Group *tabPskmail=(Fl_Group *)0;
Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0;
@ -10909,7 +10916,6 @@ gured on the\n\"Notifications\" configure dialog."));
{ tabsMisc = new Fl_Tabs(0, 25, 600, 360);
tabsMisc->selection_color(FL_LIGHT1);
{ tabCPUspeed = new Fl_Group(0, 50, 600, 335, _("CPU"));
tabCPUspeed->hide();
{ Fl_Group* o = new Fl_Group(55, 75, 490, 51);
o->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE));
@ -10942,22 +10948,22 @@ gured on the\n\"Notifications\" configure dialog."));
} // Fl_Check_Button* chk_open_wrap_folder
o->end();
} // Fl_Group* o
{ Fl_Group* o = new Fl_Group(50, 141, 500, 130, _("Reception of flmsg files"));
{ Fl_Group* o = new Fl_Group(50, 141, 500, 199, _("Reception of flmsg files"));
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(104, 168, 136, 20, _("Open with flmsg"));
{ Fl_Check_Button* o = chk_open_flmsg = new Fl_Check_Button(104, 241, 136, 20, _("Open with flmsg"));
chk_open_flmsg->tooltip(_("Open message with flmsg"));
chk_open_flmsg->down_box(FL_DOWN_BOX);
chk_open_flmsg->callback((Fl_Callback*)cb_chk_open_flmsg);
o->value(progdefaults.open_flmsg);
} // Fl_Check_Button* chk_open_flmsg
{ Fl_Check_Button* o = chk_open_flmsg_print = new Fl_Check_Button(310, 168, 136, 20, _("Open in browser"));
{ Fl_Check_Button* o = chk_open_flmsg_print = new Fl_Check_Button(310, 241, 136, 20, _("Open in browser"));
chk_open_flmsg_print->tooltip(_("Open file with default browser"));
chk_open_flmsg_print->down_box(FL_DOWN_BOX);
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_Input2* o = txt_flmsg_pathname = new Fl_Input2(104, 199, 330, 24, _("flmsg:"));
{ Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(104, 271, 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);
@ -10971,24 +10977,36 @@ gured on the\n\"Notifications\" configure dialog."));
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(441, 199, 100, 24, _("Locate flmsg"));
{ btn_select_flmsg = new Fl_Button(441, 271, 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(70, 237, 364, 21, _("Timeout (secs)"));
{ Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(70, 309, 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->maximum(20);
sldr_extract_timeout->step(0.5);
sldr_extract_timeout->value(4);
sldr_extract_timeout->value(10);
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_Group* o = new Fl_Group(55, 160, 490, 76, _("Selection of transfer direct takes precedence\nover all other flmsg reception\
settings"));
o->box(FL_ENGRAVED_FRAME);
o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE));
{ Fl_Check_Button* o = chk_transfer__to_open_flmsg = new Fl_Check_Button(160, 204, 271, 20, _("Transfer direct to executing flmsg"));
chk_transfer__to_open_flmsg->tooltip(_("Send data stream directly to executing flmsg"));
chk_transfer__to_open_flmsg->down_box(FL_DOWN_BOX);
chk_transfer__to_open_flmsg->callback((Fl_Callback*)cb_chk_transfer__to_open_flmsg);
o->value(progdefaults.flmsg_transfer_direct);
} // Fl_Check_Button* chk_transfer__to_open_flmsg
o->end();
} // Fl_Group* o
o->end();
} // Fl_Group* o
tabNBEMS->end();
@ -11388,6 +11406,7 @@ earch for station name"));
tabWX->end();
} // Fl_Group* tabWX
{ tabKML = new Fl_Group(0, 50, 600, 335, _("KML"));
tabKML->hide();
{ Fl_Input* o = btnKmlSaveDir = new Fl_Input(26, 75, 390, 24, _("KML files directory"));
btnKmlSaveDir->tooltip(_("Where generated KML documents are stored."));
btnKmlSaveDir->callback((Fl_Callback*)cb_btnKmlSaveDir);

Wyświetl plik

@ -359,7 +359,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {}
Fl_Window {} {
label {Fldigi configuration} open
xywh {900 170 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible
xywh {1076 134 600 415} type Double color 45 selection_color 51 labelsize 18 align 80 non_modal visible
} {
Fl_Tabs tabsConfigure {open
xywh {0 0 600 390} color 50 selection_color 50
@ -5991,7 +5991,7 @@ progdefaults.changed = true;}
} {
Fl_Group tabCPUspeed {
label CPU open
xywh {0 50 600 335} hide
xywh {0 50 600 335}
} {
Fl_Group {} {open
xywh {55 75 490 51} box ENGRAVED_FRAME align 21
@ -6030,42 +6030,55 @@ progdefaults.changed = true;}
}
Fl_Group {} {
label {Reception of flmsg files} open
xywh {50 141 500 130} box ENGRAVED_FRAME align 21
xywh {50 141 500 199} box ENGRAVED_FRAME align 21
} {
Fl_Check_Button chk_open_flmsg {
label {Open with flmsg}
callback {progdefaults.open_flmsg = o->value();
progdefaults.changed = true;}
tooltip {Open message with flmsg} xywh {104 168 136 20} down_box DOWN_BOX
tooltip {Open message with flmsg} xywh {104 241 136 20} down_box DOWN_BOX
code0 {o->value(progdefaults.open_flmsg);}
}
Fl_Check_Button chk_open_flmsg_print {
label {Open in browser}
callback {progdefaults.open_flmsg_print = o->value();
progdefaults.changed = true;}
tooltip {Open file with default browser} xywh {310 168 136 20} down_box DOWN_BOX
tooltip {Open file with default browser} xywh {310 241 136 20} down_box DOWN_BOX
code0 {o->value(progdefaults.open_flmsg_print);}
}
Fl_Input txt_flmsg_pathname {
label {flmsg:}
callback {progdefaults.flmsg_pathname = o->value();
progdefaults.changed = true;}
tooltip {Enter full path-filename for flmsg} xywh {104 199 330 24} when 1
tooltip {Enter full path-filename for flmsg} xywh {104 271 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 {441 199 100 24}
tooltip {Locate flmsg executable} xywh {441 271 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 {70 237 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 10 step 0.5 value 4 textsize 14
tooltip {Extract times out after NN seconds of inactivity.} xywh {70 309 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 20 step 0.5 value 10 textsize 14
code0 {o->value(progdefaults.extract_timeout);}
}
Fl_Group {} {
label {Selection of transfer direct takes precedence
over all other flmsg reception settings} open
xywh {55 160 490 76} box ENGRAVED_FRAME align 17
} {
Fl_Check_Button chk_transfer__to_open_flmsg {
label {Transfer direct to executing flmsg}
callback {progdefaults.flmsg_transfer_direct = o->value();
progdefaults.changed = true;}
tooltip {Send data stream directly to executing flmsg} xywh {160 204 271 20} down_box DOWN_BOX
code0 {o->value(progdefaults.flmsg_transfer_direct);}
}
}
}
}
Fl_Group tabPskmail {
@ -6436,7 +6449,7 @@ progdefaults.changed = true;}
}
Fl_Group tabKML {
label KML open
xywh {0 50 600 335}
xywh {0 50 600 335} hide
} {
Fl_Input btnKmlSaveDir {
label {KML files directory}

Wyświetl plik

@ -593,6 +593,7 @@ extern Fl_Check_Button *chk_open_flmsg_print;
extern Fl_Input2 *txt_flmsg_pathname;
extern Fl_Button *btn_select_flmsg;
extern Fl_Value_Slider *sldr_extract_timeout;
extern Fl_Check_Button *chk_transfer__to_open_flmsg;
extern Fl_Group *tabPskmail;
extern Fl_Counter2 *cntServerCarrier;
extern Fl_Counter2 *cntServerOffset;

Wyświetl plik

@ -872,6 +872,9 @@
ELEM_(bool, open_flmsg, "OPEN_FLMSG", \
"Open flmsg with the autoextract file", \
true) \
ELEM_(bool, flmsg_transfer_direct, "FLMSG_TRANSFER_DIRECT", \
"Transfer incoming flmsg autosend file to open flmsg application", \
true) \
ELEM_(bool, open_flmsg_print, "OPEN_FLMSG_PRINT", \
"Open flmsg with the autoextract file\nprint to browser\nclose flmsg", \
true) \

Wyświetl plik

@ -50,4 +50,8 @@ extern void xmlrpc_set_qsy(long long rfc);
extern int xmltest_char();
extern bool xmltest_char_available;
extern int number_of_samples(std::string s);
extern bool flmsg_online;
extern std::string flmsg_data;
#endif // XMLRPC_H

Wyświetl plik

@ -40,6 +40,7 @@
#include "icons.h"
#include "qrunner.h"
#include "timeops.h"
#include "xmlrpc.h"
using namespace std;
@ -127,6 +128,11 @@ void invoke_flmsg()
rx_extract_msg.append(FLMSG_WRAP_recv_dir);
put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR);
if (flmsg_online && progdefaults.flmsg_transfer_direct) {
flmsg_data = rx_buff;
return;
}
if (progdefaults.open_nbems_folder)
open_recv_folder(FLMSG_WRAP_recv_dir.c_str());

Wyświetl plik

@ -1572,6 +1572,83 @@ public:
}
};
//----------------------------------------------------------------------
// flmsg i/o
//----------------------------------------------------------------------
bool flmsg_online = false;
void flmsg_defeat(void *)
{
flmsg_online = false;
}
class Main_flmsg_online : public xmlrpc_c::method
{
public:
Main_flmsg_online()
{
_signature = "n:n";
_help = "flmsg online indication";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
flmsg_online = true;
Fl::remove_timeout(flmsg_defeat);
Fl::add_timeout(0.5, flmsg_defeat);
}
};
string flmsg_data;
class Main_flmsg_available : public xmlrpc_c::method
{
public:
Main_flmsg_available()
{
_signature = "n:n";
_help = "flmsg data available";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
int data_ready = (int)flmsg_data.size();
*retval = xmlrpc_c::value_int(data_ready);
}
};
class Main_flmsg_transfer : public xmlrpc_c::method
{
public:
Main_flmsg_transfer()
{
_signature = "n:n";
_help = "data transfer to flmsg";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
XMLRPC_LOCK;
string tempstr = flmsg_data;
*retval = xmlrpc_c::value_string(tempstr);
flmsg_data.clear();
}
};
class Main_flmsg_squelch : public xmlrpc_c::method
{
public:
Main_flmsg_squelch()
{
_signature = "b:n";
_help = "Returns the squelch state.";
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_boolean(active_modem->get_metric() > progStatus.sldrSquelchValue);
}
};
//----------------------------------------------------------------------
class Main_run_macro : public xmlrpc_c::method
{
public:
@ -3312,192 +3389,197 @@ struct Navtex_send_message : public xmlrpc_c::method
// method list: ELEM_(class_name, "method_name")
#undef ELEM_
#define METHOD_LIST \
ELEM_(Fldigi_list, "fldigi.list") \
ELEM_(Fldigi_name, "fldigi.name") \
ELEM_(Fldigi_version_struct, "fldigi.version_struct") \
ELEM_(Fldigi_version_string, "fldigi.version") \
ELEM_(Fldigi_name_version, "fldigi.name_version") \
ELEM_(Fldigi_config_dir, "fldigi.config_dir") \
ELEM_(Fldigi_terminate, "fldigi.terminate") \
#define METHOD_LIST \
ELEM_(Fldigi_list, "fldigi.list") \
ELEM_(Fldigi_name, "fldigi.name") \
ELEM_(Fldigi_version_struct, "fldigi.version_struct") \
ELEM_(Fldigi_version_string, "fldigi.version") \
ELEM_(Fldigi_name_version, "fldigi.name_version") \
ELEM_(Fldigi_config_dir, "fldigi.config_dir") \
ELEM_(Fldigi_terminate, "fldigi.terminate") \
\
ELEM_(Modem_get_name, "modem.get_name") \
ELEM_(Modem_get_names, "modem.get_names") \
ELEM_(Modem_get_id, "modem.get_id") \
ELEM_(Modem_get_max_id, "modem.get_max_id") \
ELEM_(Modem_set_by_name, "modem.set_by_name") \
ELEM_(Modem_set_by_id, "modem.set_by_id") \
ELEM_(Modem_get_name, "modem.get_name") \
ELEM_(Modem_get_names, "modem.get_names") \
ELEM_(Modem_get_id, "modem.get_id") \
ELEM_(Modem_get_max_id, "modem.get_max_id") \
ELEM_(Modem_set_by_name, "modem.set_by_name") \
ELEM_(Modem_set_by_id, "modem.set_by_id") \
\
ELEM_(Modem_set_carrier, "modem.set_carrier") \
ELEM_(Modem_inc_carrier, "modem.inc_carrier") \
ELEM_(Modem_get_carrier, "modem.get_carrier") \
ELEM_(Modem_set_carrier, "modem.set_carrier") \
ELEM_(Modem_inc_carrier, "modem.inc_carrier") \
ELEM_(Modem_get_carrier, "modem.get_carrier") \
\
ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \
ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \
ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \
ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \
ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \
ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \
\
ELEM_(Modem_get_bw, "modem.get_bandwidth") \
ELEM_(Modem_set_bw, "modem.set_bandwidth") \
ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \
ELEM_(Modem_get_bw, "modem.get_bandwidth") \
ELEM_(Modem_set_bw, "modem.set_bandwidth") \
ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \
\
ELEM_(Modem_get_quality, "modem.get_quality") \
ELEM_(Modem_search_up, "modem.search_up") \
ELEM_(Modem_search_down, "modem.search_down") \
ELEM_(Modem_get_quality, "modem.get_quality") \
ELEM_(Modem_search_up, "modem.search_up") \
ELEM_(Modem_search_down, "modem.search_down") \
\
ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \
ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \
ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \
ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \
ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \
ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \
ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \
ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \
\
ELEM_(Main_get_status1, "main.get_status1") \
ELEM_(Main_get_status2, "main.get_status2") \
ELEM_(Main_get_status1, "main.get_status1") \
ELEM_(Main_get_status2, "main.get_status2") \
\
ELEM_(Main_get_sb, "main.get_sideband") \
ELEM_(Main_set_sb, "main.set_sideband") \
ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \
ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \
ELEM_(Main_get_freq, "main.get_frequency") \
ELEM_(Main_set_freq, "main.set_frequency") \
ELEM_(Main_inc_freq, "main.inc_frequency") \
ELEM_(Main_get_sb, "main.get_sideband") \
ELEM_(Main_set_sb, "main.set_sideband") \
ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \
ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \
ELEM_(Main_get_freq, "main.get_frequency") \
ELEM_(Main_set_freq, "main.set_frequency") \
ELEM_(Main_inc_freq, "main.inc_frequency") \
\
ELEM_(Main_get_afc, "main.get_afc") \
ELEM_(Main_set_afc, "main.set_afc") \
ELEM_(Main_toggle_afc, "main.toggle_afc") \
ELEM_(Main_get_afc, "main.get_afc") \
ELEM_(Main_set_afc, "main.set_afc") \
ELEM_(Main_toggle_afc, "main.toggle_afc") \
\
ELEM_(Main_get_sql, "main.get_squelch") \
ELEM_(Main_set_sql, "main.set_squelch") \
ELEM_(Main_toggle_sql, "main.toggle_squelch") \
ELEM_(Main_get_sql, "main.get_squelch") \
ELEM_(Main_set_sql, "main.set_squelch") \
ELEM_(Main_toggle_sql, "main.toggle_squelch") \
\
ELEM_(Main_get_sql_level, "main.get_squelch_level") \
ELEM_(Main_set_sql_level, "main.set_squelch_level") \
ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \
ELEM_(Main_get_sql_level, "main.get_squelch_level") \
ELEM_(Main_set_sql_level, "main.set_squelch_level") \
ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \
\
ELEM_(Main_get_rev, "main.get_reverse") \
ELEM_(Main_set_rev, "main.set_reverse") \
ELEM_(Main_toggle_rev, "main.toggle_reverse") \
ELEM_(Main_get_rev, "main.get_reverse") \
ELEM_(Main_set_rev, "main.set_reverse") \
ELEM_(Main_toggle_rev, "main.toggle_reverse") \
\
ELEM_(Main_get_lock, "main.get_lock") \
ELEM_(Main_set_lock, "main.set_lock") \
ELEM_(Main_toggle_lock, "main.toggle_lock") \
ELEM_(Main_get_lock, "main.get_lock") \
ELEM_(Main_set_lock, "main.set_lock") \
ELEM_(Main_toggle_lock, "main.toggle_lock") \
\
ELEM_(Main_get_txid, "main.get_txid") \
ELEM_(Main_set_txid, "main.set_txid") \
ELEM_(Main_toggle_txid, "main.toggle_txid") \
ELEM_(Main_get_txid, "main.get_txid") \
ELEM_(Main_set_txid, "main.set_txid") \
ELEM_(Main_toggle_txid, "main.toggle_txid") \
\
ELEM_(Main_get_rsid, "main.get_rsid") \
ELEM_(Main_set_rsid, "main.set_rsid") \
ELEM_(Main_toggle_rsid, "main.toggle_rsid") \
ELEM_(Main_get_rsid, "main.get_rsid") \
ELEM_(Main_set_rsid, "main.set_rsid") \
ELEM_(Main_toggle_rsid, "main.toggle_rsid") \
\
ELEM_(Main_get_trx_status, "main.get_trx_status") \
ELEM_(Main_tx, "main.tx") \
ELEM_(Main_tune, "main.tune") \
ELEM_(Main_rsid, "main.rsid") \
ELEM_(Main_rx, "main.rx") \
ELEM_(Main_rx_tx, "main.rx_tx") \
ELEM_(Main_rx_only, "main.rx_only") \
ELEM_(Main_abort, "main.abort") \
ELEM_(Main_get_trx_status, "main.get_trx_status") \
ELEM_(Main_tx, "main.tx") \
ELEM_(Main_tune, "main.tune") \
ELEM_(Main_rsid, "main.rsid") \
ELEM_(Main_rx, "main.rx") \
ELEM_(Main_rx_tx, "main.rx_tx") \
ELEM_(Main_rx_only, "main.rx_only") \
ELEM_(Main_abort, "main.abort") \
\
ELEM_(Main_get_trx_state, "main.get_trx_state") \
ELEM_(Main_get_tx_timing, "main.get_tx_timing") \
ELEM_(Main_get_char_rates, "main.get_char_rates") \
ELEM_(Main_get_char_timing, "main.get_char_timing") \
ELEM_(Main_set_rig_name, "main.set_rig_name") \
ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \
ELEM_(Main_set_rig_modes, "main.set_rig_modes") \
ELEM_(Main_set_rig_mode, "main.set_rig_mode") \
ELEM_(Main_get_rig_modes, "main.get_rig_modes") \
ELEM_(Main_get_rig_mode, "main.get_rig_mode") \
ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \
ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \
ELEM_(Main_get_trx_state, "main.get_trx_state") \
ELEM_(Main_get_tx_timing, "main.get_tx_timing") \
ELEM_(Main_get_char_rates, "main.get_char_rates") \
ELEM_(Main_get_char_timing, "main.get_char_timing") \
ELEM_(Main_set_rig_name, "main.set_rig_name") \
ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \
ELEM_(Main_set_rig_modes, "main.set_rig_modes") \
ELEM_(Main_set_rig_mode, "main.set_rig_mode") \
ELEM_(Main_get_rig_modes, "main.get_rig_modes") \
ELEM_(Main_get_rig_mode, "main.get_rig_mode") \
ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \
ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \
ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \
\
ELEM_(Main_run_macro, "main.run_macro") \
ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \
ELEM_(Main_run_macro, "main.run_macro") \
ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \
\
ELEM_(Rig_set_name, "rig.set_name") \
ELEM_(Rig_get_name, "rig.get_name") \
ELEM_(Rig_set_frequency, "rig.set_frequency") \
ELEM_(Rig_set_smeter, "rig.set_smeter") \
ELEM_(Rig_set_pwrmeter, "rig.set_pwrmeter") \
ELEM_(Rig_set_modes, "rig.set_modes") \
ELEM_(Rig_set_mode, "rig.set_mode") \
ELEM_(Rig_get_modes, "rig.get_modes") \
ELEM_(Rig_get_mode, "rig.get_mode") \
ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \
ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \
ELEM_(Rig_get_freq, "rig.get_frequency") \
ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \
ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \
ELEM_(Rig_get_notch, "rig.get_notch") \
ELEM_(Rig_set_notch, "rig.set_notch") \
ELEM_(Rig_take_control, "rig.take_control") \
ELEM_(Rig_release_control, "rig.release_control") \
ELEM_(Rig_set_name, "rig.set_name") \
ELEM_(Rig_get_name, "rig.get_name") \
ELEM_(Rig_set_frequency, "rig.set_frequency") \
ELEM_(Rig_set_smeter, "rig.set_smeter") \
ELEM_(Rig_set_pwrmeter, "rig.set_pwrmeter") \
ELEM_(Rig_set_modes, "rig.set_modes") \
ELEM_(Rig_set_mode, "rig.set_mode") \
ELEM_(Rig_get_modes, "rig.get_modes") \
ELEM_(Rig_get_mode, "rig.get_mode") \
ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \
ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \
ELEM_(Rig_get_freq, "rig.get_frequency") \
ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \
ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \
ELEM_(Rig_get_notch, "rig.get_notch") \
ELEM_(Rig_set_notch, "rig.set_notch") \
ELEM_(Rig_take_control, "rig.take_control") \
ELEM_(Rig_release_control, "rig.release_control") \
\
ELEM_(Log_get_freq, "log.get_frequency") \
ELEM_(Log_get_time_on, "log.get_time_on") \
ELEM_(Log_get_time_off, "log.get_time_off") \
ELEM_(Log_get_call, "log.get_call") \
ELEM_(Log_get_name, "log.get_name") \
ELEM_(Log_get_rst_in, "log.get_rst_in") \
ELEM_(Log_get_rst_out, "log.get_rst_out") \
ELEM_(Log_set_rst_in, "log.set_rst_in") \
ELEM_(Log_set_rst_out, "log.set_rst_out") \
ELEM_(Log_get_serial_number, "log.get_serial_number") \
ELEM_(Log_set_serial_number, "log.set_serial_number") \
ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \
ELEM_(Log_get_exchange, "log.get_exchange") \
ELEM_(Log_set_exchange, "log.set_exchange") \
ELEM_(Log_get_state, "log.get_state") \
ELEM_(Log_get_province, "log.get_province") \
ELEM_(Log_get_country, "log.get_country") \
ELEM_(Log_get_qth, "log.get_qth") \
ELEM_(Log_get_band, "log.get_band") \
ELEM_(Log_get_sb, "log.get_sideband") \
ELEM_(Log_get_notes, "log.get_notes") \
ELEM_(Log_get_locator, "log.get_locator") \
ELEM_(Log_get_az, "log.get_az") \
ELEM_(Log_clear, "log.clear") \
ELEM_(Log_set_call, "log.set_call") \
ELEM_(Log_set_name, "log.set_name") \
ELEM_(Log_set_qth, "log.set_qth") \
ELEM_(Log_set_locator, "log.set_locator") \
ELEM_(Log_set_rst_in, "log.set_rst_in") \
ELEM_(Log_set_rst_out, "log.set_rst_out") \
ELEM_(Log_get_freq, "log.get_frequency") \
ELEM_(Log_get_time_on, "log.get_time_on") \
ELEM_(Log_get_time_off, "log.get_time_off") \
ELEM_(Log_get_call, "log.get_call") \
ELEM_(Log_get_name, "log.get_name") \
ELEM_(Log_get_rst_in, "log.get_rst_in") \
ELEM_(Log_get_rst_out, "log.get_rst_out") \
ELEM_(Log_set_rst_in, "log.set_rst_in") \
ELEM_(Log_set_rst_out, "log.set_rst_out") \
ELEM_(Log_get_serial_number, "log.get_serial_number") \
ELEM_(Log_set_serial_number, "log.set_serial_number") \
ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \
ELEM_(Log_get_exchange, "log.get_exchange") \
ELEM_(Log_set_exchange, "log.set_exchange") \
ELEM_(Log_get_state, "log.get_state") \
ELEM_(Log_get_province, "log.get_province") \
ELEM_(Log_get_country, "log.get_country") \
ELEM_(Log_get_qth, "log.get_qth") \
ELEM_(Log_get_band, "log.get_band") \
ELEM_(Log_get_sb, "log.get_sideband") \
ELEM_(Log_get_notes, "log.get_notes") \
ELEM_(Log_get_locator, "log.get_locator") \
ELEM_(Log_get_az, "log.get_az") \
ELEM_(Log_clear, "log.clear") \
ELEM_(Log_set_call, "log.set_call") \
ELEM_(Log_set_name, "log.set_name") \
ELEM_(Log_set_qth, "log.set_qth") \
ELEM_(Log_set_locator, "log.set_locator") \
ELEM_(Log_set_rst_in, "log.set_rst_in") \
ELEM_(Log_set_rst_out, "log.set_rst_out") \
\
ELEM_(Io_in_use, "io.in_use") \
ELEM_(Io_enable_kiss, "io.enable_kiss") \
ELEM_(Io_enable_arq, "io.enable_arq") \
ELEM_(Main_flmsg_online, "main.flmsg_online") \
ELEM_(Main_flmsg_available, "main.flmsg_available") \
ELEM_(Main_flmsg_transfer, "main.flmsg_transfer") \
ELEM_(Main_flmsg_squelch, "main.flmsg_squelch") \
\
ELEM_(Text_get_rx_length, "text.get_rx_length") \
ELEM_(Text_get_rx, "text.get_rx") \
ELEM_(Text_clear_rx, "text.clear_rx") \
ELEM_(Text_add_tx, "text.add_tx") \
ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \
ELEM_(Text_clear_tx, "text.clear_tx") \
ELEM_(Io_in_use, "io.in_use") \
ELEM_(Io_enable_kiss, "io.enable_kiss") \
ELEM_(Io_enable_arq, "io.enable_arq") \
\
ELEM_(RXTX_get_data, "rxtx.get_data") \
ELEM_(RX_get_data, "rx.get_data") \
ELEM_(TX_get_data, "tx.get_data") \
ELEM_(Text_get_rx_length, "text.get_rx_length") \
ELEM_(Text_get_rx, "text.get_rx") \
ELEM_(Text_clear_rx, "text.clear_rx") \
ELEM_(Text_add_tx, "text.add_tx") \
ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \
ELEM_(Text_clear_tx, "text.clear_tx") \
\
ELEM_(Spot_get_auto, "spot.get_auto") \
ELEM_(Spot_set_auto, "spot.set_auto") \
ELEM_(Spot_toggle_auto, "spot.toggle_auto") \
ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \
ELEM_(RXTX_get_data, "rxtx.get_data") \
ELEM_(RX_get_data, "rx.get_data") \
ELEM_(TX_get_data, "tx.get_data") \
\
ELEM_(Wefax_state_string, "wefax.state_string") \
ELEM_(Wefax_skip_apt, "wefax.skip_apt") \
ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \
ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \
ELEM_(Wefax_end_reception, "wefax.end_reception") \
ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \
ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \
ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \
ELEM_(Wefax_get_received_file, "wefax.get_received_file") \
ELEM_(Wefax_send_file, "wefax.send_file") \
ELEM_(Spot_get_auto, "spot.get_auto") \
ELEM_(Spot_set_auto, "spot.set_auto") \
ELEM_(Spot_toggle_auto, "spot.toggle_auto") \
ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \
\
ELEM_(Navtex_get_message, "navtex.get_message") \
ELEM_(Navtex_send_message, "navtex.send_message") \
ELEM_(Wefax_state_string, "wefax.state_string") \
ELEM_(Wefax_skip_apt, "wefax.skip_apt") \
ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \
ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \
ELEM_(Wefax_end_reception, "wefax.end_reception") \
ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \
ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \
ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \
ELEM_(Wefax_get_received_file, "wefax.get_received_file") \
ELEM_(Wefax_send_file, "wefax.send_file") \
\
ELEM_(Navtex_get_message, "navtex.get_message") \
ELEM_(Navtex_send_message, "navtex.send_message") \
struct rm_pred
{