vrpn 07.35
Virtual Reality Peripheral Network
Loading...
Searching...
No Matches
vrpn_Tracker_GameTrak.C
Go to the documentation of this file.
1/*
2 * vrpn_Tracker_GameTrak.cpp
3 *
4 * Created on: Nov 22, 2010
5 * Author: janoc
6 */
7
8#include <math.h> // for cos, sin
9#include <stdio.h> // for fprintf, stderr
10#include <string.h> // for memset, memcpy, NULL
11
12#include "quat.h" // for Q_PI
13#include "vrpn_Connection.h" // for vrpn_CONNECTION_LOW_LATENCY, etc
15
16vrpn_Tracker_GameTrak::vrpn_Tracker_GameTrak(const char * name, vrpn_Connection * trackercon, const char *joystick_dev, int *mapping) :
17 vrpn_Tracker(name, trackercon)
18{
19 memset(_sensor0, 0, 3 * sizeof(float));
20 memset(_sensor1, 0, 3 * sizeof(float));
21
22 memcpy(_mapping, mapping, 6 * sizeof(int));
23
24 // try to open a client connection to the joystick device
25 // if the name starts with '*', use the server connection only
26 if (joystick_dev[0] == '*') {
27 _analog = new vrpn_Analog_Remote(&(joystick_dev[1]), d_connection);
28 } else {
29 _analog = new vrpn_Analog_Remote(joystick_dev);
30 }
31
32 if (_analog == NULL) {
33 fprintf(stderr, "vrpn_Tracker_GameTrak: "
34 "Can't open joystick %s\n", joystick_dev);
35 } else {
37 }
38}
39
41{
42 // TODO: Auto-generated destructor stub
43}
44
46{
47 if (!_analog)
48 return;
49
50 // server update
52
53 // master joystick update
55
57 {
59
60 // send tracker orientation
61 memset(d_quat, 0, sizeof(vrpn_float64) * 4); // no position
62 d_quat[3] = 1;
63
64 d_sensor = 0;
65 pos[0] = _sensor0[0];
66 pos[1] = _sensor0[1];
67 pos[2] = _sensor0[2];
68
69 char msgbuf[1000];
70 int len = vrpn_Tracker::encode_to(msgbuf);
72 {
73 fprintf(stderr, "GameTrak tracker: can't write message: tossing\n");
74 }
75
76 d_sensor = 1;
77 pos[0] = _sensor1[0];
78 pos[1] = _sensor1[1];
79 pos[2] = _sensor1[2];
80
81 len = vrpn_Tracker::encode_to(msgbuf);
84 {
85 fprintf(stderr,"GameTrak tracker: can't write message: tossing\n");
86 }
87
88 _should_report = false;
89 }
90}
91
93{
94 /*
95 * The spherical->carthesian conversion code is based on the mail from:
96 * Marc LE RENARD lerenard@esiea-ouest.fr,
97 * ESIEA
98 * Laboratoire RVSE
99 * (Réalité Virtuelle et Systèmes Embarqués)
100 * 38 Rue des docteurs Calmette & Guérin
101 * 53000 LAVAL
102 */
103
105
106 vrpn_float64 s1x, s1y, s1z;
107 vrpn_float64 s2x, s2y, s2z;
108
109 s1x = info.channel[gametrak->_mapping[0]];
110 s1y = info.channel[gametrak->_mapping[1]];
111 s1z = info.channel[gametrak->_mapping[2]];
112
113 s2x = info.channel[gametrak->_mapping[3]];
114 s2y = info.channel[gametrak->_mapping[4]];
115 s2z = info.channel[gametrak->_mapping[5]];
116
117 vrpn_float64 coef = (32.5 / 180.0) * Q_PI;
118
119 vrpn_float64 distance0 = 1.5 * (1 - s1z);
120 vrpn_float64 angleX0 = -s1x * coef;
121 vrpn_float64 angleY0 = -s1y * coef;
122
123 vrpn_float64 distance1 = 1.5 * (1 - s2z);
124 vrpn_float64 angleX1 = -s2x * coef;
125 vrpn_float64 angleY1 = -s2y * coef;
126
127 // printf("%3.3f %3.3f %3.3f %3.3f %3.3f %3.3f\n", angleX0, angleY0, distance0, angleX1, angleY1, distance1);
128
129 gametrak->_sensor0[0] = sin(angleX0) * distance0 + 0.065;
130 gametrak->_sensor0[1] = cos(angleX0) * sin(angleY0) * distance0;
131 gametrak->_sensor0[2] = cos(angleX0) * cos(angleY0) * distance0;
132
133 gametrak->_sensor1[0] = sin(angleX1) * distance1 - 0.065;
134 gametrak->_sensor1[1] = cos(angleX1) * sin(angleY1) * distance1;
135 gametrak->_sensor1[2] = cos(angleX1) * cos(angleY1) * distance1;
136
137 //printf(" %3.3f %3.3f %3.3f %3.3f %3.3f %3.3f\n", gametrak->_sensor0[0], gametrak->_sensor0[1], gametrak->_sensor0[2],
138 // gametrak->_sensor1[0], gametrak->_sensor1[1], gametrak->_sensor1[2]);
139
140 memcpy(&(gametrak->_timestamp), &(info.msg_time), sizeof(struct timeval));
141 gametrak->_should_report = true;
142}
143
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
Definition: vrpn_Analog.C:327
virtual int register_change_handler(void *userdata, vrpn_ANALOGCHANGEHANDLER handler)
Definition: vrpn_Analog.h:192
vrpn_Connection * d_connection
Connection that this object talks to.
vrpn_int32 d_sender_id
Sender ID registered with the connection.
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
Generic connection class not specific to the transport mechanism.
virtual int pack_message(vrpn_uint32 len, struct timeval time, vrpn_int32 type, vrpn_int32 sender, const char *buffer, vrpn_uint32 class_of_service)
Pack a message that will be sent the next time mainloop() is called. Turn off the RELIABLE flag if yo...
vrpn_Tracker_GameTrak(const char *name, vrpn_Connection *trackercon, const char *joystick_dev, int *mapping)
vrpn_Analog_Remote * _analog
static void VRPN_CALLBACK handle_update(void *, const vrpn_ANALOGCB)
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
virtual int encode_to(char *buf)
Definition: vrpn_Tracker.C:552
vrpn_float64 d_quat[4]
Definition: vrpn_Tracker.h:95
vrpn_int32 d_sensor
Definition: vrpn_Tracker.h:94
vrpn_float64 pos[3]
Definition: vrpn_Tracker.h:95
struct timeval timestamp
Definition: vrpn_Tracker.h:100
vrpn_int32 position_m_id
Definition: vrpn_Tracker.h:80
struct timeval msg_time
Definition: vrpn_Analog.h:169
vrpn_float64 channel[vrpn_CHANNEL_MAX]
Definition: vrpn_Analog.h:171
#define VRPN_CALLBACK
const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY