vrpn
07.33
Virtual Reality Peripheral Network
|
Go to the documentation of this file.
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;
virtual bool connected() const
Returns true iff the last device I/O succeeded.
HID acceptor subclass used by vrpn_Analog_5dtUSB since the bits of the product ID for these devices d...
vrpn_float64 channel[vrpn_CHANNEL_MAX]
void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report whether or not changed.
header for 5DT USB (HID) dataglove driver
vrpn_Analog_5dtUSB_Glove5Left(const char *name, vrpn_Connection *c=0)
void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report iff changed.
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 ...
void on_data_received(size_t bytes, vrpn_uint8 *buffer)
Extracts the sensor values from each report.
virtual ~vrpn_Analog_5dtUSB()
Destructor.
virtual void update()
Polls the device buffers and causes on_data_received callbacks if appropriate You NEED to call this f...
vrpn_Analog_5dtUSB_Glove14Left(const char *name, vrpn_Connection *c=0)
vrpn_uint16 product() const
Returns USB product ID of connected device.
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_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.
Generic connection class not specific to the transport mechanism.
vrpn_Analog_5dtUSB_Glove5Right(const char *name, vrpn_Connection *c=0)
bool _wasConnected
Flag indicating whether we were connected last time through the mainloop. Used to send a "normal"-sev...
#define vrpn_gettimeofday
double _rawVals[16]
The raw values extracted from the report: which ones we use to set analog channels varies based on th...
struct timeval _timestamp
Timestamp updated during mainloop()
vrpn_float64 last[vrpn_CHANNEL_MAX]
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.
5th Dimension Technologies (5dt) "Ultra" USB data glove driver
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...
vrpn_HidAcceptor * _acceptor
This is the HidAcceptor we use when reconnecting.
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...