57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
#ifndef ARDUINO_USB_MODE
|
|
#error This ESP32 SoC has no Native USB interface
|
|
#elif ARDUINO_USB_MODE == 1
|
|
#warning This sketch should be used when USB is in OTG mode
|
|
void setup() {}
|
|
void loop() {}
|
|
#else
|
|
#include "USB.h"
|
|
#include "USBHIDGamepad.h"
|
|
USBHIDGamepad Gamepad;
|
|
|
|
const int buttonPin = 0;
|
|
int previousButtonState = HIGH;
|
|
|
|
void setup() {
|
|
pinMode(buttonPin, INPUT_PULLUP);
|
|
Gamepad.begin();
|
|
USB.begin();
|
|
Serial.begin(115200);
|
|
Serial.println("\n==================\nUSB Gamepad Testing\n==================\n");
|
|
Serial.println("Press BOOT Button to activate the USB gamepad.");
|
|
Serial.println("Longer press will change the affected button and controls.");
|
|
Serial.println("Shorter press/release just activates the button and controls.");
|
|
}
|
|
|
|
void loop() {
|
|
static uint8_t padID = 0;
|
|
static long lastPress = 0;
|
|
|
|
int buttonState = digitalRead(buttonPin);
|
|
if (buttonState != previousButtonState) {
|
|
if (buttonState == LOW) { // BOOT Button pressed
|
|
Gamepad.pressButton(padID); // Buttons 1 to 32
|
|
Gamepad.leftStick(padID << 3, padID << 3); // X Axis, Y Axis
|
|
Gamepad.rightStick(-(padID << 2), padID << 2); // Z Axis, Z Rotation
|
|
Gamepad.leftTrigger(padID << 4); // X Rotation
|
|
Gamepad.rightTrigger(-(padID << 4)); // Y Rotation
|
|
Gamepad.hat((padID & 0x7) + 1); // Point of View Hat
|
|
log_d("Pressed PadID [%d]", padID);
|
|
lastPress = millis();
|
|
} else {
|
|
Gamepad.releaseButton(padID);
|
|
Gamepad.leftStick(0, 0);
|
|
Gamepad.rightStick(0, 0);
|
|
Gamepad.leftTrigger(0);
|
|
Gamepad.rightTrigger(0);
|
|
Gamepad.hat(HAT_CENTER);
|
|
log_d("Released PadID [%d]\n", padID);
|
|
if (millis() - lastPress > 300) {
|
|
padID = (padID + 1) & 0x1F;
|
|
log_d("Changed padID to %d\n", padID);
|
|
}
|
|
}
|
|
}
|
|
previousButtonState = buttonState;
|
|
}
|
|
#endif /* ARDUINO_USB_MODE */
|