diff --git a/ESP32-S3/ESP32-S3.ino b/ESP32-S3/ESP32-S3.ino new file mode 100644 index 0000000..204d7ee --- /dev/null +++ b/ESP32-S3/ESP32-S3.ino @@ -0,0 +1,89 @@ +#define CHANNELS 4 +#define SAMPLE_CACHE_LENGTH 16 // Must be power of 2 (8, 16, etc.); See cache.h for implementation +#define HIT_THRES 750 // The thresholds are also dependent on SAMPLE_CACHE_LENGTH, if you +#define RESET_THRES 100 // changed SAMPLE_CACHE_LENGTH, you must also adjust thresholds +#define SAMPLING_PERIOD 500 // Sampling period in microseconds, 500us = 0.5ms = 2000Hz + +#define DEBUG 0 + +#include "USB.h" +#include "USBHIDKeyboard.h" +#include "cache.h" + +USBHIDKeyboard Keyboard; + +Cache inputWindow[CHANNELS]; +unsigned long power[CHANNELS]; +unsigned long lastPower[CHANNELS]; + +bool triggered; +unsigned long triggeredTime[CHANNELS]; + +const byte inPins[] = {36, 39, 34, 35}; // L don, L kat, R don, R kat +const byte outPins[] = {25, 26, 27, 14}; // LED visualization (optional) +const char outKeys[] = {'f', 'd', 'j', 'k'}; // L don, L kat, R don, R kat + +float sensitivity[] = {1.0, 1.0, 1.0, 1.0}; + +short maxIndex; +float maxPower; + +unsigned long lastTime; + +void setup() { + Serial.begin(250000); + for (byte i = 0; i < CHANNELS; i++) { + power[i] = 0; + lastPower[i] = 0; + triggered = false; + pinMode(inPins[i], INPUT); + pinMode(outPins[i], OUTPUT); + } + maxIndex = -1; + maxPower = 0; + lastTime = micros(); + Keyboard.begin(); + USB.begin(); +} + +void loop() { + if (maxIndex != -1 && lastPower[maxIndex] < RESET_THRES) { + triggered = false; + digitalWrite(outPins[maxIndex], LOW); + maxIndex = -1; + maxPower = 0; + } + + for (byte i = 0; i < CHANNELS; i++) { + inputWindow[i].put(analogRead(inPins[i])); + power[i] = sensitivity[i] * + (power[i] - inputWindow[i].get(1) + inputWindow[i].get()); + + if (lastPower[i] > maxPower && power[i] < lastPower[i]) { + maxPower = lastPower[i]; + maxIndex = i; + } + lastPower[i] = power[i]; +#if DEBUG + Serial.print(power[i]); + Serial.print(" "); +#endif + } + + if (!triggered && maxPower >= HIT_THRES) { + triggered = true; + digitalWrite(outPins[maxIndex], HIGH); +#if !DEBUG + Keyboard.write(outKeys[maxIndex]); +#endif + } +#if DEBUG + Serial.print("\n"); +#endif + + unsigned int frameTime = micros() - lastTime; + if (frameTime < SAMPLING_PERIOD) { + delayMicroseconds(SAMPLING_PERIOD - frameTime); + } + lastTime = micros(); +} diff --git a/ESP32-S3/cache.h b/ESP32-S3/cache.h new file mode 100644 index 0000000..5d73956 --- /dev/null +++ b/ESP32-S3/cache.h @@ -0,0 +1,31 @@ +/*************************************************************** + * * + * Taiko Sanro - Arduino * + * Cache data structure * + * * + * Chris * + * wisaly@gmail.com * + * * + ***************************************************************/ + +#ifndef CACHE_H +#define CACHE_H + +template +class Cache { +public: + Cache() { memset(data_, 0, sizeof(data_)); } + inline void put(T value) { + current_ = (current_ + 1) & (L - 1); + data_[current_] = value; + } + inline T get(int offset = 0) const { + return data_[(current_ + offset) & (L - 1)]; + } + +private: + T data_[L]; + int current_ = 0; +}; + +#endif // CACHE_H \ No newline at end of file