diff options
Diffstat (limited to 'tracker-udp/ftnoir_tracker_udp.cpp')
-rw-r--r-- | tracker-udp/ftnoir_tracker_udp.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/tracker-udp/ftnoir_tracker_udp.cpp b/tracker-udp/ftnoir_tracker_udp.cpp new file mode 100644 index 00000000..1610f917 --- /dev/null +++ b/tracker-udp/ftnoir_tracker_udp.cpp @@ -0,0 +1,70 @@ +/* Copyright (c) 2014, Stanislaw Halik <sthalik@misaki.pl> + + * Permission to use, copy, modify, and/or distribute this + * software for any purpose with or without fee is hereby granted, + * provided that the above copyright notice and this permission + * notice appear in all copies. + */ + +#include "ftnoir_tracker_udp.h" +#include "opentrack/plugin-api.hpp" + +FTNoIR_Tracker::FTNoIR_Tracker() : last_recv_pose { 0,0,0, 0,0,0 }, should_quit(false) {} + +FTNoIR_Tracker::~FTNoIR_Tracker() +{ + should_quit = true; + wait(); +} + +void FTNoIR_Tracker::run() { + QByteArray datagram; + datagram.resize(sizeof(last_recv_pose)); + (void) sock.bind(QHostAddress::Any, (int) s.port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); + for (;;) { + if (should_quit) + break; + { + QMutexLocker foo(&mutex); + while (sock.hasPendingDatagrams()) { + sock.readDatagram((char * ) last_recv_pose, sizeof(double[6])); + } + } + msleep(1); + } +} + +void FTNoIR_Tracker::start_tracker(QFrame*) +{ + start(); + sock.moveToThread(this); +} + +void FTNoIR_Tracker::data(double *data) +{ + QMutexLocker foo(&mutex); + for (int i = 0; i < 6; i++) + data[i] = last_recv_pose[i]; + + int values[] = { + 0, + 90, + -90, + 180, + -180, + }; + int indices[] = { + s.add_yaw, + s.add_pitch, + s.add_roll, + }; + + for (int i = 0; i < 3; i++) + { + int k = std::min<unsigned>(sizeof(values)/sizeof(values[0]), std::max(0, indices[i])); + data[Yaw + i] += values[k]; + } +} + + +OPENTRACK_DECLARE_TRACKER(FTNoIR_Tracker, TrackerControls, FTNoIR_TrackerDll) |