From bed1de1e0b03fc4e429f5afa72685acd3eb03c99 Mon Sep 17 00:00:00 2001 From: veroxzik Date: Sat, 9 Nov 2019 13:26:32 -0500 Subject: [PATCH] Added the ability to report back individual IR sensors as keyboard keys Uncomment IR_SENSOR_KEY in Config.h to use --- Firmware/OpeNITHM/AirSensor.cpp | 10 ++++++++++ Firmware/OpeNITHM/AirSensor.h | 1 + Firmware/OpeNITHM/Config.h | 4 ++++ Firmware/OpeNITHM/OpeNITHM.ino | 11 ++++++++++- Firmware/OpeNITHM/Output.h | 1 + Firmware/OpeNITHM/USBOutput.cpp | 35 ++++++++++++++++++++++++++++++++- Firmware/OpeNITHM/USBOutput.h | 1 + 7 files changed, 61 insertions(+), 2 deletions(-) diff --git a/Firmware/OpeNITHM/AirSensor.cpp b/Firmware/OpeNITHM/AirSensor.cpp index bc6aaf9..037d1a5 100644 --- a/Firmware/OpeNITHM/AirSensor.cpp +++ b/Firmware/OpeNITHM/AirSensor.cpp @@ -207,6 +207,16 @@ float AirSensor::getHandPosition() return highestTriggered == -1 ? 0 : ((float)highestTriggered / 6.0f); } +uint8_t AirSensor::getSensorReadings() +{ + uint8_t reading = 0; + for (int i = 0; i < 6; i++) + { + reading |= ((int)getSensorState(i) << i); + } + return reading; +} + void AirSensor::setDeadzone(int deadzone) { this->deadzone = deadzone; diff --git a/Firmware/OpeNITHM/AirSensor.h b/Firmware/OpeNITHM/AirSensor.h index 564f49c..36f36e4 100644 --- a/Firmware/OpeNITHM/AirSensor.h +++ b/Firmware/OpeNITHM/AirSensor.h @@ -38,6 +38,7 @@ class AirSensor bool getSensorState(int sensor); int getValue(int sensor, bool light); float getHandPosition(); + uint8_t getSensorReadings(); void setDeadzone(int deadzone); void setAlpha(float alpha); diff --git a/Firmware/OpeNITHM/Config.h b/Firmware/OpeNITHM/Config.h index 7fadf21..3a00205 100644 --- a/Firmware/OpeNITHM/Config.h +++ b/Firmware/OpeNITHM/Config.h @@ -15,6 +15,10 @@ // Uncomment this line if your IR sensors will be used in analog mode (Confirm pinout on PinConfig.h) //#define IR_SENSOR_ANALOG +// Comment this line for default Seaurchin air sensor bindings +// Uncomment this line if your IR sensors will each be mapped to separate keyboard key +//#define IR_SENSOR_KEY + // Uncomment this line to output the RAW touch values to the Serial port (for use with Arduino's Serial Plotter) //#define SERIAL_PLOT // Define PLOT_PIN as -1 to print all key's values, otherwise define as 0-15 for an individual key diff --git a/Firmware/OpeNITHM/OpeNITHM.ino b/Firmware/OpeNITHM/OpeNITHM.ino index cb33b3f..30fcb26 100644 --- a/Firmware/OpeNITHM/OpeNITHM.ino +++ b/Firmware/OpeNITHM/OpeNITHM.ino @@ -277,7 +277,7 @@ void loop() { Serial.print("\t"); Serial.print(touchboard->getNeutralValue(PLOT_PIN)); Serial.print("\t"); - Serial.println(touchboard->getNeutralValue(PLOT_PIN) + touchboard->getDeadzone()); + Serial.print(touchboard->getNeutralValue(PLOT_PIN) + touchboard->getDeadzone()); } #endif @@ -286,11 +286,20 @@ void loop() { if (newPosition != sensorPosition) { #if !defined(SERIAL_PLOT) || defined(USB) +#ifdef IR_SENSOR_KEY + output->sendSensor(sensor->getSensorReadings()); +#else output->sendSensorEvent(newPosition); +#endif #endif sensorPosition = newPosition; } +#if defined(SERIAL_PLOT) + Serial.print("\t"); + Serial.println(sensor->getSensorReadings()); +#endif + // If the air sensor is calibrated, update lights. The lights will stay red as long as the air sensor is not calibrated. if (sensor->isCalibrated()) FastLED.show(); diff --git a/Firmware/OpeNITHM/Output.h b/Firmware/OpeNITHM/Output.h index 06be694..8dd2dbd 100644 --- a/Firmware/OpeNITHM/Output.h +++ b/Firmware/OpeNITHM/Output.h @@ -8,6 +8,7 @@ class Output public: virtual void sendKeyEvent(int key, bool pressed, bool doublePressed); virtual void sendSensorEvent(float position); + virtual void sendSensor(int sensor); }; #endif diff --git a/Firmware/OpeNITHM/USBOutput.cpp b/Firmware/OpeNITHM/USBOutput.cpp index 38df788..4d02e1c 100644 --- a/Firmware/OpeNITHM/USBOutput.cpp +++ b/Firmware/OpeNITHM/USBOutput.cpp @@ -6,18 +6,22 @@ char bottomRow[] = {'a', 'z', 's', 'x', 'd', 'c', 'f', 'v', 'g', 'b', 'h', 'n', 'j', 'm', 'k', ','}; char topRow[] = {'1', 'q', '2', 'w', '3', 'e', '4', 'r', '5', 't', '6', 'y', '7', 'u', '8', 'i'}; +uint16_t airKeys[] = { KEY_SLASH, KEY_PERIOD, KEY_QUOTE , KEY_SEMICOLON, KEY_RIGHT_BRACE , KEY_LEFT_BRACE }; + void USBOutput::sendKeyEvent(int key, bool pressed, bool doublePressed) { if (pressed) { if (doublePressed) { - writeKey(topRow[key]); + pressKey(topRow[key]); } else { pressKey(bottomRow[key]); + releaseKey(topRow[key]); } } else { releaseKey(bottomRow[key]); + releaseKey(topRow[key]); } } @@ -58,6 +62,17 @@ void USBOutput::sendSensorEvent(float position) lastPosition = position; } +void USBOutput::sendSensor(int sensor) +{ + for (int i = 0; i < 6; i++) + { + if (bitRead(sensor, i)) + pressKey(airKeys[i]); + else + releaseKey(airKeys[i]); + } +} + USBOutput::USBOutput() { #ifndef TEENSY @@ -77,6 +92,12 @@ void USBOutput::writeKey(uint16_t key) case KEY_PAGE_DOWN: case KEY_HOME: case KEY_END: + case KEY_SLASH: + case KEY_PERIOD: + case KEY_QUOTE: + case KEY_SEMICOLON: + case KEY_RIGHT_BRACE: + case KEY_LEFT_BRACE: // Don't use ASCII method Nkro.set_key(key); Nkro.send_nkro_now(); @@ -105,6 +126,12 @@ void USBOutput::pressKey(uint16_t key) case KEY_PAGE_DOWN: case KEY_HOME: case KEY_END: + case KEY_SLASH: + case KEY_PERIOD: + case KEY_QUOTE: + case KEY_SEMICOLON: + case KEY_RIGHT_BRACE: + case KEY_LEFT_BRACE: // Don't use ASCII method Nkro.set_key(key); Nkro.send_nkro_now(); @@ -129,6 +156,12 @@ void USBOutput::releaseKey(uint16_t key) case KEY_PAGE_DOWN: case KEY_HOME: case KEY_END: + case KEY_SLASH: + case KEY_PERIOD: + case KEY_QUOTE: + case KEY_SEMICOLON: + case KEY_RIGHT_BRACE: + case KEY_LEFT_BRACE: // Don't use ASCII method Nkro.reset_key(key); Nkro.send_nkro_now(); diff --git a/Firmware/OpeNITHM/USBOutput.h b/Firmware/OpeNITHM/USBOutput.h index 734c301..a396f63 100644 --- a/Firmware/OpeNITHM/USBOutput.h +++ b/Firmware/OpeNITHM/USBOutput.h @@ -27,6 +27,7 @@ class USBOutput : public Output public: void sendKeyEvent(int key, bool pressed, bool doublePressed) override; void sendSensorEvent(float position) override; + void sendSensor(int sensor) override; USBOutput(); };