#pragma once // --- System registers --- #include #define TCA8418_REG_CFG 0x01 #define TCA8418_REG_INT_STAT 0x02 #define TCA8418_REG_KEY_LCK_EC 0x03 #define TCA8418_REG_KEY_EVENT_A 0x04 #define TCA8418_REG_KEY_EVENT_B 0x05 #define TCA8418_REG_KEY_EVENT_C 0x06 #define TCA8418_REG_KEY_EVENT_D 0x07 #define TCA8418_REG_KEY_EVENT_E 0x08 #define TCA8418_REG_KEY_EVENT_F 0x09 #define TCA8418_REG_KEY_EVENT_G 0x0A #define TCA8418_REG_KEY_EVENT_H 0x0B #define TCA8418_REG_KEY_EVENT_I 0x0C #define TCA8418_REG_KEY_EVENT_J 0x0D #define TCA8418_REG_KP_LCK_TIMER 0x0E #define TCA8418_REG_UNLOCK1 0x0F #define TCA8418_REG_UNLOCK2 0x10 #define TCA8418_REG_GPIO_INT_STAT1 0x11 #define TCA8418_REG_GPIO_INT_STAT2 0x12 #define TCA8418_REG_GPIO_INT_STAT3 0x13 #define TCA8418_REG_DAT_STAT1 0x14 #define TCA8418_REG_DAT_STAT2 0x15 #define TCA8418_REG_DAT_STAT3 0x16 #define TCA8418_REG_DAT_OUT1 0x17 #define TCA8418_REG_DAT_OUT2 0x18 #define TCA8418_REG_DAT_OUT3 0x19 #define TCA8418_REG_GPIO_INT_EN1 0x1A #define TCA8418_REG_GPIO_INT_EN2 0x1B #define TCA8418_REG_GPIO_INT_EN3 0x1C #define TCA8418_REG_KP_GPIO1 0x1D #define TCA8418_REG_KP_GPIO2 0x1E #define TCA8418_REG_KP_GPIO3 0x1F #define TCA8418_REG_GPI_EM1 0x20 #define TCA8418_REG_GPI_EM2 0x21 #define TCA8418_REG_GPI_EM3 0x22 #define TCA8418_REG_GPIO_DIR1 0x23 #define TCA8418_REG_GPIO_DIR2 0x24 #define TCA8418_REG_GPIO_DIR3 0x25 #define TCA8418_REG_GPIO_INT_LVL1 0x26 #define TCA8418_REG_GPIO_INT_LVL2 0x27 #define TCA8418_REG_GPIO_INT_LVL3 0x28 #define TCA8418_REG_DEBOUNCE_DIS1 0x29 #define TCA8418_REG_DEBOUNCE_DIS2 0x2A #define TCA8418_REG_DEBOUNCE_DIS3 0x2B #define TCA8418_REG_GPIO_PULL1 0x2C #define TCA8418_REG_GPIO_PULL2 0x2D #define TCA8418_REG_GPIO_PULL3 0x2E // --- Keypad configuration --- // --- Interrupt bits --- #define TCA8418_INT_KEY_EVENT (1 << 0) #define TCA8418_INT_GPIO (1 << 1) #define TCA8418_INT_KP_LOCK (1 << 2) #define TCA8418_INT_OVR_FLOW (1 << 3) #define TCA8418_INT_CAD (1 << 4) // --- Config bits --- #define TCA8418_CFG_INT_ENABLE (1 << 0) #define TCA8418_CFG_GPIO_INT_ENABLE (1 << 1) #define TCA8418_CFG_LOCK_INT_ENABLE (1 << 2) #define TCA8418_CFG_OVF_INT_ENABLE (1 << 3) #define TCA8418_CFG_INT_CFG (1 << 4) #define TCA8418_CFG_OVERFLOW_MODE (1 << 5) #define TCA8418_CFG_GPIO_TRACK_LOCKED (1 << 6) #define TCA8418_CFG_AUTO_INCREMENT (1 << 7) void tca8418_init(void); int tca8418_read(uint8_t *key, uint8_t *pressed); /* test key= 2 pressed key= 3 pressed key= 4 pressed key=1 5 pressed key=q 6 pressed key= 7 pressed key= 8 pressed key=a 11 pressed key= 12 pressed key=3 13 pressed key=e 14 pressed key=s 15 pressed key=z 16 pressed key=4 17 pressed key=r 18 pressed key=5 21 pressed key=t 22 pressed key=f 23 pressed key=c 24 pressed key=6 25 pressed key=y 26 pressed key=g 27 pressed key=v 28 pressed key=h 31 pressed key=b 32 pressed key=8 33 pressed key=i 34 pressed key=j 35 pressed key=n 36 pressed key=9 37 pressed key=o 38 pressed key=0 41 pressed key=p 42 pressed key=l 43 pressed key= 44 pressed key= 45 pressed key= 46 pressed key= 47 pressed key= 48 pressed key= 51 pressed key= 52 pressed key= 53 pressed key= 54 pressed key= 55 pressed key= 56 pressed key= 57 pressed key= 58 pressed key=s 61 pressed key=2 62 pressed key=8 63 pressed key=1 64 pressed key=2 65 pressed key=_ 66 pressed key=s 67 pressed key=e 68 pressed */ typedef enum { KEYBOARD_GPIO0 = 0, KEYBOARD_ESC = 1, KEYBOARD_TAB = 2, KEYBOARD_MOD_FN = 3, KEYBOARD_MOD_CTRL = 4, KEYBOARD_1 = 5, KEYBOARD_Q = 6, KEYBOARD_MOD_SHIFT = 7, KEYBOARD_MOD_OPT = 8, KEYBOARD_2 = 11, KEYBOARD_W = 12, KEYBOARD_A = 13, KEYBOARD_MOD_ALT = 14, KEYBOARD_3 = 15, KEYBOARD_E = 16, KEYBOARD_S = 17, KEYBOARD_Z = 18, KEYBOARD_4 = 21, KEYBOARD_R = 22, KEYBOARD_D = 23, KEYBOARD_X = 24, KEYBOARD_5 = 25, KEYBOARD_T = 26, KEYBOARD_F = 27, KEYBOARD_C = 28, KEYBOARD_6 = 31, KEYBOARD_Y = 32, KEYBOARD_G = 33, KEYBOARD_V = 34, KEYBOARD_7 = 35, KEYBOARD_U = 36, KEYBOARD_H = 37, KEYBOARD_B = 38, KEYBOARD_8 = 41, KEYBOARD_I = 42, KEYBOARD_J = 43, KEYBOARD_N = 44, KEYBOARD_9 = 45, KEYBOARD_O = 46, KEYBOARD_K = 47, KEYBOARD_M = 48, KEYBOARD_0 = 51, KEYBOARD_P = 52, KEYBOARD_L = 53, KEYBOARD_LEFT = 54, //also comma KEYBOARD_UNDERSCORE = 55, KEYBOARD_LEFT_BRACKET = 56, KEYBOARD_UP = 57, //also semicolon KEYBOARD_DOWN = 58, KEYBOARD_EQUALS = 61, KEYBOARD_RIGHT_BRACKET = 62, KEYBOARD_APOSTROPHE = 63, KEYBOARD_RIGHT = 64, //also slash KEYBOARD_BACKSPACE = 65, KEYBOARD_BACKSLASH = 66, KEYBOARD_RETURN = 67, KEYBOARD_SPACE = 68 } KEYMAP_MAP; #define KEYBOARD_KEYS_COUNT 80 typedef enum { KEYBOARD_SHIFT_TILDE = KEYBOARD_ESC, KEYBOARD_SHIFT_EXCLAMATION = KEYBOARD_1, KEYBOARD_SHIFT_AT = KEYBOARD_2, KEYBOARD_SHIFT_HASH = KEYBOARD_3, KEYBOARD_SHIFT_DOLLAR = KEYBOARD_4, KEYBOARD_SHIFT_PERCENT = KEYBOARD_5, KEYBOARD_SHIFT_POWER = KEYBOARD_6, KEYBOARD_SHIFT_AMPERSAND = KEYBOARD_7, KEYBOARD_SHIFT_STAR = KEYBOARD_8, KEYBOARD_SHIFT_OPENPARETHESIS = KEYBOARD_9, KEYBOARD_SHIFT_CLOSEPARENTHESIS = KEYBOARD_0, KEYBOARD_SHIFT_LESS = KEYBOARD_LEFT, KEYBOARD_SHIFT_DASH = KEYBOARD_UNDERSCORE, KEYBOARD_SHIFT_LEFT_CURLY_BRACKET = KEYBOARD_LEFT_BRACKET, KEYBOARD_SHIFT_COLON = KEYBOARD_UP, KEYBOARD_SHIFT_GREATER = KEYBOARD_DOWN, KEYBOARD_SHIFT_PLUS = KEYBOARD_EQUALS, KEYBOARD_SHIFT_RIGHT_CURLY_BRACKET = KEYBOARD_RIGHT_BRACKET, KEYBOARD_SHIFT_APOSTROPHES = KEYBOARD_APOSTROPHE, KEYBOARD_SHIFT_QUESTIONMARK = KEYBOARD_LEFT, //also slash KEYBOARD_SHIFT_DELETE = KEYBOARD_BACKSPACE, KEYBOARD_SHIFT_PIPE = KEYBOARD_BACKSLASH, } KEYMAP_SHIFT; static const char keymap_normal[] = { [KEYBOARD_ESC] = 27, [KEYBOARD_TAB] = '\t', [KEYBOARD_SPACE] = ' ', [KEYBOARD_RETURN] = '\n', [KEYBOARD_BACKSPACE] = '\b', [KEYBOARD_1] = '1', [KEYBOARD_2] = '2', [KEYBOARD_3] = '3', [KEYBOARD_4] = '4', [KEYBOARD_5] = '5', [KEYBOARD_6] = '6', [KEYBOARD_7] = '7', [KEYBOARD_8] = '8', [KEYBOARD_9] = '9', [KEYBOARD_0] = '0', [KEYBOARD_Q] = 'q', [KEYBOARD_W] = 'w', [KEYBOARD_E] = 'e', [KEYBOARD_R] = 'r', [KEYBOARD_T] = 't', [KEYBOARD_Y] = 'y', [KEYBOARD_U] = 'u', [KEYBOARD_I] = 'i', [KEYBOARD_O] = 'o', [KEYBOARD_P] = 'p', [KEYBOARD_A] = 'a', [KEYBOARD_S] = 's', [KEYBOARD_D] = 'd', [KEYBOARD_F] = 'f', [KEYBOARD_G] = 'g', [KEYBOARD_H] = 'h', [KEYBOARD_J] = 'j', [KEYBOARD_K] = 'k', [KEYBOARD_L] = 'l', [KEYBOARD_Z] = 'z', [KEYBOARD_X] = 'x', [KEYBOARD_C] = 'c', [KEYBOARD_V] = 'v', [KEYBOARD_B] = 'b', [KEYBOARD_N] = 'n', [KEYBOARD_M] = 'm', [KEYBOARD_LEFT] = ',', [KEYBOARD_RIGHT] = '/', [KEYBOARD_UP] = ';', [KEYBOARD_DOWN] = '.', [KEYBOARD_UNDERSCORE] = '-', [KEYBOARD_EQUALS] = '=', [KEYBOARD_LEFT_BRACKET] = '[', [KEYBOARD_RIGHT_BRACKET] = ']', [KEYBOARD_APOSTROPHE] = '\'', [KEYBOARD_BACKSLASH] = '\\', }; static const char keymap_shift[] = { [KEYBOARD_ESC] = '~', [KEYBOARD_1] = '!', [KEYBOARD_2] = '@', [KEYBOARD_3] = '#', [KEYBOARD_4] = '$', [KEYBOARD_5] = '%', [KEYBOARD_6] = '^', [KEYBOARD_7] = '&', [KEYBOARD_8] = '*', [KEYBOARD_9] = '(', [KEYBOARD_0] = ')', [KEYBOARD_Q] = 'Q', [KEYBOARD_W] = 'W', [KEYBOARD_E] = 'E', [KEYBOARD_R] = 'R', [KEYBOARD_T] = 'T', [KEYBOARD_Y] = 'Y', [KEYBOARD_U] = 'U', [KEYBOARD_I] = 'I', [KEYBOARD_O] = 'O', [KEYBOARD_P] = 'P', [KEYBOARD_A] = 'A', [KEYBOARD_S] = 'S', [KEYBOARD_D] = 'D', [KEYBOARD_F] = 'F', [KEYBOARD_G] = 'G', [KEYBOARD_H] = 'H', [KEYBOARD_J] = 'J', [KEYBOARD_K] = 'K', [KEYBOARD_L] = 'L', [KEYBOARD_Z] = 'Z', [KEYBOARD_X] = 'X', [KEYBOARD_C] = 'C', [KEYBOARD_V] = 'V', [KEYBOARD_B] = 'B', [KEYBOARD_N] = 'N', [KEYBOARD_M] = 'M', [KEYBOARD_LEFT] = '<', [KEYBOARD_RIGHT] = '?', [KEYBOARD_UP] = ':', [KEYBOARD_DOWN] = '>', [KEYBOARD_UNDERSCORE] = '_', [KEYBOARD_EQUALS] = '+', [KEYBOARD_LEFT_BRACKET] = '{', [KEYBOARD_RIGHT_BRACKET] = '}', [KEYBOARD_APOSTROPHE] = '"', [KEYBOARD_BACKSLASH] = '|', }; static const char * keymap_normal_name[] = { [KEYBOARD_ESC] = "ESC", [KEYBOARD_TAB] = "TAB", [KEYBOARD_SPACE] = "SPACE", [KEYBOARD_MOD_FN] = "FN", [KEYBOARD_MOD_CTRL] = "CTRL", [KEYBOARD_MOD_SHIFT] = "SHIFT", [KEYBOARD_MOD_OPT] = "OPT", [KEYBOARD_MOD_ALT] = "ALT", [KEYBOARD_LEFT] = ",", [KEYBOARD_RIGHT] = "/", [KEYBOARD_UP] = ";", [KEYBOARD_DOWN] = ".", [KEYBOARD_UNDERSCORE] = "-", [KEYBOARD_EQUALS] = "=", [KEYBOARD_LEFT_BRACKET] = "[", [KEYBOARD_RIGHT_BRACKET] = "]", [KEYBOARD_APOSTROPHE] = "'", [KEYBOARD_BACKSLASH] = "\\", [KEYBOARD_SHIFT_DELETE] = "DELETE", [KEYBOARD_RETURN] = "RETURN", [KEYBOARD_1] = "1", [KEYBOARD_2] = "2", [KEYBOARD_3] = "3", [KEYBOARD_4] = "4", [KEYBOARD_5] = "5", [KEYBOARD_6] = "6", [KEYBOARD_7] = "7", [KEYBOARD_8] = "8", [KEYBOARD_9] = "9", [KEYBOARD_0] = "0", [KEYBOARD_Q] = "q", [KEYBOARD_W] = "w", [KEYBOARD_E] = "e", [KEYBOARD_R] = "r", [KEYBOARD_T] = "t", [KEYBOARD_Y] = "y", [KEYBOARD_U] = "u", [KEYBOARD_I] = "i", [KEYBOARD_O] = "o", [KEYBOARD_P] = "p", [KEYBOARD_A] = "a", [KEYBOARD_S] = "s", [KEYBOARD_D] = "d", [KEYBOARD_F] = "f", [KEYBOARD_G] = "g", [KEYBOARD_H] = "h", [KEYBOARD_J] = "j", [KEYBOARD_K] = "k", [KEYBOARD_L] = "l", [KEYBOARD_Z] = "z", [KEYBOARD_X] = "x", [KEYBOARD_C] = "c", [KEYBOARD_V] = "v", [KEYBOARD_B] = "b", [KEYBOARD_N] = "n", [KEYBOARD_M] = "m", }; static const char * keymap_shift_name[] = { [KEYBOARD_ESC] = "~", [KEYBOARD_1] = "!", [KEYBOARD_2] = "@", [KEYBOARD_3] = "#", [KEYBOARD_4] = "$", [KEYBOARD_5] = "%", [KEYBOARD_6] = "^", [KEYBOARD_7] = "&", [KEYBOARD_8] = "*", [KEYBOARD_9] = "(", [KEYBOARD_0] = ")", [KEYBOARD_LEFT] = "<", [KEYBOARD_RIGHT] = "?", [KEYBOARD_UP] = ":", [KEYBOARD_DOWN] = ">", [KEYBOARD_UNDERSCORE] = "_", [KEYBOARD_EQUALS] = "+", [KEYBOARD_LEFT_BRACKET] = "{", [KEYBOARD_RIGHT_BRACKET] = "}", [KEYBOARD_APOSTROPHE] = "\"", [KEYBOARD_BACKSLASH] = "|", }; typedef struct { bool fnPressed; bool ctrlPressed; bool shiftPressed; bool altPressed; bool optPressed; //for convenience bool pressedKeys[KEYBOARD_KEYS_COUNT]; } KeyboardState_t; extern KeyboardState_t keyboardState; char getKeyboardChar(const uint8_t code); const char * getKeyboardKeyName(const uint8_t code);