vrpn  07.33
Virtual Reality Peripheral Network
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
14 #include "vrpn_Tracker_GameTrak.h"
15 
16 vrpn_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  if (_analog == NULL)
32  {
33  fprintf(stderr, "vrpn_Tracker_GameTrak: "
34  "Can't open joystick %s\n", joystick_dev);
35  }
36  else
37  {
39  }
40 }
41 
43 {
44  // TODO: Auto-generated destructor stub
45 }
46 
48 {
49  if (!_analog)
50  return;
51 
52  // server update
54 
55  // master joystick update
56  _analog->mainloop();
57 
58  if (_should_report)
59  {
61 
62  // send tracker orientation
63  memset(d_quat, 0, sizeof(vrpn_float64) * 4); // no position
64  d_quat[3] = 1;
65 
66  d_sensor = 0;
67  pos[0] = _sensor0[0];
68  pos[1] = _sensor0[1];
69  pos[2] = _sensor0[2];
70 
71  char msgbuf[1000];
72  int len = vrpn_Tracker::encode_to(msgbuf);
74  {
75  fprintf(stderr, "GameTrak tracker: can't write message: tossing\n");
76  }
77 
78  d_sensor = 1;
79  pos[0] = _sensor1[0];
80  pos[1] = _sensor1[1];
81  pos[2] = _sensor1[2];
82 
83  len = vrpn_Tracker::encode_to(msgbuf);
86  {
87  fprintf(stderr,"GameTrak tracker: can't write message: tossing\n");
88  }
89 
90  _should_report = false;
91  }
92 }
93 
95 {
96  /*
97  * The spherical->carthesian conversion code is based on the mail from:
98  * Marc LE RENARD lerenard@esiea-ouest.fr,
99  * ESIEA
100  * Laboratoire RVSE
101  * (Réalité Virtuelle et Systèmes Embarqués)
102  * 38 Rue des docteurs Calmette & Guérin
103  * 53000 LAVAL
104  */
105 
107 
108  vrpn_float64 s1x, s1y, s1z;
109  vrpn_float64 s2x, s2y, s2z;
110 
111  s1x = info.channel[gametrak->_mapping[0]];
112  s1y = info.channel[gametrak->_mapping[1]];
113  s1z = info.channel[gametrak->_mapping[2]];
114 
115  s2x = info.channel[gametrak->_mapping[3]];
116  s2y = info.channel[gametrak->_mapping[4]];
117  s2z = info.channel[gametrak->_mapping[5]];
118 
119  vrpn_float64 coef = (32.5 / 180.0) * Q_PI;
120 
121  vrpn_float64 distance0 = 1.5 * (1 - s1z);
122  vrpn_float64 angleX0 = -s1x * coef;
123  vrpn_float64 angleY0 = -s1y * coef;
124 
125  vrpn_float64 distance1 = 1.5 * (1 - s2z);
126  vrpn_float64 angleX1 = -s2x * coef;
127  vrpn_float64 angleY1 = -s2y * coef;
128 
129  // printf("%3.3f %3.3f %3.3f %3.3f %3.3f %3.3f\n", angleX0, angleY0, distance0, angleX1, angleY1, distance1);
130 
131  gametrak->_sensor0[0] = sin(angleX0) * distance0 + 0.065;
132  gametrak->_sensor0[1] = cos(angleX0) * sin(angleY0) * distance0;
133  gametrak->_sensor0[2] = cos(angleX0) * cos(angleY0) * distance0;
134 
135  gametrak->_sensor1[0] = sin(angleX1) * distance1 - 0.065;
136  gametrak->_sensor1[1] = cos(angleX1) * sin(angleY1) * distance1;
137  gametrak->_sensor1[2] = cos(angleX1) * cos(angleY1) * distance1;
138 
139  //printf(" %3.3f %3.3f %3.3f %3.3f %3.3f %3.3f\n", gametrak->_sensor0[0], gametrak->_sensor0[1], gametrak->_sensor0[2],
140  // gametrak->_sensor1[0], gametrak->_sensor1[1], gametrak->_sensor1[2]);
141 
142  memcpy(&(gametrak->_timestamp), &(info.msg_time), sizeof(struct timeval));
143  gametrak->_should_report = true;
144 }
145 
vrpn_Connection::pack_message
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...
Definition: vrpn_Connection.C:4632
vrpn_Tracker
Definition: vrpn_Tracker.h:49
vrpn_Tracker_GameTrak::handle_update
static void VRPN_CALLBACK handle_update(void *, const vrpn_ANALOGCB)
Definition: vrpn_Tracker_GameTrak.C:94
vrpn_Tracker::encode_to
virtual int encode_to(char *buf)
Definition: vrpn_Tracker.C:533
vrpn_Tracker::d_sensor
vrpn_int32 d_sensor
Definition: vrpn_Tracker.h:94
vrpn_Tracker_GameTrak::_timestamp
struct timeval _timestamp
Definition: vrpn_Tracker_GameTrak.h:33
vrpn_Analog_Remote
Definition: vrpn_Analog.h:181
vrpn_BaseClassUnique::userdata
void * userdata
Definition: vrpn_BaseClass.h:287
vrpn_Tracker_GameTrak.h
vrpn_Tracker::d_quat
vrpn_float64 d_quat[4]
Definition: vrpn_Tracker.h:95
vrpn_Tracker_GameTrak
Definition: vrpn_Tracker_GameTrak.h:20
vrpn_Tracker::timestamp
struct timeval timestamp
Definition: vrpn_Tracker.h:100
vrpn_Tracker_GameTrak::mainloop
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
Definition: vrpn_Tracker_GameTrak.C:47
vrpn_CONNECTION_LOW_LATENCY
const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY
Definition: vrpn_Connection.h:122
vrpn_BaseClassUnique::d_connection
vrpn_Connection * d_connection
Connection that this object talks to.
Definition: vrpn_BaseClass.h:224
vrpn_ANALOGCB
Definition: vrpn_Analog.h:168
vrpn_Tracker_GameTrak::_should_report
bool _should_report
Definition: vrpn_Tracker_GameTrak.h:31
vrpn_BaseClassUnique::d_sender_id
vrpn_int32 d_sender_id
Sender ID registered with the connection.
Definition: vrpn_BaseClass.h:228
vrpn_Tracker_GameTrak::_sensor1
vrpn_float64 _sensor1[3]
Definition: vrpn_Tracker_GameTrak.h:32
vrpn_ANALOGCB::msg_time
struct timeval msg_time
Definition: vrpn_Analog.h:169
vrpn_ANALOGCB::channel
vrpn_float64 channel[vrpn_CHANNEL_MAX]
Definition: vrpn_Analog.h:171
vrpn_Analog_Remote::mainloop
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
Definition: vrpn_Analog.C:328
vrpn_Tracker::position_m_id
vrpn_int32 position_m_id
Definition: vrpn_Tracker.h:80
vrpn_Connection
Generic connection class not specific to the transport mechanism.
Definition: vrpn_Connection.h:510
vrpn_Connection.h
VRPN_CALLBACK
#define VRPN_CALLBACK
Definition: vrpn_Configure.h:647
vrpn_Tracker_GameTrak::_analog
vrpn_Analog_Remote * _analog
Definition: vrpn_Tracker_GameTrak.h:35
vrpn_Tracker_GameTrak::vrpn_Tracker_GameTrak
vrpn_Tracker_GameTrak(const char *name, vrpn_Connection *trackercon, const char *joystick_dev, int *mapping)
Definition: vrpn_Tracker_GameTrak.C:16
vrpn_Tracker_GameTrak::_sensor0
vrpn_float64 _sensor0[3]
Definition: vrpn_Tracker_GameTrak.h:32
vrpn_Tracker::pos
vrpn_float64 pos[3]
Definition: vrpn_Tracker.h:95
vrpn_Tracker_GameTrak::_mapping
int _mapping[6]
Definition: vrpn_Tracker_GameTrak.h:29
vrpn_Analog_Remote::register_change_handler
virtual int register_change_handler(void *userdata, vrpn_ANALOGCHANGEHANDLER handler)
Definition: vrpn_Analog.h:192
vrpn_Tracker_GameTrak::~vrpn_Tracker_GameTrak
virtual ~vrpn_Tracker_GameTrak()
Definition: vrpn_Tracker_GameTrak.C:42
vrpn_BaseClassUnique::server_mainloop
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
Definition: vrpn_BaseClass.C:603