Panda3D
Loading...
Searching...
No Matches
vrpnTracker.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file vrpnTracker.cxx
10 * @author drose
11 * @date 2001-01-25
12 */
13
14#include "vrpnTracker.h"
15#include "vrpnTrackerDevice.h"
16#include "vrpnClient.h"
17#include "config_vrpn.h"
18
19#include "indent.h"
20
21#include <algorithm>
22
23/**
24 *
25 */
26VrpnTracker::
27VrpnTracker(const std::string &tracker_name, vrpn_Connection *connection) :
28 _tracker_name(tracker_name)
29{
30 _tracker = new vrpn_Tracker_Remote(_tracker_name.c_str(), connection);
31
32 _tracker->register_change_handler((void*)this, &vrpn_position_callback);
33 _tracker->register_change_handler((void*)this, &vrpn_velocity_callback);
34 _tracker->register_change_handler((void*)this, &vrpn_acceleration_callback);
35}
36
37/**
38 *
39 */
40VrpnTracker::
41~VrpnTracker() {
42 delete _tracker;
43}
44
45/**
46 * Adds the indicated VrpnTrackerDevice to the list of devices that are
47 * sharing this VrpnTracker.
48 */
50mark(VrpnTrackerDevice *device) {
51 if (vrpn_cat.is_debug()) {
52 vrpn_cat.debug() << *this << " marking " << *device << "\n";
53 }
54 _devices.push_back(device);
55}
56
57/**
58 * Removes the indicated VrpnTrackerDevice from the list of devices that are
59 * sharing this VrpnTracker.
60 */
63 if (vrpn_cat.is_debug()) {
64 vrpn_cat.debug() << *this << " unmarking " << *device << "\n";
65 }
66
67 Devices::iterator di =
68 find(_devices.begin(), _devices.end(), device);
69
70 if (di != _devices.end()) {
71 _devices.erase(di);
72 }
73}
74
75/**
76 * Polls the connected device. Normally you should not call this directly;
77 * this will be called by the VrpnClient.
78 */
80poll() {
81 _tracker->mainloop();
82}
83
84/**
85 *
86 */
87void VrpnTracker::
88output(std::ostream &out) const {
89 out << _tracker_name;
90}
91
92/**
93 *
94 */
95void VrpnTracker::
96write(std::ostream &out, int indent_level) const {
97 indent(out, indent_level)
98 << get_tracker_name() << " ("
99 << _devices.size() << " devices)\n";
100}
101
102/**
103 * Receives the tracker positional data from the VRPN code and sends it to any
104 * interested VrpnTrackerDevices.
105 */
106void VRPN_CALLBACK VrpnTracker::
107vrpn_position_callback(void *userdata, const vrpn_TRACKERCB info) {
108 VrpnTracker *self = (VrpnTracker *)userdata;
109 if (vrpn_cat.is_spam()) {
110 vrpn_cat.spam()
111 << *self << " position_callback\n";
112 }
113
114 Devices::iterator di;
115 for (di = self->_devices.begin(); di != self->_devices.end(); ++di) {
116 VrpnTrackerDevice *device = (*di);
117 if (device->get_sensor() == info.sensor &&
118 device->get_data_type() == VrpnTrackerDevice::DT_position) {
119 device->tracker_changed(LPoint3(info.pos[0], info.pos[1], info.pos[2]),
120 LOrientation(info.quat[3], info.quat[0],
121 info.quat[1], info.quat[2]),
122 VrpnClient::convert_to_secs(info.msg_time));
123 }
124 }
125}
126
127/**
128 * Receives the tracker velocity data from the VRPN code and sends it to any
129 * interested VrpnTrackerDevices.
130 */
131void VRPN_CALLBACK VrpnTracker::
132vrpn_velocity_callback(void *userdata, const vrpn_TRACKERVELCB info) {
133 VrpnTracker *self = (VrpnTracker *)userdata;
134 if (vrpn_cat.is_spam()) {
135 vrpn_cat.spam()
136 << *self << " velocity_callback\n";
137 }
138
139 Devices::iterator di;
140 for (di = self->_devices.begin(); di != self->_devices.end(); ++di) {
141 VrpnTrackerDevice *device = (*di);
142 if (device->get_sensor() == info.sensor &&
143 device->get_data_type() == VrpnTrackerDevice::DT_velocity) {
144 device->tracker_changed(LPoint3(info.vel[0], info.vel[1], info.vel[2]),
145 LOrientation(info.vel_quat[3], info.vel_quat[0],
146 info.vel_quat[1], info.vel_quat[2]),
147 VrpnClient::convert_to_secs(info.msg_time));
148 }
149 }
150}
151
152/**
153 * Receives the tracker acceleration data from the VRPN code and sends it to
154 * any interested VrpnTrackerDevices.
155 */
156void VRPN_CALLBACK VrpnTracker::
157vrpn_acceleration_callback(void *userdata, const vrpn_TRACKERACCCB info) {
158 VrpnTracker *self = (VrpnTracker *)userdata;
159 if (vrpn_cat.is_spam()) {
160 vrpn_cat.spam()
161 << *self << " acceleration_callback\n";
162 }
163
164 Devices::iterator di;
165 for (di = self->_devices.begin(); di != self->_devices.end(); ++di) {
166 VrpnTrackerDevice *device = (*di);
167 if (device->get_sensor() == info.sensor &&
168 device->get_data_type() == VrpnTrackerDevice::DT_acceleration) {
169 device->tracker_changed(LPoint3(info.acc[0], info.acc[1], info.acc[2]),
170 LOrientation(info.acc_quat[3], info.acc_quat[0],
171 info.acc_quat[1], info.acc_quat[2]),
172 VrpnClient::convert_to_secs(info.msg_time));
173 }
174 }
175}
static double convert_to_secs(struct timeval msg_time)
Little inline function to convert a struct timeval to only seconds.
Definition vrpnClient.I:26
The Panda interface to a VRPN tracker.
int get_sensor() const
Returns the particular sensor index that this device wants to hear about from the VrpnTracker.
DataType get_data_type() const
Returns the type of data this device represents from the VrpnTracker.
This is the actual interface to a particular VRPN tracker object, and all of its sensors.
Definition vrpnTracker.h:37
void mark(VrpnTrackerDevice *device)
Adds the indicated VrpnTrackerDevice to the list of devices that are sharing this VrpnTracker.
const std::string & get_tracker_name() const
Returns the name of the tracker device that was used to create this VrpnTracker.
Definition vrpnTracker.I:19
void unmark(VrpnTrackerDevice *device)
Removes the indicated VrpnTrackerDevice from the list of devices that are sharing this VrpnTracker.
void poll()
Polls the connected device.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition indent.cxx:20
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.