Skip to content

Commit c8bf958

Browse files
author
Martin Gregorio
committed
Improved experience when tracker not detected
1 parent e6af079 commit c8bf958

9 files changed

Lines changed: 103 additions & 39 deletions

File tree

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ if(NOT DEFINED SDL_BUILD_DIR)
3737
message(FATAL_ERROR "Please set SDL_BUILD_DIR to the directory where the SDL library is installed")
3838
endif()
3939
file(TO_CMAKE_PATH ${SDL_BUILD_DIR} SDL_BUILD_DIR)
40+
if(NOT EXISTS ${SDL_BUILD_DIR})
41+
message(FATAL_ERROR "There is an issue with the SDL path provided.")
42+
endif()
4043

4144

4245

src/Controllers/Tracker.cpp

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,33 @@ PSTracker::PSTracker(QObject *parent) : QObject(parent) {
8686
signal(SIGQUIT, Exithandler);
8787
signal(SIGINT, Exithandler);
8888
#endif
89-
try {
90-
_pst = new PSTech::pstsdk::Tracker();
91-
} catch (PSTech::TrackerException& e) {
92-
std::cout << "Could not connect to tracker." << std::endl;
93-
std::cout << e.full_description() << std::endl; // DEV
94-
// throw e;
89+
}
90+
91+
void PSTracker::initPST() {
92+
if (_pst == nullptr) {
93+
try {
94+
_pst = new PSTech::pstsdk::Tracker();
95+
_detected = true;
96+
}
97+
catch (PSTech::TrackerException& e) {
98+
std::cout << "Could not connect to tracker." << std::endl;
99+
std::cout << e.full_description() << std::endl; // DEV
100+
throw "The PS-tech tracker is not detected";
101+
}
95102
}
96103
}
97104

98105
PSTracker::~PSTracker() {
99106
Exithandler(0);
100-
if (_pst != nullptr) delete _pst;
107+
delete _pst;
101108
}
102109

103110

104111
bool PSTracker::checkTrackerStatus() {
112+
if (!_detected) {
113+
throw "The PS-tech tracker is not detected";
114+
}
115+
105116
qDebug() << "PS Tech system check : ";
106117
PSTech::pstsdk::StatusMessage msg = _pst->Systemcheck();
107118
switch (msg) {
@@ -169,9 +180,16 @@ bool PSTracker::getTrackerConnected() const {
169180
};
170181

171182

183+
bool PSTracker::getTrackerActive() const {
184+
return _connected;
185+
};
186+
187+
172188
void PSTracker::Connect()
173189
{
174-
190+
if (!_detected) throw "The PS-tech tracker is not detected";
191+
192+
if (checkTrackerStatus()) return;
175193

176194
// Implement error handling of PSTech::TrackerException exceptions to prevent
177195
// improper PST Tracker shutdown on errors.

src/Controllers/Tracker.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,19 @@ class PSTracker : public QObject
110110
bool poseIsLive() const { return poseAcurate && listener.poseIsLive(); }
111111

112112
bool getTrackerConnected() const;
113+
bool getTrackerActive() const;
114+
void initPST();
113115

114116

115117
private:
116118
PSTech::pstsdk::TargetStatuses targets;
117119

118120
MyListener listener;
119-
PSTech::pstsdk::Tracker* _pst;
121+
PSTech::pstsdk::Tracker* _pst = nullptr;
120122

123+
/* Reflects whether an instance of pst exists, ie if a tracker is plugged in */
124+
bool _detected = false;
125+
/* Reflects whether the tracker is activated and actively sending information */
121126
bool _connected = false;
122127

123128
/** Timing of the animation after there has been a tracking lost */
@@ -129,6 +134,4 @@ class PSTracker : public QObject
129134
QMatrix4x4 lerpTrajectory;
130135
QMatrix4x4 oldPos;
131136

132-
signals:
133-
void connected() const;
134137
};

src/ReferenceSetup.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,16 @@
33
#include <QVBoxLayout>
44

55

6-
ReferenceSetupWidget::ReferenceSetupWidget(QWidget* parent, PSTracker* trackerPtr) : QWidget(parent, Qt::Window)
6+
ReferenceSetupWidget::ReferenceSetupWidget(QWidget* parent) :
7+
QWidget(parent, Qt::Window),
8+
tracker(nullptr)
79
{
810
setWindowTitle("PS Tracker Reference Setup");
911
resize(400, 350);
1012

1113
setFocusPolicy(Qt::FocusPolicy::ClickFocus);
1214
installEventFilter(this);
1315

14-
tracker = trackerPtr;
15-
16-
// When the object is instanciated (VolumeViewer is opened)
17-
// Load back the reference systemn used in the previosu session
18-
//connect(tracker, &PSTracker::connected, this, [this]() {setStoredReference(); });
1916

2017
createUI();
2118

@@ -87,7 +84,10 @@ void ReferenceSetupWidget::createUI() {
8784
}
8885

8986
void ReferenceSetupWidget::show(){
90-
if (!tracker->getTrackerConnected())
87+
if(tracker == nullptr){
88+
89+
}
90+
else if (!tracker->getTrackerConnected())
9191
{
9292
instructions->setText("Please click \"connect tracker\" and try again.");
9393
imageLabel->setPixmap(illustrations[3]);

src/ReferenceSetup.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class ReferenceSetupWidget : public QWidget {
3030

3131

3232
public:
33-
ReferenceSetupWidget(QWidget* parent, PSTracker* trackerPtr);
33+
ReferenceSetupWidget(QWidget* parent);
3434

3535
void show();
3636

@@ -40,6 +40,7 @@ class ReferenceSetupWidget : public QWidget {
4040
void continueCalib();
4141
void startMeasurement();
4242
void stopMeasurement();
43+
void setTracker(PSTracker* trackerPtr) {};
4344

4445
private:
4546
QLabel* instructions;

src/Renderer/OpenGL/OpenGLRendererWidget.cpp

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <QEvent>
44
#include <QMouseEvent>
55
#include <QWindow>
6+
#include <QVBoxLayout>
67

78
#include <QMainWindow>
89
#include <algorithm>
@@ -11,8 +12,17 @@
1112

1213

1314
OpenGLRendererWidget::OpenGLRendererWidget() :
14-
QOpenGLWidget()
15+
QOpenGLWidget(),
16+
_tracker(nullptr),
17+
msgLabel(new QLabel(this))
1518
{
19+
// UI
20+
QVBoxLayout* layout = new QVBoxLayout(this);
21+
msgLabel->setAlignment(Qt::AlignBottom);
22+
msgLabel->setStyleSheet(QString::fromUtf8("color: rgb(235, 235, 235);"));
23+
layout->addWidget(msgLabel);
24+
setLayout(layout);
25+
1626

1727
setAcceptDrops(true);
1828
setFocusPolicy(Qt::FocusPolicy::ClickFocus);
@@ -45,7 +55,7 @@ OpenGLRendererWidget::OpenGLRendererWidget() :
4555

4656
#endif
4757

48-
refWidget = new ReferenceSetupWidget(this, &_tracker);
58+
refWidget = new ReferenceSetupWidget(this);
4959

5060
pedal = new PedalManager();
5161

@@ -83,10 +93,11 @@ OpenGLRendererWidget::OpenGLRendererWidget() :
8393
}
8494
}
8595
});
96+
97+
}
8698

87-
connectToTracker();
88-
89-
99+
OpenGLRendererWidget::~OpenGLRendererWidget() {
100+
delete _tracker;
90101
}
91102

92103
//void OpenGLRendererWidget::setTexels(int width, int height, int depth, std::vector<float>& texels)
@@ -117,10 +128,20 @@ void OpenGLRendererWidget::setColormap(const QImage& colormap)
117128
}
118129

119130

120-
void OpenGLRendererWidget::connectToTracker()
131+
void OpenGLRendererWidget::connectToTracker(PSTracker* tracker)
121132
{
122-
_tracker.Connect();
123-
setFocus();
133+
if (tracker == nullptr) _tracker = new PSTracker();
134+
else _tracker = tracker;
135+
136+
try {
137+
_tracker->initPST();
138+
_tracker->Connect();
139+
}
140+
catch (const char* err) {
141+
msgLabel->setText(err);
142+
}
143+
144+
emit trackerAvailable(_tracker);
124145
}
125146

126147
void OpenGLRendererWidget::setEyeOffset(float eyeOffset)
@@ -199,8 +220,8 @@ void OpenGLRendererWidget::paintGL()
199220
_volumeRenderer.render(defaultFramebufferObject(), getCamPos(), aspect, true, _controls->getControlMatrix());
200221
#else
201222
QMatrix4x4 pose;
202-
if (_tracker.GetTargetMatrix(pose)) {
203-
_volumeRenderer.render(defaultFramebufferObject(), getCamPos(), aspect, _tracker.poseIsLive(), pose);
223+
if (_tracker != nullptr && _tracker->GetTargetMatrix(pose)) {
224+
_volumeRenderer.render(defaultFramebufferObject(), getCamPos(), aspect, _tracker->poseIsLive(), pose);
204225
}
205226
#endif
206227
}
@@ -211,7 +232,7 @@ void OpenGLRendererWidget::cleanup()
211232
#ifdef CONTROLS
212233
if(_controls != nullptr) delete _controls;
213234
#endif
214-
235+
delete _tracker;
215236

216237
makeCurrent();
217238
}

src/Renderer/OpenGL/OpenGLRendererWidget.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class OpenGLRendererWidget : public QOpenGLWidget, QOpenGLFunctions_4_2_Core
4545

4646
public:
4747
OpenGLRendererWidget();
48+
~OpenGLRendererWidget();
4849

4950

5051
VolumeRenderer& getVolumeRenderer() { return _volumeRenderer; }
@@ -54,11 +55,13 @@ class OpenGLRendererWidget : public QOpenGLWidget, QOpenGLFunctions_4_2_Core
5455
void setData(std::vector<float>& data);
5556
void setColors(std::vector<float>& colors);
5657
void setColormap(const QImage& colormap);
57-
void connectToTracker();
58+
void connectToTracker(PSTracker* tracker = nullptr);
5859
void setEyeOffset(float eyeOffset);
5960
void setCamDist(float camDist);
6061
void setSelectionMode(const int32_t& mode);
61-
void openCalib() const { refWidget->show(); };
62+
void openCalib() const { refWidget->show(); }
63+
64+
PSTracker* getTracker() const { return _tracker; }
6265

6366
public:
6467
bool eventFilter(QObject* target, QEvent* event);
@@ -88,9 +91,11 @@ private slots:
8891
void created();
8992
void newSelection(const SelectionMode& type, const bool& replace);
9093

94+
void trackerAvailable(PSTracker* tracker);
95+
9196
private:
9297
VolumeRenderer _volumeRenderer;
93-
PSTracker _tracker;
98+
PSTracker* _tracker;
9499

95100
#ifdef CONTROLS
96101
ControlsWidget* _controls;
@@ -116,7 +121,7 @@ private slots:
116121

117122
SelectionMode selectionMode;
118123

119-
124+
QLabel* msgLabel;
120125

121126
QTimer* _updateTimer = nullptr;
122127

src/VolumeViewerPlugin.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,22 @@ VolumeViewerPlugin::VolumeViewerPlugin(const PluginFactory* factory) :
113113
void VolumeViewerPlugin::init()
114114
{
115115

116+
// Detect other instances of the plugin and use their tracker
117+
const std::vector<Plugin*> instances = plugins().getPluginsByFactory(getFactory());
118+
if (instances.size() > 0) {
119+
VolumeViewerPlugin* firstInstance = static_cast<VolumeViewerPlugin*>(instances[0]);
120+
connect(&firstInstance->getOpenGLRendererWidget(), &OpenGLRendererWidget::trackerAvailable, this, [this](PSTracker* tracker) {
121+
getOpenGLRendererWidget().connectToTracker(tracker);
122+
});
123+
}
124+
else {
125+
getOpenGLRendererWidget().connectToTracker();
126+
}
127+
128+
129+
qDebug() << "Number of instances " << instances.size();
130+
131+
116132
// Create the layout.
117133
auto layout = new QVBoxLayout();
118134
layout->setContentsMargins(0, 0, 0, 0);
@@ -123,9 +139,7 @@ void VolumeViewerPlugin::init()
123139

124140
getWidget().setLayout(layout);
125141

126-
// Martin : Control widget
127-
controls = new QWidget();
128-
// END Martin : Control widget
142+
129143

130144
// Set the drop indicator widget (the widget that indicates that the view is eligible for data dropping)
131145
_dropWidget->setDropIndicatorWidget(new DropWidget::DropIndicatorWidget(&getWidget(), "No data loaded", "Drag an item from the data hierarchy and drop it here to visualize data..."));

src/VolumeViewerPlugin.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ class VolumeViewerPlugin : public ViewPlugin
220220
HorizontalToolbarAction _primaryToolbarAction; /** Horizontal toolbar for primary content */
221221
HorizontalToolbarAction _secondaryToolbarAction; /** Secondary toolbar for secondary content */
222222

223-
// Martin : widget
224-
QWidget* controls;
223+
225224
};
226225

227226
/**

0 commit comments

Comments
 (0)