From 1b0806402ffe37cbde1c3312550ce7bdddce923a Mon Sep 17 00:00:00 2001 From: stathis Date: Wed, 17 Sep 2008 23:56:52 +0300 Subject: [PATCH] Crazy commit --- qt/mkspdata/main.cpp | 85 ++++++++++++++++++++++------ qt/sphere-orbit-camera-gui/controlDialog.cpp | 41 +++++++++----- qt/sphere-orbit-camera-gui/controlDialog.h | 2 + qt/sphere-orbit-camera-gui/controlDialog.ui | 4 +- qt/sphere-orbit-camera-gui/workerthread.cpp | 17 +++--- qt/sphere-orbit-camera-gui/workerthread.h | 6 +- 6 files changed, 111 insertions(+), 44 deletions(-) diff --git a/qt/mkspdata/main.cpp b/qt/mkspdata/main.cpp index 73f9d07..3d42e62 100644 --- a/qt/mkspdata/main.cpp +++ b/qt/mkspdata/main.cpp @@ -1,43 +1,82 @@ -#include // For ``EXIT_FAILURE'' constant +#include // For `EXIT_FAILURE' constant #include #include #include +#include // FIXME: make it portable #include #define MAGIC_NUMBER 0xA0B0C0D0 #define PROT_VERSION 0x1 -#define TIME_STEP 1.0f -#define START_TIME 0.0f -#define END_TIME 50.0f -#define NUM_REPLAYS 100 -#define DURATION 100000 // msec +/* Function prototypes */ +void usage(const char *pname); int main(int argc, char *argv[]) { QFile file; - float x, y, z, xR, yR, zR, t; - quint32 i, duration, magicNumber, protVersion, numRecords; + float duration, endTime, startTime, timeStep, x, y, z, xR, yR, zR, t; + quint32 i, cnt, magicNumber, protVersion, numRecords; + int numReplays, opt; - file.setFileName(argv[1]); + /* Parse arguments */ + numReplays = 1; + while ((opt = getopt(argc, argv, "f:s:e:t:r::")) != -1) { + switch (opt) { + case 'f': + file.setFileName(optarg); + break; + case 's': + startTime = atof(optarg); + break; + case 'e': + endTime = atof(optarg); + break; + case 't': + timeStep = atof(optarg); + break; + case 'r': + numReplays = atoi(optarg); + break; + default: + usage(argv[0]); + /* Never reached */ + } + } + + /* optind shows to the argv[] index of the first non-option element */ + if (optind < argc) { + fprintf(stderr, "non-option argv[]-elements: "); + while (optind < argc) + fprintf(stderr, "%s ", argv[optind++]); + fprintf(stderr, "\n"); + usage(argv[0]); + } + + qDebug("Start time = %f\tEnd time = %f\tTime step = %f\tReplays = %d\n", + startTime, endTime, timeStep, numReplays); + //return 0; // Open file for writing file.open(QIODevice::WriteOnly); QDataStream out(&file); // Write a header with a "magic number" and a protocol version + duration = (endTime - startTime) * numReplays; out << (quint32) MAGIC_NUMBER; out << (quint32) PROT_VERSION; - out << (quint32) DURATION; // msec - out << (quint32) (NUM_REPLAYS * (END_TIME - START_TIME) / TIME_STEP); + out << (float) duration; + out << (quint32) (numReplays * (endTime - startTime) / timeStep); // Write actual data - for (i = 0; i < NUM_REPLAYS; i++) { - for (t = START_TIME; t < END_TIME; t += TIME_STEP) { - out << (float) (5.0 * t * t) << 0.0f << 0.0f + for (i = 0, cnt = 0; i < numReplays; i++) { + for (t = startTime; t < endTime; t += timeStep, cnt++) { + out << (float) cnt / duration + << (float) (5.0 * t * t) << 0.0f << 0.0f << (float) (cos(t) * 180.0) << 0.0f << 0.0f; } } + + // Done -- close file file.close(); // Open file for reading @@ -46,7 +85,7 @@ int main(int argc, char *argv[]) // Read "magic number" and protocol version in >> magicNumber; - if (magicNumber != 0xA0B0C0D0) { + if (magicNumber != MAGIC_NUMBER) { std::cout << "Magic number mismatch\n"; exit(EXIT_FAILURE); } @@ -62,20 +101,30 @@ int main(int argc, char *argv[]) std::cout << "Magic number = 0x" << std::hex << magicNumber << "\n"; std::cout << "Protocol version = 0x" << protVersion << "\n"; - std::cout << "Duration in msec = " << std::dec << duration << "\n"; + std::cout << "Duration in sec = " << std::dec << duration << "\n"; std::cout << "Number of records = " << numRecords << "\n"; // Read data while (!in.atEnd()) { - in >> x >> y >> z >> xR >> yR >> zR; - std::cout << "x = " << x + in >> t >> x >> y >> z >> xR >> yR >> zR; + std::cout << "t = " << t + << "\tx = " << x << "\ty = " << y << "\tz = " << z << "\txR = " << xR << "\tyR = " << yR << "\tzR = " << zR << "\n"; } + + // Done -- close file file.close(); return EXIT_SUCCESS; } + +void usage(const char *pname) +{ + fprintf(stderr, "Usage: %s -f fileName -s startTime -e endTime -t timeStep" + " [-r replays]\n", pname); + exit(EXIT_FAILURE); +} diff --git a/qt/sphere-orbit-camera-gui/controlDialog.cpp b/qt/sphere-orbit-camera-gui/controlDialog.cpp index 1b50351..e9aaf67 100644 --- a/qt/sphere-orbit-camera-gui/controlDialog.cpp +++ b/qt/sphere-orbit-camera-gui/controlDialog.cpp @@ -274,9 +274,10 @@ void ControlDialog::on_browseFileButton_clicked(void) emit fileNameChanged(fileName); // - m_timeLine.setFrameRange(0, fpsSpin->value() * m_thread.getDuration()); + m_timeLine.setFrameRange(0, m_thread.getNumOfRecords()); + qDebug("End frame: %d\n", m_timeLine.endFrame()); m_timeLine.setUpdateInterval(1000 / fpsSpin->value()); - m_timeLine.setDuration(m_thread.getDuration()); + m_timeLine.setDuration(m_thread.getDuration() * 1000); // QString magicVersionStr = QString("0x%1") @@ -304,29 +305,38 @@ void ControlDialog::on_fileNameChangedManually(void) void ControlDialog::pullData(qreal time) { - float xp, yp, zp, xa, ya, za; + float t, xp, yp, zp, xa, ya, za; qDebug("ControlDialog::pullData()"); - m_mutex.lock(); - if (m_thread.m_data.size() >= 6) { + m_thread.m_mutex.lock(); +AGAIN:; + qDebug("Current time = %f\tSearching for time = %f", m_t, time * m_thread.getDuration()); + if (m_thread.m_data.size() >= 7) { qDebug("Queue size = %d", m_thread.m_data.size()); + m_t = m_thread.m_data.dequeue(); xp = m_thread.m_data.dequeue(); yp = m_thread.m_data.dequeue(); zp = m_thread.m_data.dequeue(); xa = m_thread.m_data.dequeue(); ya = m_thread.m_data.dequeue(); za = m_thread.m_data.dequeue(); - qDebug("xp = %f\typ = %f\tzp = %f\txa = %f\tya = %f\tza = %f\n", - xp, yp, zp, xa, ya, za); - m_coordsAndAngles.setCoordsAndAngles(xp, yp, zp, xa, ya, za); + //qDebug("t = %f\txp = %f\typ = %f\tzp = %f\txa = %f\tya = %f\tza = %f", + // t, xp, yp, zp, xa, ya, za); + if (m_t < m_thread.getDuration() * time) + goto AGAIN; + else { + m_coordsAndAngles.setCoordsAndAngles(xp, yp, zp, xa, ya, za); + goto OUT; + } } else { - m_mutex.unlock(); + m_thread.m_mutex.unlock(); qDebug("WAKING THREAD"); m_thread.condition.wakeOne(); return; } - m_mutex.unlock(); +OUT:; + m_thread.m_mutex.unlock(); emit glSceneNeedsUpdate(); } @@ -337,7 +347,12 @@ void ControlDialog::on_fpsSpin_valueChanged(int i) "New value = %d", i); m_timeLine.stop(); - m_timeLine.setFrameRange(0, fpsSpin->value() * m_thread.getDuration()); - m_timeLine.setUpdateInterval(1000 / fpsSpin->value()); - m_timeLine.start(); + m_timeLine.setFrameRange(0, i * m_thread.getDuration()); + qDebug("=======> %d\n", m_timeLine.endFrame()); + m_timeLine.setUpdateInterval(1000 / i); + //m_timeLine.start(); + + // Don't resume animation, unless it was running before. + if (stopButton->isEnabled()) + m_timeLine.resume(); } diff --git a/qt/sphere-orbit-camera-gui/controlDialog.h b/qt/sphere-orbit-camera-gui/controlDialog.h index e684f8d..edb4952 100644 --- a/qt/sphere-orbit-camera-gui/controlDialog.h +++ b/qt/sphere-orbit-camera-gui/controlDialog.h @@ -78,6 +78,8 @@ private: Camera m_camera; Sphere m_sphere; CoordsAndAngles m_coordsAndAngles; + + float m_t; }; #endif // CONTROL_DIALOG_H diff --git a/qt/sphere-orbit-camera-gui/controlDialog.ui b/qt/sphere-orbit-camera-gui/controlDialog.ui index 449fa93..b2c37c9 100644 --- a/qt/sphere-orbit-camera-gui/controlDialog.ui +++ b/qt/sphere-orbit-camera-gui/controlDialog.ui @@ -22,7 +22,7 @@ - 4 + 2 @@ -368,7 +368,7 @@ - Duration (msec): + Duration (sec): diff --git a/qt/sphere-orbit-camera-gui/workerthread.cpp b/qt/sphere-orbit-camera-gui/workerthread.cpp index 31de153..d1776d7 100644 --- a/qt/sphere-orbit-camera-gui/workerthread.cpp +++ b/qt/sphere-orbit-camera-gui/workerthread.cpp @@ -23,10 +23,10 @@ WorkerThread::~WorkerThread() { qDebug("WorkerThread::~WorkerThread()"); - mutex.lock(); + m_mutex.lock(); abort = true; condition.wakeOne(); - mutex.unlock(); + m_mutex.unlock(); m_file.close(); @@ -41,16 +41,17 @@ void WorkerThread::run(void) // Loop while (!abort) { - mutex.lock(); - if (m_data.size() >= 667) { + m_mutex.lock(); + if (m_data.size() >= 6667) { qDebug("BLOCKED"); - condition.wait(&mutex); - mutex.unlock(); + condition.wait(&m_mutex); + m_mutex.unlock(); } else { + qDebug("Reading from file"); in >> r; m_data.enqueue(r); - mutex.unlock(); + m_mutex.unlock(); } } } @@ -87,7 +88,7 @@ quint32 WorkerThread::getProtocolVersion(void) const return m_protocolVersion; } -quint32 WorkerThread::getDuration(void) const +float WorkerThread::getDuration(void) const { qDebug("WorkerThread::getDuration()"); diff --git a/qt/sphere-orbit-camera-gui/workerthread.h b/qt/sphere-orbit-camera-gui/workerthread.h index c275204..6bb0615 100644 --- a/qt/sphere-orbit-camera-gui/workerthread.h +++ b/qt/sphere-orbit-camera-gui/workerthread.h @@ -19,7 +19,7 @@ public: quint32 getMagicVersion(void) const; quint32 getProtocolVersion(void) const; - quint32 getDuration(void) const; + float getDuration(void) const; quint32 getNumOfRecords(void) const; friend class ControlDiaog; @@ -35,7 +35,7 @@ public: QFile m_file; QDataStream in; - QMutex mutex; + QMutex m_mutex; QQueue m_data; float prev; bool abort; @@ -43,7 +43,7 @@ public: // Header specific quint32 m_magicVersion; quint32 m_protocolVersion; - quint32 m_duration; // in msec + float m_duration; // in sec quint32 m_numOfRecords; }; -- 2.11.4.GIT