mirror of
https://github.com/google/mozc-devices.git
synced 2025-11-08 16:53:28 +03:00
68 lines
1.7 KiB
C++
68 lines
1.7 KiB
C++
#include "flick_keyboard.h"
|
|
#include <stdint.h>
|
|
|
|
#define ADC_BITS 12
|
|
|
|
void FlickKeyboard::ProcessSensorData(const SensorData& data, size_t maxKeyNum,
|
|
const char** outputStrings, int* nOutputs) {
|
|
const char* characters[COLS][ROWS] = {
|
|
{"a", "i", "u", "e", "o"},
|
|
{"ka", "ki", "ku", "ke", "ko"},
|
|
{"sa", "si", "su", "se", "so"},
|
|
{"ta", "ti", "tu", "te", "to"},
|
|
{"na", "ni", "nu", "ne", "no"},
|
|
{"ha", "hi", "hu", "he", "ho"},
|
|
{"ma", "mi", "mu", "me", "mo"},
|
|
{"ya", "(", "yu", ")", "yo"},
|
|
{"ra", "ri", "ru", "re", "ro"},
|
|
{"\n", "\b", "", " ", ""},
|
|
{"wa", "wo", "nn", "-", "~"},
|
|
{",", ".", "?", "!", "..."}
|
|
};
|
|
*nOutputs = 0;
|
|
for (size_t i = 0; i < COLS; i++) {
|
|
Direction s = ConvertToFlickState(data.axes[i * 2 + 1],
|
|
data.axes[i * 2], data.button[i]);
|
|
if (lastState[i] == NONE && s != NONE) {
|
|
if (*nOutputs < maxKeyNum) {
|
|
outputStrings[(*nOutputs)++] = characters[i][s];
|
|
}
|
|
}
|
|
lastState[i] = s;
|
|
}
|
|
}
|
|
|
|
FlickKeyboard::FlickKeyboard() {
|
|
for (size_t i = 0; i < COLS; i++) {
|
|
lastState[i] = NONE;
|
|
}
|
|
}
|
|
|
|
Direction FlickKeyboard::ConvertToFlickState(
|
|
int16_t x, int16_t y, bool buttonPressed) {
|
|
const int16_t adScale = 1 << ADC_BITS;
|
|
const int16_t adCenter = adScale / 2;
|
|
const int16_t threshold = adScale * 0.4;
|
|
|
|
int16_t diffX = x - adCenter;
|
|
int16_t diffY = y - adCenter;
|
|
if (buttonPressed) {
|
|
return CENTER;
|
|
}
|
|
if (abs(diffX) > abs(diffY)) {
|
|
if (diffX < -threshold) {
|
|
return LEFT;
|
|
} else if (diffX > threshold) {
|
|
return RIGHT;
|
|
}
|
|
} else {
|
|
if (diffY < -threshold) {
|
|
return UP;
|
|
} else if (diffY > threshold) {
|
|
return DOWN;
|
|
}
|
|
}
|
|
return NONE;
|
|
}
|
|
|