11#if defined(VRPN_USE_HID)
14static const vrpn_uint16 LOGITECH_VENDOR = 0x046d;
15static const vrpn_uint16 EXTREME_3D_PRO = 0xc215;
19#define GAMEPAD_TRIGGER_THRESHOLD 30
24static vrpn_float64 normalize_dpad(
unsigned char up,
unsigned char right,
unsigned char down,
unsigned char left)
44 size_t index = ((x + 1) * 3) + (y + 1);
45 vrpn_float64 angles[] = {225, 270, 315, 180, -1, 0, 135, 90, 45};
46 return (angles[index]);
49static void normalize_axis(
const unsigned int value,
const short deadzone,
const vrpn_float64 scale, vrpn_float64& channel,
int wordSize = 16)
51 channel = (
static_cast<float>(value) - (float) (1 << (wordSize - 1)));
52 if (fabs(channel) < (deadzone * 3 / 4))
58 channel /= (float) (1 << (wordSize - 1));
61 if (channel < -1.0) { channel = -1.0; }
62 if (channel > 1.0) { channel = 1.0; }
65static void normalize_axes(
const unsigned int x,
const unsigned int y,
const short deadzone,
const vrpn_float64 scale, vrpn_float64& channelX, vrpn_float64& channelY,
int wordSize = 16)
67 normalize_axis(x, deadzone, scale, channelX, wordSize);
68 normalize_axis(y, deadzone, scale, channelY, wordSize);
86 fprintf(stderr,
"vrpn_Logitech_Controller_Raw::~vrpn_Logitech_Controller_Raw(): delete failed\n");
135 struct timeval current_time;
202 y = ((buffer[2] & 0x0f) << 8) + buffer[1];
204 normalize_axis(buffer[3], 0x12, 1.0f,
channel[2], 8);
205 normalize_axis(buffer[5], 0x0e, 1.0f,
channel[3], 8);
207 vrpn_uint8 value, mask;
209 for (
int btn = 0; btn < 8; btn++)
211 mask =
static_cast<vrpn_uint8
>(1 << (btn % 8));
212 buttons[btn] = ((value & mask) != 0);
216 for (
int btn = 0; btn < 4; btn++)
218 mask =
static_cast<vrpn_uint8
>(1 << (btn % 8));
219 buttons[btn + 12] = ((value & mask) != 0);
224 switch (buffer[2] >> 4)
259 fprintf(stderr,
"vrpn_Logitech_Extreme_3D_Pro: Found a corrupted report; # total bytes = %u\n",
static_cast<unsigned>(bytes));
vrpn_float64 last[vrpn_CHANNEL_MAX]
vrpn_float64 channel[vrpn_CHANNEL_MAX]
vrpn_Analog(const char *name, vrpn_Connection *c=NULL)
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...
int register_autodeleted_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
Registers a handler with the connection, and remembers to delete at destruction.
vrpn_Connection * d_connection
Connection that this object talks to.
void server_mainloop(void)
Handles functions that all servers should provide in their mainloop() (ping/pong, for example) Should...
vrpn_BaseClass(const char *name, vrpn_Connection *c=NULL)
Names the device and assigns or opens connection, calls registration methods.
Generic connection class not specific to the transport mechanism.
virtual void report(void)
vrpn_Dial(const char *name, vrpn_Connection *c=NULL)
vrpn_uint16 product() const
Returns USB product ID of connected device May not contain valid if an already-open device was provid...
vrpn_HidInterface(vrpn_HidAcceptor *acceptor, vrpn_uint16 vendor=0, vrpn_uint16 product=0, hid_device *device=NULL)
Constructor If we already have a HID device from some other source, it can be passed and we'll take o...
virtual void update()
Polls the device buffers and causes on_data_received callbacks if appropriate You NEED to call this f...
vrpn_uint16 vendor() const
Returns USB vendor ID of connected device May not contain valid if an already-open device was provide...
Accepts any device with the given vendor and product IDs.
static int VRPN_CALLBACK on_last_disconnect(void *thisPtr, vrpn_HANDLERPARAM p)
vrpn_Logitech_Controller_Raw(vrpn_HidAcceptor *filter, const char *name, vrpn_Connection *c=0, vrpn_uint16 vendor=0, vrpn_uint16 product=0)
void on_data_received(size_t bytes, vrpn_uint8 *buffer)
Derived class reimplements this callback.
struct timeval _timestamp
virtual ~vrpn_Logitech_Controller_Raw(void)
vrpn_HidAcceptor * _filter
virtual void decodePacket(size_t bytes, vrpn_uint8 *buffer)=0
static int VRPN_CALLBACK on_connect(void *thisPtr, vrpn_HANDLERPARAM p)
vrpn_Logitech_Extreme_3D_Pro(const char *name, vrpn_Connection *c=0)
void decodePacket(size_t bytes, vrpn_uint8 *buffer)
virtual void mainloop(void)
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
This structure is what is passed to a vrpn_Connection message callback.
const char * vrpn_dropped_last_connection
const char * vrpn_got_connection
unsigned long vrpn_TimevalDuration(struct timeval endT, struct timeval startT)
Return number of microseconds between startT and endT.
#define vrpn_gettimeofday