Merge with upstream

pull/2/head
Stelios Bounanos 2008-09-03 18:43:23 +01:00
commit 4b41ce093d
15 zmienionych plików z 100 dodań i 93 usunięć

Wyświetl plik

@ -19,6 +19,14 @@ Change Log:
Skipped text
Alternate (quick view) text
Background
10) Changed the way that RTS/DTR PTT is used with rig.xml files
11) Updated regular expression parser
12) Modified <EXEC> passing of fd's to child processes
13) Changed "no color" buttons to background vice background2 (white).
Setting -bg <color> on command line switch now controls the "no color"
value for the macro buttons.
14) Fixed macro timer to properly reset if <TIMER> re-invoked during
timeout period.
3.02
1) Added hamlib interface for rig control

Wyświetl plik

@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may
dnl contain other characters or be empty
m4_define(FLDIGI_MAJOR, [3])
m4_define(FLDIGI_MINOR, [0])
m4_define(FLDIGI_PATCH, [3AG])
m4_define(FLDIGI_PATCH, [3AI])
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])

Wyświetl plik

@ -214,6 +214,11 @@ void Fl_ComboBox::value( const char *s )
Output->value(datalist[i]->s);
}
void Fl_ComboBox::put_value(const char *s)
{
value(s);
}
void Fl_ComboBox::index(int i)
{
if (i >= 0 && i < listsize)

Wyświetl plik

@ -1,4 +1,4 @@
// generated by Fast Light User Interface Designer (fluid) version 1.0109
// generated by Fast Light User Interface Designer (fluid) version 1.0108
#include "confdialog.h"
#include <config.h>
@ -764,7 +764,7 @@ progdefaults.changed = true;
Fl_Value_Slider *valPCMvolume=(Fl_Value_Slider *)0;
static void cb_valPCMvolume(Fl_Value_Slider* o, void*) {
setPCMvolume(o->value() / 100.0);
setPCMvolume(o->value());
progdefaults.changed = true;
}
@ -2002,12 +2002,11 @@ l with your sound hardware.");
valPCMvolume->type(5);
valPCMvolume->color((Fl_Color)26);
valPCMvolume->selection_color((Fl_Color)1);
valPCMvolume->step(0.01);
valPCMvolume->value(0.8);
valPCMvolume->textsize(14);
valPCMvolume->callback((Fl_Callback*)cb_valPCMvolume);
valPCMvolume->align(FL_ALIGN_RIGHT);
valPCMvolume->range(0.0, 100.0);
valPCMvolume->step(1.0);
} // Fl_Value_Slider* valPCMvolume
{ Fl_Input_Choice* o = menuMix = new Fl_Input_Choice(105, 90, 110, 25, "Device");
menuMix->callback((Fl_Callback*)cb_menuMix);
@ -2188,6 +2187,7 @@ l with your sound hardware.");
cntCWdash2dot->type(1);
cntCWdash2dot->minimum(2.5);
cntCWdash2dot->maximum(4);
cntCWdash2dot->step(0.1);
cntCWdash2dot->value(3);
cntCWdash2dot->callback((Fl_Callback*)cb_cntCWdash2dot);
cntCWdash2dot->align(FL_ALIGN_LEFT);
@ -2197,6 +2197,7 @@ l with your sound hardware.");
cntCWrisetime->type(1);
cntCWrisetime->minimum(0);
cntCWrisetime->maximum(15);
cntCWrisetime->step(0.1);
cntCWrisetime->value(4);
cntCWrisetime->callback((Fl_Callback*)cb_cntCWrisetime);
cntCWrisetime->align(FL_ALIGN_LEFT);
@ -2259,6 +2260,7 @@ l with your sound hardware.");
valTHOR_BW->type(1);
valTHOR_BW->minimum(1);
valTHOR_BW->maximum(2);
valTHOR_BW->step(0.1);
valTHOR_BW->value(1.5);
valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW);
o->value(progdefaults.THOR_BW);
@ -2308,6 +2310,7 @@ l with your sound hardware.");
valDominoEX_BW->type(1);
valDominoEX_BW->minimum(1);
valDominoEX_BW->maximum(2);
valDominoEX_BW->step(0.1);
valDominoEX_BW->value(1.5);
valDominoEX_BW->callback((Fl_Callback*)cb_valDominoEX_BW);
o->value(progdefaults.DOMINOEX_BW);
@ -2551,7 +2554,7 @@ l with your sound hardware.");
btnMT63_8bit->callback((Fl_Callback*)cb_btnMT63_8bit);
o->value(progdefaults.mt63_8bit);
} // Fl_Check_Button* btnMT63_8bit
{ Fl_Check_Button* o = btnmt63_interleave = new Fl_Check_Button(55, 120, 134, 15, "64 bit interleave");
{ Fl_Check_Button* o = btnmt63_interleave = new Fl_Check_Button(55, 120, 186, 15, "64 bit interleave (long)");
btnmt63_interleave->down_box(FL_DOWN_BOX);
btnmt63_interleave->callback((Fl_Callback*)cb_btnmt63_interleave);
o->value(0);if (progdefaults.mt63_interleave == 64) o->value(1);

Wyświetl plik

@ -1,5 +1,5 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0109
version 1.0108
header_name {.h}
code_name {.cxx}
decl {\#include <config.h>} {}
@ -908,12 +908,10 @@ progdefaults.changed = true;}
}
Fl_Value_Slider valPCMvolume {
label PCM
callback {setPCMvolume(o->value() / 100.0);
callback {setPCMvolume(o->value());
progdefaults.changed = true;}
xywh {19 125 340 21} type {Horz Knob} color 26 selection_color 1 align 8 value 0.8 textsize 14
xywh {19 125 340 21} type {Horz Knob} color 26 selection_color 1 align 8 step 0.01 value 0.8 textsize 14
code0 {extern void setPCMvolume(double);}
code1 {valPCMvolume->range(0.0, 100.0);}
code2 {valPCMvolume->step(1.0);}
}
Fl_Input_Choice menuMix {
label Device
@ -1089,14 +1087,14 @@ progdefaults.changed = true;}
label {Dash/Dot}
callback {progdefaults.CWdash2dot=o->value();
progdefaults.changed = true;}
xywh {205 185 64 21} type Simple align 4 minimum 2.5 maximum 4 value 3
xywh {205 185 64 21} type Simple align 4 minimum 2.5 maximum 4 step 0.1 value 3
code0 {o->value(progdefaults.CWdash2dot);}
}
Fl_Counter cntCWrisetime {
label Edge
callback {progdefaults.CWrisetime=o->value();
progdefaults.changed = true;}
xywh {325 185 65 21} type Simple align 4 minimum 0 maximum 15 value 4
xywh {325 185 65 21} type Simple align 4 minimum 0 maximum 15 step 0.1 value 4
code0 {o->value(progdefaults.CWrisetime);}
}
Fl_Counter cntCWdefWPM {
@ -1151,7 +1149,7 @@ progdefaults.changed = true;}
callback {progdefaults.THOR_BW = o->value();
resetTHOR();
progdefaults.changed = true;}
xywh {20 130 63 21} type Simple minimum 1 maximum 2 value 1.5
xywh {20 130 63 21} type Simple minimum 1 maximum 2 step 0.1 value 1.5
code0 {o->value(progdefaults.THOR_BW);}
}
Fl_Check_Button valTHOR_FILTER {
@ -1199,7 +1197,7 @@ progdefaults.changed = true;}
callback {progdefaults.DOMINOEX_BW = o->value();
resetDOMEX();
progdefaults.changed = true;}
xywh {20 130 63 21} type Simple minimum 1 maximum 2 value 1.5
xywh {20 130 63 21} type Simple minimum 1 maximum 2 step 0.1 value 1.5
code0 {o->value(progdefaults.DOMINOEX_BW);}
}
Fl_Check_Button valDominoEX_FILTER {
@ -1468,13 +1466,13 @@ progdefaults.changed = true;}
code0 {o->value(progdefaults.mt63_8bit);}
}
Fl_Check_Button btnmt63_interleave {
label {64 bit interleave}
label {64 bit interleave (long)}
callback {if (o->value() == 1)
progdefaults.mt63_interleave = 64;
else
progdefaults.mt63_interleave = 32;
progdefaults.changed = true;}
xywh {55 120 134 15} down_box DOWN_BOX
xywh {55 120 186 15} down_box DOWN_BOX
code0 {o->value(0);if (progdefaults.mt63_interleave == 64) o->value(1);}
}
}

Wyświetl plik

@ -637,6 +637,13 @@ void init_modem(trx_mode mode)
clear_StatusMessages();
progStatus.lastmode = mode;
if (wf->xmtlock->value() == 1) {
wf->xmtlock->value(0);
wf->xmtlock->damage();
active_modem->set_freqlock(false);
}
}
void init_modem_sync(trx_mode m)
@ -707,7 +714,7 @@ void colorize_macro(int i)
progdefaults.btnFkeyTextColor.G,
progdefaults.btnFkeyTextColor.B ));
} else {
btnMacro[i]->color(FL_BACKGROUND2_COLOR);
btnMacro[i]->color(FL_BACKGROUND_COLOR);
btnMacro[i]->labelcolor(FL_FOREGROUND_COLOR);
}
}

Wyświetl plik

@ -108,6 +108,7 @@ class Fl_ComboBox : public Fl_Group {
const char *value ();
void value (const char *);
void put_value( const char *);
void fl_popbrwsr(Fl_Widget *);
void type (int = 0);

Wyświetl plik

@ -1,4 +1,4 @@
// generated by Fast Light User Interface Designer (fluid) version 1.0109
// generated by Fast Light User Interface Designer (fluid) version 1.0108
#ifndef confdialog_h
#define confdialog_h

Wyświetl plik

@ -96,6 +96,7 @@ private:
double I11, I12, I21, I22, I31, I32;
double snratio, s2n, imdratio, imd;
double E1, E2, E3;
double afcmetric;
// complex thirdorder;
// tx variables & functions

Wyświetl plik

@ -286,7 +286,7 @@ enum TAG { \
OLIVIATONES, OLIVIABW, OLIVIASMARGIN, OLIVIASINTEG, OLIVIA8BIT,
THORBW, THORFILTER, THORSECTEXT, THORPATHS, THORSOFT, THORCWI,
DOMINOEXBW, DOMINOEXFILTER, DOMINOEXFEC, DOMINOEXPATHS, DOMCWI,
MT638BIT, MT63INTERLEAVE, FELDFONTNBR,
FELDFONTNBR,
HELLRCVWIDTH, HELLXMTWIDTH, HELLBLACKBOARD, HELLPULSEFAST, HELLXMTIDLE,
WFPREFILTER, LATENCY,
USECURSORLINES, USECURSORCENTERLINE, USEBWTRACKS,
@ -318,7 +318,8 @@ enum TAG { \
RXFONTNBR, RXFONTSIZE, RXFNTCOLOR, TXFONTNBR, TXFONTSIZE, TXFNTCOLOR,
RXFONTCOLOR, TXFONTCOLOR, XMITCOLOR, CTRLCOLOR, SKIPCOLOR, ALTRCOLOR,
WATERFALLFONTNBR, WATERFALLFONTSIZE, UISCHEME,
RSIDWIDESEARCH, TRANSMITRSID, SLOWCPU
RSIDWIDESEARCH, TRANSMITRSID, SLOWCPU,
MT638BIT, MT63INTERLEAVE
};
void writeXMLint(ofstream &f, const char * tag, int val)
@ -440,8 +441,6 @@ void configuration::writeDefaultsXML()
writeXMLbool(f, "DOMINOEXFEC", DOMINOEX_FEC);
writeXMLint(f, "DOMINOEXPATHS", DOMINOEX_PATHS);
writeXMLdbl(f, "DOMCWI", DomCWI);
writeXMLbool(f, "MT638BIT", mt63_8bit);
writeXMLint(f, "MT63INTERLEAVE", mt63_interleave);
writeXMLint(f, "FELDFONTNBR", feldfontnbr);
writeXMLbool(f, "HELLRCVWIDTH", HellRcvWidth);
@ -561,6 +560,9 @@ void configuration::writeDefaultsXML()
writeXMLbool(f, "TRANSMITRSID", TransmitRSid);
writeXMLbool(f, "SLOWCPU", slowcpu);
writeXMLbool(f, "MT638BIT", mt63_8bit);
writeXMLint(f, "MT63INTERLEAVE", mt63_interleave);
f << "</FLDIGI_DEFS>\n";
f.close();
}
@ -784,12 +786,6 @@ bool configuration::readDefaultsXML()
case DOMCWI :
DomCWI = atof(xml->getNodeData());
break;
case MT638BIT :
mt63_8bit = atoi(xml->getNodeData());
break;
case MT63INTERLEAVE :
mt63_interleave = atoi(xml->getNodeData());
break;
case FELDFONTNBR :
feldfontnbr = atoi(xml->getNodeData());
break;
@ -1131,6 +1127,12 @@ bool configuration::readDefaultsXML()
case SLOWCPU :
slowcpu = atoi(xml->getNodeData());
break;
case MT638BIT :
mt63_8bit = atoi(xml->getNodeData());
break;
case MT63INTERLEAVE :
mt63_interleave = atoi(xml->getNodeData());
break;
}
break;
@ -1205,8 +1207,6 @@ bool configuration::readDefaultsXML()
else if (!strcmp("DOMINOEXFEC", nodeName)) tag = DOMINOEXFEC;
else if (!strcmp("DOMINOEXPATHS", nodeName)) tag = DOMINOEXPATHS;
else if (!strcmp("DOMCWI", nodeName)) tag = DOMCWI;
else if (!strcmp("MT638BIT", nodeName)) tag = MT638BIT;
else if (!strcmp("MT63INTERLEAVE", nodeName)) tag = MT63INTERLEAVE;
else if (!strcmp("FELDFONTNBR", nodeName)) tag = FELDFONTNBR;
else if (!strcmp("HELLRCVWIDTH", nodeName)) tag = HELLRCVWIDTH;
else if (!strcmp("HELLXMTWIDTH", nodeName)) tag = HELLXMTWIDTH;
@ -1307,10 +1307,13 @@ bool configuration::readDefaultsXML()
else if (!strcmp("SKIPCOLOR", nodeName)) tag = SKIPCOLOR;
else if (!strcmp("ALTRCOLOR", nodeName)) tag = ALTRCOLOR;
else if (!strcmp("WATERFALLFONTNBR", nodeName)) tag = WATERFALLFONTNBR;
else if (!strcmp("WATERFALLFONTSIZE", nodeName)) tag = WATERFALLFONTSIZE; else if (!strcmp("UISCHEME", nodeName)) tag = UISCHEME;
else if (!strcmp("WATERFALLFONTSIZE", nodeName)) tag = WATERFALLFONTSIZE;
else if (!strcmp("UISCHEME", nodeName)) tag = UISCHEME;
else if (!strcmp("RSIDWIDESEARCH", nodeName)) tag = RSIDWIDESEARCH;
else if (!strcmp("TRANSMITRSID", nodeName)) tag = TRANSMITRSID;
else if (!strcmp("SLOWCPU", nodeName)) tag = SLOWCPU;
else if (!strcmp("MT638BIT", nodeName)) tag = MT638BIT;
else if (!strcmp("MT63INTERLEAVE", nodeName)) tag = MT63INTERLEAVE;
else tag = IGNORE;
}
break;

Wyświetl plik

@ -436,7 +436,7 @@ public:
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
*retval = xmlrpc_c::value_int(cntSearchRange->value());
*retval = xmlrpc_c::value_int((int)cntSearchRange->value());
}
};
@ -450,8 +450,8 @@ public:
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
int v = cntSearchRange->value();
REQ(set_valuator, cntSearchRange, params.getInt(0, cntSearchRange->minimum(), cntSearchRange->maximum()));
int v = (int)(cntSearchRange->value());
REQ(set_valuator, cntSearchRange, params.getInt(0, (int)cntSearchRange->minimum(), (int)cntSearchRange->maximum()));
*retval = xmlrpc_c::value_int(v);
}
};
@ -466,7 +466,7 @@ public:
}
void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval)
{
int v = cntSearchRange->value() + params.getInt(0);
int v = (int)(cntSearchRange->value() + params.getInt(0));
REQ(set_valuator, cntSearchRange, v);
*retval = xmlrpc_c::value_int(v);
}
@ -499,7 +499,7 @@ public:
throw xmlrpc_c::fault("Operation not supported by modem", xmlrpc_c::fault::code_t(0));
}
*retval = xmlrpc_c::value_int(val->value());
*retval = xmlrpc_c::value_int((int)val->value());
}
};
@ -525,8 +525,8 @@ public:
throw xmlrpc_c::fault("Operation not supported by modem", xmlrpc_c::fault::code_t(0));
}
int v = val->value();
REQ(set_valuator, val, params.getInt(0, val->minimum(), val->maximum()));
int v = (int)(val->value());
REQ(set_valuator, val, params.getInt(0, (int)val->minimum(), (int)val->maximum()));
*retval = xmlrpc_c::value_int(v);
}
};
@ -553,7 +553,7 @@ public:
throw xmlrpc_c::fault("Operation not supported by modem", xmlrpc_c::fault::code_t(0));
}
int v = val->value() + params.getInt(0);
int v = (int)(val->value() + params.getInt(0));
REQ(set_valuator, val, v);
*retval = xmlrpc_c::value_int(v);
}
@ -676,10 +676,10 @@ public:
double d = wf->rfcarrier();
double rfc = params.getDouble(0, 0.0);
int mc = active_modem->get_freq();
rigCAT_set_qsy(rfc, mc);
rigMEM_set_qsy(rfc, mc);
rigCAT_set_qsy((long long int)rfc, mc);
rigMEM_set_qsy((long long int)rfc, mc);
#if USE_HAMLIB
hamlib_set_qsy(rfc, mc);
hamlib_set_qsy((long long int)rfc, mc);
#endif
*retval = xmlrpc_c::value_double(d);
}
@ -697,10 +697,10 @@ public:
{
double rfc = wf->rfcarrier() + params.getDouble(0);
int mc = active_modem->get_freq();
rigCAT_set_qsy(rfc, mc);
rigMEM_set_qsy(rfc, mc);
rigCAT_set_qsy((long long int)rfc, mc);
rigMEM_set_qsy((long long int)rfc, mc);
#if USE_HAMLIB
hamlib_set_qsy(rfc, mc);
hamlib_set_qsy((long long int)rfc, mc);
#endif
*retval = xmlrpc_c::value_double(rfc);
}

Wyświetl plik

@ -87,6 +87,7 @@ void psk::rx_init()
resetSN_IMD();
imdValid = false;
set_AFCrange(1.0);
afcmetric = 0.0;
}
void psk::restart()
@ -366,6 +367,8 @@ void psk::findsignal()
void psk::phaseafc()
{
double error;
if (afcmetric < 0.05) return;
error = (phase - bits * M_PI / 2.0);
if (error < -M_PI/2.0)
error += TWOPI;
@ -410,6 +413,7 @@ void psk::rx_symbol(complex symbol)
quality.im = decayavg(quality.im, sin(n*phase), SQLDECAY);
metric = 100.0 * quality.norm();
afcmetric = decayavg(afcmetric, quality.norm(), 50);
dcdshreg = (dcdshreg << 2) | bits;

Wyświetl plik

@ -384,7 +384,6 @@ static void *hamlib_loop(void *args)
if (freq == 0) {
fl_unlock (&hamlib_mutex);
continue;
// hamlib_exit = true;
}
}
catch (const RigException& Ex) {
@ -416,9 +415,7 @@ static void *hamlib_loop(void *args)
if (freqok && freq && (freq != hamlib_freq)) {
hamlib_freq = freq;
FL_LOCK_D();
FreqDisp->value(hamlib_freq);
FL_UNLOCK_D();
FreqDisp->value(hamlib_freq);
wf->rfcarrier(hamlib_freq);
}

Wyświetl plik

@ -32,6 +32,7 @@
#include "rigio.h"
#include "debug.h"
#include "threads.h"
#include "qrunner.h"
using namespace std;
@ -371,7 +372,7 @@ long long rigCAT_getfreq()
if (itrCmd == commands.end()) {
LOG_DEBUG("Cmd not defined");
nonCATrig = true;
return -1; // get_freq command is not defined!
return -2; // get_freq command is not defined!
}
modeCmd = *itrCmd;
@ -962,10 +963,10 @@ bool rigCAT_init()
nonCATrig = false;
if (rigCAT_getfreq() <= 0) {
if (rigCAT_getfreq() == -1) {
LOG_ERROR("Xcvr Freq request not answered");
// rigio.ClosePort();
// return false;
rigio.ClosePort();
return false;
}
rigCAT_sendINIT();
@ -1061,10 +1062,9 @@ static void *rigCAT_loop(void *args)
long long freq = 0L;
string sWidth, sMode;
int cntr = 10;
for (;;) {
MilliSleep(10);
MilliSleep(100);
if (rigCAT_bypass == true)
goto loop;
@ -1076,41 +1076,26 @@ static void *rigCAT_loop(void *args)
freq = rigCAT_getfreq();
fl_unlock(&rigCAT_mutex);
if (freq <= 0)
goto loop;
if (freq != llFreq) {
llFreq = freq;
// FL_LOCK_D();
FreqDisp->value(freq);
// FL_UNLOCK_D();
FreqDisp->value(freq); // REQ is built in to the widget
wf->rfcarrier(freq);
}
if (--cntr % 5)
if (rigCAT_exit == true)
goto exitloop;
if (rigCAT_bypass == true)
goto loop;
if (cntr == 5) {
if (rigCAT_exit == true)
goto exitloop;
if (rigCAT_bypass == true)
goto loop;
fl_lock(&rigCAT_mutex);
sWidth = rigCAT_getwidth();
fl_unlock(&rigCAT_mutex);
fl_lock(&rigCAT_mutex);
sWidth = rigCAT_getwidth();
fl_unlock(&rigCAT_mutex);
if (sWidth.size() && sWidth != sRigWidth) {
sRigWidth = sWidth;
FL_LOCK();
opBW->value(sWidth.c_str());
FL_UNLOCK();
FL_AWAKE();
}
goto loop;
if (sWidth.size() && sWidth != sRigWidth) {
sRigWidth = sWidth;
REQ(&Fl_ComboBox::put_value, opBW, sWidth.c_str());
}
cntr = 10;
if (rigCAT_exit == true)
goto exitloop;
if (rigCAT_bypass == true)
@ -1120,20 +1105,13 @@ static void *rigCAT_loop(void *args)
sMode = rigCAT_getmode();
fl_unlock(&rigCAT_mutex);
if (rigCAT_exit == true)
goto exitloop;
if (rigCAT_bypass == true)
goto loop;
if (sMode.size() && sMode != sRigMode) {
sRigMode = sMode;
if (ModeIsLSB(sMode))
wf->USB(false);
else
wf->USB(true);
FL_LOCK();
opMODE->value(sMode.c_str());
FL_UNLOCK();
FL_AWAKE();
REQ(&Fl_ComboBox::put_value, opMODE, sMode.c_str());
}
loop:
continue;

Wyświetl plik

@ -435,12 +435,13 @@ void trx_reset(void)
//=============================================================================
static char timermsg[80];
static int countdown = 1;
static void macro_timer(void *)
{
if (progdefaults.useTimer == false)
return;
progdefaults.timeout--;
if (progdefaults.timeout == 0) {
countdown--;
if (countdown == 0) {
progdefaults.useTimer = false;
macros.execute(progdefaults.macronumber);
FL_LOCK();
@ -448,7 +449,7 @@ static void macro_timer(void *)
btnMacroDummy->show();
FL_UNLOCK();
} else {
snprintf(timermsg, sizeof(timermsg), "Timer: %d", progdefaults.timeout);
snprintf(timermsg, sizeof(timermsg), "Timer: %d", countdown);
FL_LOCK();
btnMacroTimer->label(timermsg);
btnMacroTimer->redraw_label();
@ -460,8 +461,9 @@ static void macro_timer(void *)
//=============================================================================
void trx_start_macro_timer()
{
countdown = progdefaults.timeout;
Fl::add_timeout(1.0, macro_timer);
snprintf(timermsg, sizeof(timermsg), "Timer: %d", progdefaults.timeout);
snprintf(timermsg, sizeof(timermsg), "Timer: %d", countdown);
FL_LOCK();
btnMacroTimer->label(timermsg);
btnMacroTimer->redraw_label();