qmk_firmware/keyboards/rgbkb/sol/keymaps/default/keymap.c
Jeff Epler 9632360caa
Use a macro to compute the size of arrays at compile time (#18044)
* 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>
2022-08-30 10:20:04 +02:00

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