Skip to content

Commit

Permalink
Handle more keys on the tdeck
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Greening committed Dec 10, 2024
1 parent da71055 commit 6d4abea
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 76 deletions.
155 changes: 90 additions & 65 deletions firmware/src/Emulator/keyboard_defs.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include <unordered_map>
#include <vector>

enum SpecKeys
{
Expand Down Expand Up @@ -100,69 +101,93 @@ const std::unordered_map<SpecKeys, char> specKeyToLetter = {
};

// map letters to the SpecKeys enum
const std::unordered_map<char, SpecKeys> letterToSpecKey = {
{ '0', SPECKEY_0 },
{ '1', SPECKEY_1 },
{ '2', SPECKEY_2 },
{ '3', SPECKEY_3 },
{ '4', SPECKEY_4 },
{ '5', SPECKEY_5 },
{ '6', SPECKEY_6 },
{ '7', SPECKEY_7 },
{ '8', SPECKEY_8 },
{ '9', SPECKEY_9 },
{ 'A', SPECKEY_A },
{ 'B', SPECKEY_B },
{ 'C', SPECKEY_C },
{ 'D', SPECKEY_D },
{ 'E', SPECKEY_E },
{ 'F', SPECKEY_F },
{ 'G', SPECKEY_G },
{ 'H', SPECKEY_H },
{ 'I', SPECKEY_I },
{ 'J', SPECKEY_J },
{ 'K', SPECKEY_K },
{ 'L', SPECKEY_L },
{ 'M', SPECKEY_M },
{ 'N', SPECKEY_N },
{ 'O', SPECKEY_O },
{ 'P', SPECKEY_P },
{ 'Q', SPECKEY_Q },
{ 'R', SPECKEY_R },
{ 'S', SPECKEY_S },
{ 'T', SPECKEY_T },
{ 'U', SPECKEY_U },
{ 'V', SPECKEY_V },
{ 'W', SPECKEY_W },
{ 'X', SPECKEY_X },
{ 'Y', SPECKEY_Y },
{ 'Z', SPECKEY_Z },
{ 'a', SPECKEY_A },
{ 'b', SPECKEY_B },
{ 'c', SPECKEY_C },
{ 'd', SPECKEY_D },
{ 'e', SPECKEY_E },
{ 'f', SPECKEY_F },
{ 'g', SPECKEY_G },
{ 'h', SPECKEY_H },
{ 'i', SPECKEY_I },
{ 'j', SPECKEY_J },
{ 'k', SPECKEY_K },
{ 'l', SPECKEY_L },
{ 'm', SPECKEY_M },
{ 'n', SPECKEY_N },
{ 'o', SPECKEY_O },
{ 'p', SPECKEY_P },
{ 'q', SPECKEY_Q },
{ 'r', SPECKEY_R },
{ 's', SPECKEY_S },
{ 't', SPECKEY_T },
{ 'u', SPECKEY_U },
{ 'v', SPECKEY_V },
{ 'w', SPECKEY_W },
{ 'x', SPECKEY_X },
{ 'y', SPECKEY_Y },
{ 'z', SPECKEY_Z },
{ ' ', SPECKEY_SPACE },
{ 0x0d, SPECKEY_ENTER },
const std::unordered_map<char, std::vector<SpecKeys>> letterToSpecKeys = {
{ '0', { SPECKEY_0 } },
{ '1', { SPECKEY_1 } },
{ '2', { SPECKEY_2 } },
{ '3', { SPECKEY_3 } },
{ '4', { SPECKEY_4 } },
{ '5', { SPECKEY_5 } },
{ '6', { SPECKEY_6 } },
{ '7', { SPECKEY_7 } },
{ '8', { SPECKEY_8 } },
{ '9', { SPECKEY_9 } },
{ 'A', { SPECKEY_A } },
{ 'B', { SPECKEY_B } },
{ 'C', { SPECKEY_C } },
{ 'D', { SPECKEY_D } },
{ 'E', { SPECKEY_E } },
{ 'F', { SPECKEY_F } },
{ 'G', { SPECKEY_G } },
{ 'H', { SPECKEY_H } },
{ 'I', { SPECKEY_I } },
{ 'J', { SPECKEY_J } },
{ 'K', { SPECKEY_K } },
{ 'L', { SPECKEY_L } },
{ 'M', { SPECKEY_M } },
{ 'N', { SPECKEY_N } },
{ 'O', { SPECKEY_O } },
{ 'P', { SPECKEY_P } },
{ 'Q', { SPECKEY_Q } },
{ 'R', { SPECKEY_R } },
{ 'S', { SPECKEY_S } },
{ 'T', { SPECKEY_T } },
{ 'U', { SPECKEY_U } },
{ 'V', { SPECKEY_V } },
{ 'W', { SPECKEY_W } },
{ 'X', { SPECKEY_X } },
{ 'Y', { SPECKEY_Y } },
{ 'Z', { SPECKEY_Z } },
{ 'a', { SPECKEY_A } },
{ 'b', { SPECKEY_B } },
{ 'c', { SPECKEY_C } },
{ 'd', { SPECKEY_D } },
{ 'e', { SPECKEY_E } },
{ 'f', { SPECKEY_F } },
{ 'g', { SPECKEY_G } },
{ 'h', { SPECKEY_H } },
{ 'i', { SPECKEY_I } },
{ 'j', { SPECKEY_J } },
{ 'k', { SPECKEY_K } },
{ 'l', { SPECKEY_L } },
{ 'm', { SPECKEY_M } },
{ 'n', { SPECKEY_N } },
{ 'o', { SPECKEY_O } },
{ 'p', { SPECKEY_P } },
{ 'q', { SPECKEY_Q } },
{ 'r', { SPECKEY_R } },
{ 's', { SPECKEY_S } },
{ 't', { SPECKEY_T } },
{ 'u', { SPECKEY_U } },
{ 'v', { SPECKEY_V } },
{ 'w', { SPECKEY_W } },
{ 'x', { SPECKEY_X } },
{ 'y', { SPECKEY_Y } },
{ 'z', { SPECKEY_Z } },
{ ' ', { SPECKEY_SPACE } },
{ 0x0d, { SPECKEY_ENTER } },
{ '!', { SPECKEY_1, SPECKEY_SYMB } },
{ '@', { SPECKEY_2, SPECKEY_SYMB } },
{ '#', { SPECKEY_3, SPECKEY_SYMB } },
{ '$', { SPECKEY_4, SPECKEY_SYMB } },
{ '%', { SPECKEY_5, SPECKEY_SYMB } },
{ '&', { SPECKEY_6, SPECKEY_SYMB } },
{ '\'', { SPECKEY_7, SPECKEY_SYMB } },
{ '(', { SPECKEY_8, SPECKEY_SYMB } },
{ ')', { SPECKEY_9, SPECKEY_SYMB } },
{ '_', { SPECKEY_0, SPECKEY_SYMB } },
{ '<', { SPECKEY_R, SPECKEY_SYMB } },
{ '>', { SPECKEY_T, SPECKEY_SYMB } },
{ ';', { SPECKEY_O, SPECKEY_SYMB } },
{ '"', { SPECKEY_P, SPECKEY_SYMB } },
{ '-', { SPECKEY_J, SPECKEY_SYMB } },
{ '+', { SPECKEY_K, SPECKEY_SYMB } },
{ '=', { SPECKEY_L, SPECKEY_SYMB } },
{ ':', { SPECKEY_Z, SPECKEY_SYMB } },
{ '$', { SPECKEY_X, SPECKEY_SYMB } },
{ '?', { SPECKEY_C, SPECKEY_SYMB } },
{ '/', { SPECKEY_V, SPECKEY_SYMB } },
{ '*', { SPECKEY_B, SPECKEY_SYMB } },
{ ',', { SPECKEY_N, SPECKEY_SYMB } },
{ '.', { SPECKEY_M, SPECKEY_SYMB } },
};
27 changes: 16 additions & 11 deletions firmware/src/Input/TDeckKeyboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,28 +24,33 @@ void TDeckKeyboard::readKeyboardTask(void *pvParameters) {
}

void TDeckKeyboard::readKeyboard() {
SpecKeys lastKey = SpecKeys::SPECKEY_NONE;
unsigned long lastKeyPress = 0;
std::vector<SpecKeys> keysPressed;
unsigned long lastPress = 0;
while(true) {
char keyValue = 0;
Wire.requestFrom(0x55, 1);
while (Wire.available() > 0) {
keyValue = Wire.read();
if (keyValue != (char)0x00) {
Serial.println(keyValue);
// is it a valid spec key?
// convert to uppercase
if (letterToSpecKey.find(keyValue) != letterToSpecKey.end()) {
SpecKeys key = letterToSpecKey.at(keyValue);
m_keyPressedEvent(key);
m_keyEvent(key, true);
lastKey = key;
lastKeyPress = millis();
if (letterToSpecKeys.find(keyValue) != letterToSpecKeys.end()) {
std::vector<SpecKeys> keys = letterToSpecKeys.at(keyValue);
for (SpecKeys key : keys) {
keysPressed.push_back(key);
m_keyPressedEvent(key);
m_keyEvent(key, true);
lastPress = millis();
}
}
}
// release any pressed keys
if (lastKey != SpecKeys::SPECKEY_NONE && millis() - lastKeyPress > 100) {
m_keyEvent(lastKey, false);
lastKey = SpecKeys::SPECKEY_NONE;
if (millis() - lastPress > 100) {
for (SpecKeys key : keysPressed) {
m_keyEvent(key, false);
}
keysPressed.clear();
}
}
vTaskDelay(10);
Expand Down

0 comments on commit 6d4abea

Please sign in to comment.