kopia lustrzana https://github.com/jamescoxon/dl-fldigi
rigcat mod
* Add min, max settings for pwr control * Add testing mode if no xcvr serial port available * Made opMODE and opBW combo controls readonly - pull down values can only be added and not inserted * Added debugging tags to xml definitions: - <NOSERIAL>true/false</NOSERIAL> - default false suppress all serial port i/o - <ASCII>true/false</ASCII> - default false if true, print all CAT i/o events as ASCII strings if false, print all CAT i/o events as HEX sequences * Added polling for pwr level querypull/4/head
rodzic
4c9f1404ca
commit
4e055b4da9
|
@ -745,6 +745,16 @@ fldigi will then record critical events as they occur during the execution
|
|||
of the rigCAT loop. Remove the debug statement from the xml when the
|
||||
file has been proven and before publishing.
|
||||
|
||||
You can test an xml to observe the CAT send sequences by inhibiting the
|
||||
actual connection to the serial port.
|
||||
|
||||
<NOSERIAL>true/false</NOSERIAL> - default false
|
||||
|
||||
The serial i/o events are normally recorded as a sequence of HEX values. This
|
||||
behavior can be changed to record the events as a string of ASCII characters.
|
||||
|
||||
<ASCII>true/false</ASCII> - default false
|
||||
|
||||
You can use the xml remarks brackets
|
||||
<pre>
|
||||
\<!--
|
||||
|
|
|
@ -364,18 +364,20 @@ void Fl_ComboBox::value( const char *s )
|
|||
} else
|
||||
val->value(datalist[idx]->s);
|
||||
} else {
|
||||
insert(s, 0);
|
||||
for (i = 0; i < listsize; i++) {
|
||||
if (strcmp (s, datalist[i]->s) == 0) {
|
||||
idx = i;
|
||||
if (type_ == LISTBOX) {
|
||||
valbox->label(datalist[idx]->s);
|
||||
valbox->redraw_label();
|
||||
} else
|
||||
if (type_ != LISTBOX && !val->readonly()) {
|
||||
insert(s, 0);
|
||||
for (i = 0; i < listsize; i++) {
|
||||
if (strcmp (s, datalist[i]->s) == 0) {
|
||||
idx = i;
|
||||
val->value(datalist[idx]->s);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (type_ == LISTBOX) {
|
||||
valbox->label("");
|
||||
valbox->redraw_label();
|
||||
} else
|
||||
val->value("");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5476,7 +5476,7 @@ static void add_docked(dockgroup *dock)
|
|||
|
||||
void cb_meters(void *)
|
||||
{
|
||||
rigCAT_get_pwrlevel();
|
||||
if (!rigCAT_active()) return;
|
||||
pwrlevel_grp->show();
|
||||
}
|
||||
|
||||
|
@ -5711,6 +5711,7 @@ void create_fl_digi_main_primary() {
|
|||
qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE);
|
||||
qso_opMODE->align(FL_ALIGN_TOP);
|
||||
qso_opMODE->when(FL_WHEN_RELEASE);
|
||||
qso_opMODE->readonly(true);
|
||||
qso_opMODE->end();
|
||||
|
||||
qso_opBW = new Fl_ComboBox(
|
||||
|
@ -5727,6 +5728,7 @@ void create_fl_digi_main_primary() {
|
|||
qso_opBW->callback((Fl_Callback*)cb_qso_opBW);
|
||||
qso_opBW->align(FL_ALIGN_TOP);
|
||||
qso_opBW->when(FL_WHEN_RELEASE);
|
||||
qso_opBW->readonly(true);
|
||||
qso_opBW->end();
|
||||
|
||||
qso_opGROUP = new Fl_Group(
|
||||
|
|
|
@ -49,6 +49,7 @@ extern void rigCAT_get_pwrlevel();
|
|||
|
||||
extern void rigCAT_close();
|
||||
extern bool rigCAT_init();
|
||||
extern bool rigCAT_active();
|
||||
extern void rigCAT_sendINIT(const std::string& icmd, int multiplier = 1);
|
||||
|
||||
extern void rigCAT_set_ptt(int);
|
||||
|
|
|
@ -130,6 +130,9 @@ struct XMLRIG {
|
|||
vector< PAIR >pwrlevel;
|
||||
|
||||
bool debug;
|
||||
bool noserial;
|
||||
bool ascii;
|
||||
bool xmlok;
|
||||
|
||||
void clear() {
|
||||
port.clear();
|
||||
|
@ -155,6 +158,9 @@ struct XMLRIG {
|
|||
pollinterval = 100;
|
||||
|
||||
debug = false;
|
||||
noserial = false;
|
||||
ascii = false;
|
||||
xmlok = false;
|
||||
|
||||
use_smeter = false;
|
||||
use_pwrmeter = false;
|
||||
|
|
|
@ -63,8 +63,6 @@ static string sRigWidth = "";
|
|||
static string sRigMode = "";
|
||||
static long long llFreq = 0;
|
||||
|
||||
//static bool nonCATrig = false;
|
||||
|
||||
static void *rigCAT_loop(void *args);
|
||||
|
||||
#define RXBUFFSIZE 2000
|
||||
|
@ -89,7 +87,14 @@ bool sendCommand (string s, int retnbr, int waitval)
|
|||
1000.0 / rigio.Baud() );
|
||||
|
||||
if (xmlrig.debug)
|
||||
LOG_INFO("%s", str2hex(s.data(), s.length()));
|
||||
LOG_INFO("%s",
|
||||
xmlrig.ascii ? s.c_str() : str2hex(s.data(), s.length()));
|
||||
|
||||
if (xmlrig.noserial) {
|
||||
memset(replybuff, 0, RXBUFFSIZE + 1);
|
||||
numread = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
retval = rigio.WriteBuffer((unsigned char *)s.c_str(), numwrite);
|
||||
if (retval <= 0)
|
||||
|
@ -116,7 +121,8 @@ bool sendCommand (string s, int retnbr, int waitval)
|
|||
numread++;
|
||||
}
|
||||
if (xmlrig.debug)
|
||||
LOG_INFO("reply %s", str2hex(replybuff, numread));
|
||||
LOG_INFO("reply %s",
|
||||
xmlrig.ascii ? (const char *)(replybuff) : str2hex(replybuff, numread));
|
||||
if (numread > retnbr) {
|
||||
memmove(replybuff, replybuff + numread - retnbr, retnbr);
|
||||
numread = retnbr;
|
||||
|
@ -322,7 +328,7 @@ long long rigCAT_getfreq(int retries, bool &failed, int waitval)
|
|||
{
|
||||
const char symbol[] = "GETFREQ";
|
||||
failed = false;
|
||||
if (rigCAT_exit) {
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) {
|
||||
failed = true;
|
||||
return progStatus.noCATfreq;
|
||||
}
|
||||
|
@ -434,8 +440,10 @@ retry_get_freq: ;
|
|||
void rigCAT_setfreq(long long f)
|
||||
{
|
||||
const char symbol[] = "SETFREQ";
|
||||
if (rigCAT_exit)
|
||||
return;
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) {
|
||||
progStatus.noCATfreq = f;
|
||||
}
|
||||
if (rigCAT_exit || !xmlrig.xmlok) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
|
@ -494,7 +502,8 @@ string rigCAT_getmode()
|
|||
{
|
||||
const char symbol[] = "GETMODE";
|
||||
|
||||
if (rigCAT_exit) return "";
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok)
|
||||
return progStatus.noCATmode;
|
||||
|
||||
// guard_lock ser_guard( &rigCAT_mutex );
|
||||
|
||||
|
@ -608,7 +617,11 @@ void rigCAT_setmode(const string& md)
|
|||
{
|
||||
const char symbol[] = "SETMODE";
|
||||
|
||||
if (rigCAT_exit) return;
|
||||
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok)
|
||||
progStatus.noCATmode = md;
|
||||
|
||||
if (rigCAT_exit || !xmlrig.xmlok) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
|
@ -622,10 +635,8 @@ void rigCAT_setmode(const string& md)
|
|||
}
|
||||
modeCmd = *itrCmd;
|
||||
|
||||
if ( modeCmd.str1.empty() == false) {
|
||||
if (xmlrig.debug) LOG_INFO("%s not defined", symbol);
|
||||
if ( modeCmd.str1.empty() == false)
|
||||
strCmd.append(modeCmd.str1);
|
||||
}
|
||||
|
||||
if ( modeCmd.data.size > 0 ) {
|
||||
list<MODE>::iterator mode;
|
||||
|
@ -680,7 +691,7 @@ string rigCAT_getwidth()
|
|||
{
|
||||
const char symbol[] = "GETBW";
|
||||
|
||||
if (rigCAT_exit)
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok)
|
||||
return progStatus.noCATwidth;
|
||||
|
||||
XMLIOS widthCmd;
|
||||
|
@ -802,8 +813,10 @@ void rigCAT_setwidth(const string& w)
|
|||
{
|
||||
const char symbol[] = "SETBW";
|
||||
|
||||
if (rigCAT_exit)
|
||||
return;
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok)
|
||||
progStatus.noCATwidth = w;
|
||||
|
||||
if (rigCAT_exit || !xmlrig.xmlok) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
|
@ -1151,10 +1164,13 @@ echo : %c\n",
|
|||
(rigio.RTSCTS() ? 'T' : 'F'),
|
||||
progdefaults.RigCatECHO ? 'T' : 'F');
|
||||
|
||||
if (rigio.OpenPort() == false) {
|
||||
LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str());
|
||||
return false;
|
||||
if (xmlrig.noserial == false && xmlrig.xmlok) {
|
||||
if (rigio.OpenPort() == false) {
|
||||
LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str());
|
||||
xmlrig.xmlok = true;
|
||||
}
|
||||
}
|
||||
|
||||
sRigMode = "";
|
||||
sRigWidth = "";
|
||||
|
||||
|
@ -1170,21 +1186,27 @@ echo : %c\n",
|
|||
rigCAT_sendINIT("INIT", progdefaults.RigCatInitDelay);
|
||||
bool failed = false;
|
||||
|
||||
rigCAT_getfreq(3, failed, progdefaults.RigCatInitDelay);
|
||||
if (xmlrig.noserial)
|
||||
rigCAT_getfreq(1, failed, 0);
|
||||
else if (xmlrig.xmlok) {
|
||||
rigCAT_getfreq(3, failed, progdefaults.RigCatInitDelay);
|
||||
|
||||
if (failed) {
|
||||
LOG_ERROR("*****************Failed to read xcvr frequency");
|
||||
rigio.ClosePort();
|
||||
return false;
|
||||
if (failed) {
|
||||
LOG_ERROR("*****************Failed to read xcvr frequency");
|
||||
if (xmlrig.noserial == false)
|
||||
rigio.ClosePort();
|
||||
xmlrig.xmlok = false;
|
||||
} else
|
||||
LOG_INFO("Passed serial port test");
|
||||
}
|
||||
|
||||
LOG_INFO("Passed serial port test");
|
||||
|
||||
llFreq = 0;
|
||||
|
||||
if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) {
|
||||
LOG_ERROR("%s", "pthread_create failed");
|
||||
rigio.ClosePort();
|
||||
if (xmlrig.xmlok && !xmlrig.noserial)
|
||||
rigio.ClosePort();
|
||||
xmlrig.xmlok = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1322,7 +1344,7 @@ void rigCAT_get_smeter()
|
|||
{
|
||||
const char symbol[] = "GET_SMETER";
|
||||
|
||||
if (rigCAT_exit) return;
|
||||
if (rigCAT_exit || xmlrig.noserial) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
|
@ -1468,7 +1490,7 @@ void rigCAT_get_pwrmeter()
|
|||
{
|
||||
const char symbol[] = "GET_PWRMETER";
|
||||
|
||||
if (rigCAT_exit) return;
|
||||
if (rigCAT_exit || xmlrig.noserial) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
|
@ -1562,7 +1584,6 @@ static void rigcat_notch(void *data)
|
|||
{
|
||||
int val = reinterpret_cast<long>(data);
|
||||
notch_frequency = val;
|
||||
// printf("notch value %d\n", val);
|
||||
}
|
||||
|
||||
int notch_data(DATA d, size_t p)
|
||||
|
@ -2041,7 +2062,7 @@ int pwrlevel_val(int pwr)
|
|||
size_t n;
|
||||
int val1, val2, pwr1, pwr2;
|
||||
for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) {
|
||||
if ((pwr > xmlrig.pwrlevel[n].mtr) && (pwr <= xmlrig.pwrlevel[n+1].mtr))
|
||||
if ((pwr >= xmlrig.pwrlevel[n].mtr) && (pwr <= xmlrig.pwrlevel[n+1].mtr))
|
||||
break;
|
||||
}
|
||||
if (n == xmlrig.pwrlevel.size() - 1)
|
||||
|
@ -2060,19 +2081,33 @@ int pwrlevel_val(int pwr)
|
|||
|
||||
}
|
||||
|
||||
// called by main UI loop
|
||||
// called by rigio thread
|
||||
// must use REQ(...) to set the power level control
|
||||
|
||||
static void rigCAT_update_pwrlevel(void *v)
|
||||
{
|
||||
long pwr = reinterpret_cast<long>(v);
|
||||
char szpwr[10];
|
||||
snprintf(szpwr, sizeof(szpwr), "%ld", pwr);
|
||||
progdefaults.mytxpower = szpwr;
|
||||
|
||||
inpMyPower->value(szpwr);
|
||||
pwr_level->value(pwr);
|
||||
|
||||
if (xmlrig.debug) LOG_INFO("Read power level %s", szpwr);
|
||||
}
|
||||
|
||||
void rigCAT_get_pwrlevel()
|
||||
{
|
||||
const char symbol[] = "GET_PWRLEVEL";
|
||||
|
||||
if (rigCAT_exit || !xmlrig.use_pwrlevel) return;
|
||||
if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return;
|
||||
|
||||
XMLIOS modeCmd;
|
||||
list<XMLIOS>::iterator itrCmd;
|
||||
string strCmd;
|
||||
size_t p = 0, len1 = 0, len2 = 0, pData = 0;
|
||||
int pwr = 0;
|
||||
long pwr = 0;
|
||||
|
||||
itrCmd = commands.begin();
|
||||
while (itrCmd != commands.end()) {
|
||||
|
@ -2153,16 +2188,7 @@ void rigCAT_get_pwrlevel()
|
|||
// convert the data field
|
||||
pwr = pwrlevel_data(rTemp.data, pData);
|
||||
|
||||
pwr_level->value(pwr);
|
||||
|
||||
// set logging values
|
||||
|
||||
char szpwr[10];
|
||||
snprintf(szpwr, sizeof(szpwr), "%d", pwr);
|
||||
progdefaults.mytxpower = szpwr;
|
||||
inpMyPower->value(szpwr);
|
||||
|
||||
if (xmlrig.debug) LOG_INFO("Read power level %s", szpwr);
|
||||
REQ(rigCAT_update_pwrlevel, (void *)pwr);
|
||||
}
|
||||
|
||||
void rigCAT_set_pwrlevel(int pwr)
|
||||
|
@ -2300,7 +2326,10 @@ static void *rigCAT_loop(void *args)
|
|||
show_mode(sMode);
|
||||
}
|
||||
|
||||
if (xmlrig.use_pwrlevel) rigCAT_get_pwrlevel();
|
||||
|
||||
if (xmlrig.use_smeter) rigCAT_get_smeter();
|
||||
|
||||
if (xmlrig.use_notch) rigCAT_get_notch();
|
||||
|
||||
} else {
|
||||
|
|
|
@ -137,16 +137,19 @@ string modeString(rmode_t m)
|
|||
void initOptionMenus()
|
||||
{
|
||||
qso_opMODE->clear();
|
||||
|
||||
list<MODE>::iterator MD;
|
||||
list<MODE> *pMD = 0;
|
||||
|
||||
if (lmodes.empty() == false)
|
||||
pMD = &lmodes;
|
||||
else if (lmodeCMD.empty() == false)
|
||||
pMD = &lmodeCMD;
|
||||
|
||||
printf("initOptionMenus()\n");
|
||||
if (pMD) {
|
||||
MD = pMD->begin();
|
||||
while (MD != pMD->end()) {
|
||||
printf("adding mode: %s\n", (*MD).SYMBOL.c_str());
|
||||
qso_opMODE->add( (*MD).SYMBOL.c_str());
|
||||
MD++;
|
||||
}
|
||||
|
@ -168,6 +171,7 @@ void initOptionMenus()
|
|||
if (pBW) {
|
||||
bw = pBW->begin();
|
||||
while (bw != pBW->end()) {
|
||||
printf("adding BW: %s\n", (*bw).SYMBOL.c_str());
|
||||
qso_opBW->add( (*bw).SYMBOL.c_str());
|
||||
bw++;
|
||||
}
|
||||
|
@ -522,7 +526,9 @@ bool init_NoRig_RigDialog()
|
|||
qso_opBW->deactivate();
|
||||
qso_opMODE->clear();
|
||||
|
||||
printf("init_NoRig_RigDialog()\n");
|
||||
for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) {
|
||||
printf("adding %s\n", modes[i].name);
|
||||
qso_opMODE->add(modes[i].name);
|
||||
}
|
||||
// list of LSB type modes that various xcvrs report via flrig
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include "confdialog.h"
|
||||
|
||||
#include "icons.h"
|
||||
#include "fl_digi.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -63,6 +64,8 @@ void parseTITLE(size_t &);
|
|||
void parseLSBMODES(size_t &);
|
||||
void parseDISCARD(size_t &);
|
||||
void parseDEBUG(size_t &);
|
||||
void parseNOSERIAL(size_t &);
|
||||
void parseASCII(size_t &);
|
||||
|
||||
void parseWRITE_DELAY(size_t &);
|
||||
void parseINIT_DELAY(size_t &);
|
||||
|
@ -166,6 +169,8 @@ TAGS rigdeftags[] = {
|
|||
{"<NOTCH", parseNOTCH},
|
||||
{"<PWRLEVEL", parsePWRLEVEL},
|
||||
{"<DEBUG", parseDEBUG},
|
||||
{"<NOSERIAL", parseNOSERIAL},
|
||||
{"<ASCII", parseASCII},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
|
@ -546,6 +551,31 @@ void parseDEBUG(size_t &p0){
|
|||
p0 = pend;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Parse NOSERIAL, use during xml file creation/testing
|
||||
// suppresses serial port i/o
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
void parseNOSERIAL(size_t &p0){
|
||||
bool val = getBool(p0);
|
||||
xmlrig.noserial = val;
|
||||
size_t pend = tagEnd(p0);
|
||||
p0 = pend;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Parse ASCII, use during xml file creation/testing
|
||||
// prints events as ASCII string vice HEX sequence
|
||||
//---------------------------------------------------------------------
|
||||
|
||||
void parseASCII(size_t &p0){
|
||||
bool val = getBool(p0);
|
||||
xmlrig.ascii = val;
|
||||
size_t pend = tagEnd(p0);
|
||||
p0 = pend;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
// Parse Baudrate, write_delay, post_write_delay, timeout, retries
|
||||
// RTSCTS handshake
|
||||
|
@ -763,10 +793,13 @@ void parsePWRLEVEL(size_t &p0) {
|
|||
p0 = pend;
|
||||
xmlrig.pwrlevel.clear();
|
||||
int val, pwr;
|
||||
float min = 500, max = 0;
|
||||
size_t p = strpwrlevel.find(",");
|
||||
while ( !strpwrlevel.empty() && (p != string::npos) ) {
|
||||
val = atoi(&strpwrlevel[0]);
|
||||
pwr = atoi(&strpwrlevel[p+1]);
|
||||
if (pwr < min) min = pwr;
|
||||
if (pwr > max) max = pwr;
|
||||
xmlrig.pwrlevel.push_back(PAIR(val,pwr));
|
||||
p = strpwrlevel.find(";");
|
||||
if (p == string::npos) strpwrlevel.clear();
|
||||
|
@ -775,6 +808,7 @@ void parsePWRLEVEL(size_t &p0) {
|
|||
p = strpwrlevel.find(",");
|
||||
}
|
||||
}
|
||||
pwr_level->range(min, max);
|
||||
xmlrig.use_pwrlevel = true;
|
||||
}
|
||||
|
||||
|
@ -1067,6 +1101,7 @@ bool readRigXML()
|
|||
xmlfile.close();
|
||||
if (testXML()) {
|
||||
parseXML();
|
||||
xmlrig.xmlok = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue