Permalink
Browse files

Logitech Extreme 3D Pro Joystick report parser added

  • Loading branch information...
1 parent c16a160 commit f2dd1215bd2d5e71fbe12393619ccee3fd9699fe @felis committed May 9, 2012
Showing with 151 additions and 1 deletion.
  1. +47 −0 examples/HID/le3dp/le3dp.pde
  2. +43 −0 examples/HID/le3dp/le3dp_rptparser.cpp
  3. +60 −0 examples/HID/le3dp/le3dp_rptparser.h
  4. +1 −1 hiduniversal.cpp
@@ -0,0 +1,47 @@
+/* Simplified Logitech Extreme 3D Pro Joystick Report Parser */
+
+#include <avr/pgmspace.h>
+
+#include <avrpins.h>
+#include <max3421e.h>
+#include <usbhost.h>
+#include <usb_ch9.h>
+#include <Usb.h>
+#include <usbhub.h>
+#include <avr/pgmspace.h>
+#include <address.h>
+#include <hid.h>
+#include <hiduniversal.h>
+
+#include "le3dp_rptparser.h"
+
+#include <printhex.h>
+#include <message.h>
+#include <hexdump.h>
+#include <parsetools.h>
+
+USB Usb;
+USBHub Hub(&Usb);
+HIDUniversal Hid(&Usb);
+JoystickEvents JoyEvents;
+JoystickReportParser Joy(&JoyEvents);
+
+void setup()
+{
+ Serial.begin( 115200 );
+ Serial.println("Start");
+
+ if (Usb.Init() == -1)
+ Serial.println("OSC did not start.");
+
+ delay( 200 );
+
+ if (!Hid.SetReportParser(0, &Joy))
+ ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1 );
+}
+
+void loop()
+{
+ Usb.Task();
+}
+
@@ -0,0 +1,43 @@
+#include "le3dp_rptparser.h"
+
+JoystickReportParser::JoystickReportParser(JoystickEvents *evt) :
+ joyEvents(evt)
+{}
+
+void JoystickReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf)
+{
+ bool match = true;
+
+ // Checking if there are changes in report since the method was last called
+ for (uint8_t i=0; i<RPT_GAMEPAD_LEN; i++) {
+ if( buf[i] != oldPad[i] ) {
+ match = false;
+ break;
+ }
+ }
+ // Calling Game Pad event handler
+ if (!match && joyEvents) {
+ joyEvents->OnGamePadChanged((const GamePadEventData*)buf);
+
+ for (uint8_t i=0; i<RPT_GAMEPAD_LEN; i++) oldPad[i] = buf[i];
+ }
+}
+
+void JoystickEvents::OnGamePadChanged(const GamePadEventData *evt)
+{
+ Serial.print("X: ");
+ PrintHex<uint16_t>(evt->x);
+ Serial.print(" Y: ");
+ PrintHex<uint16_t>(evt->y);
+ Serial.print(" Hat Switch: ");
+ PrintHex<uint8_t>(evt->hat);
+ Serial.print(" Twist: ");
+ PrintHex<uint8_t>(evt->twist);
+ Serial.print(" Slider: ");
+ PrintHex<uint8_t>(evt->slider);
+ Serial.print(" Buttons A: ");
+ PrintHex<uint8_t>(evt->buttons_a);
+ Serial.print(" Buttons B: ");
+ PrintHex<uint8_t>(evt->buttons_b);
+ Serial.println("");
+}
@@ -0,0 +1,60 @@
+#if !defined(__HIDJOYSTICKRPTPARSER_H__)
+#define __HIDJOYSTICKRPTPARSER_H__
+
+#include <inttypes.h>
+#include <avr/pgmspace.h>
+#include "avrpins.h"
+#include "max3421e.h"
+#include "usbhost.h"
+#include "usb_ch9.h"
+#include "Usb.h"
+
+#if defined(ARDUINO) && ARDUINO >=100
+#include "Arduino.h"
+#else
+#include <WProgram.h>
+#endif
+
+#include "printhex.h"
+#include "hexdump.h"
+#include "message.h"
+#include "confdescparser.h"
+#include "hid.h"
+
+struct GamePadEventData
+{
+ union { //axes and hut switch
+ uint32_t axes;
+ struct {
+ uint32_t x : 10;
+ uint32_t y : 10;
+ uint32_t hat : 4;
+ uint32_t twist : 8;
+ };
+ };
+ uint8_t buttons_a;
+ uint8_t slider;
+ uint8_t buttons_b;
+};
+
+class JoystickEvents
+{
+public:
+ virtual void OnGamePadChanged(const GamePadEventData *evt);
+};
+
+#define RPT_GAMEPAD_LEN sizeof(GamePadEventData)/sizeof(uint8_t)
+
+class JoystickReportParser : public HIDReportParser
+{
+ JoystickEvents *joyEvents;
+
+ uint8_t oldPad[RPT_GAMEPAD_LEN];
+
+public:
+ JoystickReportParser(JoystickEvents *evt);
+
+ virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
+};
+
+#endif // __HIDJOYSTICKRPTPARSER_H__
View
@@ -178,7 +178,7 @@ uint8_t HIDUniversal::Init(uint8_t parent, uint8_t port, bool lowspeed)
p->lowspeed = lowspeed;
- delay(200);
+ delay(500);
if (len)
rcode = pUsb->getDevDescr( bAddress, 0, len, (uint8_t*)buf );

0 comments on commit f2dd121

Please sign in to comment.