mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-12-12 12:51:18 +00:00
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>
369 lines
16 KiB
C
369 lines
16 KiB
C
#include QMK_KEYBOARD_H
|
|
|
|
extern keymap_config_t keymap_config;
|
|
|
|
#ifdef RGBLIGHT_ENABLE
|
|
//Following line allows macro to read current RGB settings
|
|
extern rgblight_config_t rgblight_config;
|
|
rgblight_config_t RGB_current_config;
|
|
#endif
|
|
|
|
extern uint8_t is_master;
|
|
|
|
// 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,
|
|
_DVORAK,
|
|
_LOWER,
|
|
_RAISE,
|
|
_ADJUST
|
|
};
|
|
|
|
enum custom_keycodes {
|
|
QWERTY = SAFE_RANGE,
|
|
COLEMAK,
|
|
DVORAK,
|
|
LOWER,
|
|
RAISE,
|
|
ADJUST,
|
|
BACKLIT,
|
|
KANA,
|
|
EISU,
|
|
RGBRST,
|
|
AQOURS, //サンシャインぴっかぴかモード
|
|
};
|
|
|
|
#ifdef RGBLIGHT_ENABLE
|
|
//9色に変化するLEDのHSV各パラメータ
|
|
int aqours_h[] = { 26, 340, 150, 0, 199, 220, 53, 265, 322};
|
|
int aqours_s[] = {255, 165, 255, 255, 255, 350, 255, 255, 255};
|
|
int aqours_v[] = {255, 255, 255, 255, 255, 255, 255, 255, 255};
|
|
const int NEXT_COLOR_TIME = 2400; //次の色に切り替わるまでの時間
|
|
const int NEXT_CHANGE_TARGET_TIME = 100; //次のキーに色が伝播するまでの時間
|
|
bool aqours_mode = false;
|
|
int aqours_next_color_timer_count = 0;
|
|
int aqours_num = 0;
|
|
int target_col = 0;
|
|
|
|
//keyのmatrixの位置とLEDの番号を紐づける
|
|
int combined_key_to_led[] =
|
|
{
|
|
0,1,2,3,4,5,
|
|
11,10,9,8,7,6,
|
|
12,13,14,15,16,17,
|
|
23,22,21,20,19,18
|
|
};
|
|
#endif
|
|
|
|
enum macro_keycodes {
|
|
KC_SAMPLEMACRO,
|
|
};
|
|
|
|
//Macros
|
|
#define M_SAMPLE M(KC_SAMPLEMACRO)
|
|
|
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \
|
|
/* Qwerty
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Esc |ADJUST| Win | Alt |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_QWERTY] = LAYOUT_ortho_4x12(
|
|
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
|
|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, 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_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
KC_ESC, ADJUST, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
),
|
|
|
|
/* Colemak
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_COLEMAK] = LAYOUT_ortho_4x12( \
|
|
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \
|
|
KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, 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_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
|
|
KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
),
|
|
|
|
/* Dvorak
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_DVORAK] = LAYOUT_ortho_4x12( \
|
|
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
|
|
KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
|
|
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \
|
|
KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
|
|
),
|
|
|
|
/* Lower
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | | | | | | | - | _ | + | { | } | | |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | | | | | | | | | | Home | End | |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_LOWER] = LAYOUT_ortho_4x12( \
|
|
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
|
|
_______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
|
|
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______, \
|
|
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
),
|
|
|
|
/* Raise
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | | | | | | | | | Next | Vol- | Vol+ | Play |
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_RAISE] = LAYOUT_ortho_4x12( \
|
|
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
|
|
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
|
|
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \
|
|
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
|
|
),
|
|
|
|
/* Adjust (Lower + Raise)
|
|
* ,-----------------------------------------. ,-----------------------------------------.
|
|
* | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* |AQOURS|RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | MODE | HUE- | SAT- | VAL- | | | | | | | | |
|
|
* |------+------+------+------+------+------| |------+------+------+------+------+------|
|
|
* | | | | EISU | EISU | EISU | | KANA | KANA | Home |PageDn|PageUp| End |
|
|
* `-----------------------------------------' `-----------------------------------------'
|
|
*/
|
|
[_ADJUST] = LAYOUT_ortho_4x12( \
|
|
_______, QK_BOOT, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, \
|
|
AQOURS, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\
|
|
_______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______,\
|
|
_______, _______, _______, EISU, EISU, EISU, KANA, KANA, KC_HOME, KC_PGDN, KC_PGUP, KC_END\
|
|
)
|
|
};
|
|
|
|
// define variables for reactive RGB
|
|
bool TOG_STATUS = false;
|
|
|
|
// Setting ADJUST layer RGB back to default
|
|
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
|
|
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_mode_noeeprom(RGB_current_config.mode);
|
|
#endif
|
|
layer_on(layer3);
|
|
} else {
|
|
layer_off(layer3);
|
|
}
|
|
}
|
|
|
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
switch (keycode) {
|
|
case QWERTY:
|
|
if (record->event.pressed) {
|
|
set_single_persistent_default_layer(_QWERTY);
|
|
}
|
|
return false;
|
|
break;
|
|
case COLEMAK:
|
|
if (record->event.pressed) {
|
|
set_single_persistent_default_layer(_COLEMAK);
|
|
}
|
|
return false;
|
|
break;
|
|
case DVORAK:
|
|
if (record->event.pressed) {
|
|
set_single_persistent_default_layer(_DVORAK);
|
|
}
|
|
return false;
|
|
break;
|
|
|
|
case LOWER:
|
|
if (record->event.pressed) {
|
|
//not sure how to have keyboard check mode and set it to a variable, so my work around
|
|
//uses another variable that would be set to true after the first time a reactive key is pressed.
|
|
if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
|
|
} else {
|
|
TOG_STATUS = !TOG_STATUS;
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_mode_noeeprom(16);
|
|
#endif
|
|
}
|
|
layer_on(_LOWER);
|
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
} else {
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change
|
|
#endif
|
|
TOG_STATUS = false;
|
|
layer_off(_LOWER);
|
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
}
|
|
return false;
|
|
break;
|
|
|
|
case RAISE:
|
|
if (record->event.pressed) {
|
|
//not sure how to have keyboard check mode and set it to a variable, so my work around
|
|
//uses another variable that would be set to true after the first time a reactive key is pressed.
|
|
if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
|
|
} else {
|
|
TOG_STATUS = !TOG_STATUS;
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_mode_noeeprom(15);
|
|
#endif
|
|
}
|
|
layer_on(_RAISE);
|
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
} else {
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change
|
|
#endif
|
|
layer_off(_RAISE);
|
|
TOG_STATUS = false;
|
|
update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
|
|
}
|
|
return false;
|
|
break;
|
|
|
|
case ADJUST:
|
|
if (record->event.pressed) {
|
|
layer_on(_ADJUST);
|
|
} else {
|
|
layer_off(_ADJUST);
|
|
}
|
|
return false;
|
|
break;
|
|
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
|
|
case RGB_MOD:
|
|
#ifdef RGBLIGHT_ENABLE
|
|
if (record->event.pressed) {
|
|
rgblight_mode_noeeprom(RGB_current_config.mode);
|
|
rgblight_step();
|
|
RGB_current_config.mode = rgblight_config.mode;
|
|
}
|
|
#endif
|
|
return false;
|
|
break;
|
|
|
|
case EISU:
|
|
if (record->event.pressed) {
|
|
if(keymap_config.swap_lalt_lgui==false){
|
|
register_code(KC_LANG2);
|
|
}else{
|
|
SEND_STRING(SS_LALT("`"));
|
|
}
|
|
} else {
|
|
unregister_code(KC_LANG2);
|
|
}
|
|
return false;
|
|
break;
|
|
case KANA:
|
|
if (record->event.pressed) {
|
|
if(keymap_config.swap_lalt_lgui==false){
|
|
register_code(KC_LANG1);
|
|
}else{
|
|
SEND_STRING(SS_LALT("`"));
|
|
}
|
|
} else {
|
|
unregister_code(KC_LANG1);
|
|
}
|
|
return false;
|
|
break;
|
|
case AQOURS:
|
|
#ifdef RGBLIGHT_ENABLE
|
|
if (record->event.pressed) {
|
|
aqours_mode = !aqours_mode;
|
|
}
|
|
#endif
|
|
break;
|
|
case RGBRST:
|
|
#ifdef RGBLIGHT_ENABLE
|
|
if (record->event.pressed) {
|
|
eeconfig_update_rgblight_default();
|
|
rgblight_enable();
|
|
RGB_current_config = rgblight_config;
|
|
}
|
|
#endif
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#ifdef RGBLIGHT_ENABLE
|
|
|
|
void aqours_led(void) {
|
|
aqours_next_color_timer_count++;
|
|
//一定間隔で色が変化
|
|
if (aqours_next_color_timer_count > NEXT_COLOR_TIME) {
|
|
aqours_num++;
|
|
aqours_next_color_timer_count = 0;
|
|
target_col = 0;
|
|
if (aqours_num == ARRAY_SIZE(aqours_h)) {
|
|
aqours_num = 0;
|
|
}
|
|
}
|
|
|
|
//キー毎に時間差で色が変化していく
|
|
if (aqours_next_color_timer_count % NEXT_CHANGE_TARGET_TIME == 0) {
|
|
if (target_col < MATRIX_COLS) {
|
|
sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[target_col]);
|
|
sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[11 - target_col]);
|
|
sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[12 + target_col]);
|
|
sethsv(aqours_h[aqours_num], aqours_s[aqours_num], aqours_v[aqours_num], (LED_TYPE *)&led[23 - target_col]);
|
|
target_col++;
|
|
rgblight_set();
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void matrix_scan_user(void) {
|
|
#ifdef RGBLIGHT_ENABLE
|
|
if (aqours_mode) {
|
|
aqours_led();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void matrix_init_user(void) {
|
|
#ifdef RGBLIGHT_ENABLE
|
|
rgblight_init();
|
|
RGB_current_config = rgblight_config;
|
|
#endif
|
|
}
|