Class Reference for E1039 Core & Analysis Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OnlMonUI.cc
Go to the documentation of this file.
1 #include <iostream>
2 #include <sstream>
3 #include <sys/stat.h>
4 #include <TSystem.h>
5 #include <TGFrame.h>
6 #include <TGTextView.h>
7 #include <TGButton.h>
8 #include <TGLabel.h>
9 #include <TGNumberEntry.h>
10 #include <TGDoubleSlider.h>
11 #include "OnlMonComm.h"
12 #include "OnlMonClient.h"
13 #include "OnlMonUI.h"
14 using namespace std;
15 
17  : m_auto_cycle(false)
18  , m_interval(10)
19  , m_tid1(0)
20  , m_tid2(0)
21  , m_list_omc(list)
22 {
23  ;
24 }
25 
27 {
29  StartBgProc();
30 }
31 
33 {
34  m_fr_main = new TGMainFrame(gClient->GetRoot(), 200, 900);
35  m_fr_main->SetWMPosition(0, 0); // Often ignored by the window manager
36 
37  string fn_img = gSystem->Getenv("E1039_RESOURCE");
38  fn_img += "/image/onlmon_banner.png";
39  struct stat st;
40  if (stat(fn_img.c_str(), &st) == 0) {
41  TGPictureButton* head2 = new TGPictureButton(m_fr_main, fn_img.c_str());
42  head2->SetCommand("cout << \">> E1039 Online Monitor <<\" << endl;");
43  m_fr_main->AddFrame(head2);
44  } else {
45  TGTextView* head = new TGTextView(m_fr_main, 200, 40, "E1039 Online Monitor");
46  m_fr_main->AddFrame(head);
47  }
48 
49  TGTextButton* button[99];
50  for (unsigned int ii = 0; ii < m_list_omc->size(); ii++) {
51  button[ii] = new TGTextButton(m_fr_main, m_list_omc->at(ii)->Title().c_str());
52  button[ii]->Connect("Clicked()", "OnlMonClient", m_list_omc->at(ii), "StartMonitor()");
53  m_fr_main->AddFrame(button[ii], new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 2,2,2,2)); // (l, r, t, b)
54  }
55 
56  TGLabel* lbl_sp_sel = new TGLabel(m_fr_main, "- - - Spill Selection - - -");
57  m_fr_main->AddFrame(lbl_sp_sel, new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 2,2,5,2));
58 
59  { // Spill selector by none
60  TGHorizontalFrame* fr_sp_all = new TGHorizontalFrame(m_fr_main);
61 
62  m_rad_sp_all = new TGRadioButton(fr_sp_all, "All ");
63  m_rad_sp_all->Connect("Pressed()", "OnlMonUI", this, "HandleSpRadAll()");
64  fr_sp_all->AddFrame(m_rad_sp_all, new TGLayoutHints(kLHintsCenterY, 2,2,2,2));
65 
66  m_lbl_sp = new TGLabel(fr_sp_all, "? ? ? ? ? ?-? ? ? ? ? ?");
67  fr_sp_all->AddFrame(m_lbl_sp, new TGLayoutHints(kLHintsCenterY | kLHintsExpandX | kLHintsRight, 2,2,2,2));
68 
69  m_fr_main->AddFrame(fr_sp_all);
70  }
71 
72  { // Spill selector by number
73  TGHorizontalFrame* fr_sp_last = new TGHorizontalFrame(m_fr_main);
74 
75  m_rad_sp_last = new TGRadioButton(fr_sp_last, "Last ");
76  m_rad_sp_last->Connect("Pressed()", "OnlMonUI", this, "HandleSpRadLast()");
77  fr_sp_last->AddFrame(m_rad_sp_last, new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 2,2,2,2));
78 
79  m_num_sp = new TGNumberEntry(fr_sp_last, OnlMonComm::instance()->GetSpillNum(), 2);
80  m_num_sp->Connect("ValueSet(Long_t)", "OnlMonUI", this, "HandleSpLastNum()");
81  fr_sp_last->AddFrame(m_num_sp, new TGLayoutHints(kLHintsCenterY | kLHintsCenterX, 2,2,2,2));
82 
83  TGLabel* lbl_sp_last = new TGLabel(fr_sp_last, "spills");
84  fr_sp_last->AddFrame(lbl_sp_last, new TGLayoutHints(kLHintsCenterY | kLHintsRight, 2,2,2,2));
85 
86  m_fr_main->AddFrame(fr_sp_last);
87  }
88 
89  { // Spill selector by spill range
90  m_rad_sp_range = new TGRadioButton(m_fr_main, "Range");
91  m_rad_sp_range->Connect("Pressed()", "OnlMonUI", this, "HandleSpRadRange()");
92  m_fr_main->AddFrame(m_rad_sp_range, new TGLayoutHints(kLHintsCenterY | kLHintsExpandX, 2,2,2,2));
93 
94  m_fr_sp_range = new TGVerticalFrame(m_fr_main);
95 
96  TGHorizontalFrame* fr_sp = new TGHorizontalFrame(m_fr_sp_range);
97 
98  m_num_sp0 = new TGNumberEntry(fr_sp, 0, 5);
99  m_num_sp0->Connect("ValueSet(Long_t)", "OnlMonUI", this, "HandleSpEntLo()");
100  fr_sp->AddFrame(m_num_sp0, new TGLayoutHints(kLHintsCenterY | kLHintsCenterX));
101 
102  TGLabel* lbl_sp2 = new TGLabel(fr_sp, "-");
103  fr_sp->AddFrame(lbl_sp2, new TGLayoutHints(kLHintsCenterY | kLHintsCenterX));
104 
105  m_num_sp1 = new TGNumberEntry(fr_sp, 0, 5);
106  m_num_sp1->Connect("ValueSet(Long_t)", "OnlMonUI", this, "HandleSpEntHi()");
107  fr_sp->AddFrame(m_num_sp1, new TGLayoutHints(kLHintsCenterY | kLHintsRight));
108 
109  m_fr_sp_range->AddFrame(fr_sp, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 2,2,2,2));
110 
111  m_slider = new TGDoubleHSlider(m_fr_sp_range, 180, 0);
112  m_slider->Connect("PositionChanged()", "OnlMonUI", this, "HandleSpSlider()");
113  m_slider->SetRange(1, 10);
114  m_fr_sp_range->AddFrame(m_slider, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 2,2,2,2));
115 
116  m_fr_main->AddFrame(m_fr_sp_range);
117  }
118 
119 
120  TGCheckButton* check = new TGCheckButton(m_fr_main, new TGHotString("Auto-close all canvases"), 99);
121  check->SetToolTipText("When checked, all existing canvases are closed by clicking any button above.");
122  check->SetState(OnlMonClient::GetClearUsFlag() ? kButtonDown : kButtonUp);
123  check->Connect("Toggled(Bool_t)", "OnlMonClient", m_list_omc->at(0), "SetClearUsFlag(Bool_t)");
124  m_fr_main->AddFrame(check, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 2,2,2,2));
125 
126  //TGCheckButton* cycle = new TGCheckButton(m_fr_main, new TGHotString("Auto-cycle all subsystems"), 99);
127  //cycle->SetToolTipText("When checked, all subsystems are automatically drawn.");
128  //cycle->SetState(GetAutoCycleFlag() ? kButtonDown : kButtonUp);
129  //cycle->Connect("Toggled(Bool_t)", "OnlMonUI", this, "SetAutoCycleFlag(Bool_t)");
130  //m_fr_main->AddFrame(cycle, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 2,2,5,5));
131 
132  TGTextButton* fExit = new TGTextButton(m_fr_main, "Exit","gApplication->Terminate(0)");
133  m_fr_main->AddFrame(fExit, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2,2,5,5));
134 
135  m_fr_main->SetWindowName("E1039 Online Monitor");
136  m_fr_main->MapSubwindows();
137  HandleSpRadAll();
138  //m_fr_main->Resize(m_fr_main->GetDefaultSize());
139  //m_fr_main->MapWindow();
140 }
141 
143 {
144  pthread_create(&m_tid1, NULL, FuncAutoCycle, this);
145  pthread_create(&m_tid2, NULL, ExecSpillRangeCheck, this);
146 }
147 
148 void* OnlMonUI::FuncAutoCycle(void* arg)
149 {
150  OnlMonUI* ui = (OnlMonUI*)arg;
151  ui->ExecAutoCycle();
152  return 0;
153 }
154 
156 
162 {
163  unsigned int idx = 0;
164  while (true) {
165  if (m_auto_cycle) {
166  //button[idx]->Clicked();
167  m_list_omc->at(idx)->StartMonitor();
168  //++idx;
169  if (++idx >= m_list_omc->size()) idx = 0;
170  }
171  sleep(m_interval);
172  }
173 }
174 
176 {
177  OnlMonUI* ui = (OnlMonUI*)arg;
178  while (true) {
179  ui->UpdateFullSpillRange();
180  sleep(6);
181  }
182  return 0;
183 }
184 
186 {
188  comm->ReceiveFullSpillRange();
189  if (comm->GetSpillSelectability()) {
190  int sp_min, sp_max;
191  comm->GetFullSpillRange(sp_min, sp_max);
192 
193  m_num_sp0->SetLimits(TGNumberFormat::kNELLimitMinMax, sp_min, sp_max);
194  m_num_sp1->SetLimits(TGNumberFormat::kNELLimitMinMax, sp_min, sp_max);
195  m_slider->SetRange(sp_min, sp_max);
196 
197  ostringstream oss;
198  oss << sp_min << "-" << sp_max;
199  m_lbl_sp->SetText(oss.str().c_str());
200  } else {
201  m_lbl_sp->SetText("(not selectable)");
202  m_rad_sp_all ->SetOn(true );
203  m_rad_sp_last ->SetOn(false);
204  m_rad_sp_range->SetOn(false);
205  m_rad_sp_last ->SetEnabled(false);
206  m_rad_sp_range->SetEnabled(false);
207  }
208 }
209 
211 {
213  m_rad_sp_all ->SetOn(true );
214  m_rad_sp_last ->SetOn(false);
215  m_rad_sp_range->SetOn(false);
216  m_fr_main->HideFrame(m_fr_sp_range);
217  m_fr_main->Resize(m_fr_main->GetDefaultSize());
218  m_fr_main->MapWindow();
219 }
220 
222 {
224  m_rad_sp_all ->SetOn(false);
225  m_rad_sp_last ->SetOn(true );
226  m_rad_sp_range->SetOn(false);
227  m_fr_main->HideFrame(m_fr_sp_range);
228  m_fr_main->Resize(m_fr_main->GetDefaultSize());
229  m_fr_main->MapWindow();
230 }
231 
233 {
235 
236  int sp_min, sp_max;
237  OnlMonComm::instance()->GetFullSpillRange(sp_min, sp_max);
238  OnlMonComm::instance()->SetSpillRange((sp_min+sp_max)/2, sp_max);
239  SyncSpillRange();
240 
242  m_rad_sp_all ->SetOn(false);
243  m_rad_sp_last ->SetOn(false);
244  m_rad_sp_range->SetOn(true );
245  m_fr_main->ShowFrame(m_fr_sp_range);
246  m_fr_main->Resize(m_fr_main->GetDefaultSize());
247  m_fr_main->MapWindow();
248 }
249 
251 {
252  int num = (int)m_num_sp->GetNumber();
253  m_num_sp->SetNumber(num); // Make it integer
255 }
256 
258 {
259  OnlMonComm::instance()->SetSpillRangeLow((int)m_num_sp0->GetNumber());
260  SyncSpillRange();
261 }
262 
264 {
265  OnlMonComm::instance()->SetSpillRangeHigh((int)m_num_sp1->GetNumber());
266  SyncSpillRange();
267 }
268 
270 {
271  float sp_lo, sp_hi;
272  m_slider->GetPosition(sp_lo, sp_hi);
273  OnlMonComm::instance()->SetSpillRange((int)sp_lo, (int)sp_hi);
274  SyncSpillRange();
275 }
276 
278 {
279  int sp_lo, sp_hi;
280  OnlMonComm::instance()->GetSpillRange(sp_lo, sp_hi);
281  m_slider->SetPosition(sp_lo, sp_hi);
282  m_num_sp0->SetNumber (sp_lo);
283  m_num_sp1->SetNumber (sp_hi);
284 }
bool GetSpillSelectability()
Definition: OnlMonComm.h:33
void HandleSpSlider()
Definition: OnlMonUI.cc:269
void UpdateFullSpillRange()
Definition: OnlMonUI.cc:185
void ExecAutoCycle()
This function does NOT work at present.
Definition: OnlMonUI.cc:161
void SetSpillRangeHigh(const int sp)
Definition: OnlMonComm.cc:45
void Run()
Definition: OnlMonUI.cc:26
void HandleSpEntHi()
Definition: OnlMonUI.cc:263
void SetSpillMode(const SpillMode_t mode)
Definition: OnlMonComm.h:29
void GetSpillRange(int &sp_lo, int &sp_hi)
Definition: OnlMonComm.cc:56
void SetSpillNum(const int num)
Definition: OnlMonComm.h:35
#define NULL
Definition: Pdb.h:9
void SetSpillRange(const int sp_lo, const int sp_hi)
Definition: OnlMonComm.cc:50
void SetSpillRangeLow(const int sp)
Definition: OnlMonComm.cc:40
static void * FuncAutoCycle(void *arg)
Definition: OnlMonUI.cc:148
std::vector< OnlMonClient * > OnlMonClientList_t
Definition: OnlMonUI.h:12
void HandleSpRadRange()
Definition: OnlMonUI.cc:232
int ReceiveFullSpillRange()
Definition: OnlMonComm.cc:78
void HandleSpRadLast()
Definition: OnlMonUI.cc:221
void HandleSpLastNum()
Definition: OnlMonUI.cc:250
static OnlMonComm * instance()
Definition: OnlMonComm.cc:16
void HandleSpEntLo()
Definition: OnlMonUI.cc:257
void GetFullSpillRange(int &id_min, int &id_max)
Definition: OnlMonComm.cc:105
static bool GetClearUsFlag()
Definition: OnlMonClient.h:93
void BuildInterface()
Definition: OnlMonUI.cc:32
void StartBgProc()
Definition: OnlMonUI.cc:142
void SyncSpillRange()
Definition: OnlMonUI.cc:277
void HandleSpRadAll()
Definition: OnlMonUI.cc:210
static void * ExecSpillRangeCheck(void *arg)
Definition: OnlMonUI.cc:175
OnlMonUI(OnlMonClientList_t *list)
Definition: OnlMonUI.cc:16