summaryrefslogtreecommitdiff
path: root/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick
diff options
context:
space:
mode:
authortmk <hasu@tmk-kbd.com>2015-05-13 11:13:10 +0900
committertmk <hasu@tmk-kbd.com>2015-05-13 11:13:10 +0900
commitf1f2066657f4a0998adc016c95d7e541b436e09f (patch)
treed056cb656b538c4f3a3c205363e0070976655e2e /tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick
parent1c73e574f109a17566db99e399bdf86007488d2a (diff)
parentf6d56675f9f981c5464f0ca7a1fbb0162154e8c5 (diff)
Merge commit 'f6d56675f9f981c5464f0ca7a1fbb0162154e8c5'
Diffstat (limited to 'tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick')
m---------tmk_core/protocol/usb_hid/USB_Host_Shield_2.00
-rw-r--r--tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/USBHIDJoystick.ino38
-rw-r--r--tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.cpp84
-rw-r--r--tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.h33
4 files changed, 155 insertions, 0 deletions
diff --git a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0 b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0
deleted file mode 160000
-Subproject 7c2e6c1bcdcc22cfdbd82edd9d8fc4c4276ead4
diff --git a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/USBHIDJoystick.ino b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/USBHIDJoystick.ino
new file mode 100644
index 0000000000..956441d67a
--- /dev/null
+++ b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/USBHIDJoystick.ino
@@ -0,0 +1,38 @@
+#include <hid.h>
+#include <hiduniversal.h>
+#include <usbhub.h>
+
+// Satisfy IDE, which only needs to see the include statment in the ino.
+#ifdef dobogusinclude
+#include <spi4teensy3.h>
+#include <SPI.h>
+#endif
+
+#include "hidjoystickrptparser.h"
+
+USB Usb;
+USBHub Hub(&Usb);
+HIDUniversal Hid(&Usb);
+JoystickEvents JoyEvents;
+JoystickReportParser Joy(&JoyEvents);
+
+void setup() {
+ Serial.begin(115200);
+#if !defined(__MIPSEL__)
+ while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
+#endif
+ 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();
+}
+
diff --git a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.cpp b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.cpp
new file mode 100644
index 0000000000..083b95cac5
--- /dev/null
+++ b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.cpp
@@ -0,0 +1,84 @@
+#include "hidjoystickrptparser.h"
+
+JoystickReportParser::JoystickReportParser(JoystickEvents *evt) :
+joyEvents(evt),
+oldHat(0xDE),
+oldButtons(0) {
+ for (uint8_t i = 0; i < RPT_GEMEPAD_LEN; i++)
+ oldPad[i] = 0xD;
+}
+
+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_GEMEPAD_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_GEMEPAD_LEN; i++) oldPad[i] = buf[i];
+ }
+
+ uint8_t hat = (buf[5] & 0xF);
+
+ // Calling Hat Switch event handler
+ if (hat != oldHat && joyEvents) {
+ joyEvents->OnHatSwitch(hat);
+ oldHat = hat;
+ }
+
+ uint16_t buttons = (0x0000 | buf[6]);
+ buttons <<= 4;
+ buttons |= (buf[5] >> 4);
+ uint16_t changes = (buttons ^ oldButtons);
+
+ // Calling Button Event Handler for every button changed
+ if (changes) {
+ for (uint8_t i = 0; i < 0x0C; i++) {
+ uint16_t mask = (0x0001 << i);
+
+ if (((mask & changes) > 0) && joyEvents)
+ if ((buttons & mask) > 0)
+ joyEvents->OnButtonDn(i + 1);
+ else
+ joyEvents->OnButtonUp(i + 1);
+ }
+ oldButtons = buttons;
+ }
+}
+
+void JoystickEvents::OnGamePadChanged(const GamePadEventData *evt) {
+ Serial.print("X1: ");
+ PrintHex<uint8_t > (evt->X, 0x80);
+ Serial.print("\tY1: ");
+ PrintHex<uint8_t > (evt->Y, 0x80);
+ Serial.print("\tX2: ");
+ PrintHex<uint8_t > (evt->Z1, 0x80);
+ Serial.print("\tY2: ");
+ PrintHex<uint8_t > (evt->Z2, 0x80);
+ Serial.print("\tRz: ");
+ PrintHex<uint8_t > (evt->Rz, 0x80);
+ Serial.println("");
+}
+
+void JoystickEvents::OnHatSwitch(uint8_t hat) {
+ Serial.print("Hat Switch: ");
+ PrintHex<uint8_t > (hat, 0x80);
+ Serial.println("");
+}
+
+void JoystickEvents::OnButtonUp(uint8_t but_id) {
+ Serial.print("Up: ");
+ Serial.println(but_id, DEC);
+}
+
+void JoystickEvents::OnButtonDn(uint8_t but_id) {
+ Serial.print("Dn: ");
+ Serial.println(but_id, DEC);
+}
diff --git a/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.h b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.h
new file mode 100644
index 0000000000..733b8f8da8
--- /dev/null
+++ b/tmk_core/protocol/usb_hid/USB_Host_Shield_2.0/examples/HID/USBHIDJoystick/hidjoystickrptparser.h
@@ -0,0 +1,33 @@
+#if !defined(__HIDJOYSTICKRPTPARSER_H__)
+#define __HIDJOYSTICKRPTPARSER_H__
+
+#include <hid.h>
+
+struct GamePadEventData {
+ uint8_t X, Y, Z1, Z2, Rz;
+};
+
+class JoystickEvents {
+public:
+ virtual void OnGamePadChanged(const GamePadEventData *evt);
+ virtual void OnHatSwitch(uint8_t hat);
+ virtual void OnButtonUp(uint8_t but_id);
+ virtual void OnButtonDn(uint8_t but_id);
+};
+
+#define RPT_GEMEPAD_LEN 5
+
+class JoystickReportParser : public HIDReportParser {
+ JoystickEvents *joyEvents;
+
+ uint8_t oldPad[RPT_GEMEPAD_LEN];
+ uint8_t oldHat;
+ uint16_t oldButtons;
+
+public:
+ JoystickReportParser(JoystickEvents *evt);
+
+ virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf);
+};
+
+#endif // __HIDJOYSTICKRPTPARSER_H__