Renamed main file

This commit is contained in:
Christoffer Martinsson 2023-06-04 20:26:15 +02:00
parent 43007a57b6
commit 12b5526e47
2 changed files with 56 additions and 48 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
firmware/compile_commands.json
firmware/.cache/clangd/index
firmware/.ccls-cache

View File

@ -15,6 +15,11 @@
* --- ----- --------------------- ---------------------------------------------
* -------------------------------------------------------------------------------------------------------
* =======================================================================================================
*
* Date: 2023-09-02
* Author: Christoffer Martinsson
* Email: cm@cmtec.se
* License: Please refer to end of this file for license information
*/
#include "IndicatorLed.h"
@ -26,11 +31,9 @@ const uint8_t USB_LED_CAPS_LOCK = 1;
const uint8_t USB_LED_SCROLL_LOCK = 2;
const uint16_t KEY_OFFSET = 0xAA00; // Offset to apply for not interfere with already defined keyboard keys
const uint16_t KEY_FN = 1 + KEY_OFFSET; // Function layer 1 button
const uint16_t KEY_WIN_LATCH = 2 + KEY_OFFSET; // Function layer 2 button
const uint16_t KEY_FN = 10 + KEY_OFFSET; // Function layer 1 button
const uint16_t KEY_WIN_LATCH = 11 + KEY_OFFSET; // Function layer 2 button
const uint8_t TAP_TIMEOUT = 150; // Key tap timeout (ms)
const uint8_t NBR_OF_BUTTONS = 42; // Number of buttons used (42 in this case)
struct Button
@ -49,14 +52,16 @@ const byte KP_COLS = 12;
byte kp_rowPins[KP_ROWS] = {0, 1, 2, 3};
byte kp_colPins[KP_COLS] = {9, 8, 7, 6, 5, 4, 19, 18, 17, 16, 15, 14};
const char kp_keys[KP_ROWS][KP_COLS] = {
const uint8_t MAX_PRESSED_KEYS = LIST_MAX;
const char kp_keys_id[KP_ROWS][KP_COLS] = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
{13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24},
{25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36},
{0, 0, 0, 37, 38, 39, 40, 41, 42, 0, 0, 0},
};
Keypad kp_keypad = Keypad(makeKeymap(kp_keys), kp_rowPins, kp_colPins, KP_ROWS, KP_COLS);
Keypad kp_keypad = Keypad(makeKeymap(kp_keys_id), kp_rowPins, kp_colPins, KP_ROWS, KP_COLS);
/*
@ -71,24 +76,40 @@ Keypad kp_keypad = Keypad(makeKeymap(kp_keys), kp_rowPins, kp_colPins, KP_ROWS,
* "Fn1 key" is the layer 1 key to use. Don NOT add KEY_FN1 or KEY_FN2 to this layer.
* "Fn2 key" is the layer 2 key to use. Don NOT add KEY_FN1 or KEY_FN2 to this layer.
Swedish keymap (ISO) special characters (not matching the key definition):
* KEY_TILE = §
* KEY_SEMICOLON = ö
* KEY_QUOTE = ä
* KEY_LEFT_BRACE = å
* KEY_SLASH = -
* KEY_NON_US_100 = <
* KEY_EQUAL = ´
* KEY_BACKSLASH = '
* KEY_RIGHT_BRACE = ^
* KEY_MINUS = +
* KEY_LEFT_ALT = Alt
* KEY_RIGHT_ALT = AltGr
*/
/* Keymap config ----------------------------------------------------------------------------------------------------------------------------------- */
// clang-format off
Button buttons[NBR_OF_BUTTONS] =
{
/* Fn0 key Fn1 key Fn2 key */
{
/* KeyId Fn0 key Fn1 key Fn2 key */
/* 1 */ {KEY_TAB, KEY_ESC, KEY_F11, IDLE, NO_KEY, false},
/* 2 */ {KEY_Q, KEY_F1, KEY_F12, IDLE, NO_KEY, false},
/* 3 */ {KEY_W, KEY_F2, KEY_F13, IDLE, NO_KEY, false},
/* 4 */ {KEY_E, KEY_F3, KEY_F14, IDLE, NO_KEY, false},
/* 5 */ {KEY_R, KEY_F4, KEY_F15, IDLE, NO_KEY, false},
/* 6 */ {KEY_T, KEY_F5, KEY_F16, IDLE, NO_KEY, false},
/* 7 */ {KEY_Y, KEY_F6, '§', IDLE, NO_KEY, false},
/* 7 */ {KEY_Y, KEY_F6, KEY_TILDE, IDLE, NO_KEY, false},
/* 8 */ {KEY_U, KEY_F7, KEY_WIN_LATCH, IDLE, NO_KEY, false},
/* 9 */ {KEY_I, KEY_F8, KEY_LEFT_GUI, IDLE, NO_KEY, false},
/* 10 */ {KEY_O, KEY_F9, NO_KEY, IDLE, NO_KEY, false},
/* 11 */ {KEY_P, KEY_F10, KEY_CAPS_LOCK, IDLE, NO_KEY, false},
/* 12 */ {'å', KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
/* 12 */ {KEY_LEFT_BRACE, KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
/* 13 */ {KEY_LEFT_CTRL, KEY_LEFT_CTRL, KEY_LEFT_CTRL, IDLE, NO_KEY, false},
/* 14 */ {KEY_A, KEY_1, KEY_MEDIA_PLAY_PAUSE, IDLE, NO_KEY, false},
/* 15 */ {KEY_S, KEY_2, KEY_MEDIA_NEXT_TRACK, IDLE, NO_KEY, false},
@ -99,15 +120,15 @@ Button buttons[NBR_OF_BUTTONS] =
/* 20 */ {KEY_J, KEY_7, KEY_DOWN_ARROW, IDLE, NO_KEY, false},
/* 21 */ {KEY_K, KEY_8, KEY_UP_ARROW, IDLE, NO_KEY, false},
/* 22 */ {KEY_L, KEY_9, KEY_RIGHT_ARROW, IDLE, NO_KEY, false},
/* 23 */ {'ö', KEY_0, KEY_DELETE, IDLE, NO_KEY, false},
/* 24 */ {'ä', KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false},
/* 23 */ {KEY_SEMICOLON, KEY_0, KEY_DELETE, IDLE, NO_KEY, false},
/* 24 */ {KEY_QUOTE, KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false},
/* 25 */ {KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, IDLE, NO_KEY, false},
/* 26 */ {KEY_Z, KEY_6, KEY_F20, IDLE, NO_KEY, false},
/* 27 */ {KEY_X, KEY_7, KEY_F21, IDLE, NO_KEY, false},
/* 28 */ {KEY_C, KEY_8, KEY_F22, IDLE, NO_KEY, false},
/* 29 */ {KEY_V, KEY_9, KEY_F23, IDLE, NO_KEY, false},
/* 30 */ {KEY_B, KEY_0, KEY_F24, IDLE, NO_KEY, false},
/* 31 */ {KEY_N, '<', KEY_HOME, IDLE, NO_KEY, false},
/* 31 */ {KEY_N, KEY_NON_US_100, KEY_HOME, IDLE, NO_KEY, false},
/* 32 */ {KEY_M, KEY_EQUAL, KEY_PAGE_DOWN, IDLE, NO_KEY, false},
/* 33 */ {KEY_COMMA, KEY_BACKSLASH, KEY_PAGE_UP, IDLE, NO_KEY, false},
/* 34 */ {KEY_PERIOD, KEY_RIGHT_BRACE, KEY_END, IDLE, NO_KEY, false},
@ -133,7 +154,7 @@ bool key_pressed = false;
bool win_latched = false;
/**
Perform key action.
set_key.
@param keycode code to apply action.
@param kstate PRESSED or RELEASED.
@ -141,11 +162,7 @@ bool win_latched = false;
*/
uint8_t set_key(uint16_t keycode, uint8_t kstate)
{
/* Abort if keycode is invalid */
if (keycode == NO_KEY || keycode == KEY_FN)
{
return 0;
}
if (keycode == NO_KEY || keycode == KEY_FN) return 0;
if (keycode == KEY_WIN_LATCH)
{
@ -184,22 +201,18 @@ uint8_t set_key(uint16_t keycode, uint8_t kstate)
/**
* find_and_set_button
*
* @param key_id key character
* @param key_id
* @param state_changed true if state changed
* @param key_state PRESSED or RELEASED
* @return 1 if button found and set, 0 if not
*/
uint8_t update_button_status(uint8_t key_id, bool state_changed, uint8_t key_state)
{
if (key_id == 0) return 0;
if (key_id == 0 || key_id > NBR_OF_BUTTONS || state_changed == false) return 0;
if (state_changed == true)
{
buttons[key_id - 1].run_keycode = true;
buttons[key_id - 1].kstate = key_state;
return 1;
}
return 0;
}
/**
@ -210,16 +223,10 @@ uint8_t update_button_status(uint8_t key_id, bool state_changed, uint8_t key_sta
*/
uint8_t check_if_button_is_fn(char key_id)
{
uint8_t fn_key_found = 0;
if (key_id == 0 || key_id > NBR_OF_BUTTONS) return 0;
if (key_id == 0) return 0;
/* Check if FN1 key are defined to this button (Layer 0 and first position in combo array)*/
if (buttons[key_id - 1].keycode == KEY_FN)
{
fn_key_found = 1;
}
return fn_key_found;
if (buttons[key_id - 1].keycode == KEY_FN) return 1;
return 0;
}
/**
@ -227,11 +234,11 @@ uint8_t check_if_button_is_fn(char key_id)
*
* @return void
*/
void check_bootloader_mode()
void check_if_to_enter_bootloader()
{
/* Enter bootloader if all four corner-buttons is pressed together */
int reboot = 0;
for (int i = 0; i < LIST_MAX; i++)
for (int i = 0; i < MAX_PRESSED_KEYS; i++)
{
if ((kp_keypad.key[i].kchar == 1) && (kp_keypad.key[i].kstate == PRESSED || kp_keypad.key[i].kstate == HOLD))
{
@ -252,7 +259,7 @@ void check_bootloader_mode()
}
if (reboot == 4)
{
_reboot_Teensyduino_();
_reboot_Teensyduino_(); // reboot to bootloader
}
}
@ -265,7 +272,7 @@ uint8_t get_fn_mode()
{
/* Check for Fn1 mode */
int fn_mode = 0;
for (int i = 0; i < LIST_MAX; i++)
for (int i = 0; i < MAX_PRESSED_KEYS; i++)
{
if (kp_keypad.key[i].kstate != PRESSED && kp_keypad.key[i].kstate != HOLD) continue;
fn_mode += check_if_button_is_fn(kp_keypad.key[i].kchar);
@ -281,7 +288,7 @@ uint8_t get_fn_mode()
void process_keypad(uint8_t fn_mode)
{
/* Process key press/release */
for (int i = 0; i < LIST_MAX; i++)
for (int i = 0; i < MAX_PRESSED_KEYS; i++)
{
if (kp_keypad.key[i].kstate == PRESSED)
{
@ -289,7 +296,7 @@ void process_keypad(uint8_t fn_mode)
}
else if (kp_keypad.key[i].kstate == RELEASED)
{
update_button_status(uint8_t(kp_keypad.key[i].kchar), kp_keypad.key[i].stateChanged, RELEASED);
update_button_status(kp_keypad.key[i].kchar, kp_keypad.key[i].stateChanged, RELEASED);
}
}
@ -350,7 +357,7 @@ void loop()
/* Scan keypad */
if (kp_keypad.getKeys())
{
check_bootloader_mode();
check_if_to_enter_bootloader();
process_keypad(get_fn_mode());
}