Code cleanup (Never Nesting)
This commit is contained in:
parent
a4e0fcd847
commit
43007a57b6
101
firmware/src/IndicatorLed.cpp
Normal file
101
firmware/src/IndicatorLed.cpp
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* =======================================================================================================
|
||||||
|
* -------------------------------------------------------------------------------------------------------
|
||||||
|
* ---####################-----###########-------###########-----############--############-############--
|
||||||
|
* --######################---#############-----#############---- -- - ---
|
||||||
|
* --###### ##---##### ###-----### #####---------##-------#######------#-------------
|
||||||
|
* -- -------------- --- ----- --- ----- ---------##-------#------------#-------------
|
||||||
|
* --#####--------------------#####------####-####------#####---------##-------###########--############--
|
||||||
|
* -- -------------------- ------ ------ --------- ------- -- --
|
||||||
|
* --#####--------------------#####--------#####--------#####---------------------------------------------
|
||||||
|
* -- -------------------- -------- -------- ---------------------------------------------
|
||||||
|
* --######--------------##---#####---------------------#####---------------- IndicatorLed ---------------
|
||||||
|
* --##################### ---#####---------------------#####---------------------------------------------
|
||||||
|
* ---################### ----#####---------------------#####---------------------------------------------
|
||||||
|
* --- ----- --------------------- ---------------------------------------------
|
||||||
|
* -------------------------------------------------------------------------------------------------------
|
||||||
|
* =======================================================================================================
|
||||||
|
*
|
||||||
|
* Copyright 2023 Christoffer Martinsson <cm@cmtec.se>
|
||||||
|
*
|
||||||
|
* CMtec ERLS can be redistributed and/or modified under the terms of the GNU General
|
||||||
|
* Public License (Version 2), as published by the Free Software Foundation.
|
||||||
|
* A copy of the license can be found online at www.gnu.o urg/licenses.
|
||||||
|
*
|
||||||
|
* CMtec ERLS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "IndicatorLed.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Construct a new Indicator Led:: Indicator Led object
|
||||||
|
*
|
||||||
|
* @param pin Pin number for indicator LED
|
||||||
|
*/
|
||||||
|
IndicatorLed::IndicatorLed(int pin)
|
||||||
|
{
|
||||||
|
_pin = pin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize indicator LED
|
||||||
|
*/
|
||||||
|
void IndicatorLed::begin()
|
||||||
|
{
|
||||||
|
pinMode(_pin, OUTPUT);
|
||||||
|
digitalWrite(_pin, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Turn on indicator LED
|
||||||
|
*/
|
||||||
|
void IndicatorLed::on()
|
||||||
|
{
|
||||||
|
led_mode = LED_ON;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Turn off indicator LED
|
||||||
|
*/
|
||||||
|
void IndicatorLed::off()
|
||||||
|
{
|
||||||
|
led_mode = LED_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Blink indicator LED
|
||||||
|
*/
|
||||||
|
void IndicatorLed::blink()
|
||||||
|
{
|
||||||
|
led_mode = LED_BLINK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update indicator LED. Call this function in the main loop with a 200-500 ms interval.
|
||||||
|
*/
|
||||||
|
void IndicatorLed::update()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (led_mode == LED_BLINK && current_state == LED_OFF)
|
||||||
|
{
|
||||||
|
digitalWrite(_pin, HIGH);
|
||||||
|
current_state = LED_ON;
|
||||||
|
}
|
||||||
|
else if (led_mode == LED_BLINK && current_state == LED_ON)
|
||||||
|
{
|
||||||
|
digitalWrite(_pin, LOW);
|
||||||
|
current_state = LED_OFF;
|
||||||
|
}
|
||||||
|
else if (led_mode == LED_ON)
|
||||||
|
{
|
||||||
|
digitalWrite(_pin, HIGH);
|
||||||
|
current_state = LED_ON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
digitalWrite(_pin, LOW);
|
||||||
|
current_state = LED_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
55
firmware/src/IndicatorLed.h
Normal file
55
firmware/src/IndicatorLed.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* =======================================================================================================
|
||||||
|
* -------------------------------------------------------------------------------------------------------
|
||||||
|
* ---####################-----###########-------###########-----############--############-############--
|
||||||
|
* --######################---#############-----#############---- -- - ---
|
||||||
|
* --###### ##---##### ###-----### #####---------##-------#######------#-------------
|
||||||
|
* -- -------------- --- ----- --- ----- ---------##-------#------------#-------------
|
||||||
|
* --#####--------------------#####------####-####------#####---------##-------###########--############--
|
||||||
|
* -- -------------------- ------ ------ --------- ------- -- --
|
||||||
|
* --#####--------------------#####--------#####--------#####---------------------------------------------
|
||||||
|
* -- -------------------- -------- -------- ---------------------------------------------
|
||||||
|
* --######--------------##---#####---------------------#####---------------- IndicatorLed ---------------
|
||||||
|
* --##################### ---#####---------------------#####---------------------------------------------
|
||||||
|
* ---################### ----#####---------------------#####---------------------------------------------
|
||||||
|
* --- ----- --------------------- ---------------------------------------------
|
||||||
|
* -------------------------------------------------------------------------------------------------------
|
||||||
|
* =======================================================================================================
|
||||||
|
*
|
||||||
|
* Copyright 2023 Christoffer Martinsson <cm@cmtec.se>
|
||||||
|
*
|
||||||
|
* CMtec ERLS can be redistributed and/or modified under the terms of the GNU General
|
||||||
|
* Public License (Version 2), as published by the Free Software Foundation.
|
||||||
|
* A copy of the license can be found online at www.gnu.o urg/licenses.
|
||||||
|
*
|
||||||
|
* CMtec ERLS is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INDICATORLED_H
|
||||||
|
#define INDICATORLED_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
const int LED_OFF = 0;
|
||||||
|
const int LED_ON = 1;
|
||||||
|
const int LED_BLINK = 2;
|
||||||
|
|
||||||
|
class IndicatorLed
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IndicatorLed(int pin);
|
||||||
|
void begin();
|
||||||
|
void on();
|
||||||
|
void off();
|
||||||
|
void blink();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _pin;
|
||||||
|
int led_mode = LED_OFF;
|
||||||
|
int current_state = LED_OFF;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -17,29 +17,28 @@
|
|||||||
* =======================================================================================================
|
* =======================================================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "IndicatorLed.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Keypad.h>
|
#include <Keypad.h>
|
||||||
|
|
||||||
#define USB_LED_NUM_LOCK 0
|
const uint8_t USB_LED_NUM_LOCK = 0;
|
||||||
#define USB_LED_CAPS_LOCK 1
|
const uint8_t USB_LED_CAPS_LOCK = 1;
|
||||||
#define USB_LED_SCROLL_LOCK 2
|
const uint8_t USB_LED_SCROLL_LOCK = 2;
|
||||||
|
|
||||||
#define KEY_OFFSET 0xAA00 // Offset to apply for not interfere with already defined keyboard keys
|
const uint16_t KEY_OFFSET = 0xAA00; // Offset to apply for not interfere with already defined keyboard keys
|
||||||
|
|
||||||
#define KEY_FN1 10 + KEY_OFFSET // Function layer 1 button
|
const uint16_t KEY_FN = 10 + KEY_OFFSET; // Function layer 1 button
|
||||||
#define KEY_FN2 11 + KEY_OFFSET // Function layer 2 button
|
const uint16_t KEY_WIN_LATCH = 11 + KEY_OFFSET; // Function layer 2 button
|
||||||
#define KEY_WIN_LATCH 12 + KEY_OFFSET // Function layer 2 button
|
|
||||||
|
|
||||||
#define TAP_TIMEOUT 150 // Key tap timeout (ms)
|
const uint8_t TAP_TIMEOUT = 150; // Key tap timeout (ms)
|
||||||
#define NBR_OF_BUTTONS 42 // Number of buttons used (42 in this case)
|
const uint8_t NBR_OF_BUTTONS = 42; // Number of buttons used (42 in this case)
|
||||||
|
|
||||||
struct Button
|
struct Button
|
||||||
{
|
{
|
||||||
int keypad_kchar = 0;
|
|
||||||
uint16_t keycode = NO_KEY;
|
uint16_t keycode = NO_KEY;
|
||||||
uint16_t fn1_keycode = NO_KEY;
|
uint16_t fn1_keycode = NO_KEY;
|
||||||
uint16_t fn2_keycode = NO_KEY;
|
uint16_t fn2_keycode = NO_KEY;
|
||||||
int kstate = IDLE;
|
uint8_t kstate = IDLE;
|
||||||
uint16_t last_keycode = NO_KEY;
|
uint16_t last_keycode = NO_KEY;
|
||||||
bool run_keycode = false;
|
bool run_keycode = false;
|
||||||
};
|
};
|
||||||
@ -50,7 +49,7 @@ const byte KP_COLS = 12;
|
|||||||
byte kp_rowPins[KP_ROWS] = {0, 1, 2, 3};
|
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};
|
byte kp_colPins[KP_COLS] = {9, 8, 7, 6, 5, 4, 19, 18, 17, 16, 15, 14};
|
||||||
|
|
||||||
char kp_keys[KP_ROWS][KP_COLS] = {
|
const char kp_keys[KP_ROWS][KP_COLS] = {
|
||||||
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
|
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
|
||||||
{13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24},
|
{13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24},
|
||||||
{25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36},
|
{25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36},
|
||||||
@ -77,60 +76,58 @@ Keypad kp_keypad = Keypad(makeKeymap(kp_keys), kp_rowPins, kp_colPins, KP_ROWS,
|
|||||||
|
|
||||||
Button buttons[NBR_OF_BUTTONS] =
|
Button buttons[NBR_OF_BUTTONS] =
|
||||||
{
|
{
|
||||||
/* Btn ID Fn0 (hold) key Fn1 key Fn2 key */
|
/* Fn0 key Fn1 key Fn2 key */
|
||||||
{1, KEY_TAB, KEY_ESC, KEY_F11, IDLE, NO_KEY, false},
|
/* 1 */ {KEY_TAB, KEY_ESC, KEY_F11, IDLE, NO_KEY, false},
|
||||||
{2, KEY_Q, KEY_F1, KEY_F12, 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},
|
/* 3 */ {KEY_W, KEY_F2, KEY_F13, IDLE, NO_KEY, false},
|
||||||
{4, KEY_E, KEY_F3, KEY_F14, 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},
|
/* 5 */ {KEY_R, KEY_F4, KEY_F15, IDLE, NO_KEY, false},
|
||||||
{6, KEY_T, KEY_F5, KEY_F16, 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, '§', IDLE, NO_KEY, false},
|
||||||
{8, KEY_U, KEY_F7, KEY_WIN_LATCH, 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},
|
/* 9 */ {KEY_I, KEY_F8, KEY_LEFT_GUI, IDLE, NO_KEY, false},
|
||||||
{10, KEY_O, KEY_F9, NO_KEY, 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},
|
/* 11 */ {KEY_P, KEY_F10, KEY_CAPS_LOCK, IDLE, NO_KEY, false},
|
||||||
{12, 'å', KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
|
/* 12 */ {'å', KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
|
||||||
{13, KEY_LEFT_CTRL, KEY_LEFT_CTRL, KEY_LEFT_CTRL, 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},
|
/* 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},
|
/* 15 */ {KEY_S, KEY_2, KEY_MEDIA_NEXT_TRACK, IDLE, NO_KEY, false},
|
||||||
{16, KEY_D, KEY_3, KEY_F17, IDLE, NO_KEY, false},
|
/* 16 */ {KEY_D, KEY_3, KEY_F17, IDLE, NO_KEY, false},
|
||||||
{17, KEY_F, KEY_4, KEY_F18, IDLE, NO_KEY, false},
|
/* 17 */ {KEY_F, KEY_4, KEY_F18, IDLE, NO_KEY, false},
|
||||||
{18, KEY_G, KEY_5, KEY_F19, IDLE, NO_KEY, false},
|
/* 18 */ {KEY_G, KEY_5, KEY_F19, IDLE, NO_KEY, false},
|
||||||
{19, KEY_H, KEY_6, KEY_LEFT_ARROW, IDLE, NO_KEY, false},
|
/* 19 */ {KEY_H, KEY_6, KEY_LEFT_ARROW, IDLE, NO_KEY, false},
|
||||||
{20, KEY_J, KEY_7, KEY_DOWN_ARROW, IDLE, NO_KEY, false},
|
/* 20 */ {KEY_J, KEY_7, KEY_DOWN_ARROW, IDLE, NO_KEY, false},
|
||||||
{21, KEY_K, KEY_8, KEY_UP_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},
|
/* 22 */ {KEY_L, KEY_9, KEY_RIGHT_ARROW, IDLE, NO_KEY, false},
|
||||||
{23, 'ö', KEY_0, KEY_DELETE, IDLE, NO_KEY, false},
|
/* 23 */ {'ö', KEY_0, KEY_DELETE, IDLE, NO_KEY, false},
|
||||||
{24, 'ä', KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false},
|
/* 24 */ {'ä', KEY_ENTER, KEY_ENTER, IDLE, NO_KEY, false},
|
||||||
{25, KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, KEY_LEFT_SHIFT, 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},
|
/* 26 */ {KEY_Z, KEY_6, KEY_F20, IDLE, NO_KEY, false},
|
||||||
{27, KEY_X, KEY_7, KEY_F21, 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},
|
/* 28 */ {KEY_C, KEY_8, KEY_F22, IDLE, NO_KEY, false},
|
||||||
{29, KEY_V, KEY_9, KEY_F23, 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},
|
/* 30 */ {KEY_B, KEY_0, KEY_F24, IDLE, NO_KEY, false},
|
||||||
{31, KEY_N, '<', KEY_HOME, IDLE, NO_KEY, false},
|
/* 31 */ {KEY_N, '<', KEY_HOME, IDLE, NO_KEY, false},
|
||||||
{32, KEY_M, KEY_EQUAL, KEY_PAGE_DOWN, 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},
|
/* 33 */ {KEY_COMMA, KEY_BACKSLASH, KEY_PAGE_UP, IDLE, NO_KEY, false},
|
||||||
{34, KEY_PERIOD, KEY_RIGHT_BRACE, KEY_END, IDLE, NO_KEY, false},
|
/* 34 */ {KEY_PERIOD, KEY_RIGHT_BRACE, KEY_END, IDLE, NO_KEY, false},
|
||||||
{35, KEY_SLASH, KEY_MINUS, KEY_INSERT, IDLE, NO_KEY, false},
|
/* 35 */ {KEY_SLASH, KEY_MINUS, KEY_INSERT, IDLE, NO_KEY, false},
|
||||||
{36, KEY_RIGHT_SHIFT, KEY_RIGHT_SHIFT, KEY_RIGHT_SHIFT, IDLE, NO_KEY, false},
|
/* 36 */ {KEY_RIGHT_SHIFT, KEY_RIGHT_SHIFT, KEY_RIGHT_SHIFT, IDLE, NO_KEY, false},
|
||||||
{37, KEY_LEFT_ALT, KEY_LEFT_ALT, KEY_LEFT_ALT, IDLE, NO_KEY, false},
|
/* 37 */ {KEY_LEFT_ALT, KEY_LEFT_ALT, KEY_LEFT_ALT, IDLE, NO_KEY, false},
|
||||||
{38, KEY_FN1, NO_KEY, NO_KEY, IDLE, NO_KEY, false},
|
/* 38 */ {KEY_FN, NO_KEY, NO_KEY, IDLE, NO_KEY, false},
|
||||||
{39, KEY_SPACE, KEY_BACKSPACE, KEY_LEFT_GUI, IDLE, NO_KEY, false},
|
/* 39 */ {KEY_SPACE, KEY_BACKSPACE, KEY_LEFT_GUI, IDLE, NO_KEY, false},
|
||||||
{40, KEY_SPACE, KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
|
/* 40 */ {KEY_SPACE, KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
|
||||||
{41, KEY_FN1, NO_KEY, NO_KEY, IDLE, NO_KEY, false},
|
/* 41 */ {KEY_FN, NO_KEY, NO_KEY, IDLE, NO_KEY, false},
|
||||||
{42, KEY_FN1, KEY_RIGHT_ALT, NO_KEY, IDLE, NO_KEY, false}};
|
/* 42 */ {KEY_FN, KEY_RIGHT_ALT, NO_KEY, IDLE, NO_KEY, false}};
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
/* End of keymap config ----------------------------------------------------------------------------------------------------------------------------- */
|
/* End of keymap config ----------------------------------------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
const int STATUS_LED = 13;
|
IndicatorLed status_led = IndicatorLed(13);
|
||||||
bool status_led_on = false;
|
|
||||||
int status_led_mode = 0;
|
|
||||||
|
|
||||||
unsigned long current_timestamp = 0;
|
uint64_t current_timestamp = 0;
|
||||||
unsigned long button_timestamp = 0;
|
uint64_t button_timestamp = 0;
|
||||||
unsigned long indicator_timestamp = 0;
|
uint64_t indicator_timestamp = 0;
|
||||||
|
|
||||||
bool key_pressed = false;
|
bool key_pressed = false;
|
||||||
bool win_latched = false;
|
bool win_latched = false;
|
||||||
@ -140,23 +137,22 @@ bool win_latched = false;
|
|||||||
|
|
||||||
@param keycode code to apply action.
|
@param keycode code to apply action.
|
||||||
@param kstate PRESSED or RELEASED.
|
@param kstate PRESSED or RELEASED.
|
||||||
@return Action applied.
|
@return 1 if action applied. 0 if action aborted.
|
||||||
*/
|
*/
|
||||||
bool set_key(uint16_t keycode, uint8_t kstate)
|
uint8_t set_key(uint16_t keycode, uint8_t kstate)
|
||||||
{
|
{
|
||||||
/* Abort if keycode is invalid */
|
/* Abort if keycode is invalid */
|
||||||
if (keycode == NO_KEY || keycode == KEY_FN1 || keycode == KEY_FN2)
|
if (keycode == NO_KEY || keycode == KEY_FN)
|
||||||
{
|
{
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keycode == KEY_WIN_LATCH)
|
if (keycode == KEY_WIN_LATCH)
|
||||||
{
|
{
|
||||||
win_latched = true;
|
win_latched = true;
|
||||||
return true;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Normal keyboard keys (HID keyboard) */
|
|
||||||
if (kstate == RELEASED)
|
if (kstate == RELEASED)
|
||||||
{
|
{
|
||||||
if (win_latched == true)
|
if (win_latched == true)
|
||||||
@ -182,12 +178,56 @@ bool set_key(uint16_t keycode, uint8_t kstate)
|
|||||||
Keyboard.press(keycode);
|
Keyboard.press(keycode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find_and_set_button
|
||||||
|
*
|
||||||
|
* @param key_id key character
|
||||||
|
* @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 (state_changed == true)
|
||||||
|
{
|
||||||
|
buttons[key_id - 1].run_keycode = true;
|
||||||
|
buttons[key_id - 1].kstate = key_state;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void process_data()
|
/**
|
||||||
|
* find_fn_button
|
||||||
|
*
|
||||||
|
* @param key_id key character
|
||||||
|
* @return 1 if FN button found, 0 if not
|
||||||
|
*/
|
||||||
|
uint8_t check_if_button_is_fn(char key_id)
|
||||||
|
{
|
||||||
|
uint8_t fn_key_found = 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check_bootloader_mode
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void check_bootloader_mode()
|
||||||
{
|
{
|
||||||
/* Enter bootloader if all four corner-buttons is pressed together */
|
/* Enter bootloader if all four corner-buttons is pressed together */
|
||||||
int reboot = 0;
|
int reboot = 0;
|
||||||
@ -214,56 +254,42 @@ void process_data()
|
|||||||
{
|
{
|
||||||
_reboot_Teensyduino_();
|
_reboot_Teensyduino_();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_fn_mode
|
||||||
|
*
|
||||||
|
* @return 0, 1 or 2 depending on how many FN buttons are pressed
|
||||||
|
*/
|
||||||
|
uint8_t get_fn_mode()
|
||||||
|
{
|
||||||
/* Check for Fn1 mode */
|
/* Check for Fn1 mode */
|
||||||
int fn_mode = 0;
|
int fn_mode = 0;
|
||||||
for (int i = 0; i < LIST_MAX; i++)
|
for (int i = 0; i < LIST_MAX; i++)
|
||||||
{
|
{
|
||||||
if (kp_keypad.key[i].kstate != PRESSED && kp_keypad.key[i].kstate != HOLD)
|
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);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < NBR_OF_BUTTONS; j++)
|
|
||||||
{
|
|
||||||
if (buttons[j].keypad_kchar == kp_keypad.key[i].kchar && buttons[j].keycode == KEY_FN1)
|
|
||||||
{
|
|
||||||
/* Check if FN1 key are defined to this button (Layer 0 and first position in combo array)*/
|
|
||||||
if (buttons[j].keycode == KEY_FN1)
|
|
||||||
{
|
|
||||||
fn_mode++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return fn_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* process_keypad
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void process_keypad(uint8_t fn_mode)
|
||||||
|
{
|
||||||
/* Process key press/release */
|
/* Process key press/release */
|
||||||
for (int i = 0; i < LIST_MAX; i++)
|
for (int i = 0; i < LIST_MAX; i++)
|
||||||
{
|
{
|
||||||
if (kp_keypad.key[i].kstate == PRESSED)
|
if (kp_keypad.key[i].kstate == PRESSED)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < NBR_OF_BUTTONS; j++)
|
update_button_status(kp_keypad.key[i].kchar, kp_keypad.key[i].stateChanged, PRESSED);
|
||||||
{
|
|
||||||
if (buttons[j].keypad_kchar == kp_keypad.key[i].kchar && kp_keypad.key[i].stateChanged == true)
|
|
||||||
{
|
|
||||||
buttons[j].run_keycode = true;
|
|
||||||
buttons[j].kstate = PRESSED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (kp_keypad.key[i].kstate == RELEASED)
|
else if (kp_keypad.key[i].kstate == RELEASED)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < NBR_OF_BUTTONS; j++)
|
update_button_status(uint8_t(kp_keypad.key[i].kchar), kp_keypad.key[i].stateChanged, RELEASED);
|
||||||
{
|
|
||||||
if (buttons[j].keypad_kchar == kp_keypad.key[i].kchar && kp_keypad.key[i].stateChanged == true)
|
|
||||||
{
|
|
||||||
buttons[j].run_keycode = true;
|
|
||||||
buttons[j].kstate = RELEASED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,17 +301,17 @@ void process_data()
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset run_keycode flag */
|
/* Reset run_keycode flag */
|
||||||
buttons[i].run_keycode = false;
|
buttons[i].run_keycode = false;
|
||||||
|
|
||||||
if (buttons[i].kstate == RELEASED)
|
if (buttons[i].kstate == RELEASED)
|
||||||
{
|
{
|
||||||
/* Sending release command for last keycode related to this button */
|
/* Sending release command for last keycode related to this button */
|
||||||
set_key(buttons[i].last_keycode, RELEASED);
|
set_key(buttons[i].last_keycode, RELEASED);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if key pressed or released */
|
/* Check if key pressed or released */
|
||||||
if (fn_mode == 0)
|
if (fn_mode == 0)
|
||||||
{
|
{
|
||||||
@ -305,41 +331,10 @@ void process_data()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Scan key matrix and perform processing for each key.
|
|
||||||
|
|
||||||
@return void.
|
|
||||||
*/
|
|
||||||
void scan_buttons()
|
|
||||||
{
|
|
||||||
/* Scan keypad */
|
|
||||||
if (kp_keypad.getKeys())
|
|
||||||
{
|
|
||||||
process_data();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set status indication */
|
|
||||||
if (keyboard_leds & (1 << USB_LED_CAPS_LOCK))
|
|
||||||
{
|
|
||||||
/* 2 = blinking (CapsLock) */
|
|
||||||
status_led_mode = 2;
|
|
||||||
}
|
|
||||||
else if (win_latched)
|
|
||||||
{
|
|
||||||
status_led_mode = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* 0 = off (normal) */
|
|
||||||
status_led_mode = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
/* Init HW */
|
/* Init HW */
|
||||||
pinMode(STATUS_LED, OUTPUT);
|
status_led.begin();
|
||||||
digitalWrite(STATUS_LED, LOW);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
@ -351,36 +346,37 @@ void loop()
|
|||||||
if (current_timestamp >= button_timestamp)
|
if (current_timestamp >= button_timestamp)
|
||||||
{
|
{
|
||||||
button_timestamp = current_timestamp + 1;
|
button_timestamp = current_timestamp + 1;
|
||||||
scan_buttons();
|
|
||||||
|
/* Scan keypad */
|
||||||
|
if (kp_keypad.getKeys())
|
||||||
|
{
|
||||||
|
check_bootloader_mode();
|
||||||
|
process_keypad(get_fn_mode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set status indication */
|
||||||
|
if (keyboard_leds & (1 << USB_LED_CAPS_LOCK))
|
||||||
|
{
|
||||||
|
status_led.blink();
|
||||||
|
}
|
||||||
|
else if (win_latched)
|
||||||
|
{
|
||||||
|
status_led.on();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status_led.off();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update indicator 200ms */
|
/* Update indicator 200ms */
|
||||||
if (current_timestamp >= indicator_timestamp)
|
if (current_timestamp >= indicator_timestamp)
|
||||||
{
|
{
|
||||||
if (status_led_mode == 2 && status_led_on == false)
|
status_led.update();
|
||||||
{
|
|
||||||
digitalWrite(STATUS_LED, HIGH);
|
|
||||||
status_led_on = true;
|
|
||||||
}
|
|
||||||
else if (status_led_mode == 2 && status_led_on == true)
|
|
||||||
{
|
|
||||||
digitalWrite(STATUS_LED, LOW);
|
|
||||||
status_led_on = false;
|
|
||||||
}
|
|
||||||
else if (status_led_mode == 1)
|
|
||||||
{
|
|
||||||
digitalWrite(STATUS_LED, HIGH);
|
|
||||||
status_led_on = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
digitalWrite(STATUS_LED, LOW);
|
|
||||||
status_led_on = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
indicator_timestamp = current_timestamp + 200;
|
indicator_timestamp = current_timestamp + 200;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2022 Christoffer Martinsson <cm@cmtec.se>
|
* Copyright 2022 Christoffer Martinsson <cm@cmtec.se>
|
||||||
*
|
*
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user