mirror of
https://github.com/ByteWelder/Tactility.git
synced 2026-02-18 19:03:16 +00:00
- Implement M5Stack Cardputer: display, SD card and keyboard - `St7789Display` now supports a "gap" configuration - `ElfApp` has improved errors
193 lines
5.1 KiB
C++
193 lines
5.1 KiB
C++
/**
|
|
* @file keyboard.h
|
|
* @author Forairaaaaa
|
|
* @brief
|
|
* @version 0.1
|
|
* @date 2023-09-22
|
|
*
|
|
* @copyright Copyright (c) 2023
|
|
*
|
|
*/
|
|
#pragma once
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include "keymap.h"
|
|
|
|
|
|
namespace KEYBOARD
|
|
{
|
|
struct Chart_t
|
|
{
|
|
uint8_t value;
|
|
uint8_t x_1;
|
|
uint8_t x_2;
|
|
};
|
|
|
|
struct Point2D_t
|
|
{
|
|
int x;
|
|
int y;
|
|
};
|
|
|
|
const std::vector<int> output_list = {8, 9, 11};
|
|
const std::vector<int> input_list = {13, 15, 3, 4, 5, 6, 7};
|
|
// const std::vector<int> input_list = {1, 2, 3, 4, 5, 6, 7};
|
|
|
|
const Chart_t X_map_chart[7] =
|
|
{
|
|
{1, 0, 1},
|
|
{2, 2, 3},
|
|
{4, 4, 5},
|
|
{8, 6, 7},
|
|
{16, 8, 9},
|
|
{32, 10, 11},
|
|
{64, 12, 13}
|
|
};
|
|
|
|
struct KeyValue_t
|
|
{
|
|
const char* value_first;
|
|
const int value_num_first;
|
|
const char* value_second;
|
|
const int value_num_second;
|
|
};
|
|
|
|
const KeyValue_t _key_value_map[4][14] = {
|
|
{{"`", KEY_GRAVE, "~", KEY_GRAVE},
|
|
{"1", KEY_1, "!", KEY_1},
|
|
{"2", KEY_2, "@", KEY_2},
|
|
{"3", KEY_3, "#", KEY_3},
|
|
{"4", KEY_4, "$", KEY_4},
|
|
{"5", KEY_5, "%", KEY_5},
|
|
{"6", KEY_6, "^", KEY_6},
|
|
{"7", KEY_7, "&", KEY_7},
|
|
{"8", KEY_8, "*", KEY_KPASTERISK},
|
|
{"9", KEY_9, "(", KEY_KPLEFTPAREN},
|
|
{"0", KEY_0, ")", KEY_KPRIGHTPAREN},
|
|
{"-", KEY_MINUS, "_", KEY_KPMINUS},
|
|
{"=", KEY_EQUAL, "+", KEY_KPPLUS},
|
|
{"del", KEY_BACKSPACE, "del", KEY_BACKSPACE}},
|
|
{{"tab", KEY_TAB, "tab", KEY_TAB},
|
|
{"q", KEY_Q, "Q", KEY_Q},
|
|
{"w", KEY_W, "W", KEY_W},
|
|
{"e", KEY_E, "E", KEY_E},
|
|
{"r", KEY_R, "R", KEY_R},
|
|
{"t", KEY_T, "T", KEY_T},
|
|
{"y", KEY_Y, "Y", KEY_Y},
|
|
{"u", KEY_U, "U", KEY_U},
|
|
{"i", KEY_I, "I", KEY_I},
|
|
{"o", KEY_O, "O", KEY_O},
|
|
{"p", KEY_P, "P", KEY_P},
|
|
{"[", KEY_LEFTBRACE, "{", KEY_LEFTBRACE},
|
|
{"]", KEY_RIGHTBRACE, "}", KEY_RIGHTBRACE},
|
|
{"\\", KEY_BACKSLASH, "|", KEY_BACKSLASH}},
|
|
{{"fn", 0, "fn", 0},
|
|
{"shift", 0, "shift", 0},
|
|
{"a", KEY_A, "A", KEY_A},
|
|
{"s", KEY_S, "S", KEY_S},
|
|
{"d", KEY_D, "D", KEY_D},
|
|
{"f", KEY_F, "F", KEY_F},
|
|
{"g", KEY_G, "G", KEY_G},
|
|
{"h", KEY_H, "H", KEY_H},
|
|
{"j", KEY_J, "J", KEY_J},
|
|
{"k", KEY_K, "K", KEY_K},
|
|
{"l", KEY_L, "L", KEY_L},
|
|
{";", KEY_SEMICOLON, ":", KEY_SEMICOLON},
|
|
{"'", KEY_APOSTROPHE, "\"", KEY_APOSTROPHE},
|
|
{"enter", KEY_ENTER, "enter", KEY_ENTER}},
|
|
{{"ctrl", KEY_LEFTCTRL, "ctrl", KEY_LEFTCTRL},
|
|
{"opt", 0, "opt", 0},
|
|
{"alt", KEY_LEFTALT, "alt", KEY_LEFTALT},
|
|
{"z", KEY_Z, "Z", KEY_Z},
|
|
{"x", KEY_X, "X", KEY_X},
|
|
{"c", KEY_C, "C", KEY_C},
|
|
{"v", KEY_V, "V", KEY_V},
|
|
{"b", KEY_B, "B", KEY_B},
|
|
{"n", KEY_N, "N", KEY_N},
|
|
{"m", KEY_M, "M", KEY_M},
|
|
{",", KEY_COMMA, "<", KEY_COMMA},
|
|
{".", KEY_DOT, ">", KEY_DOT},
|
|
{"/", KEY_KPSLASH, "?", KEY_KPSLASH},
|
|
{"space", KEY_SPACE, "space", KEY_SPACE}}};
|
|
|
|
class Keyboard
|
|
{
|
|
public:
|
|
|
|
struct KeysState
|
|
{
|
|
bool tab = false;
|
|
bool fn = false;
|
|
bool shift = false;
|
|
bool ctrl = false;
|
|
bool opt = false;
|
|
bool alt = false;
|
|
bool del = false;
|
|
bool enter = false;
|
|
bool space = false;
|
|
|
|
std::vector<char> values;
|
|
std::vector<int> hidKey;
|
|
|
|
void reset()
|
|
{
|
|
tab = false;
|
|
fn = false;
|
|
shift = false;
|
|
ctrl = false;
|
|
opt = false;
|
|
alt = false;
|
|
del = false;
|
|
enter = false;
|
|
space = false;
|
|
|
|
values.clear();
|
|
hidKey.clear();
|
|
}
|
|
};
|
|
|
|
|
|
private:
|
|
std::vector<Point2D_t> _key_list_buffer;
|
|
|
|
std::vector<Point2D_t> _key_values_without_special_keys;
|
|
KeysState _keys_state_buffer;
|
|
|
|
bool _is_caps_locked;
|
|
uint8_t _last_key_size;
|
|
|
|
|
|
void _set_output(const std::vector<int>& pinList, uint8_t output);
|
|
uint8_t _get_input(const std::vector<int>& pinList);
|
|
|
|
|
|
public:
|
|
Keyboard() :
|
|
_is_caps_locked(false),
|
|
_last_key_size(0)
|
|
{}
|
|
|
|
void init();
|
|
|
|
Point2D_t getKey();
|
|
|
|
uint8_t getKeyNum(Point2D_t keyCoor);
|
|
|
|
void updateKeyList();
|
|
inline std::vector<KEYBOARD::Point2D_t>& keyList() { return _key_list_buffer; }
|
|
|
|
inline KeyValue_t getKeyValue(const Point2D_t& keyCoor) { return _key_value_map[keyCoor.y][keyCoor.x]; }
|
|
|
|
bool isKeyPressing(int keyNum);
|
|
|
|
void updateKeysState();
|
|
inline KeysState& keysState() { return _keys_state_buffer; }
|
|
|
|
inline bool capslocked(void) { return _is_caps_locked; }
|
|
inline void setCapsLocked(bool isLocked) { _is_caps_locked = isLocked; }
|
|
|
|
bool isChanged();
|
|
inline uint8_t isPressed() { return _key_list_buffer.size(); }
|
|
};
|
|
}
|