source: trunk/FACT++/gui/MainWindow.cc@ 11103

Last change on this file since 11103 was 11102, checked in by tbretz, 13 years ago
Added possibility to set the clock conditioner's frequency for some selected frequency.
File size: 8.7 KB
Line 
1#include "MainWindow.h"
2
3#include <iostream>
4#include <sstream>
5
6#include <QTimer>
7
8#include "src/Dim.h"
9
10#include "DockWindow.h"
11#include "HtmlDelegate.h"
12#include "CheckBoxDelegate.h"
13
14using namespace std;
15
16void MainWindow::MakeLEDs(QPushButton **arr, QGridLayout *lay, const char *slot) const
17{
18 arr[0]->setToolTip("Crate 0, Board 0, Index 0");
19
20 for (int i=1; i<40; i++)
21 {
22 QPushButton *b = new QPushButton(static_cast<QWidget*>(arr[0]->parent()));
23
24 b->setEnabled(arr[0]->isEnabled());
25 b->setSizePolicy(arr[0]->sizePolicy());
26 b->setMaximumSize(arr[0]->maximumSize());
27 b->setIcon(arr[0]->icon());
28 b->setIconSize(arr[0]->iconSize());
29 b->setCheckable(arr[0]->isCheckable());
30 b->setFlat(arr[0]->isFlat());
31
32 ostringstream str;
33 str << "Crate " << i/10 << ", Board " << i%10 << ", Index " << i;
34 b->setToolTip(str.str().c_str());
35
36 lay->addWidget(b, i/10+1, i%10+1, 1, 1);
37
38 arr[i] = b;
39 }
40
41 const QString name = arr[0]->objectName();
42
43 for (int i=0; i<40; i++)
44 {
45 arr[i]->setObjectName(name+QString::number(i));
46 QObject::connect(arr[i], SIGNAL(clicked()), this, slot);
47 }
48}
49
50MainWindow::MainWindow(QWidget *p) : QMainWindow(p)
51{
52 // setupUi MUST be called before the DimNetwork is initilized
53 // In this way it can be ensured that nothing from the
54 // DimNetwork arrives before all graphical elements are
55 // initialized. This is a simple but very powerfull trick.
56 setupUi(this);
57
58 // Now here we can do further setup which should be done
59 // before the gui is finally displayed.
60 fDimCmdServers->setItemDelegate(new CheckBoxDelegate);
61 fDimCmdCommands->setItemDelegate(new CheckBoxDelegate);
62 fDimCmdDescription->setItemDelegate(new HtmlDelegate);
63
64 fDimSvcServers->setItemDelegate(new CheckBoxDelegate);
65 fDimSvcServices->setItemDelegate(new CheckBoxDelegate);
66 fDimSvcDescription->setItemDelegate(new HtmlDelegate);
67
68 // Set a default string to be displayed in a the status bar at startup
69 fStatusBar->showMessage(PACKAGE_STRING" | "PACKAGE_URL" | report bugs to <"PACKAGE_BUGREPORT">");
70
71 // Initialize the 40 FTU Leds as a copy of the prototype LED
72 fFtuLED[0] = fFtuLEDPrototype;
73 MakeLEDs(fFtuLED, fFtuLedLayout, SLOT(slot_fFtuLED_clicked()));
74
75 // Initialize the 40 FAD Leds as a copy of the prototype LED
76 fFadLED[0] = fFadLEDPrototype;
77 MakeLEDs(fFadLED, fFadLedLayout, SLOT(slot_fFadLED_clicked()));
78
79 // Initialize a timer to update the displayed UTC time
80 QTimer *timer = new QTimer(this);
81 connect(timer, SIGNAL(timeout()), this, SLOT(slot_TimeUpdate()));
82 timer->start(100);
83}
84
85void MainWindow::slot_TimeUpdate()
86{
87 // Used toUTC to support also older Qt versions
88 // toTime_t() always returns the datetime converted to UTC
89 // dateTime() unfortunately returns our UTC always as LocalTime
90 QDateTime now = QDateTime::currentDateTime().toUTC();
91 now.setTimeSpec(Qt::LocalTime);
92
93 if (now.toTime_t()==fUTC->dateTime().toTime_t())
94 return;
95
96 fUTC->setDateTime(now);
97}
98
99
100void MainWindow::SelectTab(const QString &name)
101{
102 for (int i=0; i<fTabWidget->count(); i++)
103 if (fTabWidget->tabText(i)==name)
104 {
105 fTabWidget->setCurrentIndex(i);
106 break;
107 }
108}
109
110
111void MainWindow::on_fShutdown_clicked()
112{
113 Dim::SendCommand("DIS_DNS/KILL_SERVERS");
114}
115
116
117void MainWindow::on_fShutdownAll_clicked()
118{
119 Dim::SendCommand("DIS_DNS/KILL_SERVERS");
120 Dim::SendCommand("DIS_DNS/EXIT", int(1));
121}
122
123void MainWindow::on_fTabWidget_tabCloseRequested(int which)
124{
125 // To get the correct size we have to switch to this tab
126 // An alternative would be to take the size of the current tab
127 fTabWidget->setCurrentIndex(which);
128
129 QWidget *w = fTabWidget->currentWidget(); //fTabWidget->widget(which);
130 if (!w)
131 {
132 cout << "Weird... the tab requested to be closed doesn't exist!" << endl;
133 return;
134 }
135
136 QDockWidget *d = w->findChild<QDockWidget*>();
137 if (!d)
138 {
139 cout << "Sorry, tab requested to be closed contains no QDockWidget!" << endl;
140 return;
141 }
142
143 new DockWindow(d, fTabWidget->tabText(which));
144 fTabWidget->removeTab(which);
145
146 if (fTabWidget->count()==1)
147 fTabWidget->setTabsClosable(false);
148}
149
150void MainWindow::SetTriggerSequence()
151{
152 const uint16_t d[3] =
153 {
154 uint16_t(fTriggerSeqPed->value()),
155 uint16_t(fTriggerSeqLPext->value()),
156 uint16_t(fTriggerSeqLPint->value())
157 };
158
159 if (!fInHandler)
160 Dim::SendCommand("FTM_CONTROL/SET_TRIGGER_SEQUENCE", d);
161}
162
163void on_fEnableTrigger_clicked(bool b)
164{
165 Dim::SendCommand("FTM_CONTROL/ENABLE_TRIGGER", b);
166}
167
168void on_fEnableExt1_clicked(bool b)
169{
170 Dim::SendCommand("FTM_CONTROL/ENABLE_EXT1", b);
171}
172
173void on_fEnableExt2_clicked(bool b)
174{
175 Dim::SendCommand("FTM_CONTROL/ENABLE_EXT2", b);
176}
177
178void on_fEnableVeto_clicked(bool b)
179{
180 Dim::SendCommand("FTM_CONTROL/ENABLE_VETO", b);
181}
182
183void MainWindow::on_fPhysicsCoincidence_valueChanged(int v)
184{
185 if (!fInHandler)
186 Dim::SendCommand("FTM_CONTROL/SET_TRIGGER_MULTIPLICITY", v);
187}
188
189void MainWindow::on_fPhysicsWindow_valueChanged(int v)
190{
191 if (!fInHandler)
192 Dim::SendCommand("FTM_CONTROL/SET_TRIGGER_WINDOW", v/4-2);
193}
194
195void MainWindow::on_fCalibCoincidence_valueChanged(int v)
196{
197 if (!fInHandler)
198 Dim::SendCommand("FTM_CONTROL/SET_CALIBRATION_MULTIPLICITY", v);
199}
200
201void MainWindow::on_fCalibWindow_valueChanged(int v)
202{
203 if (!fInHandler)
204 Dim::SendCommand("FTM_CONTROL/SET_CALIBRATION_WINDOW", v/4-2);
205}
206
207void MainWindow::on_fTriggerInterval_valueChanged(int val)
208{
209 if (!fInHandler)
210 Dim::SendCommand("FTM_CONTROL/SET_TRIGGER_INTERVAL", val);
211}
212
213void MainWindow::on_fTriggerDelay_valueChanged(int val)
214{
215 if (!fInHandler)
216 Dim::SendCommand("FTM_CONTROL/SET_TRIGGER_DELAY", val/4-2);
217}
218
219void MainWindow::on_fTimeMarkerDelay_valueChanged(int val)
220{
221 if (!fInHandler)
222 Dim::SendCommand("FTM_CONTROL/SET_TIME_MARKER_DELAY", val/4-2);
223}
224
225void MainWindow::on_fDeadTime_valueChanged(int val)
226{
227 if (!fInHandler)
228 Dim::SendCommand("FTM_CONTROL/SET_DEAD_TIME", val/4-2);
229}
230
231void MainWindow::on_fPrescalingVal_valueChanged(int val)
232{
233 if (!fInHandler)
234 Dim::SendCommand("FTM_CONTROL/SET_PRESCALING", val);
235}
236
237void MainWindow::on_fPixelEnableAll_clicked()
238{
239 Dim::SendCommand("FTM_CONTROL/ENABLE_PIXEL", int16_t(-1));
240}
241
242void MainWindow::on_fPixelDisableAll_clicked()
243{
244 Dim::SendCommand("FTM_CONTROL/DISABLE_PIXEL", int16_t(-1));
245}
246
247void MainWindow::on_fEnableTrigger_stateChanged(int b)
248{
249 if (!fInHandler)
250 Dim::SendCommand("FTM_CONTROL/ENABLE_TRIGGER", b==Qt::Checked);
251}
252
253void MainWindow::on_fEnableExt1_stateChanged(int b)
254{
255 if (!fInHandler)
256 Dim::SendCommand("FTM_CONTROL/ENABLE_EXT1", b==Qt::Checked);
257}
258
259void MainWindow::on_fEnableExt2_stateChanged(int b)
260{
261 if (!fInHandler)
262 Dim::SendCommand("FTM_CONTROL/ENABLE_EXT2", b==Qt::Checked);
263}
264
265void MainWindow::on_fEnableClockCond_stateChanged(int b)
266{
267 if (!fInHandler)
268 Dim::SendCommand("FTM_CONTROL/ENABLE_CLOCK_CONDITIONER", b==Qt::Checked);
269}
270
271void MainWindow::on_fEnableVeto_stateChanged(int b)
272{
273 if (!fInHandler)
274 Dim::SendCommand("FTM_CONTROL/ENABLE_VETO", b==Qt::Checked);
275}
276
277void MainWindow::on_fClockCondFreq_activated(int idx)
278{
279 if (!fInHandler)
280 Dim::SendCommand("FTM_CONTROL/SET_CLOCK_FREQUENCY", fClockCondFreq->itemData(idx).toInt());
281}
282
283void MainWindow::slot_fFtuLED_clicked()
284{
285 for (int32_t i=0; i<40; i++)
286 if (sender()==fFtuLED[i])
287 {
288 Dim::SendCommand("FTM_CONTROL/TOGGLE_FTU", i);
289 break;
290 }
291}
292
293void MainWindow::on_fFtuPing_toggled(bool checked)
294{
295 if (checked)
296 Dim::SendCommand("FTM_CONTROL/PING");
297}
298
299void MainWindow::on_fFtuAllOn_clicked()
300{
301 static const struct Data { int32_t id; char on; } __attribute__((__packed__)) d = { -1, 1 };
302 Dim::SendCommand("FTM_CONTROL/ENABLE_FTU", &d, sizeof(d));
303}
304
305void MainWindow::on_fFtuAllOff_clicked()
306{
307 static const struct Data { int32_t id; char on; } __attribute__((__packed__)) d = { -1, 0 };
308 Dim::SendCommand("FTM_CONTROL/ENABLE_FTU", &d, sizeof(d));
309}
310
311void MainWindow::on_fChatSend_clicked()
312{
313 const string msg = fChatMessage->text().toStdString();
314 if (Dim::SendCommand("CHAT/MSG", msg.c_str(), msg.length()+1))
315 fChatMessage->clear();
316}
317
318void MainWindow::on_fStatusLoggerLed_clicked()
319{
320 SelectTab("Logger");
321}
322
323void MainWindow::on_fStatusChatLed_clicked()
324{
325 SelectTab("Chat");
326}
327
328void MainWindow::on_fStatusFTMLed_clicked()
329{
330 SelectTab("Trigger");
331}
332
333void MainWindow::on_fStatusFTULed_clicked()
334{
335 SelectTab("FTUs");
336}
337
338void MainWindow::on_fStatusFADLed_clicked()
339{
340 SelectTab("FAD");
341}
Note: See TracBrowser for help on using the repository browser.