GSI Object Oriented Online Offline (Go4)  GO4-6.1.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
TGo4MBSViewer.cpp
Go to the documentation of this file.
1 // $Id: TGo4MBSViewer.cpp 3127 2021-03-30 09:23:27Z linev $
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4MBSViewer.h"
15 
16 #include <iostream>
17 
18 #include "TH1.h"
19 
20 #include "TGo4Slot.h"
21 #include "TGo4BrowserProxy.h"
22 #include "TGo4QSettings.h"
23 #include "f_stccomm.h"
24 
25 #include <QTimer>
26 #include <QDateTime>
27 #include <QButtonGroup>
28 #include <QMovie>
29 
30 extern "C"
31 {
36  INTS4 f_ut_seg_show (s_daqst *ps_daqst, s_setup *ps_setup, s_set_ml *ps_set_ml, s_set_mo *ps_set_mo);
37 }
38 
39 
40 TGo4MBSViewer::TGo4MBSViewer(QWidget *parent, const char* name) :
41  QGo4Widget(parent,name),
42  fxRunMovie(0)
43 {
44  setupUi(this);
45 
46  QObject::connect(FullPrintButton, SIGNAL(clicked()), this, SLOT(PrintStatus()));
47  QObject::connect(MonitorButton, SIGNAL(clicked()), this, SLOT(TimerStart()));
48  QObject::connect(StopButton, SIGNAL(clicked()), this, SLOT(TimerStop()));
49  QObject::connect(RefreshButton, SIGNAL(clicked()), this, SLOT(RefreshButtonClick()));
50  QObject::connect(NodeEdit, SIGNAL(returnPressed()), this, SLOT(NodeEditEnter()));
51  QObject::connect(NodeEdit, SIGNAL(textChanged(QString)), this, SLOT(NodeChanged(QString)));
52  QObject::connect(TrendCheck, SIGNAL(toggled(bool)), this, SLOT(TrendSwitched(bool)));
53  QObject::connect(FrequencyBox, SIGNAL(valueChanged(int)), this, SLOT(FrequencyBox_valueChanged(int)));
54  QObject::connect(MoreBox, SIGNAL(toggled(bool)), this, SLOT(MoreBox_toggled(bool)));
55  QObject::connect(TrendBinsBox, SIGNAL(valueChanged(int)), this, SLOT(TrendBinsBox_valueChanged(int)));
56 
57 
58 #if QT_VERSION >= QT_VERSION_CHECK(4,6,0)
59  RateEvents->setDigitCount(7);
60  SumEvents->setDigitCount(12);
61  RateBytes->setDigitCount(7);
62  SumBytes->setDigitCount(8);
63  ServerPercent->setDigitCount(3);
64  SumBytesFile->setDigitCount(9);
65 #else
66  RateEvents->setNumDigits(7);
67  SumEvents->setNumDigits(12);
68  RateBytes->setNumDigits(7);
69  SumBytes->setNumDigits(8);
70  ServerPercent->setNumDigits(3);
71  SumBytesFile->setNumDigits(9);
72 #endif
73 
74  fbIsMonitoring=false;
75  fbWarningState=false;
76  fbRunning=false;
77  fbGetSetup=false;
78  fbGetSetML=false;
79  fbGetSetMO=false;
80  fbTrending=false;
81  fbTrendingInit=true;
82  fbShowMore=false;
83  fbSingleRefresh=false;
84  fbTrendingForward=false; // define moving direction of trend histograms
85  fiTrendBins=1000;
86  // now overwrite some settings:
89  TrendCheck->setChecked(fbTrending);
91  TrendBinsBox->setValue(fiTrendBins);
93  MoreBox->setChecked(fbShowMore);
94  FrequencyBox->setValue(go4sett->getMbsMonitorFreq());
96 
97  StateGroup = new QButtonGroup(this);
98  StateGroup->setExclusive(false);
99  StateGroup->addButton(StatusRadio, 0);
100  StateGroup->addButton(SetupRadio, 1);
101  StateGroup->addButton(SetupMLRadio, 2);
102  StateGroup->addButton(SetupMORadio, 3);
103  StateGroup->button(0)->setChecked(true);
104  connect(StateGroup, SIGNAL(buttonClicked(int)), this, SLOT(StateGroup_clicked(int)));
105 
106  fxHistoAccessName = "nosuchobject";
107  fxHistokBAccessName = "nosuchobject";
108  fxHistoEvRatioAccessName = "nosuchobject";
109  fxServerLabel = "NO SERVER";
110  fxTimer = new QTimer(this);
111  fxMovieResetTimer = new QTimer(this);
112  QString moviepath = ":/icons/mbslogorun.gif";
113  fxRunMovie= new QMovie(moviepath);
114  memset(&fxDaqStat, 0, sizeof(fxDaqStat));
119  fiLastEventNum=0;
120  fiLastDataNum=0;
121  fxDeltaClock.start();
122  connect( fxTimer, SIGNAL(timeout()), this, SLOT(Refresh()) );
123  connect( fxMovieResetTimer, SIGNAL(timeout()), this, SLOT(ResetRunIcon()) );
124  Display();
125 
126 }
127 
129 {
130  delete fxRunMovie;
131 }
132 
133 
135 {
136  // save settings:
141  go4sett->setMbsMonitorFreq(FrequencyBox->value());
144 }
145 
146 
148 {
149  fbIsMonitoring=true;
150  fbTrendingInit=true;
151  fiLastEventNum=0;
152  fiLastDataNum=0;
154  Refresh();
155  fxTimer->start(1000*FrequencyBox->value());
156  Display();
157  StoreSettings();
158 }
159 
160 
162 {
163  fbIsMonitoring=false;
164  fxTimer->stop();
165  StartMovieReset();
166  Display();
167  StoreSettings();
168 }
169 
170 
172 {
173  setWindowTitle("MBS Status - "+NodeEdit->text());
174  if(!fbSingleRefresh)
175  {
176  NodeEdit->setEnabled(!fbIsMonitoring);
177  MonitorButton->setEnabled(!fbIsMonitoring);
178  StopButton->setEnabled(fbIsMonitoring);
179  FrequencyBox->setEnabled(!fbIsMonitoring);
180  //TrendCheck->setEnabled(!fbIsMonitoring);
181  TrendBinsBox->setEnabled(!fbTrending);
182  }
183  MoreFrame->setVisible(fbShowMore);
184  SumEvents->display((double) fxDaqStat.bl_n_events);
185  //RateEvents->display((double) fxDaqStat.bl_r_events);
186  RateEvents->display((double) fiCalcedEventRate);
187  SumBytes->display((double) ((unsigned int) fxDaqStat.bl_n_kbyte/1024));
188  //RateBytes->display((double) fxDaqStat.bl_r_kbyte);
189  RateBytes->display((double) fiCalcedDataRate);
190  DateLabel->setText(fxRefTime);
191  SumBytesFile->display((double) ((unsigned int) fxDaqStat.bl_n_kbyte_file/1024));
192 
194  OutfileLabel->setText(fxDaqStat.c_file_name);
195  else
196  OutfileLabel->setText("- file closed -") ;
197 
198  ServerLabel->setText(fxServerLabel) ;
199  ServerPercent->display((int) fiEvRatio);
200  if(fbRunning && !fbWarningState){
201  RunPix->clear();
202  RunPix->setMovie(fxRunMovie);
203  fxRunMovie->start();
204  }
205  else{
206  RunPix->setWindowIcon(QIcon( ":/icons/mbsbutton.png" ));
207  if(fxRunMovie) fxRunMovie->stop();
208  }
209  WarnPix->setVisible(fbWarningState);
210 
211  // put here enable/disable setup buttons:
212  SetupRadio->setEnabled(fxDaqStat.bh_setup_loaded);
213  SetupMLRadio->setEnabled(fxDaqStat.bh_set_ml_loaded);
214  SetupMORadio->setEnabled(fxDaqStat.bh_set_mo_loaded);
215  if(fbWarningState)
216  std::cerr <<fxMessage.toLatin1().constData() << std::endl;
217 
218  ensurePolished();
219  update();
220  show();
221 }
222 
223 
225 {
226  // for the ratemeter and running state, we always get status block
227  if(fxNode.isEmpty()) return;
228  int state=f_mbs_status(const_cast<char*>(fxNode.toLatin1().constData()), &fxDaqStat);
229  if(state!=STC__SUCCESS) {
230  fxMessage = QString("MBS Status refresh node %1 returned error %2 at ").arg(fxNode).arg(state);
231  fxMessage += QDateTime::currentDateTime().toString();
232  fbWarningState = true;
233  } else
234  fbWarningState = false;
235  //fxRefTime=QDateTime::currentDateTime ().toString();
238  int deltat=FrequencyBox->value();
239  int numperiods=1;
240  int deltamilsecs=deltat*1000.0; // default
241  if(fbIsMonitoring)
242  {
243  // only in monitoring mode: calculate rates ourselves, independent of mbs ratemter:
244  // NEW: first check real time diff since last call and correct rates:
245  deltamilsecs=fxDeltaClock.elapsed();
246  //std::cout <<"******* found ms:"<<deltamilsecs << std::endl;
247  fxDeltaClock.restart();
248  int deltasecs=deltamilsecs/1000;
249  if(!fbTrendingInit && (deltasecs>=deltat*2))
250  //if((deltasecs>=deltat*2)) // this one was for testing JAM
251  {
252  std::cout <<"Warning: MBS monitor found measuring interval:"<<deltasecs<<" s ("<<deltamilsecs <<" ms) exceeding timer period "<<deltat<<" s" << std::endl;
253  std::cout <<" Maybe timer was skipped?" << std::endl;
254  deltat=deltasecs;
255  numperiods=(deltat/ (int) FrequencyBox->value());
256  std::cout <<" Correcting number of measuring periods to:"<<numperiods << std::endl;
257  }
258  if(fiLastEventNum && deltamilsecs)
260  else
263 
264  if(fiLastDataNum && deltamilsecs)
265  {
267  fiCalcedDataRate=1000.*fiDataDelta/deltamilsecs;;
268  }
269  else
270  {
271  fiDataDelta=0;
273  }
275  // std::cout <<"Data rate:"<<fiCalcedDataRate << std::endl;
276  // std::cout <<"Data total:"<<fiLastDataNum << std::endl;
277  }
278  else
279  {
280  // single refresh on button press: use momentary mbs rate
283  }
284 
286  {
287  fxServerLabel = QString("streamserver %1%2").arg((int)(fxDaqStat.bl_strsrv_scale!=0 ? 100/fxDaqStat.bl_strsrv_scale : 0)).arg("%");
288 
289  if(fbIsMonitoring)
290  {
291  // own rate calculation for monitoring on:
292  if(fiLastServDataNum && deltamilsecs)
293  {
295  fiCalcedServDataRate=1000.*fiServDataDelta/deltamilsecs;
296  }
297  else
298  {
299  fiServDataDelta=0;
301  }
302  // std::cout <<"Streamserver rate:"<<fiCalcedServDataRate << std::endl;
303  // std::cout <<"Streamserver data:"<<fxDaqStat.bl_n_strserv_kbytes << std::endl;
304  // std::cout <<"Streamserver last data:"<<fiLastServDataNum << std::endl;
305  // std::cout <<"dt:"<<deltat << std::endl;
307  }
308  else
309  {
310  // single refresh: use ratio from current mbs calculated rates
312  fiDataDelta=0;
313  }
314  //fiEvRatio= (fiCalcedDataRate!=0 ? 100* fiCalcedServDataRate /fiCalcedDataRate : 0);
315  //int curentratio=(fiCalcedDataRate!=0 ? 100* fiCalcedServDataRate /fiCalcedDataRate : 0);
317  //std::cout<<"Eventratio="<<fiEvRatio<<" , currentratio="<<curentratio<< std::endl;
318  }
320  {
321  // calculate momentary rate for eventserver:
322 
323  fxServerLabel = QString("eventserver %1 %2%3")
324  .arg(fxDaqStat.bh_event_serv_ready ? "R" : "S")
325  .arg((int)(fxDaqStat.bl_evtsrv_scale!=0 ? 100/fxDaqStat.bl_evtsrv_scale : 0)).arg("%");
326  if(fbIsMonitoring)
327  {
328  // own rate calculation for monitoring on:
329  if(fiLastServDataNum && deltamilsecs)
330  {
332  fiCalcedServDataRate=1000.0*fiServDataDelta/deltamilsecs;
333  }
334  else
335  {
336  fiServDataDelta=0;
338  }
340  }
341  else
342  {
343  // single refresh: use ratio from current mbs calculated rates
345  fiDataDelta=0;
346  }
347  //fiEvRatio= (fiCalcedDataRate!=0 ? 100* fiCalcedServDataRate /fiCalcedDataRate : 0);
349 
350  }
351  else
352  {
353  fxServerLabel="NO SERVER";
354  fiEvRatio=0;
355  }
356 
358  {
359  while((numperiods--) > 0)
360  {
361  UpdateTrending(); // use same values for all skipped periods
362  //std::cout <<"Update trending with numperiods:"<<numperiods << std::endl;
363  }
364  }
365  StartMovieReset();
366  Display();
367  //f_ut_seg_show (&fxDaqStat,0,0,0);
368 }
369 
370 
372 {
373  Refresh();
374 }
375 
376 
377 
378 void TGo4MBSViewer::NodeChanged( const QString & txt )
379 {
380  fxNode = txt.trimmed();
381 }
382 
383 
385 {
386  if(fbWarningState)
387  {
388  std::cout <<fxMessage.toLatin1().constData() << std::endl;
389  }
390  else
391  {
392  std::cout <<"\n------------------------------------------------" << std::endl;
393  if(StateGroup->button(0)->isChecked())
394  f_ut_seg_show (&fxDaqStat,0,0,0);
395  if(fbGetSetup)
396  f_ut_seg_show (0,&fxSetup,0,0);
397  else if(fbGetSetML)
398  f_ut_seg_show (0,0,&fxSetupML,0);
399  else if(fbGetSetMO)
400  f_ut_seg_show (0,0,0,&fxSetupMO);
401  }
402 
403 }
404 
406 {
407  // only one of these can be enabled
408  fbGetSetup=StateGroup->button(1)->isChecked();
409  fbGetSetML=StateGroup->button(2)->isChecked();
410  fbGetSetMO=StateGroup->button(3)->isChecked();
411  // if status is wanted, do not print setups:
412  // if(fbGetSetup=StateGroup->button(0)->isChecked()){
413  // fbGetSetup=false;
414  // fbGetSetML=false;
415  // fbGetSetMO=false;
416  // }
417 }
418 
419 
421 {
422  if(fxNode.isEmpty()) return;
423  if(fbGetSetup)
424  {
425  // request setup if selected
426 
427  int state=f_mbs_setup(const_cast<char*>(fxNode.toLatin1().constData()), &fxSetup);
428  if(state!=0)
429  {
430  fxMessage = QString("MBS Setup refresh returned error %1 at %2").arg(state).arg(QDateTime::currentDateTime().toString());
431  fbWarningState = true;
432  }
433  else
434  fbWarningState=false;
435  }
436 
437  else if(fbGetSetML)
438  {
439  // request setup multilayer if selected
440  int state=f_mbs_ml_setup(const_cast<char*>(fxNode.toLatin1().constData()), &fxSetupML);
441  if(state!=0)
442  {
443  fxMessage = QString("MBS Setup ML refresh returned error %1 at %2").arg(state).arg(QDateTime::currentDateTime().toString());
444  fbWarningState = true;
445  }
446  else
447  fbWarningState = false;
448  }
449  else if(fbGetSetMO)
450  {
451  // request setup MO if selected
452  int state=f_mbs_mo_setup(const_cast<char*>(fxNode.toLatin1().constData()), &fxSetupMO);
453  if(state!=0)
454  {
455  fxMessage = QString("MBS Setup MO refresh returned error %1 at %2").arg(state).arg(QDateTime::currentDateTime().toString());
456  fbWarningState = true;
457  }
458  else
459  fbWarningState = false;
460  }
461 
462  else {}
463  RefreshButtonClick(); // always get new status structure and display on window
464  ShowStatus();
465 }
466 
467 
469 {
470  if(!fbTrending) fbTrendingInit=true;
471  fbTrending=on;
473  Display();
474 }
475 
476 
478 {
479  TrendHisto(fxHistoAccessName,"MbsEventRate","Events/s",fiCalcedEventRate);
480  TrendHisto(fxHistokBAccessName,"MbsDataRate","kB/s",fiCalcedDataRate);
481  TrendHisto(fxHistoEvRatioAccessName,fxServerLabel.section(' ',0,0),"% Events served",fiEvRatio);
482  fbTrendingInit=false;
483 }
484 
485 
486 void TGo4MBSViewer::IncTrending( TH1 * histo, int value, bool forwards )
487 {
488  if(histo==0) return;
489  int bins=histo->GetNbinsX();
490  //bool forwards=true;
491  int j,dj;
492  if(forwards)
493  dj=-1;
494  else
495  dj=+1;
496  for(int i=0;i<bins;i++)
497  {
498  if(forwards)
499  j=bins-i;
500  else
501  j=i;
502  int oldval=histo->GetBinContent(j+dj);
503  histo->SetBinContent(j,oldval);
504  }
505  histo->SetBinContent(j+dj,value);
506 }
507 
508 
510 {
511  fbTrendingInit=true;
512 }
513 
514 
515 TH1* TGo4MBSViewer::TrendHisto( QString & refname ,const QString & name, const QString & title, int value)
516 {
517  TH1* his=0;
518  TGo4Slot* histoslot=0;
519  if(!fbTrendingInit) histoslot=Browser()->BrowserSlot(refname.toLatin1());
520  if(histoslot==0)
521  {
522  Axis_t lo,up;
524  {
525  lo=0;
526  up=1*fiTrendBins*FrequencyBox->value();
527  }
528  else
529  {
530  lo=-1*fiTrendBins*FrequencyBox->value();
531  up=0;
532  }
533  his=new TH1F(name.toLatin1(), title.toLatin1() ,fiTrendBins,lo,up);
534  TAxis* xax=his->GetXaxis();
535  xax->SetTitle("s");
536  xax->CenterTitle();
537  //xax->SetLimits(0,lo,up);
538 
539  TGo4Slot* hisdataslot=Browser()->DataSlot(refname.toLatin1());
540  if(hisdataslot)
541  {
542  hisdataslot->AssignObject(his,true);
543  }
544  else
545  {
546  refname=Browser()->SaveToMemory("Mbs", his, true);
547  }
548  histoslot=Browser()->BrowserSlot(refname.toLatin1());
549  }
550  else
551  {
552  his=dynamic_cast<TH1*>(histoslot->GetAssignedObject());
553  }
554  IncTrending(his,value,fbTrendingForward);
555  if(histoslot)
556  {
557  histoslot->ForwardEvent(histoslot, TGo4Slot::evObjUpdated);
558  Browser()->SetItemTimeDate(histoslot);
559  }
560  return his;
561 }
562 
563 
565 {
566  fbShowMore=on;
568  Display();
569 }
570 
571 
573 {
574  fiTrendBins=i;
575  fbTrendingInit=true;
576 }
577 
578 
580 {
581  bool trend=fbTrending;
582  bool monitoring=fbIsMonitoring;
583  fbTrending=false; // avoid to put direct refresh into the trending histogram
584  fbIsMonitoring=false; // avoid confuse rate calculations
585  fbSingleRefresh=true; // avoid changing state of control buttons
586  Refresh();
587  fbSingleRefresh=false;
588  fbIsMonitoring=monitoring;
589  fbTrending=trend;
590 
591 }
592 
593 
594 void TGo4MBSViewer::SetNode( const QString & txt )
595 {
596  fxNode=txt;
597  NodeEdit->setText(txt);
598 }
599 
600 
602 {
603  fbRunning=false;
604  Display();
605 }
606 
607 
609 {
610  if(!fbIsMonitoring) {
611  fxMovieResetTimer->setSingleShot(true);
612  fxMovieResetTimer->start(2000);
613  }
614 }
int fiCalcedServDataRate
QString fxHistoEvRatioAccessName
INTU4 bl_r_events
Definition: s_daqst.h:48
virtual void StateGroup_clicked(int id)
QMovie * fxRunMovie
virtual void TimerStop()
QTimer * fxTimer
TString SaveToMemory(const char *pathname, TObject *obj, Bool_t ownership, Bool_t overwrite=kFALSE)
void setMbsMonitorMonitorActive(bool on=true)
void setMbsMonitorTrend(bool on=true)
QString fxServerLabel
INTU4 bl_r_kbyte
Definition: s_daqst.h:51
#define SYS__stream_serv
Definition: sys_def.h:41
INTU4 bl_evtsrv_scale
Definition: s_daqst.h:107
virtual void MoreBox_toggled(bool on)
virtual void StartMovieReset()
INTU4 bl_strsrv_scale
Definition: s_daqst.h:101
virtual void Display()
#define SYS__event_serv
Definition: sys_def.h:34
INTU4 bh_set_ml_loaded
Definition: s_daqst.h:34
INTU4 bl_n_kbyte
Definition: s_daqst.h:41
virtual void PrintStatus()
INTU4 bl_n_kbyte_file
Definition: s_daqst.h:47
virtual void TrendSwitched(bool on)
TH1 * TrendHisto(QString &refname, const QString &name, const QString &title, int value)
QString fxHistoAccessName
Definition: TGo4MBSViewer.h:98
QString fxMessage
virtual void StoreSettings()
virtual void FrequencyBox_valueChanged(int)
virtual void TrendBinsBox_valueChanged(int i)
INTU4 bh_setup_loaded
Definition: s_daqst.h:33
bool fbTrendingForward
Definition: TGo4MBSViewer.h:94
TGo4BrowserProxy * Browser()
Definition: QGo4Widget.cpp:224
QButtonGroup * StateGroup
#define STC__SUCCESS
Definition: f_stccomm.h:369
INTU4 bl_n_strserv_kbytes
Definition: s_daqst.h:45
INTU4 bh_acqui_running
Definition: s_daqst.h:31
INTU4 bl_n_events
Definition: s_daqst.h:38
TGo4Slot * DataSlot(const char *item)
virtual void UpdateTrending()
s_set_mo fxSetupMO
Definition: TGo4MBSViewer.h:92
int INTS4
Definition: typedefs.h:28
TObject * GetAssignedObject()
Definition: TGo4Slot.cxx:370
QElapsedTimer fxDeltaClock
virtual void IncTrending(TH1 *histo, int value, bool forwards)
virtual void SetNode(const QString &txt)
INTU4 bh_event_serv_ready
Definition: s_daqst.h:100
virtual void RefreshButtonClick()
bool getMbsMonitorTrend()
bool getMbsMonitorMore()
INTU4 bl_r_strserv_kbytes
Definition: s_daqst.h:56
virtual void Refresh()
INTS4 f_ut_seg_show(s_daqst *ps_daqst, s_setup *ps_setup, s_set_ml *ps_set_ml, s_set_mo *ps_set_mo)
Definition: f_ut_seg_show.c:51
void setMbsMonitorNode(const QString &name)
TGo4QSettings * go4sett
INTS4 f_mbs_mo_setup(CHARS *, s_set_mo *)
Definition: f_mbs_status.c:175
QString fxHistokBAccessName
Definition: TGo4MBSViewer.h:95
TGo4MBSViewer(QWidget *parent=0, const char *name=0)
virtual void NodeEditEnter()
TGo4Slot * BrowserSlot(const char *item)
INTS4 l_open_file
Definition: s_daqst.h:70
s_set_ml fxSetupML
bool getMbsMonitorBackwardsTrending()
CHARS c_date[SBS__STR_LEN_64]
Definition: s_daqst.h:128
INTU4 bh_set_mo_loaded
Definition: s_daqst.h:35
QString getMbsMonitorNode()
virtual ~TGo4MBSViewer()
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=0)
Definition: TGo4Slot.cxx:581
virtual void ResetRunIcon()
s_daqst fxDaqStat
INTS4 f_mbs_status(CHARS *, s_daqst *)
Definition: f_mbs_status.c:55
Bool_t AssignObject(TObject *obj, Bool_t owner)
Definition: TGo4Slot.cxx:358
INTS4 f_mbs_setup(CHARS *, s_setup *)
Definition: f_mbs_status.c:87
INTS4 f_mbs_ml_setup(CHARS *, s_set_ml *)
Definition: f_mbs_status.c:132
QTimer * fxMovieResetTimer
void setMbsMonitorBins(int num)
INTU4 bh_running[SYS__N_MAX_PROCS]
Definition: s_daqst.h:83
char CHARS
Definition: typedefs.h:21
void setMbsMonitorBackwardsTrending(bool on=true)
INTU4 bl_r_evserv_kbytes
Definition: s_daqst.h:54
virtual void NodeChanged(const QString &txt)
virtual void TimerStart()
void setMbsMonitorFreq(int secs)
static void SetItemTimeDate(TGo4Slot *slot, const char *stime=0, const char *sdate=0)
void setMbsMonitorMore(bool on=true)
bool fbSingleRefresh
Definition: TGo4MBSViewer.h:88
INTU4 bl_n_evserv_kbytes
Definition: s_daqst.h:43
CHARS c_file_name[256]
Definition: s_daqst.h:142
virtual void ShowStatus()
QString fxRefTime