24 #if defined(VRPN_USE_HID) 27 static const vrpn_uint16 vrpn_5DT_VENDOR = 0x5d70;
29 static const vrpn_uint16 vrpn_5DT_LEFT_MASK = 0x0001;
30 static const vrpn_uint16 vrpn_5DT_RIGHT = 0x0000;
31 static const vrpn_uint16 vrpn_5DT_LEFT = 0x0001;
32 static const vrpn_uint16 vrpn_5DT_WIRELESS_PORTA_MASK = 0x0002;
33 static const vrpn_uint16 vrpn_5DT_WIRELESS_PORTB_MASK = 0x0006;
34 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_MASK = 0x0010;
35 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5 = 0x0010;
36 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14 = 0x0000;
39 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_RIGHT_WIRED = 0x0000;
40 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_LEFT_WIRED = 0x0001;
41 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_RIGHT_WIRELESS_PORTA = 0x0002;
42 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_LEFT_WIRELESS_PORTA = 0x0003;
43 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_RIGHT_WIRELESS_PORTB = 0x0006;
44 static const vrpn_uint16 vrpn_5DT_DATAGLOVE14_LEFT_WIRELESS_PORTB = 0x0007;
45 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_RIGHT_WIRED = 0x0010;
46 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_LEFT_WIRED = 0x0011;
47 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_RIGHT_WIRELESS_PORTA = 0x0012;
48 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_LEFT_WIRELESS_PORTA = 0x0013;
49 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_RIGHT_WIRELESS_PORTB = 0x0016;
50 static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_LEFT_WIRELESS_PORTB = 0x0017;
60 _isLeftHand(isLeftHand),
61 _wasConnected(false) {
63 if (num_sensors != 5 && num_sensors != 14) {
64 throw std::logic_error(
"The vrpn_Analog_5dtUSB driver only supports 5 or 14 sensors, and a different number was passed!");
81 std::ostringstream ss;
82 if (
product() & vrpn_5DT_LEFT_MASK) {
89 if (
product() & vrpn_5DT_DATAGLOVE5_MASK) {
96 if (
product() & vrpn_5DT_WIRELESS_PORTA_MASK) {
97 ss <<
"wireless port A";
98 }
else if (
product() & vrpn_5DT_WIRELESS_PORTB_MASK) {
99 ss <<
"wireless port B";
108 std::ostringstream ss;
109 ss <<
"Received a too-short report: " << bytes;
117 const float scale = 1.0f / 4096.0f;
118 vrpn_uint8 * bufptr = buffer;
119 for (
size_t i = 0; i < 16; i++) {
120 _rawVals[i] = vrpn_unbuffer<vrpn_int16>(bufptr) * scale;
125 for (
size_t i = 0; i < 5; ++i) {
133 for (
size_t i = 0; i < 14; ++i) {
140 std::cerr <<
"Internal error - should not happen: Unrecognized number of channels!" << std::endl;
150 std::ostringstream ss;
vrpn_Analog_5dtUSB_Glove5Left(const char *name, vrpn_Connection *c=0)
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report whether or not changed.
virtual void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
Send a report only if something has changed (for servers) Optionally, tell what time to stamp the val...
header for 5DT USB (HID) dataglove driver
double _rawVals[16]
The raw values extracted from the report: which ones we use to set analog channels varies based on th...
virtual void mainloop()
Standard VRPN mainloop method.
std::string get_description() const
Returns a string description of the device we've connected to. Used internally, but also possibly use...
vrpn_uint16 product() const
Returns USB product ID of connected device.
struct timeval _timestamp
Timestamp updated during mainloop()
virtual ~vrpn_Analog_5dtUSB()
Destructor.
vrpn_float64 channel[vrpn_CHANNEL_MAX]
bool _wasConnected
Flag indicating whether we were connected last time through the mainloop. Used to send a "normal"-sev...
Generic connection class not specific to the transport mechanism.
virtual void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
Send a report whether something has changed or not (for servers) Optionally, tell what time to stamp ...
5th Dimension Technologies (5dt) "Ultra" USB data glove driver
HID acceptor subclass used by vrpn_Analog_5dtUSB since the bits of the product ID for these devices d...
All types of client/server/peer objects in VRPN should be derived from the vrpn_BaseClass type descri...
vrpn_Analog_5dtUSB_Glove14Left(const char *name, vrpn_Connection *c=0)
void on_data_received(size_t bytes, vrpn_uint8 *buffer)
Extracts the sensor values from each report.
vrpn_Analog_5dtUSB_Glove14Right(const char *name, vrpn_Connection *c=0)
int send_text_message(const char *msg, struct timeval timestamp, vrpn_TEXT_SEVERITY type=vrpn_TEXT_NORMAL, vrpn_uint32 level=0)
Sends a NULL-terminated text message from the device d_sender_id.
vrpn_HidAcceptor * _acceptor
This is the HidAcceptor we use when reconnecting.
vrpn_Analog_5dtUSB_Glove5Right(const char *name, vrpn_Connection *c=0)
#define vrpn_gettimeofday
virtual void update()
Polls the device buffers and causes on_data_received callbacks if appropriate You NEED to call this f...
void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report iff changed.
virtual bool connected() const
Returns true iff the last device I/O succeeded.
vrpn_float64 last[vrpn_CHANNEL_MAX]
vrpn_Analog_5dtUSB(vrpn_HidAcceptor *filter, int num_sensors, bool isLeftHand, const char *name, vrpn_Connection *c=0)
Protected constructor: use a subclass to specify the glove variant to use.