24#if defined(VRPN_USE_HID)
27static const vrpn_uint16 vrpn_5DT_VENDOR = 0x5d70;
29static const vrpn_uint16 vrpn_5DT_LEFT_MASK = 0x0001;
30static const vrpn_uint16 vrpn_5DT_RIGHT = 0x0000;
31static const vrpn_uint16 vrpn_5DT_LEFT = 0x0001;
32static const vrpn_uint16 vrpn_5DT_WIRELESS_PORTA_MASK = 0x0002;
33static const vrpn_uint16 vrpn_5DT_WIRELESS_PORTB_MASK = 0x0006;
34static const vrpn_uint16 vrpn_5DT_DATAGLOVE5_MASK = 0x0010;
35static const vrpn_uint16 vrpn_5DT_DATAGLOVE5 = 0x0010;
36static const vrpn_uint16 vrpn_5DT_DATAGLOVE14 = 0x0000;
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 fprintf(stderr,
"vrpn_Analog_5dtUSB::~vrpn_Analog_5dtUSB(): delete failed\n");
86 std::ostringstream ss;
87 if (
product() & vrpn_5DT_LEFT_MASK) {
94 if (
product() & vrpn_5DT_DATAGLOVE5_MASK) {
101 if (
product() & vrpn_5DT_WIRELESS_PORTA_MASK) {
102 ss <<
"wireless port A";
103 }
else if (
product() & vrpn_5DT_WIRELESS_PORTB_MASK) {
104 ss <<
"wireless port B";
113 std::ostringstream ss;
114 ss <<
"Received a too-short report: " << bytes;
122 const float scale = 1.0f / 4096.0f;
123 vrpn_uint8 * bufptr = buffer;
124 for (
size_t i = 0; i < 16; i++) {
125 _rawVals[i] = vrpn_unbuffer<vrpn_int16>(bufptr) * scale;
130 for (
size_t i = 0; i < 5; ++i) {
138 for (
size_t i = 0; i < 14; ++i) {
145 std::cerr <<
"Internal error - should not happen: Unrecognized number of channels!" << std::endl;
155 std::ostringstream ss;
vrpn_Analog_5dtUSB_Glove14Left(const char *name, vrpn_Connection *c=0)
vrpn_Analog_5dtUSB_Glove14Right(const char *name, vrpn_Connection *c=0)
vrpn_Analog_5dtUSB_Glove5Left(const char *name, vrpn_Connection *c=0)
vrpn_Analog_5dtUSB_Glove5Right(const char *name, vrpn_Connection *c=0)
5th Dimension Technologies (5dt) "Ultra" USB data glove driver
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.
void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report iff changed.
bool _wasConnected
Flag indicating whether we were connected last time through the mainloop. Used to send a "normal"-sev...
struct timeval _timestamp
Timestamp updated during mainloop()
std::string get_description() const
Returns a string description of the device we've connected to. Used internally, but also possibly use...
void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY)
Send report whether or not changed.
void on_data_received(size_t bytes, vrpn_uint8 *buffer)
Extracts the sensor values from each report.
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.
virtual ~vrpn_Analog_5dtUSB()
Destructor.
vrpn_float64 last[vrpn_CHANNEL_MAX]
vrpn_float64 channel[vrpn_CHANNEL_MAX]
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 ...
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...
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
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.
Generic connection class not specific to the transport mechanism.
vrpn_uint16 product() const
Returns USB product ID of connected device May not contain valid if an already-open device was provid...
vrpn_HidAcceptor * m_acceptor
This is the HidAcceptor we use when reconnecting.
virtual void update()
Polls the device buffers and causes on_data_received callbacks if appropriate You NEED to call this f...
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...
header for 5DT USB (HID) dataglove driver
All types of client/server/peer objects in VRPN should be derived from the vrpn_BaseClass type descri...
#define vrpn_gettimeofday