mirror of
https://github.com/skogaby/OpeNITHM.git
synced 2026-09-28 18:08:08 +03:00
179 lines
3.3 KiB
C++
179 lines
3.3 KiB
C++
#include "PinConfig.h"
|
|
|
|
#ifdef USB
|
|
#include "USBOutput.h"
|
|
|
|
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) {
|
|
pressKey(topRow[key]);
|
|
}
|
|
else {
|
|
pressKey(bottomRow[key]);
|
|
releaseKey(topRow[key]);
|
|
}
|
|
}
|
|
else {
|
|
releaseKey(bottomRow[key]);
|
|
releaseKey(topRow[key]);
|
|
}
|
|
}
|
|
|
|
void USBOutput::sendSensorEvent(float position)
|
|
{
|
|
// Send hand up / hand down key
|
|
if (position > lastPosition)
|
|
{
|
|
writeKey(KEY_PAGE_UP);
|
|
if (wasAirHeld)
|
|
{
|
|
// Send Air Action
|
|
writeKey(KEY_END);
|
|
}
|
|
}
|
|
if (position < lastPosition)
|
|
{
|
|
writeKey(KEY_PAGE_DOWN);
|
|
if (wasAirHeld)
|
|
{
|
|
// Send Air Action
|
|
writeKey(KEY_END);
|
|
}
|
|
}
|
|
|
|
// Send hand seen / unseen key
|
|
if (position > 0.05f)
|
|
{
|
|
pressKey(KEY_HOME);
|
|
wasAirHeld = true;
|
|
}
|
|
else {
|
|
releaseKey(KEY_HOME);
|
|
wasAirHeld = false;
|
|
}
|
|
|
|
// Save last position for next loop
|
|
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
|
|
NKROKeyboard.begin();
|
|
#endif
|
|
lastPosition = 0;
|
|
}
|
|
|
|
void USBOutput::writeKey(uint16_t key)
|
|
{
|
|
#ifndef TEENSY
|
|
NKROKeyboard.write(key);
|
|
#else
|
|
switch (key)
|
|
{
|
|
case KEY_PAGE_UP:
|
|
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();
|
|
Nkro.reset_key(key);
|
|
Nkro.send_nkro_now();
|
|
break;
|
|
default:
|
|
// Use NKRO for ASCII
|
|
Nkro.set_key_ascii(key);
|
|
Nkro.send_nkro_now();
|
|
Nkro.reset_key_ascii(key);
|
|
Nkro.send_nkro_now();
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void USBOutput::pressKey(uint16_t key)
|
|
{
|
|
#ifndef TEENSY
|
|
pressKey(key);
|
|
#else
|
|
switch (key)
|
|
{
|
|
case KEY_PAGE_UP:
|
|
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();
|
|
break;
|
|
default:
|
|
// Use NKRO for ASCII
|
|
Nkro.set_key_ascii(key);
|
|
Nkro.send_nkro_now();
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void USBOutput::releaseKey(uint16_t key)
|
|
{
|
|
#ifndef TEENSY
|
|
NKROKeyboard.release(key);
|
|
#else
|
|
switch (key)
|
|
{
|
|
case KEY_PAGE_UP:
|
|
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();
|
|
break;
|
|
default:
|
|
// Use NKRO for ASCII
|
|
Nkro.reset_key_ascii(key);
|
|
Nkro.send_nkro_now();
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#endif
|