duration -> durationInSec
[agianapa.git] / socg / controlDialog.cpp
blob2807110109eb4ef1a9535b3e3a8b187ff7b7e334
1 #include <iostream>
2 //#include <QString>
3 #include <QTextStream>
5 #include "controlDialog.h"
6 #include "myglwidget.h"
7 #include "workerthread.h"
9 ControlDialog::ControlDialog(QWidget *parent)
10 : QDialog(parent)
12 qDebug("ControlDialog::ControlDialog()");
14 // Worker thread populates the data pool with coordinations and angles.
15 // It automatically blocks once the pool has reached a maximum number
16 // of data and wakes up when data resource are low.
17 m_thread.start();
19 // Setup GUI
20 setupUi(this);
22 // Connect signals
23 connect(this, SIGNAL(glSceneNeedsUpdate()),
24 &m_GLScene, SLOT(updateGL()));
25 connect(fileNameEdit, SIGNAL(returnPressed()),
26 this, SLOT(on_fileNameChangedManually()));
27 connect(this, SIGNAL(fileNameChanged(QString)),
28 &m_thread, SLOT(setFileName(QString)));
30 // Timeline
31 connect(&m_timeLine, SIGNAL(valueChanged(qreal)),
32 this, SLOT(pullData(qreal)));
34 // Initialize axis, camera, sphere.
35 // XXX: axis
36 m_axisX.setColor(QColor(255, 0, 0));
37 m_axisY.setColor(QColor(0, 255, 0));
38 m_axisZ.setColor(QColor(0, 0, 255));
39 m_localAxisSystem = false;
41 // Camera
42 m_camera.setEyeX(eyeXEdit->text().toFloat());
43 m_camera.setEyeY(eyeYEdit->text().toFloat());
44 m_camera.setEyeZ(eyeZEdit->text().toFloat());
46 m_camera.setCenterX(centerXEdit->text().toFloat());
47 m_camera.setCenterY(centerYEdit->text().toFloat());
48 m_camera.setCenterZ(centerZEdit->text().toFloat());
50 m_camera.setUpX(upXEdit->text().toFloat());
51 m_camera.setUpY(upYEdit->text().toFloat());
52 m_camera.setUpZ(upZEdit->text().toFloat());
54 // Sphere
55 m_sphere.setRadius(radiusSpin->value());
56 m_sphere.setSlices(slicesSpin->value());
57 m_sphere.setStacks(stacksSpin->value());
58 m_sphere.setCulling(cullingCheck->checkState() == Qt::Checked ?
59 true : false);
61 // Pass objects to GL scene.
62 m_GLScene.setAxis(AXIS_X, &m_axisX);
63 m_GLScene.setAxis(AXIS_Y, &m_axisY);
64 m_GLScene.setAxis(AXIS_Z, &m_axisZ);
66 m_GLScene.setCamera(&m_camera);
67 m_GLScene.setSphere(&m_sphere);
68 m_GLScene.setCoordsAndAngles(&m_coordsAndAngles);
70 // Show scene
71 m_GLScene.setWindowTitle("GL Scene");
72 // Window manager might ignore the following line
73 m_GLScene.move(pos().x() + frameGeometry().width(), pos().y());
74 m_GLScene.show();
76 // At this point the animation isn't ready to begin.
77 // We still miss the following function calls:
78 // WorkerThread::setFileName()
79 // QTimeLine::setFrameRange()
80 // QTimeLine::setUpdateInterval()
81 // QTimeLine::setDuration()
84 ControlDialog::~ControlDialog()
86 qDebug("ControlDialog::~ControlDialog()");
89 void ControlDialog::on_startButton_clicked()
91 qDebug("ControlDialog::on_startButton_clicked()");
93 m_timeLine.start();
94 stopButton->setEnabled(true);
97 void ControlDialog::on_stopButton_clicked()
99 qDebug("ControlDialog::on_stopButton_clicked()");
101 m_timeLine.stop();
102 stopButton->setEnabled(false);
105 void ControlDialog::on_exitButton_clicked()
107 // qApp is a global pointer referring to the unique application object.
108 qApp->closeAllWindows();
111 void ControlDialog::on_xAxisVisibleCheck_stateChanged(int state)
113 qDebug("ControlDialog::on_xAxisVisibleCheck_stateChanged()\n"
114 "New state = %d", state);
116 m_axisX.setVisible(state == Qt::Checked ? true : false);
117 emit glSceneNeedsUpdate();
120 void ControlDialog::on_yAxisVisibleCheck_stateChanged(int state)
122 qDebug("ControlDialog::on_yAxisVisibleCheck_stateChanged()\n"
123 "New state = %d", state);
125 m_axisY.setVisible(state == Qt::Checked ? true : false);
126 emit glSceneNeedsUpdate();
129 void ControlDialog::on_zAxisVisibleCheck_stateChanged(int state)
131 qDebug("ControlDialog::on_zAxisVisibleCheck_stateChanged()\n"
132 "New state = %d", state);
134 m_axisZ.setVisible(state == Qt::Checked ? true : false);
135 emit glSceneNeedsUpdate();
138 void ControlDialog::on_localAxisCheck_stateChanged(int state)
140 qDebug("ControlDialog::on_localAxisCheck_stateChanged()\n"
141 "New state = %d", state);
143 m_axisX.setLocal(state == Qt::Checked ? true : false);
144 m_axisY.setLocal(state == Qt::Checked ? true : false);
145 m_axisZ.setLocal(state == Qt::Checked ? true : false);
146 emit glSceneNeedsUpdate();
149 void ControlDialog::on_stacksSpin_valueChanged(int i)
151 qDebug("ControlDialog::on_stacksSpin_valueChanged()\n"
152 "New value = %d", i);
154 m_sphere.setStacks(i);
155 emit glSceneNeedsUpdate();
158 void ControlDialog::on_slicesSpin_valueChanged(int i)
160 qDebug("ControlDialog::on_slicesSpin_valueChanged()\n"
161 "New value = %d", i);
163 m_sphere.setSlices(i);
164 emit glSceneNeedsUpdate();
167 void ControlDialog::on_radiusSpin_valueChanged(double d)
169 qDebug("ControlDialog::on_radiusSpin_valueChanged()\n"
170 "New value = %f", d);
172 m_sphere.setRadius(d);
173 emit glSceneNeedsUpdate();
176 void ControlDialog::on_cullingCheck_stateChanged(int state)
178 qDebug("ControlDialog::on_cullingCheck_stateChanged()\n"
179 "New state = %d", state);
181 m_sphere.setCulling(state == Qt::Checked ? true : false);
182 emit glSceneNeedsUpdate();
185 // Camera tab related slots
186 void ControlDialog::on_eyeXEdit_textChanged(const QString& text)
188 qDebug("ControlDialog::on_eyeXEdit_textChanged()\n"
189 "New eyeX = %f", text.toFloat());
191 m_camera.setEyeX(text.toFloat());
192 emit glSceneNeedsUpdate();
195 void ControlDialog::on_eyeYEdit_textChanged(const QString& text)
197 qDebug("ControlDialog::on_eyeYEdit_textChanged()\n"
198 "New eyeY = %f", text.toFloat());
200 m_camera.setEyeY(text.toFloat());
201 emit glSceneNeedsUpdate();
204 void ControlDialog::on_eyeZEdit_textChanged(const QString& text)
206 qDebug("ControlDialog::on_eyeZEdit_textChanged()\n"
207 "New eyeZ = %f", text.toFloat());
209 m_camera.setEyeZ(text.toFloat());
210 emit glSceneNeedsUpdate();
213 void ControlDialog::on_centerXEdit_textChanged(const QString& text)
215 qDebug("ControlDialog::on_centerXEdit_textChanged()\n"
216 "New centerX = %f", text.toFloat());
218 m_camera.setCenterX(text.toFloat());
219 emit glSceneNeedsUpdate();
222 void ControlDialog::on_centerYEdit_textChanged(const QString& text)
224 qDebug("ControlDialog::on_centerYEdit_textChanged()\n"
225 "New centerY = %f", text.toFloat());
227 m_camera.setCenterY(text.toFloat());
228 emit glSceneNeedsUpdate();
231 void ControlDialog::on_centerZEdit_textChanged(const QString& text)
233 qDebug("ControlDialog::on_centerZEdit_textChanged()\n"
234 "New centerZ = %f", text.toFloat());
236 m_camera.setCenterZ(text.toFloat());
237 emit glSceneNeedsUpdate();
240 void ControlDialog::on_upXEdit_textChanged(const QString& text)
242 qDebug("ControlDialog::on_upXEdit_textChanged()\n"
243 "New upX = %f", text.toFloat());
245 m_camera.setUpX(text.toFloat());
246 emit glSceneNeedsUpdate();
249 void ControlDialog::on_upYEdit_textChanged(const QString& text)
251 qDebug("ControlDialog::on_upYEdit_textChanged()\n"
252 "New upY = %f", text.toFloat());
254 m_camera.setUpY(text.toFloat());
255 emit glSceneNeedsUpdate();
258 void ControlDialog::on_upZEdit_textChanged(const QString& text)
260 qDebug("ControlDialog::on_upZEdit_textChanged()\n"
261 "New upZ = %f", text.toFloat());
263 m_camera.setUpZ(text.toFloat());
264 emit glSceneNeedsUpdate();
267 void ControlDialog::on_browseFileButton_clicked(void)
269 QString fileName;
270 qDebug("ControlDialog::on_browseFileButton_clicked()");
272 // Get filename from open dialog
273 fileName = QFileDialog::getOpenFileName(this, tr("Open data file"),
274 "/home",
275 "Data files(*.dat);; All files(*)");
276 if (fileName == NULL) {
277 qDebug("QFileDialog::getOpenFileName() returned NULL"
278 "(user pressed cancel");
279 return;
282 // CAUTION: these lines must precede or else the
283 // WorkerThread::extractHeader() won't be called.
284 fileNameEdit->setText(fileName);
285 emit fileNameChanged(fileName);
287 // Update time line
288 m_timeLine.setFrameRange(0, m_thread.getNumOfRecords());
289 m_timeLine.setUpdateInterval(1000 / fpsSpin->value());
290 m_timeLine.setDuration(m_thread.getDurationInSec() * 1000);
291 qDebug("End frame: %d\n", m_timeLine.endFrame());
293 // Construct strings based on the extracted header from the binary file
294 QString magicVersionStr = QString("0x%1")
295 .arg(m_thread.getMagicVersion(), 0, 16).toUpper();
296 QString protocolVersionStr = QString::number(m_thread.getProtocolVersion());
297 QString durationStr = QString::number(m_thread.getDurationInSec());
298 QString numberOfRecordsStr = QString::number(m_thread.getNumOfRecords());
300 // Update the labels in control dialog
301 magicVersionOutputLabel->setText(magicVersionStr);
302 protocolVersionOutputLabel->setText(protocolVersionStr);
303 durationOutputLabel->setText(durationStr);
304 numberOfRecordsOutputLabel->setText(numberOfRecordsStr);
306 if (!startButton->isEnabled())
307 startButton->setEnabled(true);
310 void ControlDialog::on_fileNameChangedManually(void)
312 qDebug("ControlDialog::on_fileNameChangedManually()");
314 QString fileName = fileNameEdit->text();
315 emit fileNameChanged(fileName);
318 void ControlDialog::pullData(qreal time)
320 float t, xp, yp, zp, xa, ya, za;
321 qDebug("ControlDialog::pullData()");
323 // Acquire lock
324 m_thread.m_mutex.lock();
326 AGAIN:;
327 qDebug("Timeline[0, 1] = %f\tTarget time(sec) = %f\tCurrent time(sec) = %f",
328 time, time * m_thread.getDurationInSec(), m_t);
330 if (m_thread.m_data.size() >= 1000) {
331 qDebug("Queue size = %d", m_thread.m_data.size());
332 m_t = m_thread.m_data.dequeue();
333 xp = m_thread.m_data.dequeue();
334 yp = m_thread.m_data.dequeue();
335 zp = m_thread.m_data.dequeue();
336 xa = m_thread.m_data.dequeue();
337 ya = m_thread.m_data.dequeue();
338 za = m_thread.m_data.dequeue();
339 //qDebug("t = %f\txp = %f\typ = %f\tzp = %f\txa = %f\tya = %f\tza = %f",
340 // t, xp, yp, zp, xa, ya, za);
341 if (m_t < m_thread.getDurationInSec() * time)
342 goto AGAIN;
343 else {
344 m_coordsAndAngles.setCoordsAndAngles(xp, yp, zp, xa, ya, za);
345 goto OUT;
348 else {
349 m_thread.m_mutex.unlock();
350 qDebug("WAKING THREAD");
351 m_thread.condition.wakeOne();
352 return;
354 OUT:;
355 m_thread.m_mutex.unlock();
357 emit glSceneNeedsUpdate();
360 void ControlDialog::on_fpsSpin_valueChanged(int i)
362 qDebug("ControlDialog::on_fpsSpin_valueChanged()\n"
363 "New value = %d", i);
365 m_timeLine.stop();
366 m_timeLine.setFrameRange(0, i * m_thread.getDurationInSec());
367 qDebug("=======> %d\n", m_timeLine.endFrame());
368 m_timeLine.setUpdateInterval(1000 / i);
369 //m_timeLine.start();
371 // Don't resume animation, unless it was running before.
372 if (stopButton->isEnabled())
373 m_timeLine.resume();