9632360caa
* Add ARRAY_SIZE and CEILING utility macros * Apply a coccinelle patch to use ARRAY_SIZE * fix up some straggling items * Fix 'make test:secure' * Enhance ARRAY_SIZE macro to reject acting on pointers The previous definition would not produce a diagnostic for ``` int *p; size_t num_elem = ARRAY_SIZE(p) ``` but the new one will. * explicitly get definition of ARRAY_SIZE * Convert to ARRAY_SIZE when const is involved The following spatch finds additional instances where the array is const and the division is by the size of the type, not the size of the first element: ``` @ rule5a using "empty.iso" @ type T; const T[] E; @@ - (sizeof(E)/sizeof(T)) + ARRAY_SIZE(E) @ rule6a using "empty.iso" @ type T; const T[] E; @@ - sizeof(E)/sizeof(T) + ARRAY_SIZE(E) ``` * New instances of ARRAY_SIZE added since initial spatch run * Use `ARRAY_SIZE` in docs (found by grep) * Manually use ARRAY_SIZE hs_set is expected to be the same size as uint16_t, though it's made of two 8-bit integers * Just like char, sizeof(uint8_t) is guaranteed to be 1 This is at least true on any plausible system where qmk is actually used. Per my understanding it's universally true, assuming that uint8_t exists: https://stackoverflow.com/questions/48655310/can-i-assume-that-sizeofuint8-t-1 * Run qmk-format on core C files touched in this branch Co-authored-by: Stefan Kerkmann <karlk90@pm.me>
373 lines
16 KiB
C
373 lines
16 KiB
C
#include QMK_KEYBOARD_H
|
|
|
|
#ifdef PROTOCOL_LUFA
|
|
#include "lufa.h"
|
|
#include "split_util.h"
|
|
#endif
|
|
|
|
// Each layer gets a name for readability, which is then used in the keymap matrix below.
|
|
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
|
|
// Layer names don't all need to be of the same length, obviously, and you can also skip them
|
|
// entirely and just use numbers.
|
|
enum layer_number {
|
|
_QWERTY = 0,
|
|
_COLEMAK,
|
|
_FN,
|
|
_ADJ
|
|
};
|
|
|
|
// Keycode defines for layers
|
|
#define QWERTY DF(_QWERTY)
|
|
#define COLEMAK DF(_COLEMAK)
|
|
#define FN MO(_FN)
|
|
#define ADJ MO(_ADJ)
|
|
|
|
enum custom_keycodes {
|
|
RGBRST = SAFE_RANGE,
|
|
RGB_MENU
|
|
};
|
|
|
|
#define FN_ESC LT(_FN, KC_ESC)
|
|
#define FN_CAPS LT(_FN, KC_CAPS)
|
|
|
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
|
/* Qwerty
|
|
* ,------------------------------------------------. ,------------------------------------------------.
|
|
* | GESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | BkSp |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* |FN(CAPS)| A | S | D | F | G | ( | | ) | H | J | K | L | ; | ' |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* |Shift | Z | X | C | V | B | { | | } | N | M | , | . | / |Enter |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | Ctrl | Win | Alt | RGB | ADJ | Space| DEL | | Enter| Space| FN | Left | Down | Up |Right |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------'
|
|
* | Space| DEL | | Enter| Space|
|
|
* `-------------' `-------------'
|
|
*/
|
|
[_QWERTY] = LAYOUT(
|
|
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
|
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
|
|
FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LPRN, KC_RPRN, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
|
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
|
|
KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, ADJ, KC_SPC, KC_DEL, KC_ENT, KC_SPC, FN, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT,
|
|
KC_SPC, KC_DEL, KC_ENT, KC_SPC
|
|
),
|
|
|
|
/* Colemak
|
|
* ,------------------------------------------------. ,------------------------------------------------.
|
|
* | GESC | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 | BkSp |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | Tab | Q | W | F | P | B | [ | | ] | J | L | U | Y | ; | \ |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* |FN(CAPS)| A | R | S | T | G | ( | | ) | K | N | E | I | O | ' |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* |Shift | Z | X | C | D | V | { | | } | M | H | , | . | / |Enter |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | Ctrl | Win | Alt | RGB | ADJ | Space| DEL | | Enter| Space| FN | Left | Down | Up |Right |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------'
|
|
* | Space| DEL | | Enter| Space|
|
|
* `-------------' `-------------'
|
|
*/
|
|
[_COLEMAK] = LAYOUT(
|
|
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
|
|
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_LBRC, KC_RBRC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
|
|
FN_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_LPRN, KC_RPRN, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
|
|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR, KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
|
|
KC_LCTL, KC_LGUI, KC_LALT, RGB_TOG, ADJ, KC_SPC, KC_DEL, KC_ENT, KC_SPC, FN, KC_LEFT, KC_DOWN, KC_UP,KC_RIGHT,
|
|
KC_SPC, KC_DEL, KC_ENT, KC_SPC
|
|
),
|
|
|
|
/* FN
|
|
* ,------------------------------------------------. ,------------------------------------------------.
|
|
* | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | | PGDN | UP | PGUP | | | | | | | PGDN | UP | PGUP | PRINT| HOME |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | | LEFT | DOWN | RIGHT| | | | | | | LEFT | DOWN | RIGHT|INSERT| END |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | | | | | | | | | | | | | | | |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | | | |RGBMOD| | | | | | | PLAY | NEXT | MUTE | VOL- | VOL+ |
|
|
* `------+------+------+------+------+------+------| |------+------+------+------+------+------+------'
|
|
* | | | | | |
|
|
* `-------------' `-------------'
|
|
*/
|
|
[_FN] = LAYOUT(
|
|
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
|
|
_______, KC_PGDN, KC_UP, KC_PGUP, _______, _______, _______, KC_SLCK, _______, KC_PGDN, KC_UP, KC_PGUP, KC_PSCR, KC_HOME,
|
|
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_NLCK, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_END,
|
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
|
_______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU,
|
|
_______, _______, _______, _______
|
|
),
|
|
|
|
/* ADJ
|
|
* ,------------------------------------------------. ,------------------------------------------------.
|
|
* | F1 | F2 | F3 | F4 | F5 | F6 | | | | F7 | F8 | F9 | F10 | F11 | F12 |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | | SAD | VAI | SAI | QK_BOOT| | | | | | P7 | P8 | P9 | | |
|
|
* |------+------+------+------+------+------|------| |------|------+------+------+------+------+------|
|
|
* | | HUD | VAD | HUI |RGBRST| | | | | | P4 | P5 | P6 | | |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | | SPD | | SPI | | | | | | | P1 | P2 | P3 | | |
|
|
* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------|
|
|
* | | | |RGBMOD| | | | | | | P0 | PDOT | NLCK |QWERTY|COLEMK|
|
|
* `------+------+------+------+------+------+------| |------+------+------+------+------+------+------'
|
|
* | | | | | |
|
|
* `-------------' `-------------'
|
|
*/
|
|
|
|
[_ADJ] = LAYOUT(
|
|
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
|
|
_______, RGB_SAD, RGB_VAI, RGB_SAI, QK_BOOT, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______,
|
|
_______, RGB_HUD, RGB_VAD, RGB_HUI, RGBRST, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______,
|
|
_______, RGB_SPD, _______, RGB_SPI, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______,
|
|
_______, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_NLCK, QWERTY, COLEMAK,
|
|
_______, _______, _______, _______
|
|
)
|
|
};
|
|
|
|
// For RGBRST Keycode
|
|
#if defined(RGB_MATRIX_ENABLE)
|
|
void rgb_matrix_increase_flags(void)
|
|
{
|
|
switch (rgb_matrix_get_flags()) {
|
|
case LED_FLAG_ALL: {
|
|
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
|
|
rgb_matrix_set_color_all(0, 0, 0);
|
|
}
|
|
break;
|
|
case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
|
|
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
|
|
rgb_matrix_set_color_all(0, 0, 0);
|
|
}
|
|
break;
|
|
case LED_FLAG_UNDERGLOW: {
|
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
|
rgb_matrix_disable_noeeprom();
|
|
}
|
|
break;
|
|
default: {
|
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
|
rgb_matrix_enable_noeeprom();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void rgb_matrix_decrease_flags(void)
|
|
{
|
|
switch (rgb_matrix_get_flags()) {
|
|
case LED_FLAG_ALL: {
|
|
rgb_matrix_set_flags(LED_FLAG_NONE);
|
|
rgb_matrix_disable_noeeprom();
|
|
}
|
|
break;
|
|
case LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER: {
|
|
rgb_matrix_set_flags(LED_FLAG_ALL);
|
|
rgb_matrix_set_color_all(0, 0, 0);
|
|
}
|
|
break;
|
|
case LED_FLAG_UNDERGLOW: {
|
|
rgb_matrix_set_flags(LED_FLAG_KEYLIGHT | LED_FLAG_MODIFIER);
|
|
rgb_matrix_set_color_all(0, 0, 0);
|
|
}
|
|
break;
|
|
default: {
|
|
rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
|
|
rgb_matrix_enable_noeeprom();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef RGB_OLED_MENU
|
|
uint8_t rgb_encoder_state = 4;
|
|
|
|
typedef void (*rgb_matrix_f)(void);
|
|
|
|
const rgb_matrix_f rgb_matrix_functions[6][2] = {
|
|
{ rgb_matrix_increase_hue, rgb_matrix_decrease_hue },
|
|
{ rgb_matrix_increase_sat, rgb_matrix_decrease_sat },
|
|
{ rgb_matrix_increase_val, rgb_matrix_decrease_val },
|
|
{ rgb_matrix_increase_speed, rgb_matrix_decrease_speed },
|
|
{ rgb_matrix_step, rgb_matrix_step_reverse },
|
|
{ rgb_matrix_increase_flags, rgb_matrix_decrease_flags }
|
|
};
|
|
#endif
|
|
|
|
#ifdef ENCODER_ENABLE
|
|
|
|
static pin_t encoders_pad_a[] = ENCODERS_PAD_A;
|
|
#define NUMBER_OF_ENCODERS ARRAY_SIZE(encoders_pad_a)
|
|
|
|
const uint16_t PROGMEM encoders[][NUMBER_OF_ENCODERS * 2][2] = {
|
|
[_QWERTY] = ENCODER_LAYOUT(
|
|
KC_VOLU, KC_VOLD,
|
|
KC_VOLU, KC_VOLD
|
|
),
|
|
[_COLEMAK] = ENCODER_LAYOUT(
|
|
_______, _______,
|
|
_______, _______
|
|
),
|
|
[_FN] = ENCODER_LAYOUT(
|
|
_______, _______,
|
|
_______, _______
|
|
),
|
|
[_ADJ] = ENCODER_LAYOUT(
|
|
_______, _______,
|
|
_______, _______
|
|
)
|
|
};
|
|
|
|
bool encoder_update_user(uint8_t index, bool clockwise) {
|
|
if (!is_keyboard_master())
|
|
return true;
|
|
|
|
#ifdef RGB_OLED_MENU
|
|
if (index == RGB_OLED_MENU) {
|
|
(*rgb_matrix_functions[rgb_encoder_state][clockwise])();
|
|
} else
|
|
#endif
|
|
{
|
|
uint8_t layer = get_highest_layer(layer_state);
|
|
uint16_t keycode = pgm_read_word(&encoders[layer][index][clockwise]);
|
|
while (keycode == KC_TRANSPARENT && layer > 0)
|
|
{
|
|
layer--;
|
|
if ((layer_state & (1 << layer)) != 0)
|
|
keycode = pgm_read_word(&encoders[layer][index][clockwise]);
|
|
}
|
|
if (keycode != KC_TRANSPARENT)
|
|
tap_code16(keycode);
|
|
}
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
static uint16_t reset_timer;
|
|
switch (keycode) {
|
|
case RGBRST:
|
|
#if defined(RGBLIGHT_ENABLE)
|
|
if (record->event.pressed) {
|
|
eeconfig_update_rgblight_default();
|
|
rgblight_enable();
|
|
}
|
|
#elif defined(RGB_MATRIX_ENABLE)
|
|
if (record->event.pressed) {
|
|
eeconfig_update_rgb_matrix_default();
|
|
}
|
|
#endif
|
|
return false;
|
|
case QK_BOOT:
|
|
if (record->event.pressed) {
|
|
reset_timer = timer_read();
|
|
} else {
|
|
if (timer_elapsed(reset_timer) >= 500) {
|
|
reset_keyboard();
|
|
}
|
|
}
|
|
return false;
|
|
#if defined(RGB_MATRIX_ENABLE) && defined(KEYBOARD_rgbkb_sol_rev2)
|
|
case RGB_TOG:
|
|
if (record->event.pressed) {
|
|
rgb_matrix_increase_flags();
|
|
}
|
|
return false;
|
|
#endif
|
|
case RGB_MENU:
|
|
#ifdef RGB_OLED_MENU
|
|
if (record->event.pressed) {
|
|
if (get_mods() & MOD_MASK_SHIFT) {
|
|
rgb_encoder_state = (rgb_encoder_state - 1);
|
|
if (rgb_encoder_state > 5) {
|
|
rgb_encoder_state = 5;
|
|
}
|
|
} else {
|
|
rgb_encoder_state = (rgb_encoder_state + 1) % 6;
|
|
}
|
|
}
|
|
#endif
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// OLED Driver Logic
|
|
#ifdef OLED_ENABLE
|
|
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
|
|
if (is_keyboard_master())
|
|
return OLED_ROTATION_270;
|
|
return OLED_ROTATION_180;
|
|
}
|
|
|
|
static void render_logo(void) {
|
|
static const char PROGMEM sol_logo[] = {
|
|
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
|
|
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
|
|
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0
|
|
};
|
|
oled_write_P(sol_logo, false);
|
|
}
|
|
|
|
static void render_status(void) {
|
|
// Render to mode icon
|
|
static const char PROGMEM sol_icon[] = {
|
|
0x9b,0x9c,0x9d,0x9e,0x9f,
|
|
0xbb,0xbc,0xbd,0xbe,0xbf,
|
|
0xdb,0xdc,0xdd,0xde,0xdf,0
|
|
};
|
|
oled_write_P(sol_icon, false);
|
|
|
|
// Define layers here
|
|
oled_write_P(PSTR("Layer"), false);
|
|
uint8_t layer = get_highest_layer(layer_state|default_layer_state);
|
|
switch (layer) {
|
|
case _QWERTY:
|
|
oled_write_P(PSTR("BASE "), false);
|
|
break;
|
|
case _COLEMAK:
|
|
oled_write_P(PSTR("CLMK "), false);
|
|
break;
|
|
case _FN:
|
|
oled_write_P(PSTR("FN "), false);
|
|
break;
|
|
case _ADJ:
|
|
oled_write_P(PSTR("ADJ "), false);
|
|
break;
|
|
default:
|
|
oled_write_P(PSTR("UNDEF"), false);
|
|
}
|
|
|
|
// Host Keyboard LED Status
|
|
uint8_t led_state = host_keyboard_leds();
|
|
oled_write_P(PSTR("-----"), false);
|
|
oled_write_P(IS_LED_ON(led_state, USB_LED_NUM_LOCK) ? PSTR("NUMLK") : PSTR(" "), false);
|
|
oled_write_P(IS_LED_ON(led_state, USB_LED_CAPS_LOCK) ? PSTR("CAPLK") : PSTR(" "), false);
|
|
oled_write_P(IS_LED_ON(led_state, USB_LED_SCROLL_LOCK) ? PSTR("SCRLK") : PSTR(" "), false);
|
|
|
|
#ifdef RGB_OLED_MENU
|
|
static char buffer[31] = { 0 };
|
|
snprintf(buffer, sizeof(buffer), "h%3d s%3d v%3d s%3d m%3d e%3d ", rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v, rgb_matrix_config.speed, rgb_matrix_config.mode, rgb_matrix_get_flags());
|
|
buffer[4 + rgb_encoder_state * 5] = '<';
|
|
|
|
oled_write_P(PSTR("-----"), false);
|
|
oled_write(buffer, false);
|
|
#endif
|
|
}
|
|
|
|
bool oled_task_user(void) {
|
|
if (is_keyboard_master()) {
|
|
render_status();
|
|
} else {
|
|
render_logo();
|
|
oled_scroll_left();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#endif
|