diff --git a/ESP32-S3/ESP32-S3.ino b/ESP32-S3/ESP32-S3.ino index e25c83b..b127cdb 100644 --- a/ESP32-S3/ESP32-S3.ino +++ b/ESP32-S3/ESP32-S3.ino @@ -6,8 +6,8 @@ // The thresholds are also dependent on SAMPLE_CACHE_LENGTH, if you // changed SAMPLE_CACHE_LENGTH, you should also adjust thresholds -#define HIT_THRES 1750 -#define RESET_THRES 200 +#define HIT_THRES 400 +#define RESET_THRES 80 // Sampling period in μs, e.g., 500μs = 0.5ms = 2000Hz #define SAMPLING_PERIOD 500 @@ -36,10 +36,22 @@ #define R_DON_KEY 'j' #define R_KAT_KEY 'k' +// Switch controller output for each channel +// this default config should work for all the 3 game settings +#define L_DON_KEY_NS NSGAMEPAD_DPAD_DOWN +#define L_KAT_KEY_NS NSButton_LeftTrigger +#define R_DON_KEY_NS NSButton_B +#define R_KAT_KEY_NS NSButton_RightTrigger + // Enable debug mode to view analog input values from the Serial // Enabling this also disables the keyboard simulation #define DEBUG 0 +// 0 = keyboard; 1 = switch controller +#define controller_mode 1 + +#include "switch_ESP32.h" +NSGamepad Gamepad; #include "USB.h" #include "USBHIDKeyboard.h" #include "cache.h" @@ -56,6 +68,7 @@ unsigned long triggeredTime[CHANNELS]; const byte inPins[] = {L_DON_IN, L_KAT_IN, R_DON_IN, R_KAT_IN}; const byte outPins[] = {L_DON_LED, L_KAT_LED, R_DON_LED, R_KAT_LED}; const char outKeys[] = {L_DON_KEY, L_KAT_KEY, R_DON_KEY, R_KAT_KEY}; +const uint8_t outKeysNS[] = {L_DON_KEY_NS, L_KAT_KEY_NS, R_DON_KEY_NS, R_KAT_KEY_NS}; float sensitivities[] = {L_DON_SENS, L_KAT_SENS, R_DON_SENS, R_KAT_SENS}; short maxIndex; @@ -75,16 +88,23 @@ void setup() { maxIndex = -1; maxPower = 0; lastTime = micros(); -#if !DEBUG - Keyboard.begin(); - USB.begin(); -#endif + #if !DEBUG + if (controller_mode) { + Gamepad.begin(); + } else { + Keyboard.begin(); + } + USB.begin(); + #endif } void loop() { if (maxIndex != -1 && lastPower[maxIndex] < RESET_THRES) { triggered = false; digitalWrite(outPins[maxIndex], LOW); + if (controller_mode) { + Gamepad.releaseAll(); + } maxIndex = -1; maxPower = 0; } @@ -99,22 +119,32 @@ void loop() { maxIndex = i; } lastPower[i] = power[i]; -#if DEBUG + #if DEBUG Serial.print(power[i]); Serial.print(" "); -#endif + #endif } if (!triggered && maxPower >= HIT_THRES) { triggered = true; digitalWrite(outPins[maxIndex], HIGH); -#if !DEBUG - Keyboard.write(outKeys[maxIndex]); -#endif + #if !DEBUG + if (controller_mode) { + // special case for the DPAD + if (maxIndex == 0) { + Gamepad.dPad(outKeysNS[maxIndex]); + } else { + Gamepad.press(outKeysNS[maxIndex]); + } + Gamepad.loop(); + } else { + Keyboard.write(outKeys[maxIndex]); + } + #endif } -#if DEBUG - Serial.print("\n"); -#endif + #if DEBUG + Serial.print("\n"); + #endif unsigned int frameTime = micros() - lastTime; if (frameTime < SAMPLING_PERIOD) {