19 #include "TGo4LockGuard.h"
22 #include <QtCore/QTimer>
82 NodeTable->setColumnCount(5);
91 NodeTable->setHorizontalHeaderItem(
DABCMON_NODE_NODECOL,
new QTableWidgetItem(tr(
"Context" ) ));
93 NodeTable->setHorizontalHeaderItem(
DABCMON_NODE_CHECKCOL ,
new QTableWidgetItem( tr(
"Ratemeters" ) ));
94 NodeTable->setHorizontalHeaderItem(
DABCMON_NODE_LOGCOL,
new QTableWidgetItem( tr(
"Service list" ) ));
96 RateTable->setColumnCount(5);
106 RateTable->setHorizontalHeaderItem(
DABCMON_RATE_STATSCOL,
new QTableWidgetItem(tr(
"Statistics" ) ));
107 FullPrintDIMButton->setDisabled(
true);
108 dimServiceFilterEdit->setDisabled(
true);
147 dimDnsNodeEdit->setText(node);
155 controlBox->setVisible(
false);
190 fxDnsNode = dimDnsNodeEdit->text().trimmed();
192 DimClient::setDnsNode(
fxDnsNode.toLatin1().constData());
198 FullPrintDIMButton->setDisabled(
true);
199 dimServiceFilterEdit->setDisabled(
true);
230 std::vector <std::vector <bool> > & nodevec=
fbTrendingInit[nodeix];
231 for(
int rateix=0; rateix<nodevec.size();++rateix)
233 std::vector <bool> & hisvec= nodevec[rateix];
234 for (
int hisix=0; hisix<hisvec.size();++hisix)
240 for(
int nodeix=0;nodeix<
fbStatsInit.size();++nodeix)
242 std::vector <std::vector <bool> > & nodevec=
fbStatsInit[nodeix];
243 for(
int rateix=0; rateix<nodevec.size();++rateix)
245 std::vector <bool> & hisvec= nodevec[rateix];
246 for (
int hisix=0; hisix<hisvec.size();++hisix)
254 for (
int nodeix=0;nodeix<
fxRateSum.size();++nodeix)
256 std::vector<float> & nodevec=
fxRateSum[nodeix];
257 for(
int rateix=0; rateix<nodevec.size();++rateix)
262 for(
int nodeix=0;nodeix<
fxRateCount.size();++nodeix)
264 std::vector<unsigned int> & nodevec=
fxRateCount[nodeix];
265 for(
int rateix=0; rateix<nodevec.size();++rateix)
270 TrendBinsBox->setDisabled(val);
278 FrequencyBox->setDisabled(val);
282 float milsecs=1000*FrequencyBox->value();
316 int ix=ixtext.toInt();
324 on = (checkitem->checkState() == Qt::Checked);
326 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong rate checktableitem at tablerow "<<row <<std::endl;
341 on = (checkitem->checkState() == Qt::Checked);
343 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong log checktableitem at tablerow "<<row <<std::endl;
347 bool disablebutton=
true;
356 FullPrintDIMButton->setDisabled(disablebutton);
357 dimServiceFilterEdit->setDisabled(disablebutton);
374 on = (checkitem->checkState() == Qt::Checked);
376 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong checktableitem at tablerow "<<row <<std::endl;
381 std::cout<<
"!!!!!!!!!! NEVER COME HERE: get RateIndices could not get indices for row "<<row <<std::endl;
393 on = (checkitem->checkState() == Qt::Checked);
395 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong checktableitem at tablerow "<<row <<std::endl;
400 std::cout<<
"!!!!!!!!!! NEVER COME HERE: get RateIndices could not get indices for row "<<row <<std::endl;
420 timestamp.setTime_t (info->getTimestamp());
421 std::cout<<
"DIM service " << info->getName() <<
":"<<std::endl;
424 std::cout<<
" - "<< info->getInt();
426 std::cout<<
" - "<< info->getFloat();
428 std::cout<<
" - "<< info->getDouble();
430 std::cout<<
" - "<< info->getString();
434 char* ptr=(
char*) info->getData();
435 int size=info->getSize();
437 std::cout<<
" - structure of format " << format.toLatin1().constData() <<std::endl;
438 QStringList elements = format.split(
";",QString::SkipEmptyParts);
439 for ( QStringList::Iterator it = elements.begin(); it != elements.end(); ++it )
441 QString component=*it;
442 QString type=component.section(
':',0,0);
443 QString slen=component.section(
':',1,1);
444 int length=slen.toInt();
447 QString prompt=
" - "+type+
" ("+slen+
") \t>";
451 content.truncate(length);
456 int* cursor= (
int*) ptr;
457 for(
int t=0; t<length; ++t)
460 content+= val.setNum(*cursor,10);
467 float* cursor= (
float*) ptr;
468 for(
int t=0; t<length; ++t)
471 content+= val.setNum( *cursor,
'g',5);
480 for(
int t=0; t<length; ++t)
483 content+= val.setNum(*ptr,10);
488 std::cout<<prompt.toLatin1().constData()<<content.toLatin1().constData() <<
"< "<<std::endl;;
489 int currentposition= (long) ptr - (
long) info->getData();
490 if(currentposition > size)
492 std::cout<<
" !!!!!!!!!!!!!!!! structure iterator exceeds service size "<<size <<std::endl;
497 std::cout<<
" - (timestamp:"<<timestamp.toString().toLatin1().constData()<<
")" <<std::endl;
506 QString servers=info->getString();
507 fxNodelist = servers.split(
"|", QString::SkipEmptyParts);
518 unsigned int index=-1;
519 for(
unsigned int ix=0; ix<
fxServices.size(); ++ix)
529 std::cout<<
"!!!!!!!!!!!servicesUpdated: unknown service info" << (
int*) info<<std::endl;
535 std::cout<<
"!!!!!!!!!!!NEVER COME HERE: services updated out of bounds, index=" << index<<std::endl;
538 QString services=info->getString();
542 QStringList servlist = services.split(0x0A, QString::SkipEmptyParts);
543 QString stateservice=
"";
544 for ( QStringList::Iterator sit = servlist.begin(); sit != servlist.end(); ++sit )
546 QString service=*sit;
548 if(service.contains(
"RunStatus") || service.contains(
"Acquisition") )
550 stateservice=service.section(
'|',0,0);
555 if(!stateservice.isEmpty())
562 if(stateservice==
fxStates[index]->getName())
606 unsigned int index=-1;
607 for(
unsigned int ix=0; ix<
fxStates.size(); ++ix)
618 std::cout<<
"ERROR in stateUpdated(): object not in list, pointer " << (
int*) info<<std::endl;
625 std::cout<<
"!!!!!!!!!!!NEVER COME HERE: state updated out of bounds, index=" << index<<std::endl;
641 unsigned int nodeindex=-1;
642 unsigned int rateindex=-1;
643 for(
unsigned int ix=0; ix<
fxRates.size(); ++ix)
645 std::vector<TGo4DabcRateInfo*> & rvec=
fxRates[ix];
646 for(
unsigned int rix=0;rix< rvec.size();++rix)
660 std::cout<<
"ERROR in rateUpdated(): object not in list, pointer " << (
int*) info<<std::endl;
667 std::cout<<
"!!!!!!!!!!!NEVER COME HERE: rate updated out of bounds, nodeindex=" << nodeindex<<std::endl;
670 std::vector<TGo4DabcRate> & recordvec=
fxRateRecords[nodeindex];
671 if(rateindex>recordvec.size())
673 std::cout<<
"!!!!!!!!!!!NEVER COME HERE: rate updated out of bounds, rateindex=" << rateindex<<std::endl;
676 recordvec[rateindex]=
TGo4DabcRate(currentrate, info->getName());
681 std::vector< std::deque <float> > & qvec=
fxRateQueues[nodeindex];
682 if(rateindex>qvec.size())
684 std::cout<<
"!!!!!!!!!!!NEVER COME HERE: rate queue vector out of bounds, rateindex=" << rateindex<<std::endl;
687 qvec[rateindex].push_back(currentrate->
value);
714 if(current.contains(
"DIS_DNS"))
continue;
716 QString prefix=current.section(
'/', 0, 0 );
717 QString rest=current.section(
'/', 1, 1 );
718 QString reducednode=rest.section(
'@',0,0);
724 reducednode=current.section(
'@',0,0);;
732 QString sinfoname=current.section(
'@',0,0) +
"/SERVICE_LIST";
739 std::vector<TGo4DabcRateInfo*> rinfovec;
742 std::vector<TGo4DabcRate> ratevec;
746 std::vector<float> sumvec;
748 std::vector<unsigned int> countvec;
750 std::vector<bool> trendvec;
753 std::vector <std::vector<bool> >initvec;
757 std::vector < std::vector <QString> >namesvec;
761 std::vector< std::deque <float> > rateqvec;
773 std::vector<TGo4DabcStateInfo*>::iterator iter;
787 std::vector<TGo4DabcServiceInfo*>::iterator iter;
799 std::vector<std::vector<TGo4DabcRateInfo*> >::iterator nodeiter;
800 for(nodeiter=
fxRates.begin(); nodeiter!=
fxRates.end(); ++nodeiter)
802 std::vector<TGo4DabcRateInfo*> nodevec=*nodeiter;
803 std::vector<TGo4DabcRateInfo*>::iterator iter;
804 for(iter=nodevec.begin(); iter!=nodevec.end(); ++iter)
828 QString services=
fxServices[nodeindex]->getString();
832 QStringList servlist = services.split(0x0A, QString::SkipEmptyParts);
833 QString rateservice=
"";
834 for ( QStringList::Iterator sit = servlist.begin(); sit != servlist.end(); ++sit )
836 QString service = *sit;
839 if(service.contains(
"F:1;L:1;F:1;F:1;F:1;F:1;C:16;C:16;C"))
843 std::deque <float> ratequeue;
849 std::vector <bool> hisvec;
850 hisvec.push_back(
false);
851 hisvec.push_back(
false);
853 std::vector <QString> namesvec;
854 namesvec.push_back(
"undefined histogram");
855 namesvec.push_back(
"undefined histogram");
861 QString rname=service.section(
'|',0,0);
864 fxRates[nodeindex].push_back(rinfo);
874 std::vector<TGo4DabcRateInfo*> & nodevec=
fxRates[nodeindex];
875 std::vector<TGo4DabcRateInfo*>::iterator iter;
876 for(iter=nodevec.begin(); iter!=nodevec.end(); ++iter)
898 QRegExp filter(dimServiceFilterEdit->text().trimmed());
899 filter.setPatternSyntax(QRegExp::Wildcard);
900 std::cout<<std::endl<<
"---- Retrieving current DIM variables from node "<<
fxDabcNodes[nodeindex].toLatin1().constData()<<
" with filter:"<<filter.pattern().toLatin1().constData() <<std::endl;
903 QString services=
fxServices[nodeindex]->getString();
907 QStringList servlist = services.split(0x0A, QString::SkipEmptyParts);
908 QString logservice=
"";
909 for ( QStringList::Iterator sit = servlist.begin(); sit != servlist.end(); ++sit )
911 QString service=*sit;
912 QString sformat=service.section(
'|',1,1);
913 QString sname=service.section(
'|',0,0);
914 QString scom=service.section(
'|',2,2);
915 if(sname.contains(
"SERVICE_LIST"))
continue;
916 if(scom.contains(
"CMD"))
continue;
917 if(filter.indexIn(sname)<0)
continue;
924 else if(sformat==
"L")
955 NodeTable->setRowCount(0);
957 NodeTable->setRowCount(maxnodes);
958 for(
int ix=0; ix<maxnodes; ++ix)
965 int tablesize = NodeTable->rowCount();
967 if(maxnodes!=tablesize)
969 std::cout<<
"!!!!!!!!!! NEVER COME HERE: table size "<<tablesize<<
" does not match number of nodes "<<maxnodes <<std::endl;
973 for(
int ix=0; ix<maxnodes; ++ix)
976 for(
int j=0; j<tablesize;++j)
981 int tix=ixtext.toInt();
990 std::cout<<
"!!!!!!!!!! NEVER COME HERE: could not find tableindex for "<<ix <<std::endl;
1009 NodeTable->setSortingEnabled(
false);
1015 QPixmap pixmap = QPixmap(
":/icons/eventitem.png").scaledToHeight(NodeTable->rowHeight(tableindex),Qt::SmoothTransformation);
1017 QTableWidgetItem* item = 0;
1019 std::cout<<
" !!!!!!!!!! nodeindex exceeds size of states "<<
fxStateRecords.size()<<std::endl;
1028 item =
new QTableWidgetItem(pixmap,
fxStateRecords[nodeindex].fxState);
1029 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1032 item =
new QTableWidgetItem(QString::number(nodeindex));
1036 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1039 item =
new QTableWidgetItem(
"Show" );
1040 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1041 item->setCheckState(
fxShowRateFlags[nodeindex] ? Qt::Checked : Qt::Unchecked);
1044 item=
new QTableWidgetItem(
"Dump");
1045 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1046 item->setCheckState(
fxShowLogFlags[nodeindex] ? Qt::Checked : Qt::Unchecked);
1051 checkitem->setCheckState(
fxShowRateFlags[nodeindex] ? Qt::Checked : Qt::Unchecked);
1053 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong rate checktableitem at index "<<nodeindex <<std::endl;
1056 checklogitem->setCheckState(
fxShowLogFlags[nodeindex] ? Qt::Checked : Qt::Unchecked);
1058 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong logchecktableitem at index "<<nodeindex <<std::endl;
1060 NodeTable->setSortingEnabled(
true);
1074 for(
int ix=0; ix<maxnodes; ++ix)
1078 int tablesize = RateTable->rowCount();
1079 int tablecursor = -1;
1085 RateTable->setRowCount(0);
1086 RateTable->setRowCount(numrates);
1089 for(
int ix=0; ix<maxnodes; ++ix)
1093 for(
int rix=0; rix<rvec.size();++rix)
1107 if(numrates>tablesize)
1111 tablecursor=tablesize;
1113 RateTable->setRowCount(numrates);
1115 else if(numrates<tablesize)
1124 tablesize = RateTable->rowCount();
1125 bool usedrows[tablesize];
1126 for(
int t=0;t<tablesize;++t){usedrows[t]=
false;}
1127 for(
int nix=0; nix<maxnodes; ++nix)
1130 for(
int rix=0; rix<rvec.size();++rix)
1134 for(
int j=0; j<tablesize;++j)
1139 if(tablenodeix==nix && tablerateix==rix)
1151 std::cout<<
"!!!!!!!!!! NEVER COME HERE: tablecursor undefined for new entry ("<<nix<<
","<<rix<<
")" <<std::endl;
1155 usedrows[tablecursor]=
true;
1161 usedrows[tableindex]=
true;
1167 for(
int rownum=0;rownum<tablesize;++rownum)
1169 if(usedrows[rownum]==
false)
1172 RateTable->removeRow(rownum-offset);
1186 RateTable->setSortingEnabled(
false);
1190 val.setNum(rvec[rateindex].fxRate);
1191 val+=
" "+rvec[rateindex].fxUnits;
1193 QTableWidgetItem* item = 0;
1194 if(rvec[rateindex].fxRate<0) {
1195 QPixmap pixmap = QPixmap(
":/icons/info1.png").scaledToHeight(RateTable->rowHeight(tableindex),Qt::SmoothTransformation);
1196 item =
new QTableWidgetItem( QIcon(pixmap), val);
1198 item =
new QTableWidgetItem(val);
1199 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1203 QString namestring=rvec[rateindex].fxName.section(
'/',1);
1204 QTableWidgetItem* item =
new QTableWidgetItem(namestring);
1205 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1208 QString indexstring = QString::number(nodeindex)+
":"+QString::number(rateindex);
1209 item =
new QTableWidgetItem(indexstring);
1210 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1213 item =
new QTableWidgetItem(
"histogram" );
1214 item->setCheckState(
fxTrendingFlags[nodeindex].at(rateindex) ? Qt::Checked : Qt::Unchecked);
1215 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1218 item =
new QTableWidgetItem (
"histogram" );
1219 item->setCheckState(
fxStatsFlags[nodeindex].at(rateindex) ? Qt::Checked : Qt::Unchecked );
1220 item->setFlags(item->flags() & ~
Qt::ItemIsEditable);
1225 trendcheckitem->setCheckState(
fxTrendingFlags[nodeindex].at(rateindex) ? Qt::Checked : Qt::Unchecked);
1227 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong trend checktableitem at table index "<<tableindex <<std::endl;
1230 statcheckitem->setCheckState(
fxStatsFlags[nodeindex].at(rateindex) ? Qt::Checked : Qt::Unchecked);
1232 std::cout<<
"!!!!!!!!!! NEVER COME HERE: wrong stat checktableitem at table index "<<tableindex <<std::endl;
1234 RateTable->setSortingEnabled(
true);
1243 QString nstring=ixtext.section(
':', 0,0);
1244 if(nstring.isEmpty())
return false;
1245 nodeix=nstring.toInt();
1246 QString rstring=ixtext.section(
':', 1,1);
1247 rateix=rstring.toInt();
1263 std::cout <<
"--NEVER COME HERE: node index mismatch in displaySampleHistograms for nix="<< nodeix<<std::endl;
1267 for(
int rateix=0; rateix<trendvec.size();++rateix)
1269 bool trending=trendvec[rateix];
1270 if(rateix>statsvec.size())
1272 std::cout <<
"--NEVER COME HERE: rate index mismatch in displaySampleHistograms for rix)"<< rateix<<std::endl;;
1275 bool statisting=statsvec[rateix];
1276 if(trending || statisting)
1281 std::cout <<
"--NEVER COME HERE: node index mismatch in displaySampleHistograms queues for nix="<< nodeix<<std::endl;
1284 std::vector< std::deque <float> > & qvec =
fxRateQueues[nodeix];
1285 if(rateix>qvec.size())
1287 std::cout <<
"--NEVER COME HERE: rate index mismatch in displaySampleHistograms queues for rix)"<< rateix<<std::endl;;
1290 std::deque<float> &ratequeue = qvec[rateix];
1292 while (!ratequeue.empty())
1294 float val=ratequeue.front();
1295 ratequeue.pop_front();
1299 if(!TrendSampleCheck->isChecked())
continue;
1321 std::cout <<
"--NEVER COME HERE: node index mismatch in displaySampleHistograms for nix="<< nodeix<<std::endl;
1325 for(
int rateix=0; rateix<trendvec.size();++rateix)
1327 bool trending=trendvec[rateix];
1328 if(rateix>statsvec.size())
1330 std::cout <<
"--NEVER COME HERE: rate index mismatch in displaySampleHistograms for rix)"<< rateix<<std::endl;;
1333 bool statisting=statsvec[rateix];
1334 if(trending || statisting)
1337 float sum=
fxRateSum[nodeix].at(rateix);
1338 unsigned int count=
fxRateCount[nodeix].at(rateix);
1339 if(count!=0) val=sum/count;
1357 QDateTime timestamp;
1360 DateLabel->setText(timestamp.toString());
1391 QString foldername=name.section(
'/', 1,2);
1392 name=name.section(
'/', 3);
1393 name.replace( QChar(
'/'),
"-" );
1398 name=name+
"-TrendingFast";
1401 name=name+
"-TrendingAverage";
1404 foldername.replace( QChar(
'/'),
"-" );
1442 his=
new TH1F(name.toLatin1().constData(), title.toLatin1().constData(),
fiTrendBins,lo,up);
1443 TAxis* xax=his->GetXaxis();
1448 xax->SetTitle(
"updates");
1465 QString folder=
"DABC/"+foldername;
1486 if(histo==0)
return;
1487 int bins=histo->GetNbinsX();
1494 for(
int i=0;i<bins;i++)
1500 double oldval=histo->GetBinContent(j+dj);
1501 histo->SetBinContent(j,oldval);
1503 histo->SetBinContent(j+dj,value);
1513 QString foldername=name.section(
'/', 1,2);
1514 name=name.section(
'/', 3);
1515 name.replace( QChar(
'/'),
"-" );
1520 name=name+
"-StatsFast";
1523 name=name+
"-StatsAverage";
1526 foldername.replace( QChar(
'/'),
"-" );
1527 QString title=
"counts";
1544 his=
new TH1F(name.toLatin1().constData(),title.toLatin1().constData(),
fiStatBins,lo,up);
1545 TAxis* xax=his->GetXaxis();
1546 xax->SetTitle(xtitle.toLatin1().constData());
1556 QString folder=
"DABC/"+foldername;
virtual ~TGo4DabcMonitor()
std::vector< TGo4DabcStateInfo * > fxStates
virtual void updateStats(int nodeix, int rateix, int hix, double value)
void setDabcMonitorNode(const QString &name)
virtual void clearRates()
virtual void infoHandler()
std::vector< bool > fxShowLogFlags
static dabc::StatusRec gNolinkStateRecord
std::vector< std::vector< std::vector< bool > > > fbTrendingInit
virtual void refreshNodes()
std::vector< std::vector< float > > fxRateSum
std::vector< bool > fxShowRateFlags
TString SaveToMemory(const char *pathname, TObject *obj, Bool_t ownership, Bool_t overwrite=kFALSE)
virtual void histogramCheckToggled(bool val)
virtual void createRateServices(int nodeindex)
std::vector< std::vector< std::deque< float > > > fxRateQueues
#define DABCMON_RATE_TRENDCOL
std::vector< TGo4DabcServiceInfo * > fxServices
virtual void rateTableChangedSlot(int row, int column)
virtual bool getRateIndices(int tablerow, int &nodeix, int &rateix)
virtual void averageCheckToggled(bool val)
std::vector< std::vector< TGo4DabcRate > > fxRateRecords
virtual void fillNodeTableRow(int tableindex, int nodeindex, bool createnew)
std::vector< std::vector< unsigned int > > fxRateCount
std::vector< std::vector< std::vector< bool > > > fbStatsInit
virtual void displayRateTable()
virtual void deleteRateServices(int nodeindex)
virtual void rateUpdated(TGo4DabcRateInfo *info)
virtual void infoHandler()
void setDabcMonitorFreq(int secs)
#define DABCMON_NODE_STATECOL
virtual void displaySampleHistograms()
#define DABCMON_NODE_LOGCOL
void setDabcMonitorBins(int num)
void setDabcMonitorBackwardsTrending(bool on=true)
virtual void displayAll()
#define DABCMON_RATE_NAMECOL
TGo4Slot * DataSlot(const char *item)
const QString & getServiceType()
virtual void infoHandler()
virtual void createLogServices(int nodeindex)
TObject * GetAssignedObject()
virtual void IncTrending(TH1 *histo, double value, bool forwards)
virtual void refreshDIMSlot()
std::vector< std::vector< bool > > fxStatsFlags
TGo4DabcMonitor * fxOwner
virtual void infoHandler()
std::vector< QString > fxDabcNodes
#define DABCMON_NODE_NODECOL
virtual void displayNodeTable()
unsigned int fxLastTimestamp
QString getDabcMonitorNode()
TGo4Slot * BrowserSlot(const char *item)
virtual void stateUpdated(TGo4DabcStateInfo *info)
bool getMbsMonitorBackwardsTrending()
static dabc::RateRec gNolinkRateRecord
TGo4DabcMonitor(QWidget *parent=0, const char *name=0)
virtual void nodesUpdated(TGo4DabcNodesInfo *info)
TGo4DabcNodesInfo * fxServerInfo
virtual void clearServices()
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=0)
std::vector< TGo4DabcState > fxStateRecords
virtual void displayAverageHistograms()
virtual void infoHandler()
std::vector< std::vector< std::vector< QString > > > fxStatHistoRefnames
std::vector< std::vector< bool > > fxTrendingFlags
Bool_t AssignObject(TObject *obj, Bool_t owner)
virtual void servicesUpdated(TGo4DabcServiceInfo *info)
std::vector< std::vector< std::vector< QString > > > fxTrendHistoRefnames
virtual void infoUpdated(TGo4DabcInfo *info)
#define DABCMON_NODE_CHECKCOL
virtual void binsizeChanged(int val)
#define DABCMON_RATE_RATECOL
virtual void clearStates()
#define DABCMON_NODE_INDEXCOL
std::vector< std::vector< TGo4DabcRateInfo * > > fxRates
virtual void storeSettings()
#define DABCMON_RATE_INDEXCOL
virtual void logDIMSlot()
virtual void fillRateTableRow(int tableindex, int nodeindex, int rateindex, bool createnew)
static void SetItemTimeDate(TGo4Slot *slot, const char *stime=0, const char *sdate=0)
#define DABCMON_RATE_STATSCOL
virtual void updateTrending(int nodeix, int rateix, int hisix, double value)
virtual void nodeTableChangedSlot(int row, int column)