diff --git a/groundStation/gui/MicroCART/MicroCART.pro b/groundStation/gui/MicroCART/MicroCART.pro index 874beeab9d98f9f1a9314e2c86726d21ab7191bc..7bcc5c3748235674e09ec499d8dc0d2552a006a2 100644 --- a/groundStation/gui/MicroCART/MicroCART.pro +++ b/groundStation/gui/MicroCART/MicroCART.pro @@ -14,9 +14,11 @@ TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ - wrappers.c + wrappers.c \ + trackerworker.cpp HEADERS += mainwindow.h \ - wrappers.h + wrappers.h \ + trackerworker.h FORMS += mainwindow.ui diff --git a/groundStation/gui/MicroCART/MicroCART.pro.user b/groundStation/gui/MicroCART/MicroCART.pro.user index c1342b36d003a09aa132d2bc51876da03961598d..d8c1922ddcfb5df26cdd3db8ab7cedc4d600084b 100644 --- a/groundStation/gui/MicroCART/MicroCART.pro.user +++ b/groundStation/gui/MicroCART/MicroCART.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 3.2.2, 2017-02-23T15:17:30. --> +<!-- Written by QtCreator 3.2.2, 2017-03-05T17:14:24. --> <qtcreator> <data> <variable>EnvironmentId</variable> @@ -8,7 +8,7 @@ </data> <data> <variable>ProjectExplorer.Project.ActiveTarget</variable> - <value type="int">0</value> + <value type="int">-1</value> </data> <data> <variable>ProjectExplorer.Project.EditorSettings</variable> diff --git a/groundStation/gui/MicroCART/mainwindow.cpp b/groundStation/gui/MicroCART/mainwindow.cpp index 01aa006e06ba3d63f34841a8bb6c11e1f165ffa2..bb6976bd55acd667e0c09f19a927b16d062b9728 100644 --- a/groundStation/gui/MicroCART/mainwindow.cpp +++ b/groundStation/gui/MicroCART/mainwindow.cpp @@ -1,13 +1,46 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include <QFileDialog> +#include <QThread> +#include <QTimer> + #include "wrappers.h" +#include "trackerworker.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); + + /* Create a thread for workers */ + QThread* workerThread = new QThread(this); + + /* Create a worker to update the tracker */ + TrackerWorker * trackerWorker = new TrackerWorker(); + + /* Move it to the worker thread. This means that slots of this worker + * will run in the worker thread, and not block the UI */ + trackerWorker->moveToThread(workerThread); + + /* Connect tracker worker */ + connect(trackerWorker, SIGNAL (finished(float, float, float, float, float, float)), + this, SLOT (updateTracker(float, float, float, float, float, float))); + connect(findChild<QPushButton *>("pbStart"), SIGNAL (clicked()), trackerWorker, SLOT (connectBackend())); + connect(findChild<QPushButton *>("pbConnect"), SIGNAL (clicked()), trackerWorker, SLOT (connectBackend())); + + /* Create other workers and add them to the worker thread, then connect them */ + + /* Now we can activate the slots of the workers with impunity and not block the UI thread */ + /* Connect refresh button and refresh timer to tracker worker */ + QTimer * trackerTimer = new QTimer(this); + connect(trackerTimer, SIGNAL(timeout()), trackerWorker, SLOT(process())); + connect(findChild<QPushButton *>("pbRefresh"), SIGNAL (clicked()), trackerWorker, SLOT (process())); + + /* Start the things */ + trackerTimer->start(300); + workerThread->start(); } MainWindow::~MainWindow() @@ -15,26 +48,45 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::updateTracker(float x, float y, float z, float p, float r, float yaw) +{ + findChild<QLineEdit *>("xLineEdit")->setText(QString::number(x)); + findChild<QLineEdit *>("yLineEdit")->setText(QString::number(y)); + findChild<QLineEdit *>("zLineEdit")->setText(QString::number(z)); + findChild<QLineEdit *>("pLineEdit")->setText(QString::number(p)); + findChild<QLineEdit *>("rLineEdit")->setText(QString::number(r)); + findChild<QLineEdit *>("yLineEdit_2")->setText(QString::number(yaw)); +} + void MainWindow::on_pbStart_clicked() { - this->backendPid = startBackend(); + this->backendPid = startBackend(findChild<QLineEdit *>("backendPath")->text().toStdString().c_str()); findChild<QPushButton *>("pbStart")->setEnabled(false); findChild<QPushButton *>("pbConnect")->setEnabled(false); findChild<QPushButton *>("pbStop")->setEnabled(true); + backendState = 1; } void MainWindow::on_pbConnect_clicked() { - // TODO: Connect to existing backend (what is connected?) findChild<QPushButton *>("pbStart")->setEnabled(false); findChild<QPushButton *>("pbConnect")->setEnabled(false); findChild<QPushButton *>("pbStop")->setEnabled(true); + backendState = 1; } void MainWindow::on_pbStop_clicked() { stopBackend(backendPid); findChild<QPushButton *>("pbStart")->setEnabled(true); - //findChild<QPushButton *>("pbConnect")->setEnabled(true); + findChild<QPushButton *>("pbConnect")->setEnabled(true); findChild<QPushButton *>("pbStop")->setEnabled(false); + backendState = 0; +} + +void MainWindow::on_chooseBackend_clicked() +{ + QString backendPath = QFileDialog::getOpenFileName(this, + tr("Path to Backend Executable")); + findChild<QLineEdit *>("backendPath")->setText(backendPath); } diff --git a/groundStation/gui/MicroCART/mainwindow.h b/groundStation/gui/MicroCART/mainwindow.h index 08c56474fa70af9423135e32c9005ef2e0bae9bf..f54a88e37146462475bae4863964ea32c012c96d 100644 --- a/groundStation/gui/MicroCART/mainwindow.h +++ b/groundStation/gui/MicroCART/mainwindow.h @@ -22,6 +22,10 @@ private slots: void on_pbStop_clicked(); + void on_chooseBackend_clicked(); + + void updateTracker(float x, float y, float z, float p, float r, float yaw); + private: Ui::MainWindow *ui; pid_t backendPid; diff --git a/groundStation/gui/MicroCART/mainwindow.ui b/groundStation/gui/MicroCART/mainwindow.ui index c613f8104b06d6a5eae17f8a0cb43fc278f03154..f2e2ab683d36f62894f5611a0dc9ca6cfe768592 100644 --- a/groundStation/gui/MicroCART/mainwindow.ui +++ b/groundStation/gui/MicroCART/mainwindow.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>481</width> - <height>347</height> + <width>569</width> + <height>427</height> </rect> </property> <property name="windowTitle"> @@ -19,8 +19,8 @@ <rect> <x>10</x> <y>10</y> - <width>461</width> - <height>271</height> + <width>531</width> + <height>281</height> </rect> </property> <property name="sizePolicy"> @@ -29,6 +29,9 @@ <verstretch>0</verstretch> </sizepolicy> </property> + <property name="currentIndex"> + <number>1</number> + </property> <widget class="QWidget" name="backend"> <attribute name="title"> <string>Connection</string> @@ -55,7 +58,7 @@ <item> <widget class="QPushButton" name="pbConnect"> <property name="enabled"> - <bool>false</bool> + <bool>true</bool> </property> <property name="text"> <string>Connect</string> @@ -74,6 +77,20 @@ </item> </layout> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPushButton" name="chooseBackend"> + <property name="text"> + <string>Choose Backend</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="backendPath"/> + </item> + </layout> + </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> @@ -100,19 +117,138 @@ </layout> </widget> </widget> - <widget class="QWidget" name="tab_2"> + <widget class="QWidget" name="status"> <attribute name="title"> - <string>Tab 2</string> + <string>Quad Status</string> </attribute> + <widget class="QWidget" name="horizontalLayoutWidget_2"> + <property name="geometry"> + <rect> + <x>-1</x> + <y>9</y> + <width>451</width> + <height>226</height> + </rect> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <layout class="QFormLayout" name="formLayout"> + <property name="fieldGrowthPolicy"> + <enum>QFormLayout::ExpandingFieldsGrow</enum> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="xLabel"> + <property name="text"> + <string>X</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="xLineEdit"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="yLabel"> + <property name="text"> + <string>Y</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="yLineEdit"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="zLabel"> + <property name="text"> + <string>Z</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="zLineEdit"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="pLabel"> + <property name="text"> + <string>P</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="pLineEdit"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="rLabel"> + <property name="text"> + <string>R</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QLineEdit" name="rLineEdit"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="5" column="0"> + <widget class="QLabel" name="yLabel_2"> + <property name="text"> + <string>Y</string> + </property> + </widget> + </item> + <item row="5" column="1"> + <widget class="QLineEdit" name="yLineEdit_2"> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QFormLayout" name="formLayout_2"/> + </item> + </layout> + </widget> </widget> </widget> + <widget class="QPushButton" name="pbRefresh"> + <property name="geometry"> + <rect> + <x>10</x> + <y>290</y> + <width>88</width> + <height>34</height> + </rect> + </property> + <property name="text"> + <string>Refresh</string> + </property> + </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> - <width>481</width> + <width>569</width> <height>30</height> </rect> </property> diff --git a/groundStation/gui/MicroCART/trackerworker.cpp b/groundStation/gui/MicroCART/trackerworker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..46bb0ab514a87cce4cc39c8ae052223c40340c9e --- /dev/null +++ b/groundStation/gui/MicroCART/trackerworker.cpp @@ -0,0 +1,33 @@ +#include "trackerworker.h" +#include <QThread> + +TrackerWorker::TrackerWorker() : + QObject(), run(true) +{ +} + +TrackerWorker::~TrackerWorker() +{ +} + +void TrackerWorker::connectBackend() +{ +} + +void TrackerWorker::disconnectBackend() +{ +} + +void TrackerWorker::process() +{ + /* Fake data. SAD! */ + static float x = 1.0f, y = 2.0f, z = 3.0f, p = 4.0f, r = 5.0f, yaw = 6.0f; + x += 1.0; + y += 2.0; + z += 3.0; + p += 4.0; + r += 5.0; + yaw += 6.0; + + emit finished(x, y, z, p, r, yaw); +} diff --git a/groundStation/gui/MicroCART/trackerworker.h b/groundStation/gui/MicroCART/trackerworker.h new file mode 100644 index 0000000000000000000000000000000000000000..dd72c9edf60b4dec586d6daa01ffb9f49c336d91 --- /dev/null +++ b/groundStation/gui/MicroCART/trackerworker.h @@ -0,0 +1,25 @@ +#ifndef TRACKERWORKER_H +#define TRACKERWORKER_H + +#include <QObject> + +class TrackerWorker : public QObject +{ + Q_OBJECT +public: + TrackerWorker(); + ~TrackerWorker(); + +signals: + void finished(float, float, float, float, float, float); + +public slots: + void process(); + void connectBackend(); + void disconnectBackend(); + +private: + bool run; + +}; +#endif // TRACKERWORKER_H diff --git a/groundStation/gui/MicroCART/wrappers.c b/groundStation/gui/MicroCART/wrappers.c index 58f718fc86ba7516457e651f95678ca91eb6461c..f5e598c68b3b28b18537694edbaa60cd52bb14e8 100644 --- a/groundStation/gui/MicroCART/wrappers.c +++ b/groundStation/gui/MicroCART/wrappers.c @@ -13,13 +13,11 @@ int stopBackend(int pid) return status; } -int startBackend() +int startBackend(const char * backend) { int pid = fork(); if (!pid) { - // TODO: Make dynamic - // TODO: Redirect stdout to pipe to GUI - execl("backEnd", "backEnd", NULL); + execl(backend, "backEnd", NULL); exit(0); } return pid; diff --git a/groundStation/gui/MicroCART/wrappers.h b/groundStation/gui/MicroCART/wrappers.h index 0ac1d1151499f54c12204b5153e1ccf43e469c03..eea3e1b1925af52a2a8fa62969694ea1abe043fe 100644 --- a/groundStation/gui/MicroCART/wrappers.h +++ b/groundStation/gui/MicroCART/wrappers.h @@ -6,7 +6,7 @@ extern "C" { #endif -int startBackend(void); +int startBackend(const char * backend); int stopBackend(int pid); #ifdef __cplusplus diff --git a/groundStation/src/frontend/frontend_tracker.h b/groundStation/src/frontend/frontend_tracker.h index 58284ca01dc1b4987b523fc125b60010209af930..cbf56dbb33beae39e43e2ef5e31c623a938b9001 100644 --- a/groundStation/src/frontend/frontend_tracker.h +++ b/groundStation/src/frontend/frontend_tracker.h @@ -3,6 +3,10 @@ #include "frontend_common.h" +#ifdef __cplusplus +extern "C" { +#endif + /* Struct containing pos/att data */ struct frontend_tracker_data { double height; @@ -24,4 +28,8 @@ struct frontend_tracker_data { int frontend_track(struct backend_conn * conn, struct frontend_tracker_data *data); -#endif /* __FRONTEND_TRACKER_H */ \ No newline at end of file +#ifdef __cplusplus +} +#endif + +#endif /* __FRONTEND_TRACKER_H */