vrpn
07.35
Virtual Reality Peripheral Network
Toggle main menu visibility
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
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
32
if
(
_analog
== NULL) {
33
fprintf(stderr,
"vrpn_Tracker_GameTrak: "
34
"Can't open joystick %s\n"
, joystick_dev);
35
}
else
{
36
_analog
->register_change_handler(
this
,
handle_update
);
37
}
38
}
39
40
vrpn_Tracker_GameTrak::~vrpn_Tracker_GameTrak
()
41
{
42
// TODO: Auto-generated destructor stub
43
}
44
45
void
vrpn_Tracker_GameTrak::mainloop
()
46
{
47
if
(!
_analog
)
48
return
;
49
50
// server update
51
server_mainloop
();
52
53
// master joystick update
54
_analog
->mainloop();
55
56
if
(
_should_report
)
57
{
58
vrpn_Tracker::timestamp
=
_timestamp
;
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);
71
if
(
d_connection
->pack_message(len,
_timestamp
,
position_m_id
,
d_sender_id
, msgbuf,
vrpn_CONNECTION_LOW_LATENCY
))
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);
82
if
(
d_connection
->pack_message(len,
_timestamp
,
position_m_id
,
d_sender_id
, msgbuf,
83
vrpn_CONNECTION_LOW_LATENCY
))
84
{
85
fprintf(stderr,
"GameTrak tracker: can't write message: tossing\n"
);
86
}
87
88
_should_report
=
false
;
89
}
90
}
91
92
void
VRPN_CALLBACK
vrpn_Tracker_GameTrak::handle_update
(
void
*
userdata
,
const
vrpn_ANALOGCB
info)
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
104
vrpn_Tracker_GameTrak
*gametrak = (
vrpn_Tracker_GameTrak
*)
userdata
;
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
vrpn_Analog_Remote
Definition
vrpn_Analog.h:181
vrpn_BaseClassUnique::d_connection
vrpn_Connection * d_connection
Connection that this object talks to.
Definition
vrpn_BaseClass.h:227
vrpn_BaseClassUnique::d_sender_id
vrpn_int32 d_sender_id
Sender ID registered with the connection.
Definition
vrpn_BaseClass.h:231
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:604
vrpn_BaseClassUnique::userdata
void * userdata
Definition
vrpn_BaseClass.h:290
vrpn_Tracker_GameTrak::_sensor0
vrpn_float64 _sensor0[3]
Definition
vrpn_Tracker_GameTrak.h:32
vrpn_Tracker_GameTrak::~vrpn_Tracker_GameTrak
virtual ~vrpn_Tracker_GameTrak()
Definition
vrpn_Tracker_GameTrak.C:40
vrpn_Tracker_GameTrak::_mapping
int _mapping[6]
Definition
vrpn_Tracker_GameTrak.h:29
vrpn_Tracker_GameTrak::_should_report
bool _should_report
Definition
vrpn_Tracker_GameTrak.h:31
vrpn_Tracker_GameTrak::_sensor1
vrpn_float64 _sensor1[3]
Definition
vrpn_Tracker_GameTrak.h:32
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::_timestamp
struct timeval _timestamp
Definition
vrpn_Tracker_GameTrak.h:33
vrpn_Tracker_GameTrak::_analog
vrpn_Analog_Remote * _analog
Definition
vrpn_Tracker_GameTrak.h:35
vrpn_Tracker_GameTrak::handle_update
static void VRPN_CALLBACK handle_update(void *, const vrpn_ANALOGCB)
Definition
vrpn_Tracker_GameTrak.C:92
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:45
vrpn_Tracker::encode_to
virtual int encode_to(char *buf)
Definition
vrpn_Tracker.C:552
vrpn_Tracker::d_quat
vrpn_float64 d_quat[4]
Definition
vrpn_Tracker.h:95
vrpn_Tracker::vrpn_Tracker
vrpn_Tracker(const char *name, vrpn_Connection *c=NULL, const char *tracker_cfg_file_name=NULL)
Definition
vrpn_Tracker.C:45
vrpn_Tracker::d_sensor
vrpn_int32 d_sensor
Definition
vrpn_Tracker.h:94
vrpn_Tracker::pos
vrpn_float64 pos[3]
Definition
vrpn_Tracker.h:95
vrpn_Tracker::timestamp
struct timeval timestamp
Definition
vrpn_Tracker.h:100
vrpn_Tracker::position_m_id
vrpn_int32 position_m_id
Definition
vrpn_Tracker.h:80
vrpn_ANALOGCB
Definition
vrpn_Analog.h:168
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_CALLBACK
#define VRPN_CALLBACK
Definition
vrpn_Configure.h:649
vrpn_Connection.h
vrpn_CONNECTION_LOW_LATENCY
const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY
Definition
vrpn_Connection.h:120
vrpn_Tracker_GameTrak.h
vrpn_Connection
class VRPN_API vrpn_Connection
Definition
vrpn_Tracker_GameTrak.h:17
vrpn_Tracker_GameTrak.C
Generated by
1.17.0