mirror of
https://github.com/skogaby/OpeNITHM.git
synced 2026-09-25 08:08:08 +03:00
(*) Improve the auto calibration for the slider (32k has been tested, 16k has not) (*) Move the calibration routines into the main loop, seems to improve consistency greatly (*) Simplify the reactive lighting code (*) Make the code style more consistent
135 lines
2.8 KiB
C++
135 lines
2.8 KiB
C++
#include "PinConfig.h"
|
|
|
|
#ifdef USB
|
|
#include "USBOutput.h"
|
|
|
|
/*
|
|
In 16 sensor mode, the intended keys are:
|
|
Left Right
|
|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
|
|
|
|
In 32 sensor mode, the intended keys are:
|
|
Left Right
|
|
0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | 24 | 26 | 28 | 30
|
|
1 | 3 | 5 | 7 | 9 | 11 | 13 | 15 | 17 | 19 | 21 | 23 | 25 | 27 | 29 | 31
|
|
|
|
*/
|
|
|
|
char topRow[] = { KEY_1, KEY_Q, KEY_2, KEY_W, KEY_3, KEY_E, KEY_4, KEY_R, KEY_5, KEY_T, KEY_6, KEY_Y, KEY_7, KEY_U, KEY_8, KEY_I };
|
|
char bottomRow[] = { KEY_A, KEY_Z, KEY_S, KEY_X, KEY_D, KEY_C, KEY_F, KEY_V, KEY_G, KEY_B, KEY_H, KEY_N, KEY_J, KEY_M, KEY_K, KEY_COMMA };
|
|
|
|
uint16_t airKeys[] = { KEY_SLASH, KEY_PERIOD, KEY_QUOTE , KEY_SEMICOLON, KEY_RIGHT_BRACE , KEY_LEFT_BRACE };
|
|
|
|
void USBOutput::sendKeyEvent(int key, KeyState state)
|
|
{
|
|
#if NUM_SENSORS == 16
|
|
switch (state)
|
|
{
|
|
case KeyState::UNPRESSED:
|
|
releaseKey(bottomRow[key]);
|
|
releaseKey(topRow[key]);
|
|
break;
|
|
case KeyState::SINGLE_PRESS:
|
|
pressKey(bottomRow[key]);
|
|
releaseKey(topRow[key]);
|
|
break;
|
|
case KeyState::DOUBLE_PRESS:
|
|
pressKey(bottomRow[key]);
|
|
pressKey(topRow[key]);
|
|
break;
|
|
}
|
|
#else
|
|
if (state == UNPRESSED) {
|
|
if (key % 2 == 0) {
|
|
releaseKey(topRow[key / 2]);
|
|
} else {
|
|
releaseKey(bottomRow[(key - 1) / 2]);
|
|
}
|
|
} else {
|
|
if (key % 2 == 0) {
|
|
pressKey(topRow[key / 2]);
|
|
} else {
|
|
pressKey(bottomRow[(key - 1) / 2]);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
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()
|
|
{
|
|
lastPosition = 0;
|
|
}
|
|
|
|
void USBOutput::writeKey(uint16_t key)
|
|
{
|
|
Nkro.set_key(key);
|
|
Nkro.send_nkro_now();
|
|
Nkro.reset_key(key);
|
|
Nkro.send_nkro_now();
|
|
}
|
|
|
|
void USBOutput::pressKey(uint16_t key)
|
|
{
|
|
Nkro.set_key(key);
|
|
}
|
|
|
|
void USBOutput::releaseKey(uint16_t key)
|
|
{
|
|
Nkro.reset_key(key);
|
|
}
|
|
|
|
void USBOutput::sendUpdate()
|
|
{
|
|
Nkro.send_nkro_now();
|
|
}
|
|
|
|
#endif
|