xmlrpc server

* correction to data types
  * change zmsec computation
  * allow xmlrpc requests for get/set_power & get_pwrmeter
    direct access to xcvr i/o.
  * add xmlrpc command rig.tune
    . enable transceiver tune function
  * update xmlrpc server method list to correctly indicate
    signature <ret:arg> types
  * rewrite set numeric as integer
  * add xml_trace statements to get/set
    . volume, mic gain, rf gain, power control
This commit is contained in:
David Freese 2021-01-13 08:40:09 -06:00
parent cbc11b5a08
commit d727697f6f
3 changed files with 129 additions and 105 deletions

View file

@ -96,6 +96,7 @@ extern void setAttControl(void *);
extern void setMicGainControl(void *);
extern void setAGC(void *);
extern void setRFGAINControl(void *);
extern void update_power_control(void *);
extern void setMode();
extern void setBW();

View file

@ -599,7 +599,8 @@ int parse_args(int argc, char **argv, int& idx)
return 1;
}
if (strcasecmp("--xml-help", argv[idx]) == 0) {
std::cout << print_xmlhelp();
std::string help = print_xmlhelp();
std::cout << help;
exit(0);
}
if (strcasecmp("--debug-level", argv[idx]) == 0) {

View file

@ -457,6 +457,7 @@ public:
result = (int)(progStatus.notch_val);
else
result = (int)0;
xml_trace(1, "rig_get_notch");
}
std::string help() { return std::string("returns notch value"); }
@ -477,8 +478,8 @@ public:
}
static int ntch;
ntch = static_cast<int>((double)(params[0]));
if (ntch) progStatus.notch_val = ntch;
ntch = (int)(params[0]);
progStatus.notch_val = ntch;
if (ntch)
progStatus.notch = true;
else
@ -486,6 +487,7 @@ public:
guard_lock serial_lock(&mutex_serial, "xml rig_set_notch");
selrig->set_notch(progStatus.notch, progStatus.notch_val);
xml_trace(1, "rig_set_notch");
Fl::awake(setNotchControl, static_cast<void *>(&ntch));
}
@ -512,6 +514,7 @@ public:
result = (int)(progStatus.rfgain);
else
result = (int)0;
xml_trace(1, "rig_get_rfgain");
}
std::string help() { return std::string("returns rfgain value"); }
@ -532,11 +535,12 @@ public:
}
static int rfg;
rfg = static_cast<int>((double)(params[0]));
if (rfg) progStatus.rfgain = rfg;
rfg = static_cast<int>((double)((params[0])));
progStatus.rfgain = rfg;
guard_lock serial_lock(&mutex_serial, "xml rig_set_rfgain");
selrig->set_rf_gain(progStatus.rfgain);
xml_trace(1, "rig_set_rfgain");
Fl::awake(setRFGAINControl, static_cast<void *>(0));
}
@ -563,6 +567,7 @@ public:
result = (int)(progStatus.mic_gain);
else
result = (int)0;
xml_trace(1, "rig_get_micgain");
}
std::string help() { return std::string("returns micgain value"); }
@ -583,10 +588,11 @@ public:
}
static int micg;
micg = static_cast<int>((double)(params[0]));
if (micg) progStatus.mic_gain = micg;
micg = (int)(params[0]);
progStatus.mic_gain = micg;
guard_lock serial_lock(&mutex_serial, "xml rig_set_micgain");
xml_trace(1, "rig_set_micgain");
selrig->set_mic_gain(progStatus.mic_gain);
Fl::awake(setMicGainControl, static_cast<void *>(0));
}
@ -614,6 +620,7 @@ public:
result = (int)(progStatus.volume);
else
result = (int)0;
xml_trace(1, "rig_get_volume");
}
std::string help() { return std::string("returns volume value"); }
@ -634,11 +641,12 @@ public:
}
static int volume;
volume = static_cast<int>((double)(params[0]));
if (volume) progStatus.volume = volume;
volume = (int)(params[0]);
progStatus.volume = volume;
guard_lock serial_lock(&mutex_serial, "xml rig_set_volume");
selrig->set_volume_control(progStatus.volume);
xml_trace(1, "rig_set_volume");
Fl::awake(setVolumeControl, static_cast<void *>(0));
}
@ -703,7 +711,7 @@ public:
std::string result_string = "";
result_string += selrig->get_modetype(mode);
xml_trace(2, "rig_get_sideband ", result_string.c_str());
xml_trace(2, "rig_get_sideband ", result_string.c_str());
result = result_string;
}
@ -734,7 +742,7 @@ public:
std::string result_string = "none";
if (selrig->modes_) result_string = selrig->modes_[mode];
xml_trace(2, "mode on ", (useB ? "B " : "A "), result_string.c_str());
xml_trace(2, "mode on ", (useB ? "B " : "A "), result_string.c_str());
result = result_string;
}
@ -765,7 +773,7 @@ public:
std::string result_string = "none";
if (selrig->modes_) result_string = selrig->modes_[mode];
xml_trace(2, "mode A ", result_string.c_str());
xml_trace(2, "mode A ", result_string.c_str());
result = result_string;
}
@ -796,7 +804,7 @@ public:
std::string result_string = "none";
if (selrig->modes_) result_string = selrig->modes_[mode];
xml_trace(2, "mode B ", result_string.c_str());
xml_trace(2, "mode B ", result_string.c_str());
result = result_string;
}
@ -923,7 +931,7 @@ public:
if (dsphi) result[1] = dsphi[SH];
}
std::string s1 = result[0], s2 = result[1];
xml_trace( 5, "bandwidth on ", (useB ? "B " : "A "), s1.c_str(), " | ", s2.c_str());
xml_trace( 5, "bandwidth on ", (useB ? "B " : "A "), s1.c_str(), " | ", s2.c_str());
}
std::string help() { return std::string("returns current bw L/U value"); }
@ -982,7 +990,7 @@ public:
if (dsphi) result[1] = dsphi[SH];
}
std::string s1 = result[0], s2 = result[1];
xml_trace( 4, "bandwidth on A", s1.c_str(), " | ", s2.c_str());
xml_trace( 4, "bandwidth on A", s1.c_str(), " | ", s2.c_str());
}
std::string help() { return std::string("returns current bw L/U value"); }
@ -1042,7 +1050,7 @@ public:
if (dsphi) result[1] = dsphi[SH];
}
std::string s1 = result[0], s2 = result[1];
xml_trace( 4, "bandwidth on B", s1.c_str(), " | ", s2.c_str());
xml_trace( 4, "bandwidth on B", s1.c_str(), " | ", s2.c_str());
}
std::string help() { return std::string("returns current bw L/U value"); }
@ -1059,6 +1067,9 @@ public:
else
result = (int)(mval);
}
std::string help() { return std::string("returns S-meter reading"); }
} rig_get_smeter(&rig_server);
class rig_get_pwrmeter_scale : public XmlRpcServerMethod {
@ -1066,8 +1077,16 @@ public:
rig_get_pwrmeter_scale(XmlRpcServer* s) : XmlRpcServerMethod("rig.get_pwrmeter_scale", s) {}
void execute(XmlRpcValue& params, XmlRpcValue& result) {
result = (int)(selrig->power_scale());
if (!xcvr_online || !selrig->has_power_out)
result = (int)(0);
else {
guard_lock serial_lock(&mutex_serial);
result = (int)(selrig->power_scale());
}
}
std::string help() { return std::string("returns power scale X factor"); }
} rig_get_pwrmeter_scale(&rig_server);
class rig_get_maxpwr : public XmlRpcServerMethod {
@ -1087,9 +1106,14 @@ public:
void execute(XmlRpcValue& params, XmlRpcValue& result) {
if (!xcvr_online || !selrig->has_power_out)
result = (int)(0);
else
result = (int)(pwrval);
else {
guard_lock serial_lock(&mutex_serial);
result = selrig->get_power_out();
}
}
std::string help() { return std::string("returns power meter reading"); }
} rig_get_pwrmeter(&rig_server);
class rig_get_swrmeter : public XmlRpcServerMethod {
@ -1102,17 +1126,11 @@ public:
else
result = (int)(swrval);
}
std::string help() { return std::string("returns SWR meter reading"); }
} rig_get_swrmeter(&rig_server);
class rig_get_power : public XmlRpcServerMethod {
public:
rig_get_power(XmlRpcServer* s) : XmlRpcServerMethod("rig.get_power", s) {}
void execute(XmlRpcValue& params, XmlRpcValue& result) {
result = (int)(progStatus.power_level);
}
} rig_get_power(&rig_server);
//==============================================================================
// set interface
//==============================================================================
@ -1129,8 +1147,8 @@ XCVR_STATE srvr_vfo;
std::string print(int f, int m, int b)
{
std::ostringstream p;
// p.seekp(ios::beg);
static std::ostringstream p;
p.seekp(ios::beg);
if (b > 65536) b /= 65536;
p << "freq: " << f << ", imode: " << m << ", bw " << b;
return p.str();
@ -1140,7 +1158,7 @@ static void push_xml()
{
srvr_vfo.src = SRVR;
guard_lock service_lock(&mutex_srvc_reqs, "xml_push");
xml_trace(2, "push_xml()", print(srvr_vfo.freq, srvr_vfo.imode, srvr_vfo.iBW).c_str());
xml_trace(2, "push_xml()", print(srvr_vfo.freq, srvr_vfo.imode, srvr_vfo.iBW).c_str());
srvc_reqs.push(VFOQUEUE(vX, srvr_vfo));//(useB ? vB : vA), srvr_vfo ));
}
@ -1148,7 +1166,7 @@ static void push_xmlA()
{
srvr_vfo.src = SRVR;
guard_lock service_lock(&mutex_srvc_reqs, "xml_pushA");
xml_trace(2, "push_xmlA()", print(srvr_vfo.freq, srvr_vfo.imode, srvr_vfo.iBW).c_str());
xml_trace(2, "push_xmlA()", print(srvr_vfo.freq, srvr_vfo.imode, srvr_vfo.iBW).c_str());
srvc_reqs.push(VFOQUEUE( vA, srvr_vfo));
}
@ -1164,24 +1182,6 @@ xml_trace(2, "push_xmlB()", print(srvr_vfo.freq, srvr_vfo.imode, srvr_vfo.iBW).c
//------------------------------------------------------------------------------
// Set Power in watts
//------------------------------------------------------------------------------
static int power_level;
static void set_power(void *)
{
int max_power;
int min_power = 0;
if (spnrPOWER) {
max_power = spnrPOWER->maximum();
if (power_level > max_power) power_level = max_power;
if (power_level < min_power) power_level = min_power;
spnrPOWER->value(power_level);
} else if (sldrPOWER) {
max_power = sldrPOWER->maximum();
if (power_level > max_power) power_level = max_power;
if (power_level < min_power) power_level = min_power;
sldrPOWER->value(power_level);
}
setPower();
}
class rig_set_power : public XmlRpcServerMethod {
public:
@ -1192,14 +1192,52 @@ public:
result = 0;
return;
}
power_level = int(params[0]);
Fl::awake(set_power);
int power_level = (int)(params[0]);
guard_lock lock(&mutex_serial);
selrig->set_power_control(power_level);
progStatus.power_level = power_level;
Fl::awake(update_power_control, (void*)0);
}
std::string help() { return std::string("sets power level in watts"); }
} rig_set_power(&rig_server);
class rig_get_power : public XmlRpcServerMethod {
public:
rig_get_power(XmlRpcServer* s) : XmlRpcServerMethod("rig.get_power", s) {}
void execute(XmlRpcValue& params, XmlRpcValue& result) {
result = (int)(progStatus.power_level);
}
std::string help() { return std::string("returns power level setting in watts"); }
} rig_get_power(&rig_server);
//------------------------------------------------------------------------------
// Enable tune
//------------------------------------------------------------------------------
class rig_tune : public XmlRpcServerMethod {
public:
rig_tune(XmlRpcServer* s) : XmlRpcServerMethod("rig.tune", s) {}
void execute(XmlRpcValue& params, XmlRpcValue& result) {
if (!xcvr_online) {
result = 0;
return;
}
guard_lock que_lock(&mutex_srvc_reqs, "xml rig_tune");
guard_lock serial_lock(&mutex_serial);
selrig->tune_rig(2);
}
std::string help() { return std::string("enable transceiver tune function"); }
} rig_tune(&rig_server);
//------------------------------------------------------------------------------
// Set PTT on (1) or off (0)
//------------------------------------------------------------------------------
@ -1428,15 +1466,6 @@ public:
srvr_vfo.iBW = 255;
push_xml();
/*
int ifreq = 0;
int n = 0;
while (ifreq != srvr_vfo.freq) {
MilliSleep(10);
ifreq = vfo->freq;
n++;
}
*/
}
std::string help() { return std::string("rig.set_vfo NNNNNNNN (Hz)"); }
@ -1461,15 +1490,6 @@ public:
srvr_vfo.iBW = 255;
push_xml();
/*
int ifreq = 0;
int n = 0;
while (ifreq != srvr_vfo.freq) {
MilliSleep(10);
ifreq = vfo->freq;
n++;
}
*/
}
std::string help() { return std::string("main.set_frequency NNNNNNNN (Hz)"); }
@ -1994,58 +2014,59 @@ struct MLIST {
{ "main.set_frequency", "d:d", "set current VFO in Hz" },
{ "main.get_version", "s:n", "returns version string" },
{ "rig.get_AB", "s:n", "returns vfo in use A or B" },
{ "rig.get_bw", "s:n", "return BW of current VFO" },
{ "rig.get_bws", "s:n", "return table of BW values" },
{ "rig.get_bwA", "s:n", "return BW of vfo A" },
{ "rig.get_bwB", "s:n", "return BW of vfo B" },
{ "rig.get_bw", "A:n", "return BW of current VFO" },
{ "rig.get_bws", "A:n", "return table of BW values" },
{ "rig.get_bwA", "A:n", "return BW of vfo A" },
{ "rig.get_bwB", "A:n", "return BW of vfo B" },
{ "rig.get_info", "s:n", "return an info string" },
{ "rig.get_mode", "s:n", "return MODE of current VFO" },
{ "rig.get_modeA", "s:n", "return MODE of current VFO A" },
{ "rig.get_modeB", "s:n", "return MODE of current VFO B" },
{ "rig.get_modes", "s:n", "return table of MODE values" },
{ "rig.get_modes", "A:n", "return table of MODE values" },
{ "rig.get_sideband", "s:n", "return sideband (U/L)" },
{ "rig.get_notch", "s:n", "return notch value" },
{ "rig.get_ptt", "s:n", "return PTT state" },
{ "rig.get_power", "s:n", "return power level control value" },
{ "rig.get_pwrmeter", "s:n", "return PWR out" },
{ "rig.get_notch", "i:n", "return notch value" },
{ "rig.get_ptt", "i:n", "return PTT state" },
{ "rig.get_power", "i:n", "return power level control value" },
{ "rig.get_pwrmeter", "i:n", "return PWR out" },
{ "rig.get_pwrmeter_scale", "s:n", "return scale for power meter" },
{ "rig.get_pwrmax", "s:n", "return maximum power available" },
{ "rig.get_swrmeter", "s:n", "return SWR out" },
{ "rig.get_smeter", "s:n", "return Smeter" },
{ "rig.get_split", "s:n", "return split state" },
{ "rig.get_split", "i:n", "return split state" },
{ "rig.get_update", "s:n", "return update to info" },
{ "rig.get_vfo", "s:n", "return current VFO in Hz" },
{ "rig.get_vfoA", "s:n", "return vfo A in Hz" },
{ "rig.get_vfoB", "s:n", "return vfo B in Hz" },
{ "rig.get_xcvr", "s:n", "returns name of transceiver" },
{ "rig.get_volume", "s:n", "returns volume control value" },
{ "rig.get_rfgain", "s:n", "returns rf gain control value" },
{ "rig.get_micgain", "s:n", "returns mic gain control value" },
{ "rig.set_AB", "s:s", "set VFO A/B" },
{ "rig.get_volume", "i:n", "returns volume control value" },
{ "rig.get_rfgain", "i:n", "returns rf gain control value" },
{ "rig.get_micgain", "i:n", "returns mic gain control value" },
{ "rig.set_AB", "n:s", "set VFO A/B" },
{ "rig.set_bw", "i:i", "set BW iaw BW table" },
{ "rig.set_bandwidth","i:i", "set bandwidth to nearest requested value" },
{ "rig.set_BW", "i:i", "set L/U pair" },
{ "rig.set_frequency","d:d", "set current VFO in Hz" },
{ "rig.set_mode", "i:i", "set MODE iaw MODE table" },
{ "rig.set_modeA", "i:i", "set MODE A iaw MODE table" },
{ "rig.set_modeB", "i:i", "set MODE B iaw MODE table" },
{ "rig.set_notch", "d:d", "set NOTCH value in Hz" },
{ "rig.set_power", "i:i", "set power control level, watts" },
{ "rig.set_ptt", "i:i", "set PTT 1/0 (on/off)" },
{ "rig.set_mode", "i:s", "set MODE iaw MODE table" },
{ "rig.set_modeA", "i:s", "set MODE A iaw MODE table" },
{ "rig.set_modeB", "i:s", "set MODE B iaw MODE table" },
{ "rig.set_notch", "n:i", "set NOTCH value in Hz" },
{ "rig.set_power", "n:i", "set power control level, watts" },
{ "rig.set_ptt", "n:i", "set PTT 1/0 (on/off)" },
{ "rig.set_vfo", "d:d", "set current VFO in Hz" },
{ "rig.set_vfoA", "d:d", "set vfo A in Hz" },
{ "rig.set_vfoB", "d:d", "set vfo B in Hz" },
{ "rig.set_split", "i:i", "set split 1/0 (on/off)" },
{ "rig.set_volume", "i:i", "sets volume control" },
{ "rig.set_rfgain", "i:i", "sets rf gain control" },
{ "rig.set_micgain", "i:i", "sets mic gain control" },
{ "rig.swap", "i:i", "execute vfo swap" },
{ "rig.set_split", "n:i", "set split 1/0 (on/off)" },
{ "rig.set_volume", "n:i", "sets volume control" },
{ "rig.set_rfgain", "n:i", "sets rf gain control" },
{ "rig.set_micgain", "n:i", "sets mic gain control" },
{ "rig.swap", "n:n", "execute vfo swap" },
{ "rig.tune", "n:n", "enable transceiver tune function"},
{ "rig.cat_string", "s:s", "execute CAT string" },
{ "rig.cat_priority", "s:s", "priority CAT string" },
{ "rig.shutdown", "i:i", "shutdown xcvr & flrig" },
{ "rig.cwio_wpm", "i:i", "set cwio WPM" },
{ "rig.cwio_text", "s:s", "send text via cwio interface" },
{ "rig.cwio_send", "i:i", "cwio transmit 1/0 (on/off)"}
{ "rig.shutdown", "i:n", "shutdown xcvr & flrig" },
{ "rig.cwio_wpm", "n:i", "set cwio WPM" },
{ "rig.cwio_text", "i:s", "send text via cwio interface" },
{ "rig.cwio_send", "n:i", "cwio transmit 1/0 (on/off)"}
};
class rig_list_methods : public XmlRpcServerMethod {
@ -2111,16 +2132,17 @@ void set_server_port(int port)
std::string print_xmlhelp()
{
string pstr;
static string pstr;
pstr.clear();
string line;
size_t maxlen = 0;
for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); n++)
if (mlist[n].name.length() > maxlen) maxlen = mlist[n].name.length();
size_t f1_len = 0;
for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); ++n) {
if (mlist[n].name.length() > f1_len) f1_len = mlist[n].name.length();
}
for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); ++n) {
line.clear();
line.assign(mlist[n].name);
line.append(maxlen + 4 - line.length(), ' ');
line.append(f1_len + 2 - line.length(), ' ');
line.append(mlist[n].signature);
line.append(" ");
line.append(mlist[n].help);