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 <Keypad.h>
|
||||
|
||||
#define USB_LED_NUM_LOCK 0
|
||||
#define USB_LED_CAPS_LOCK 1
|
||||
#define USB_LED_SCROLL_LOCK 2
|
||||
const uint8_t USB_LED_NUM_LOCK = 0;
|
||||
const uint8_t USB_LED_CAPS_LOCK = 1;
|
||||
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
|
||||
#define KEY_FN2 11 + KEY_OFFSET // Function layer 2 button
|
||||
#define KEY_WIN_LATCH 12 + 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
|
||||
|
||||
#define TAP_TIMEOUT 150 // Key tap timeout (ms)
|
||||
#define NBR_OF_BUTTONS 42 // Number of buttons used (42 in this case)
|
||||
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
|
||||
{
|
||||
int keypad_kchar = 0;
|
||||
uint16_t keycode = NO_KEY;
|
||||
uint16_t fn1_keycode = NO_KEY;
|
||||
uint16_t fn2_keycode = NO_KEY;
|
||||
int kstate = IDLE;
|
||||
uint8_t kstate = IDLE;
|
||||
uint16_t last_keycode = NO_KEY;
|
||||
bool run_keycode = false;
|
||||
};
|
||||
@ -50,7 +49,7 @@ 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};
|
||||
|
||||
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},
|
||||
{13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24},
|
||||
{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] =
|
||||
{
|
||||
/* Btn ID Fn0 (hold) 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},
|
||||
{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},
|
||||
{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},
|
||||
{16, KEY_D, KEY_3, KEY_F17, 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},
|
||||
{19, KEY_H, KEY_6, KEY_LEFT_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},
|
||||
{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},
|
||||
{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},
|
||||
{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},
|
||||
{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},
|
||||
{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},
|
||||
{39, KEY_SPACE, KEY_BACKSPACE, KEY_LEFT_GUI, 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},
|
||||
{42, KEY_FN1, KEY_RIGHT_ALT, NO_KEY, IDLE, NO_KEY, false}};
|
||||
/* 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},
|
||||
/* 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},
|
||||
/* 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},
|
||||
/* 16 */ {KEY_D, KEY_3, KEY_F17, 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},
|
||||
/* 19 */ {KEY_H, KEY_6, KEY_LEFT_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},
|
||||
/* 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},
|
||||
/* 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},
|
||||
/* 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},
|
||||
/* 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},
|
||||
/* 37 */ {KEY_LEFT_ALT, KEY_LEFT_ALT, KEY_LEFT_ALT, 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},
|
||||
/* 40 */ {KEY_SPACE, KEY_BACKSPACE, KEY_BACKSPACE, IDLE, NO_KEY, false},
|
||||
/* 41 */ {KEY_FN, NO_KEY, NO_KEY, IDLE, NO_KEY, false},
|
||||
/* 42 */ {KEY_FN, KEY_RIGHT_ALT, NO_KEY, IDLE, NO_KEY, false}};
|
||||
|
||||
// clang-format on
|
||||
/* End of keymap config ----------------------------------------------------------------------------------------------------------------------------- */
|
||||
|
||||
const int STATUS_LED = 13;
|
||||
bool status_led_on = false;
|
||||
int status_led_mode = 0;
|
||||
IndicatorLed status_led = IndicatorLed(13);
|
||||
|
||||
unsigned long current_timestamp = 0;
|
||||
unsigned long button_timestamp = 0;
|
||||
unsigned long indicator_timestamp = 0;
|
||||
uint64_t current_timestamp = 0;
|
||||
uint64_t button_timestamp = 0;
|
||||
uint64_t indicator_timestamp = 0;
|
||||
|
||||
bool key_pressed = false;
|
||||
bool win_latched = false;
|
||||
@ -140,23 +137,22 @@ bool win_latched = false;
|
||||
|
||||
@param keycode code to apply action.
|
||||
@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 */
|
||||
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)
|
||||
{
|
||||
win_latched = true;
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Normal keyboard keys (HID keyboard) */
|
||||
if (kstate == RELEASED)
|
||||
{
|
||||
if (win_latched == true)
|
||||
@ -182,12 +178,56 @@ bool set_key(uint16_t keycode, uint8_t kstate)
|
||||
Keyboard.press(keycode);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 */
|
||||
int reboot = 0;
|
||||
@ -214,56 +254,42 @@ void process_data()
|
||||
{
|
||||
_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 */
|
||||
int fn_mode = 0;
|
||||
for (int i = 0; i < LIST_MAX; i++)
|
||||
{
|
||||
if (kp_keypad.key[i].kstate != PRESSED && kp_keypad.key[i].kstate != HOLD)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
return fn_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* process_keypad
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
void process_keypad(uint8_t fn_mode)
|
||||
{
|
||||
/* Process key press/release */
|
||||
for (int i = 0; i < LIST_MAX; i++)
|
||||
{
|
||||
if (kp_keypad.key[i].kstate == PRESSED)
|
||||
{
|
||||
for (int j = 0; j < NBR_OF_BUTTONS; j++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
update_button_status(kp_keypad.key[i].kchar, kp_keypad.key[i].stateChanged, PRESSED);
|
||||
}
|
||||
else if (kp_keypad.key[i].kstate == RELEASED)
|
||||
{
|
||||
for (int j = 0; j < NBR_OF_BUTTONS; j++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
update_button_status(uint8_t(kp_keypad.key[i].kchar), kp_keypad.key[i].stateChanged, RELEASED);
|
||||
}
|
||||
}
|
||||
|
||||
@ -275,17 +301,17 @@ void process_data()
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
/* Reset run_keycode flag */
|
||||
buttons[i].run_keycode = false;
|
||||
|
||||
|
||||
if (buttons[i].kstate == RELEASED)
|
||||
{
|
||||
/* Sending release command for last keycode related to this button */
|
||||
set_key(buttons[i].last_keycode, RELEASED);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
/* Check if key pressed or released */
|
||||
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()
|
||||
{
|
||||
/* Init HW */
|
||||
pinMode(STATUS_LED, OUTPUT);
|
||||
digitalWrite(STATUS_LED, LOW);
|
||||
status_led.begin();
|
||||
}
|
||||
|
||||
void loop()
|
||||
@ -351,36 +346,37 @@ void loop()
|
||||
if (current_timestamp >= button_timestamp)
|
||||
{
|
||||
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 */
|
||||
if (current_timestamp >= indicator_timestamp)
|
||||
{
|
||||
if (status_led_mode == 2 && status_led_on == false)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
status_led.update();
|
||||
indicator_timestamp = current_timestamp + 200;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 2022 Christoffer Martinsson <cm@cmtec.se>
|
||||
*
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user