Merge branch 'master' into miuni32-OA
This commit is contained in:
@@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_LW] = { /* [> LOWER <] */
|
||||
{KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10},
|
||||
{KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11},
|
||||
{KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LCTL, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12},
|
||||
{KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS}
|
||||
{KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_LCTL, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12},
|
||||
{KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS}
|
||||
}};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
|
@@ -12,49 +12,156 @@ extern keymap_config_t keymap_config;
|
||||
// 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.
|
||||
#define _DV 0
|
||||
#define _QW 1
|
||||
#define _CM 2
|
||||
#define _L1 3
|
||||
#define _L2 4
|
||||
#define _DVORAK 0
|
||||
#define _QWERTY 1
|
||||
#define _COLEMAK 2
|
||||
#define _DVORMAC 3
|
||||
#define _LOWER 4
|
||||
#define _RAISE 5
|
||||
#define _ADJUST 16
|
||||
|
||||
// Macro name shortcuts
|
||||
#define DVORAK M(_DV)
|
||||
#define QWERTY M(_QW)
|
||||
#define COLEMAK M(_CM)
|
||||
enum planck_keycodes {
|
||||
DVORAK = SAFE_RANGE,
|
||||
QWERTY,
|
||||
COLEMAK,
|
||||
DVORMAC,
|
||||
LOWER,
|
||||
RAISE,
|
||||
BACKLIT
|
||||
};
|
||||
|
||||
// Adding macros to make the keymaps below much easier to read.
|
||||
#define SFTSCLN SFT_T(KC_SCLN)
|
||||
#define SFTSLSH SFT_T(KC_SLSH)
|
||||
#define SFTZED SFT_T(KC_Z)
|
||||
#define ALTENT ALT_T(KC_ENT)
|
||||
#define ESCTRL CTL_T(KC_ESC)
|
||||
#define TABALT ALT_T(KC_TAB)
|
||||
|
||||
// Fillers to make layering more clear
|
||||
#define _______ KC_TRNS
|
||||
#define XXXXXXX KC_NO
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[_DV] = { /* Dvorak */
|
||||
{KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_NO, KC_F, KC_G, KC_C, KC_R, KC_L },
|
||||
{KC_A, KC_O, KC_E, KC_U, KC_I, KC_NO, KC_D, KC_H, KC_T, KC_N, KC_S },
|
||||
{SFT_T(KC_SCLN), KC_Q, KC_J, KC_K, KC_X, CTL_T(KC_DEL), KC_B, KC_M, KC_W, KC_V, SFT_T(KC_Z) },
|
||||
{KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_SLSH, KC_EQL}
|
||||
/* Dvorak Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ' | , | . | P | Y | | F | G | C | R | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | O | E | U | I | | D | H | T | N | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|SFT/ ;| Q | J | K | X | CTRL ||Alt / | B | M | W | V |SFT/ Z|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ |
|
||||
`----------------------------------' `----------------------------------' */
|
||||
[_DVORAK] = {
|
||||
{KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L },
|
||||
{KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S },
|
||||
{SFTSCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCTL, KC_B, KC_M, KC_W, KC_V, SFTZED },
|
||||
{ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS}
|
||||
},
|
||||
[_QW] = { /* Qwerty */
|
||||
{KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P },
|
||||
{KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN},
|
||||
{SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) },
|
||||
{KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL}
|
||||
|
||||
/* QWERTY Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| Q | W | E | R | T | | Y | U | I | O | P |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | S | D | F | G | | H | J | K | L | ; |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|SFT/ Z| X | C | V | B | CTRL ||Alt / | N | M | , | . |SFT/ /|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ |
|
||||
`----------------------------------' `----------------------------------' */
|
||||
[_QWERTY] = {
|
||||
{KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P },
|
||||
{KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, KC_H, KC_J, KC_K, KC_L, KC_SCLN},
|
||||
{SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, SFTSLSH},
|
||||
{ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS}
|
||||
},
|
||||
[_CM] = { /* Colemak */
|
||||
{KC_Q, KC_W, KC_F, KC_P, KC_G, KC_NO, KC_J, KC_L, KC_U, KC_Y, KC_SCLN},
|
||||
{KC_A, KC_R, KC_S, KC_T, KC_D, KC_NO, KC_H, KC_N, KC_E, KC_I, KC_O },
|
||||
{SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, CTL_T(KC_DEL), KC_K, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) },
|
||||
{KC_ESC, KC_TAB, KC_LGUI, MO(_L2), KC_BSPC, ALT_T(KC_ENT), KC_SPC, MO(_L1), KC_MINS, KC_QUOT, KC_EQL}
|
||||
|
||||
/* Colemak Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| Q | W | F | P | G | | J | L | U | Y | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | R | S | T | D | | H | N | E | I | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|SFT/ Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |SFT/ /|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ |
|
||||
`----------------------------------' `----------------------------------'*/
|
||||
[_COLEMAK] = {
|
||||
{KC_Q, KC_W, KC_F, KC_P, KC_G, XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN},
|
||||
{KC_A, KC_R, KC_S, KC_T, KC_D, XXXXXXX, KC_H, KC_N, KC_E, KC_I, KC_O },
|
||||
{SFTZED, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_K, KC_M, KC_COMM, KC_DOT, SFTSLSH},
|
||||
{ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_QUOT, KC_BSLS}
|
||||
},
|
||||
[_L1] = { /* LAYER 1 */
|
||||
{KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0 },
|
||||
{KC_TAB, KC_INS, KC_UP, KC_DEL, KC_HOME, KC_NO, KC_PGUP, KC_MUTE, KC_VOLD, KC_VOLU, KC_BSLS},
|
||||
{KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_LCTL, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, KC_BSLS},
|
||||
{KC_TRNS, KC_GRV, KC_LGUI, KC_TRNS, KC_DEL, KC_LALT, KC_SPC, KC_TRNS, KC_LBRC, KC_RBRC, KC_ENT }
|
||||
|
||||
/* Dvorak Layer with Command key on left thumb instead of Control
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ' | , | . | P | Y | | F | G | C | R | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | O | E | U | I | | D | H | T | N | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|SFT/ ;| Q | J | K | X | CMD ||Alt / | B | M | W | V |SFT/ Z|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ |
|
||||
`----------------------------------' `----------------------------------' */
|
||||
[_DVORMAC] = {
|
||||
{KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L },
|
||||
{KC_A, KC_O, KC_E, KC_U, KC_I, XXXXXXX, KC_D, KC_H, KC_T, KC_N, KC_S },
|
||||
{SFTSCLN, KC_Q, KC_J, KC_K, KC_X, KC_LGUI, KC_B, KC_M, KC_W, KC_V, SFTZED },
|
||||
{ESCTRL, TABALT, KC_LGUI, LOWER, KC_BSPC, ALTENT, KC_SPC, RAISE, KC_MINS, KC_SLSH, KC_BSLS}
|
||||
},
|
||||
[_L2] = { /* LAYER 2 */
|
||||
{KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN},
|
||||
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_NO, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_PIPE},
|
||||
{KC_TRNS, KC_TRNS, DVORAK, QWERTY, COLEMAK, KC_LCTL, KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12 },
|
||||
{KC_TRNS, KC_TRNS, KC_LGUI, KC_TRNS, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, LSFT(KC_LBRC), LSFT(KC_RBRC), RESET}
|
||||
|
||||
/* LOWER Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ! | @ | # | $ | % | | ^ | & | * | ( | ) |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| CAPS | | UP | | Home | | PgDn | | + | { | } |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| ~ | | | | Del |------'`------| Ins | | | | |
|
||||
`----------------------------------' `----------------------------------'*/
|
||||
[_LOWER] = {
|
||||
{KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN},
|
||||
{KC_CAPS, _______, KC_UP, _______, KC_HOME, XXXXXXX, KC_PGUP, _______, KC_PLUS, KC_LCBR, KC_RCBR},
|
||||
{_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______},
|
||||
{KC_TILD, _______, _______, _______, KC_DEL, _______, KC_INS, _______, _______, _______, _______}
|
||||
},
|
||||
|
||||
/* RAISE Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| CAPS | | UP | | Home | | PgDn | | = | [ | ] |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| ` | | | | Del |------'`------| Ins | | | | |
|
||||
`----------------------------------' `----------------------------------'*/
|
||||
[_RAISE] = {
|
||||
{KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0 },
|
||||
{KC_CAPS, _______, KC_UP, _______, KC_HOME, XXXXXXX, KC_PGUP, _______, KC_EQL, KC_LBRC, KC_RBRC},
|
||||
{_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, _______},
|
||||
{KC_GRV, _______, _______, _______, KC_DEL, _______, KC_INS, _______, _______, _______, _______}
|
||||
},
|
||||
|
||||
/* ADJUST Layer
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| F11 | | | | | | | PrSc | ScLk | Paus | F12 |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| |QWERTY|COLEMK|DVORAK|DVORMC| || | | | | | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| | | | | |------'`------| | | | | RESET|
|
||||
`----------------------------------' `----------------------------------'*/
|
||||
[_ADJUST] = {
|
||||
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 },
|
||||
{KC_F11, _______, _______, _______, _______, XXXXXXX, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_F12 },
|
||||
{_______, QWERTY, COLEMAK, DVORAK, DVORMAC, _______, _______, _______, _______, _______, _______},
|
||||
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET }
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
const uint16_t PROGMEM fn_actions[] = {
|
||||
@@ -66,24 +173,52 @@ void persistant_default_layer_set(uint16_t default_layer) {
|
||||
default_layer_set(default_layer);
|
||||
}
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
|
||||
{
|
||||
switch(id) {
|
||||
case _DV:
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
if (record->event.pressed) {
|
||||
persistant_default_layer_set(1UL<<_DV);
|
||||
persistant_default_layer_set(1UL<<_QWERTY);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case _QW:
|
||||
case COLEMAK:
|
||||
if (record->event.pressed) {
|
||||
persistant_default_layer_set(1UL<<_QW);
|
||||
persistant_default_layer_set(1UL<<_COLEMAK);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case _CM:
|
||||
case DVORAK:
|
||||
if (record->event.pressed) {
|
||||
persistant_default_layer_set(1UL<<_CM);
|
||||
persistant_default_layer_set(1UL<<_DVORAK);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case DVORMAC:
|
||||
if (record->event.pressed) {
|
||||
persistant_default_layer_set(1UL<<_DVORMAC);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case LOWER:
|
||||
if (record->event.pressed) {
|
||||
layer_on(_LOWER);
|
||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||
} else {
|
||||
layer_off(_LOWER);
|
||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
case RAISE:
|
||||
if (record->event.pressed) {
|
||||
layer_on(_RAISE);
|
||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||
} else {
|
||||
layer_off(_RAISE);
|
||||
update_tri_layer(_LOWER, _RAISE, _ADJUST);
|
||||
}
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return MACRO_NONE;
|
||||
return true;
|
||||
};
|
||||
|
107
keyboards/atreus/keymaps/xyverz/readme.md
Normal file
107
keyboards/atreus/keymaps/xyverz/readme.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# Xyverz's Atreus Keymap
|
||||
|
||||
## About this keymap:
|
||||
|
||||
This is the second iteration of my Atreus keymap. The first one was as close to the planck as I could get at the
|
||||
time, but still very much like the original Atreus keymap. I've managed to get things working better now and have
|
||||
implemented (more like copied) the RAISE/LOWER/ADJUST layers. This is a work in progress, but I think I'm closer
|
||||
to a final go with this.
|
||||
|
||||
I'm using MOD_TAP quite a bit in this keymap. On all layers, R4 pinky keys use mod-tap and are SHIFT when held
|
||||
and their normal keys when tapped. In addition, ESC and TAB are also set as Ctrl and ALT respectively when held,
|
||||
and Enter/ALT on the right thumb key for all layers.
|
||||
|
||||
I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts.
|
||||
|
||||
Recently added: Documentation, Formatting, and another Dvorak layer that has Command on the left thumb, instead of
|
||||
Control.
|
||||
|
||||
## Still to do:
|
||||
|
||||
* Enjoy this revision; figure out new things later.
|
||||
|
||||
### Layer 0: Dvorak layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ' | , | . | P | Y | | F | G | C | R | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | O | E | U | I | | D | H | T | N | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|Shft ;| Q | J | K | X | CTRL ||Alt / | B | M | W | V |Shft Z|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
### Layer 1: QWERTY layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| Q | W | E | R | T | | Y | U | I | O | P |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | S | D | F | G | | H | J | K | L | ; |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|Shft Z| X | C | V | B | CTRL ||Alt / | N | M | , | . |Shft /|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
### Keymap 2: Colemak layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| Q | W | F | P | G | | J | L | U | Y | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | R | S | T | D | | H | N | E | I | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|Shft Z| X | C | V | B | CTRL ||Alt / | K | M | , | . |Shft /|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | ' | \ |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
### Keymap 3: Dvorak for Mac layout
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ' | , | . | P | Y | | F | G | C | R | L |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| A | O | E | U | I | | D | H | T | N | S |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
|SFT/ ;| Q | J | K | X | CMD ||Alt / | B | M | W | V |SFT/ Z|
|
||||
|------+------+------+------+------| ||Enter |------+------+------+------+------|
|
||||
| Esc | Tab | GUI | LOWER| BkSp |------'`------| Spc | RAISE| - | / | \ |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
### Keymap 4: LOWER layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| ! | @ | # | $ | % | | ^ | & | * | ( | ) |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| CAPS | | UP | | Home | | PgDn | | + | { | } |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| ~ | | | | Del |------'`------| Ins | | | | |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
|
||||
### Keymap 5: RAISE layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| CAPS | | UP | | Home | | PgDn | | = | [ | ] |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| ` | | | | Del |------'`------| Ins | | | | |
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
||||
### Keymap 6: ADJUST layer
|
||||
|
||||
,----------------------------------. ,----------------------------------.
|
||||
| F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
|
||||
|------+------+------+------+------| |------+------+------+------+------|
|
||||
| F11 | | | | | | | PScr | SLck | Paus | F12 |
|
||||
|------+------+------+------+------|------.,------|------+------+------+------+------|
|
||||
| |QWERTY|COLEMK|DVORAK|DVORMC| || | | | | | |
|
||||
|------+------+------+------+------| || |------+------+------+------+------|
|
||||
| | | | | |------'`------| | | | | RESET|
|
||||
`----------------------------------' `----------------------------------'
|
||||
|
@@ -34,4 +34,4 @@
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */
|
||||
#endif /* KEYBOARDS_ERGODOX_CONFIG_H_ */
|
||||
|
@@ -74,7 +74,3 @@ OPT_DEFS += -DBOOTLOADER_SIZE=512
|
||||
SLEEP_LED_ENABLE = no
|
||||
API_SYSEX_ENABLE ?= no
|
||||
RGBLIGHT_ENABLE ?= yes
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../Makefile
|
||||
endif
|
||||
|
@@ -1,3 +1,3 @@
|
||||
ifndef MAKEFILE_INCLUDED
|
||||
include ../../../Makefile
|
||||
endif
|
||||
endif
|
||||
|
107
keyboards/ergodox/infinity/animations.c
Normal file
107
keyboards/ergodox/infinity/animations.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/* Copyright 2017 Fred Sundvik
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#if defined(VISUALIZER_ENABLE)
|
||||
|
||||
#include "animations.h"
|
||||
#include "visualizer.h"
|
||||
#ifdef LCD_ENABLE
|
||||
#include "lcd_keyframes.h"
|
||||
#endif
|
||||
#ifdef LCD_BACKLIGHT_ENABLE
|
||||
#include "lcd_backlight_keyframes.h"
|
||||
#endif
|
||||
|
||||
#ifdef LED_ENABLE
|
||||
#include "led_keyframes.h"
|
||||
#endif
|
||||
|
||||
#include "visualizer_keyframes.h"
|
||||
|
||||
|
||||
#if defined(LCD_ENABLE) && defined(LCD_BACKLIGHT_ENABLE)
|
||||
|
||||
// Don't worry, if the startup animation is long, you can use the keyboard like normal
|
||||
// during that time
|
||||
keyframe_animation_t default_startup_animation = {
|
||||
.num_frames = 4,
|
||||
.loop = false,
|
||||
.frame_lengths = {0, 0, 0, gfxMillisecondsToTicks(5000), 0},
|
||||
.frame_functions = {
|
||||
lcd_keyframe_enable,
|
||||
backlight_keyframe_enable,
|
||||
lcd_keyframe_draw_logo,
|
||||
backlight_keyframe_animate_color,
|
||||
},
|
||||
};
|
||||
|
||||
keyframe_animation_t default_suspend_animation = {
|
||||
.num_frames = 4,
|
||||
.loop = false,
|
||||
.frame_lengths = {0, gfxMillisecondsToTicks(1000), 0, 0},
|
||||
.frame_functions = {
|
||||
lcd_keyframe_display_layer_text,
|
||||
backlight_keyframe_animate_color,
|
||||
lcd_keyframe_disable,
|
||||
backlight_keyframe_disable,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(LED_ENABLE)
|
||||
#define CROSSFADE_TIME 1000
|
||||
#define GRADIENT_TIME 3000
|
||||
|
||||
keyframe_animation_t led_test_animation = {
|
||||
.num_frames = 14,
|
||||
.loop = true,
|
||||
.frame_lengths = {
|
||||
gfxMillisecondsToTicks(1000), // fade in
|
||||
gfxMillisecondsToTicks(1000), // no op (leds on)
|
||||
gfxMillisecondsToTicks(1000), // fade out
|
||||
gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
|
||||
gfxMillisecondsToTicks(GRADIENT_TIME), // left to rigt (outside in)
|
||||
gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
|
||||
gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom
|
||||
0, // mirror leds
|
||||
gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
|
||||
gfxMillisecondsToTicks(GRADIENT_TIME), // left_to_right (mirrored, so inside out)
|
||||
gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
|
||||
gfxMillisecondsToTicks(GRADIENT_TIME), // top_to_bottom
|
||||
0, // normal leds
|
||||
gfxMillisecondsToTicks(CROSSFADE_TIME), // crossfade
|
||||
|
||||
},
|
||||
.frame_functions = {
|
||||
led_keyframe_fade_in_all,
|
||||
keyframe_no_operation,
|
||||
led_keyframe_fade_out_all,
|
||||
led_keyframe_crossfade,
|
||||
led_keyframe_left_to_right_gradient,
|
||||
led_keyframe_crossfade,
|
||||
led_keyframe_top_to_bottom_gradient,
|
||||
led_keyframe_mirror_orientation,
|
||||
led_keyframe_crossfade,
|
||||
led_keyframe_left_to_right_gradient,
|
||||
led_keyframe_crossfade,
|
||||
led_keyframe_top_to_bottom_gradient,
|
||||
led_keyframe_normal_orientation,
|
||||
led_keyframe_crossfade,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
30
keyboards/ergodox/infinity/animations.h
Normal file
30
keyboards/ergodox/infinity/animations.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/* Copyright 2017 Fred Sundvik
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_
|
||||
#define KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_
|
||||
|
||||
#include "visualizer.h"
|
||||
|
||||
// You can use these default animations, but of course you can also write your own custom ones instead
|
||||
extern keyframe_animation_t default_startup_animation;
|
||||
extern keyframe_animation_t default_suspend_animation;
|
||||
|
||||
// An animation for testing and demonstrating the led support, should probably not be used for real world
|
||||
// cases
|
||||
extern keyframe_animation_t led_test_animation;
|
||||
|
||||
#endif /* KEYBOARDS_ERGODOX_INFINITY_ANIMATIONS_H_ */
|
@@ -40,7 +40,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* number of backlight levels */
|
||||
#define BACKLIGHT_LEVELS 3
|
||||
|
||||
#define LED_BRIGHTNESS_LO 15
|
||||
#define LED_BRIGHTNESS_LO 100
|
||||
#define LED_BRIGHTNESS_HI 255
|
||||
|
||||
/* define if matrix has ghost */
|
||||
@@ -54,6 +54,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
// The visualizer needs gfx thread priorities
|
||||
#define VISUALIZER_THREAD_PRIORITY (NORMAL_PRIORITY - 2)
|
||||
|
||||
#define VISUALIZER_USER_DATA_SIZE 16
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
* These options are also useful to firmware size reduction.
|
||||
|
@@ -25,6 +25,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "board_IS31FL3731C.h"
|
||||
|
||||
|
||||
// Can't include led_tables from here
|
||||
extern const uint8_t CIE1931_CURVE[];
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local definitions. */
|
||||
/*===========================================================================*/
|
||||
@@ -100,37 +104,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define IS31
|
||||
|
||||
//Generated by http://jared.geek.nz/2013/feb/linear-led-pwm
|
||||
const unsigned char cie[256] = {
|
||||
0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 4, 4, 4, 4, 4, 4, 5, 5, 5,
|
||||
5, 5, 6, 6, 6, 6, 6, 7, 7, 7,
|
||||
7, 8, 8, 8, 8, 9, 9, 9, 10, 10,
|
||||
10, 10, 11, 11, 11, 12, 12, 12, 13, 13,
|
||||
13, 14, 14, 15, 15, 15, 16, 16, 17, 17,
|
||||
17, 18, 18, 19, 19, 20, 20, 21, 21, 22,
|
||||
22, 23, 23, 24, 24, 25, 25, 26, 26, 27,
|
||||
28, 28, 29, 29, 30, 31, 31, 32, 32, 33,
|
||||
34, 34, 35, 36, 37, 37, 38, 39, 39, 40,
|
||||
41, 42, 43, 43, 44, 45, 46, 47, 47, 48,
|
||||
49, 50, 51, 52, 53, 54, 54, 55, 56, 57,
|
||||
58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
|
||||
68, 70, 71, 72, 73, 74, 75, 76, 77, 79,
|
||||
80, 81, 82, 83, 85, 86, 87, 88, 90, 91,
|
||||
92, 94, 95, 96, 98, 99, 100, 102, 103, 105,
|
||||
106, 108, 109, 110, 112, 113, 115, 116, 118, 120,
|
||||
121, 123, 124, 126, 128, 129, 131, 132, 134, 136,
|
||||
138, 139, 141, 143, 145, 146, 148, 150, 152, 154,
|
||||
155, 157, 159, 161, 163, 165, 167, 169, 171, 173,
|
||||
175, 177, 179, 181, 183, 185, 187, 189, 191, 193,
|
||||
196, 198, 200, 202, 204, 207, 209, 211, 214, 216,
|
||||
218, 220, 223, 225, 228, 230, 232, 235, 237, 240,
|
||||
242, 245, 247, 250, 252, 255,
|
||||
};
|
||||
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
@@ -231,7 +204,7 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||
uint8_t* src = PRIV(g)->frame_buffer;
|
||||
for (int y=0;y<GDISP_SCREEN_HEIGHT;y++) {
|
||||
for (int x=0;x<GDISP_SCREEN_WIDTH;x++) {
|
||||
PRIV(g)->write_buffer[get_led_address(g, x, y)]=cie[*src];
|
||||
PRIV(g)->write_buffer[get_led_address(g, x, y)]=CIE1931_CURVE[*src];
|
||||
++src;
|
||||
}
|
||||
}
|
||||
|
@@ -8,8 +8,6 @@
|
||||
#ifndef _GDISP_LLD_BOARD_H
|
||||
#define _GDISP_LLD_BOARD_H
|
||||
|
||||
#include "print.h"
|
||||
|
||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_9 // actually 6
|
||||
#define ST7565_ADC ST7565_ADC_NORMAL
|
||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_DEC
|
||||
@@ -39,35 +37,49 @@
|
||||
// MSB First
|
||||
// CLK Low by default
|
||||
static const SPIConfig spi1config = {
|
||||
NULL,
|
||||
/* HW dependent part.*/
|
||||
ST7565_GPIOPORT,
|
||||
ST7565_SS_PIN,
|
||||
SPIx_CTARn_FMSZ(7)
|
||||
| SPIx_CTARn_ASC(7)
|
||||
| SPIx_CTARn_DT(7)
|
||||
| SPIx_CTARn_CSSCK(7)
|
||||
| SPIx_CTARn_PBR(0)
|
||||
| SPIx_CTARn_BR(7)
|
||||
//SPI_CR1_BR_0
|
||||
// Operation complete callback or @p NULL.
|
||||
.end_cb = NULL,
|
||||
//The chip select line port - when not using pcs.
|
||||
.ssport = ST7565_GPIOPORT,
|
||||
// brief The chip select line pad number - when not using pcs.
|
||||
.sspad=ST7565_SS_PIN,
|
||||
// SPI initialization data.
|
||||
.tar0 =
|
||||
SPIx_CTARn_FMSZ(7) // Frame size = 8 bytes
|
||||
| SPIx_CTARn_ASC(1) // After SCK Delay Scaler (min 50 ns) = 55.56ns
|
||||
| SPIx_CTARn_DT(0) // Delay After Transfer Scaler (no minimum)= 27.78ns
|
||||
| SPIx_CTARn_CSSCK(0) // PCS to SCK Delay Scaler (min 20 ns) = 27.78ns
|
||||
| SPIx_CTARn_PBR(0) // Baud Rate Prescaler = 2
|
||||
| SPIx_CTARn_BR(0) // Baud rate (min 50ns) = 55.56ns
|
||||
};
|
||||
|
||||
static bool_t st7565_is_data_mode = 1;
|
||||
static GFXINLINE void acquire_bus(GDisplay *g) {
|
||||
(void) g;
|
||||
// Only the LCD is using the SPI bus, so no need to acquire
|
||||
// spiAcquireBus(&SPID1);
|
||||
spiSelect(&SPID1);
|
||||
}
|
||||
|
||||
static GFXINLINE void release_bus(GDisplay *g) {
|
||||
(void) g;
|
||||
// Only the LCD is using the SPI bus, so no need to release
|
||||
//spiReleaseBus(&SPID1);
|
||||
spiUnselect(&SPID1);
|
||||
}
|
||||
|
||||
static GFXINLINE void init_board(GDisplay *g) {
|
||||
(void) g;
|
||||
palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||
st7565_is_data_mode = 1;
|
||||
palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
|
||||
palSetPadModeRaw(MOSI, ST7565_SPI_MODE);
|
||||
palSetPadModeRaw(SLCK, ST7565_SPI_MODE);
|
||||
palSetPadModeRaw(SS, ST7565_SPI_MODE);
|
||||
palSetPadModeRaw(SS, PAL_MODE_OUTPUT_PUSHPULL);
|
||||
|
||||
spiInit();
|
||||
spiStart(&SPID1, &spi1config);
|
||||
spiSelect(&SPID1);
|
||||
release_bus(g);
|
||||
}
|
||||
|
||||
static GFXINLINE void post_init_board(GDisplay *g) {
|
||||
@@ -84,43 +96,17 @@ static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
|
||||
}
|
||||
}
|
||||
|
||||
static GFXINLINE void acquire_bus(GDisplay *g) {
|
||||
(void) g;
|
||||
// Only the LCD is using the SPI bus, so no need to acquire
|
||||
// spiAcquireBus(&SPID1);
|
||||
static GFXINLINE void enter_data_mode(GDisplay *g) {
|
||||
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||
}
|
||||
|
||||
static GFXINLINE void release_bus(GDisplay *g) {
|
||||
(void) g;
|
||||
// Only the LCD is using the SPI bus, so no need to release
|
||||
//spiReleaseBus(&SPID1);
|
||||
static GFXINLINE void enter_cmd_mode(GDisplay *g) {
|
||||
palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||
}
|
||||
|
||||
static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) {
|
||||
(void) g;
|
||||
if (st7565_is_data_mode) {
|
||||
// The sleeps need to be at lest 10 vs 25 ns respectively
|
||||
// So let's sleep two ticks, one tick might not be enough
|
||||
// if we are at the end of the tick
|
||||
chThdSleep(2);
|
||||
palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||
chThdSleep(2);
|
||||
st7565_is_data_mode = 0;
|
||||
}
|
||||
spiSend(&SPID1, 1, &cmd);
|
||||
}
|
||||
|
||||
static GFXINLINE void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
|
||||
(void) g;
|
||||
if (!st7565_is_data_mode) {
|
||||
// The sleeps need to be at lest 10 vs 25 ns respectively
|
||||
// So let's sleep two ticks, one tick might not be enough
|
||||
// if we are at the end of the tick
|
||||
chThdSleep(2);
|
||||
palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
|
||||
chThdSleep(2);
|
||||
st7565_is_data_mode = 1;
|
||||
}
|
||||
spiSend(&SPID1, length, data);
|
||||
}
|
||||
|
||||
|
@@ -20,16 +20,16 @@
|
||||
/*===========================================================================*/
|
||||
|
||||
#ifndef GDISP_SCREEN_HEIGHT
|
||||
#define GDISP_SCREEN_HEIGHT 32
|
||||
#define GDISP_SCREEN_HEIGHT 32
|
||||
#endif
|
||||
#ifndef GDISP_SCREEN_WIDTH
|
||||
#define GDISP_SCREEN_WIDTH 128
|
||||
#define GDISP_SCREEN_WIDTH 128
|
||||
#endif
|
||||
#ifndef GDISP_INITIAL_CONTRAST
|
||||
#define GDISP_INITIAL_CONTRAST 0
|
||||
#define GDISP_INITIAL_CONTRAST 35
|
||||
#endif
|
||||
#ifndef GDISP_INITIAL_BACKLIGHT
|
||||
#define GDISP_INITIAL_BACKLIGHT 100
|
||||
#define GDISP_INITIAL_BACKLIGHT 100
|
||||
#endif
|
||||
|
||||
#define GDISP_FLG_NEEDFLUSH (GDISP_FLG_DRIVER<<0)
|
||||
@@ -40,16 +40,16 @@
|
||||
/* Driver config defaults for backward compatibility. */
|
||||
/*===========================================================================*/
|
||||
#ifndef ST7565_LCD_BIAS
|
||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
|
||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
|
||||
#endif
|
||||
#ifndef ST7565_ADC
|
||||
#define ST7565_ADC ST7565_ADC_NORMAL
|
||||
#define ST7565_ADC ST7565_ADC_NORMAL
|
||||
#endif
|
||||
#ifndef ST7565_COM_SCAN
|
||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_INC
|
||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_INC
|
||||
#endif
|
||||
#ifndef ST7565_PAGE_ORDER
|
||||
#define ST7565_PAGE_ORDER 0,1,2,3
|
||||
#define ST7565_PAGE_ORDER 0,1,2,3
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
@@ -58,12 +58,24 @@
|
||||
|
||||
typedef struct{
|
||||
bool_t buffer2;
|
||||
uint8_t data_pos;
|
||||
uint8_t data[16];
|
||||
uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
|
||||
}PrivData;
|
||||
|
||||
// Some common routines and macros
|
||||
#define PRIV(g) ((PrivData*)g->priv)
|
||||
#define RAM(g) (PRIV(g)->ram)
|
||||
|
||||
static GFXINLINE void write_cmd(GDisplay* g, uint8_t cmd) {
|
||||
PRIV(g)->data[PRIV(g)->data_pos++] = cmd;
|
||||
}
|
||||
|
||||
static GFXINLINE void flush_cmd(GDisplay* g) {
|
||||
write_data(g, PRIV(g)->data, PRIV(g)->data_pos);
|
||||
PRIV(g)->data_pos = 0;
|
||||
}
|
||||
|
||||
#define write_cmd2(g, cmd1, cmd2) { write_cmd(g, cmd1); write_cmd(g, cmd2); }
|
||||
#define write_cmd3(g, cmd1, cmd2, cmd3) { write_cmd(g, cmd1); write_cmd(g, cmd2); write_cmd(g, cmd3); }
|
||||
|
||||
@@ -86,207 +98,232 @@ typedef struct{
|
||||
*/
|
||||
|
||||
LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
|
||||
// The private area is the display surface.
|
||||
g->priv = gfxAlloc(sizeof(PrivData));
|
||||
PRIV(g)->buffer2 = false;
|
||||
// The private area is the display surface.
|
||||
g->priv = gfxAlloc(sizeof(PrivData));
|
||||
PRIV(g)->buffer2 = false;
|
||||
PRIV(g)->data_pos = 0;
|
||||
|
||||
// Initialise the board interface
|
||||
init_board(g);
|
||||
// Initialise the board interface
|
||||
init_board(g);
|
||||
|
||||
// Hardware reset
|
||||
setpin_reset(g, TRUE);
|
||||
gfxSleepMilliseconds(20);
|
||||
setpin_reset(g, FALSE);
|
||||
gfxSleepMilliseconds(20);
|
||||
// Hardware reset
|
||||
setpin_reset(g, TRUE);
|
||||
gfxSleepMilliseconds(20);
|
||||
setpin_reset(g, FALSE);
|
||||
gfxSleepMilliseconds(20);
|
||||
acquire_bus(g);
|
||||
enter_cmd_mode(g);
|
||||
|
||||
acquire_bus(g);
|
||||
write_cmd(g, ST7565_DISPLAY_OFF);
|
||||
write_cmd(g, ST7565_LCD_BIAS);
|
||||
write_cmd(g, ST7565_RESET);
|
||||
write_cmd(g, ST7565_LCD_BIAS);
|
||||
write_cmd(g, ST7565_ADC);
|
||||
write_cmd(g, ST7565_COM_SCAN);
|
||||
|
||||
|
||||
write_cmd(g, ST7565_RESISTOR_RATIO | 0x1);
|
||||
write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST);
|
||||
|
||||
// turn on internal power supply (VC=1, VR=1, VF=1)
|
||||
write_cmd(g, ST7565_POWER_CONTROL | 0x07);
|
||||
|
||||
write_cmd(g, ST7565_INVERT_DISPLAY);
|
||||
write_cmd(g, ST7565_ALLON_NORMAL);
|
||||
|
||||
write_cmd(g, ST7565_START_LINE | 0);
|
||||
|
||||
write_cmd(g, ST7565_RESISTOR_RATIO | 0x6);
|
||||
|
||||
// turn on voltage converter (VC=1, VR=0, VF=0)
|
||||
write_cmd(g, ST7565_POWER_CONTROL | 0x04);
|
||||
delay_ms(50);
|
||||
|
||||
// turn on voltage regulator (VC=1, VR=1, VF=0)
|
||||
write_cmd(g, ST7565_POWER_CONTROL | 0x06);
|
||||
delay_ms(50);
|
||||
|
||||
// turn on voltage follower (VC=1, VR=1, VF=1)
|
||||
write_cmd(g, ST7565_POWER_CONTROL | 0x07);
|
||||
delay_ms(50);
|
||||
|
||||
write_cmd(g, 0xE2);
|
||||
write_cmd(g, ST7565_COM_SCAN);
|
||||
write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST*64/101);
|
||||
//write_cmd2(g, ST7565_CONTRAST, 0);
|
||||
write_cmd(g, ST7565_DISPLAY_ON);
|
||||
write_cmd(g, ST7565_ALLON_NORMAL);
|
||||
write_cmd(g, ST7565_INVERT_DISPLAY);
|
||||
|
||||
write_cmd(g, ST7565_RMW);
|
||||
write_cmd(g, ST7565_RMW);
|
||||
flush_cmd(g);
|
||||
|
||||
// Finish Init
|
||||
post_init_board(g);
|
||||
|
||||
// Release the bus
|
||||
release_bus(g);
|
||||
// Release the bus
|
||||
release_bus(g);
|
||||
|
||||
/* Initialise the GDISP structure */
|
||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||
g->g.Orientation = GDISP_ROTATE_0;
|
||||
g->g.Powermode = powerOn;
|
||||
g->g.Backlight = GDISP_INITIAL_BACKLIGHT;
|
||||
g->g.Contrast = GDISP_INITIAL_CONTRAST;
|
||||
return TRUE;
|
||||
/* Initialise the GDISP structure */
|
||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||
g->g.Orientation = GDISP_ROTATE_0;
|
||||
g->g.Powermode = powerOff;
|
||||
g->g.Backlight = GDISP_INITIAL_BACKLIGHT;
|
||||
g->g.Contrast = GDISP_INITIAL_CONTRAST;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if GDISP_HARDWARE_FLUSH
|
||||
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||
unsigned p;
|
||||
LLDSPEC void gdisp_lld_flush(GDisplay *g) {
|
||||
unsigned p;
|
||||
|
||||
// Don't flush if we don't need it.
|
||||
if (!(g->flags & GDISP_FLG_NEEDFLUSH))
|
||||
return;
|
||||
// Don't flush if we don't need it.
|
||||
if (!(g->flags & GDISP_FLG_NEEDFLUSH))
|
||||
return;
|
||||
|
||||
acquire_bus(g);
|
||||
unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0);
|
||||
for (p = 0; p < 4; p++) {
|
||||
write_cmd(g, ST7565_PAGE | (p + dstOffset));
|
||||
write_cmd(g, ST7565_COLUMN_MSB | 0);
|
||||
write_cmd(g, ST7565_COLUMN_LSB | 0);
|
||||
write_cmd(g, ST7565_RMW);
|
||||
write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
|
||||
}
|
||||
unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
|
||||
write_cmd(g, ST7565_START_LINE | line);
|
||||
PRIV(g)->buffer2 = !PRIV(g)->buffer2;
|
||||
release_bus(g);
|
||||
acquire_bus(g);
|
||||
enter_cmd_mode(g);
|
||||
unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0);
|
||||
for (p = 0; p < 4; p++) {
|
||||
write_cmd(g, ST7565_PAGE | (p + dstOffset));
|
||||
write_cmd(g, ST7565_COLUMN_MSB | 0);
|
||||
write_cmd(g, ST7565_COLUMN_LSB | 0);
|
||||
write_cmd(g, ST7565_RMW);
|
||||
flush_cmd(g);
|
||||
enter_data_mode(g);
|
||||
write_data(g, RAM(g) + (p*GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
|
||||
enter_cmd_mode(g);
|
||||
}
|
||||
unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
|
||||
write_cmd(g, ST7565_START_LINE | line);
|
||||
flush_cmd(g);
|
||||
PRIV(g)->buffer2 = !PRIV(g)->buffer2;
|
||||
release_bus(g);
|
||||
|
||||
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
||||
}
|
||||
g->flags &= ~GDISP_FLG_NEEDFLUSH;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if GDISP_HARDWARE_DRAWPIXEL
|
||||
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||
coord_t x, y;
|
||||
LLDSPEC void gdisp_lld_draw_pixel(GDisplay *g) {
|
||||
coord_t x, y;
|
||||
|
||||
switch(g->g.Orientation) {
|
||||
default:
|
||||
case GDISP_ROTATE_0:
|
||||
x = g->p.x;
|
||||
y = g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
x = g->p.y;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
||||
break;
|
||||
case GDISP_ROTATE_180:
|
||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_270:
|
||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
y = g->p.x;
|
||||
break;
|
||||
}
|
||||
if (gdispColor2Native(g->p.color) != Black)
|
||||
RAM(g)[xyaddr(x, y)] |= xybit(y);
|
||||
else
|
||||
RAM(g)[xyaddr(x, y)] &= ~xybit(y);
|
||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||
}
|
||||
switch(g->g.Orientation) {
|
||||
default:
|
||||
case GDISP_ROTATE_0:
|
||||
x = g->p.x;
|
||||
y = g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
x = g->p.y;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
||||
break;
|
||||
case GDISP_ROTATE_180:
|
||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_270:
|
||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
y = g->p.x;
|
||||
break;
|
||||
}
|
||||
if (gdispColor2Native(g->p.color) != Black)
|
||||
RAM(g)[xyaddr(x, y)] |= xybit(y);
|
||||
else
|
||||
RAM(g)[xyaddr(x, y)] &= ~xybit(y);
|
||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if GDISP_HARDWARE_PIXELREAD
|
||||
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
||||
coord_t x, y;
|
||||
LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
|
||||
coord_t x, y;
|
||||
|
||||
switch(g->g.Orientation) {
|
||||
default:
|
||||
case GDISP_ROTATE_0:
|
||||
x = g->p.x;
|
||||
y = g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
x = g->p.y;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
||||
break;
|
||||
case GDISP_ROTATE_180:
|
||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_270:
|
||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
y = g->p.x;
|
||||
break;
|
||||
}
|
||||
return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
|
||||
}
|
||||
switch(g->g.Orientation) {
|
||||
default:
|
||||
case GDISP_ROTATE_0:
|
||||
x = g->p.x;
|
||||
y = g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
x = g->p.y;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.x;
|
||||
break;
|
||||
case GDISP_ROTATE_180:
|
||||
x = GDISP_SCREEN_WIDTH-1 - g->p.x;
|
||||
y = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
break;
|
||||
case GDISP_ROTATE_270:
|
||||
x = GDISP_SCREEN_HEIGHT-1 - g->p.y;
|
||||
y = g->p.x;
|
||||
break;
|
||||
}
|
||||
return (RAM(g)[xyaddr(x, y)] & xybit(y)) ? White : Black;
|
||||
}
|
||||
#endif
|
||||
|
||||
LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
|
||||
uint8_t* buffer = (uint8_t*)g->p.ptr;
|
||||
int linelength = g->p.cx;
|
||||
for (int i = 0; i < g->p.cy; i++) {
|
||||
unsigned dstx = g->p.x;
|
||||
unsigned dsty = g->p.y + i;
|
||||
unsigned srcx = g->p.x1;
|
||||
unsigned srcy = g->p.y1 + i;
|
||||
unsigned srcbit = srcy * g->p.x2 + srcx;
|
||||
for(int j=0; j < linelength; j++) {
|
||||
uint8_t src = buffer[srcbit / 8];
|
||||
uint8_t bit = 7-(srcbit % 8);
|
||||
uint8_t bitset = (src >> bit) & 1;
|
||||
uint8_t* dst = &(RAM(g)[xyaddr(dstx, dsty)]);
|
||||
if (bitset) {
|
||||
*dst |= xybit(dsty);
|
||||
}
|
||||
else {
|
||||
*dst &= ~xybit(dsty);
|
||||
}
|
||||
dstx++;
|
||||
srcbit++;
|
||||
}
|
||||
}
|
||||
g->flags |= GDISP_FLG_NEEDFLUSH;
|
||||
}
|
||||
|
||||
#if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
|
||||
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||
switch(g->p.x) {
|
||||
case GDISP_CONTROL_POWER:
|
||||
if (g->g.Powermode == (powermode_t)g->p.ptr)
|
||||
return;
|
||||
switch((powermode_t)g->p.ptr) {
|
||||
case powerOff:
|
||||
case powerSleep:
|
||||
case powerDeepSleep:
|
||||
acquire_bus(g);
|
||||
write_cmd(g, ST7565_DISPLAY_OFF);
|
||||
release_bus(g);
|
||||
break;
|
||||
case powerOn:
|
||||
acquire_bus(g);
|
||||
write_cmd(g, ST7565_DISPLAY_ON);
|
||||
release_bus(g);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
g->g.Powermode = (powermode_t)g->p.ptr;
|
||||
return;
|
||||
LLDSPEC void gdisp_lld_control(GDisplay *g) {
|
||||
switch(g->p.x) {
|
||||
case GDISP_CONTROL_POWER:
|
||||
if (g->g.Powermode == (powermode_t)g->p.ptr)
|
||||
return;
|
||||
switch((powermode_t)g->p.ptr) {
|
||||
case powerOff:
|
||||
case powerSleep:
|
||||
case powerDeepSleep:
|
||||
acquire_bus(g);
|
||||
enter_cmd_mode(g);
|
||||
write_cmd(g, ST7565_DISPLAY_OFF);
|
||||
flush_cmd(g);
|
||||
release_bus(g);
|
||||
break;
|
||||
case powerOn:
|
||||
acquire_bus(g);
|
||||
enter_cmd_mode(g);
|
||||
write_cmd(g, ST7565_DISPLAY_ON);
|
||||
flush_cmd(g);
|
||||
release_bus(g);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
g->g.Powermode = (powermode_t)g->p.ptr;
|
||||
return;
|
||||
|
||||
case GDISP_CONTROL_ORIENTATION:
|
||||
if (g->g.Orientation == (orientation_t)g->p.ptr)
|
||||
return;
|
||||
switch((orientation_t)g->p.ptr) {
|
||||
/* Rotation is handled by the drawing routines */
|
||||
case GDISP_ROTATE_0:
|
||||
case GDISP_ROTATE_180:
|
||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
case GDISP_ROTATE_270:
|
||||
g->g.Height = GDISP_SCREEN_WIDTH;
|
||||
g->g.Width = GDISP_SCREEN_HEIGHT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
g->g.Orientation = (orientation_t)g->p.ptr;
|
||||
return;
|
||||
case GDISP_CONTROL_ORIENTATION:
|
||||
if (g->g.Orientation == (orientation_t)g->p.ptr)
|
||||
return;
|
||||
switch((orientation_t)g->p.ptr) {
|
||||
/* Rotation is handled by the drawing routines */
|
||||
case GDISP_ROTATE_0:
|
||||
case GDISP_ROTATE_180:
|
||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||
break;
|
||||
case GDISP_ROTATE_90:
|
||||
case GDISP_ROTATE_270:
|
||||
g->g.Height = GDISP_SCREEN_WIDTH;
|
||||
g->g.Width = GDISP_SCREEN_HEIGHT;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
g->g.Orientation = (orientation_t)g->p.ptr;
|
||||
return;
|
||||
|
||||
case GDISP_CONTROL_CONTRAST:
|
||||
if ((unsigned)g->p.ptr > 100)
|
||||
g->p.ptr = (void *)100;
|
||||
acquire_bus(g);
|
||||
write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr)<<6)/101) & 0x3F);
|
||||
release_bus(g);
|
||||
g->g.Contrast = (unsigned)g->p.ptr;
|
||||
return;
|
||||
}
|
||||
}
|
||||
case GDISP_CONTROL_CONTRAST:
|
||||
g->g.Contrast = (unsigned)g->p.ptr & 63;
|
||||
acquire_bus(g);
|
||||
enter_cmd_mode(g);
|
||||
write_cmd2(g, ST7565_CONTRAST, g->g.Contrast);
|
||||
flush_cmd(g);
|
||||
release_bus(g);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // GDISP_NEED_CONTROL
|
||||
|
||||
#endif // GFX_USE_GDISP
|
||||
|
@@ -14,12 +14,13 @@
|
||||
/* Driver hardware support. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
||||
#define GDISP_HARDWARE_DRAWPIXEL TRUE
|
||||
#define GDISP_HARDWARE_PIXELREAD TRUE
|
||||
#define GDISP_HARDWARE_CONTROL TRUE
|
||||
#define GDISP_HARDWARE_FLUSH TRUE // This controller requires flushing
|
||||
#define GDISP_HARDWARE_DRAWPIXEL TRUE
|
||||
#define GDISP_HARDWARE_PIXELREAD TRUE
|
||||
#define GDISP_HARDWARE_CONTROL TRUE
|
||||
#define GDISP_HARDWARE_BITFILLS TRUE
|
||||
|
||||
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO
|
||||
#define GDISP_LLD_PIXELFORMAT GDISP_PIXELFORMAT_MONO
|
||||
|
||||
#endif /* GFX_USE_GDISP */
|
||||
|
||||
|
@@ -34,4 +34,6 @@
|
||||
#define ST7565_RESISTOR_RATIO 0x20
|
||||
#define ST7565_POWER_CONTROL 0x28
|
||||
|
||||
#define ST7565_RESET 0xE2
|
||||
|
||||
#endif /* _ST7565_H */
|
||||
|
@@ -143,7 +143,7 @@
|
||||
#define GDISP_HARDWARE_DRAWPIXEL TRUE
|
||||
#define GDISP_HARDWARE_CLEARS FALSE
|
||||
#define GDISP_HARDWARE_FILLS FALSE
|
||||
#define GDISP_HARDWARE_BITFILLS FALSE
|
||||
//#define GDISP_HARDWARE_BITFILLS FALSE
|
||||
#define GDISP_HARDWARE_SCROLL FALSE
|
||||
#define GDISP_HARDWARE_PIXELREAD TRUE
|
||||
#define GDISP_HARDWARE_CONTROL TRUE
|
||||
|
@@ -70,10 +70,33 @@ void lcd_backlight_hal_init(void) {
|
||||
RGB_PORT->PCR[BLUE_PIN] = RGB_MODE;
|
||||
}
|
||||
|
||||
static uint16_t cie_lightness(uint16_t v) {
|
||||
// The CIE 1931 formula for lightness
|
||||
// Y = luminance (output) 0-1
|
||||
// L = lightness input 0 - 100
|
||||
|
||||
// Y = (L* / 902.3) if L* <= 8
|
||||
// Y = ((L* + 16) / 116)^3 if L* > 8
|
||||
|
||||
float l = 100.0f * (v / 65535.0f);
|
||||
float y = 0.0f;
|
||||
if (l <= 8.0f) {
|
||||
y = l / 902.3;
|
||||
}
|
||||
else {
|
||||
y = ((l + 16.0f) / 116.0f);
|
||||
y = y * y * y;
|
||||
if (y > 1.0f) {
|
||||
y = 1.0f;
|
||||
}
|
||||
}
|
||||
return y * 65535.0f;
|
||||
}
|
||||
|
||||
void lcd_backlight_hal_color(uint16_t r, uint16_t g, uint16_t b) {
|
||||
CHANNEL_RED.CnV = r;
|
||||
CHANNEL_GREEN.CnV = g;
|
||||
CHANNEL_BLUE.CnV = b;
|
||||
CHANNEL_RED.CnV = cie_lightness(r);
|
||||
CHANNEL_GREEN.CnV = cie_lightness(g);
|
||||
CHANNEL_BLUE.CnV = cie_lightness(b);
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
@@ -103,34 +126,48 @@ void matrix_scan_kb(void) {
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_board_led_on(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_1_on(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_2_on(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_3_on(void){
|
||||
}
|
||||
|
||||
void ergodox_right_led_on(uint8_t led){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_board_led_off(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_1_off(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_2_off(void){
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_3_off(void){
|
||||
}
|
||||
|
||||
void ergodox_right_led_off(uint8_t led){
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_1_set(uint8_t n) {
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_2_set(uint8_t n) {
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void ergodox_right_led_3_set(uint8_t n) {
|
||||
}
|
||||
|
||||
#ifdef ONEHAND_ENABLE
|
||||
|
@@ -7,13 +7,38 @@ void ergodox_board_led_on(void);
|
||||
void ergodox_right_led_1_on(void);
|
||||
void ergodox_right_led_2_on(void);
|
||||
void ergodox_right_led_3_on(void);
|
||||
void ergodox_right_led_on(uint8_t led);
|
||||
|
||||
inline void ergodox_right_led_on(uint8_t led) {
|
||||
switch (led) {
|
||||
case 0:
|
||||
ergodox_right_led_1_on();
|
||||
break;
|
||||
case 1:
|
||||
ergodox_right_led_2_on();
|
||||
break;
|
||||
case 2:
|
||||
ergodox_right_led_3_on();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ergodox_board_led_off(void);
|
||||
void ergodox_right_led_1_off(void);
|
||||
void ergodox_right_led_2_off(void);
|
||||
void ergodox_right_led_3_off(void);
|
||||
void ergodox_right_led_off(uint8_t led);
|
||||
inline void ergodox_right_led_off(uint8_t led) {
|
||||
switch (led) {
|
||||
case 0:
|
||||
ergodox_right_led_1_off();
|
||||
break;
|
||||
case 1:
|
||||
ergodox_right_led_2_off();
|
||||
break;
|
||||
case 2:
|
||||
ergodox_right_led_3_off();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void ergodox_led_all_on(void)
|
||||
{
|
||||
@@ -31,36 +56,22 @@ inline void ergodox_led_all_off(void)
|
||||
ergodox_right_led_3_off();
|
||||
}
|
||||
|
||||
inline void ergodox_right_led_1_set(uint8_t n){
|
||||
if (n) {
|
||||
ergodox_right_led_1_on();
|
||||
} else {
|
||||
ergodox_right_led_1_off();
|
||||
}
|
||||
}
|
||||
|
||||
inline void ergodox_right_led_2_set(uint8_t n){
|
||||
if (n) {
|
||||
ergodox_right_led_2_on();
|
||||
} else {
|
||||
ergodox_right_led_2_off();
|
||||
}
|
||||
}
|
||||
|
||||
inline void ergodox_right_led_3_set(uint8_t n){
|
||||
if (n) {
|
||||
ergodox_right_led_3_on();
|
||||
} else {
|
||||
ergodox_right_led_3_off();
|
||||
}
|
||||
}
|
||||
void ergodox_right_led_1_set(uint8_t n);
|
||||
void ergodox_right_led_2_set(uint8_t n);
|
||||
void ergodox_right_led_3_set(uint8_t n);
|
||||
|
||||
inline void ergodox_right_led_set(uint8_t led, uint8_t n){
|
||||
if (n) {
|
||||
ergodox_right_led_on(led);
|
||||
} else {
|
||||
ergodox_right_led_off(led);
|
||||
}
|
||||
switch (led) {
|
||||
case 0:
|
||||
ergodox_right_led_1_set(n);
|
||||
break;
|
||||
case 1:
|
||||
ergodox_right_led_2_set(n);
|
||||
break;
|
||||
case 2:
|
||||
ergodox_right_led_3_set(n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
inline void ergodox_led_all_set(uint8_t n) {
|
||||
|
@@ -1,6 +1,7 @@
|
||||
# project specific files
|
||||
SRC = matrix.c \
|
||||
led.c
|
||||
led.c \
|
||||
animations.c
|
||||
|
||||
## chip/board settings
|
||||
# - the next two should match the directories in
|
||||
@@ -59,21 +60,17 @@ OPT_DEFS += -DCORTEX_VTOR_INIT=0x00002000
|
||||
#
|
||||
CUSTOM_MATRIX ?= yes # Custom matrix file
|
||||
SERIAL_LINK_ENABLE = yes
|
||||
VISUALIZER_ENABLE ?= no #temporarily disabled to make everything compile
|
||||
VISUALIZER_ENABLE ?= yes
|
||||
LCD_ENABLE ?= yes
|
||||
LED_ENABLE ?= yes
|
||||
LED_ENABLE ?= no
|
||||
LCD_BACKLIGHT_ENABLE ?= yes
|
||||
MIDI_ENABLE = no
|
||||
RGBLIGHT_ENABLE = no
|
||||
|
||||
ifndef QUANTUM_DIR
|
||||
include ../../../Makefile
|
||||
endif
|
||||
|
||||
ifdef LCD_ENABLE
|
||||
include $(SUBPROJECT_PATH)/drivers/gdisp/st7565ergodox/driver.mk
|
||||
endif
|
||||
|
||||
ifdef LED_ENABLE
|
||||
include $(SUBPROJECT_PATH)/drivers/gdisp/IS31FL3731C/driver.mk
|
||||
endif
|
||||
endif
|
123
keyboards/ergodox/infinity/simple_visualizer.h
Normal file
123
keyboards/ergodox/infinity/simple_visualizer.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/* Copyright 2017 Fred Sundvik
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_
|
||||
#define KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_
|
||||
|
||||
// Currently we are assuming that both the backlight and LCD are enabled
|
||||
// But it's entirely possible to write a custom visualizer that use only
|
||||
// one of them
|
||||
#ifndef LCD_BACKLIGHT_ENABLE
|
||||
#error This visualizer needs that LCD backlight is enabled
|
||||
#endif
|
||||
|
||||
#ifndef LCD_ENABLE
|
||||
#error This visualizer needs that LCD is enabled
|
||||
#endif
|
||||
|
||||
#include "visualizer.h"
|
||||
#include "visualizer_keyframes.h"
|
||||
#include "lcd_keyframes.h"
|
||||
#include "lcd_backlight_keyframes.h"
|
||||
#include "system/serial_link.h"
|
||||
#include "led.h"
|
||||
#include "animations.h"
|
||||
|
||||
static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF);
|
||||
static const uint32_t initial_color = LCD_COLOR(0, 0, 0);
|
||||
|
||||
static bool initial_update = true;
|
||||
|
||||
// Feel free to modify the animations below, or even add new ones if needed
|
||||
|
||||
static keyframe_animation_t lcd_layer_display = {
|
||||
.num_frames = 1,
|
||||
.loop = false,
|
||||
.frame_lengths = {gfxMillisecondsToTicks(0)},
|
||||
.frame_functions = {lcd_keyframe_display_layer_and_led_states}
|
||||
};
|
||||
|
||||
// The color animation animates the LCD color when you change layers
|
||||
static keyframe_animation_t color_animation = {
|
||||
.num_frames = 2,
|
||||
.loop = false,
|
||||
// Note that there's a 200 ms no-operation frame,
|
||||
// this prevents the color from changing when activating the layer
|
||||
// momentarily
|
||||
.frame_lengths = {gfxMillisecondsToTicks(200), gfxMillisecondsToTicks(500)},
|
||||
.frame_functions = {keyframe_no_operation, backlight_keyframe_animate_color},
|
||||
};
|
||||
|
||||
void initialize_user_visualizer(visualizer_state_t* state) {
|
||||
// The brightness will be dynamically adjustable in the future
|
||||
// But for now, change it here.
|
||||
lcd_backlight_brightness(130);
|
||||
state->current_lcd_color = initial_color;
|
||||
state->target_lcd_color = logo_background_color;
|
||||
initial_update = true;
|
||||
start_keyframe_animation(&default_startup_animation);
|
||||
}
|
||||
|
||||
|
||||
// This function should be implemented by the keymap visualizer
|
||||
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
|
||||
// that the simple_visualizer assumes that you are updating
|
||||
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
|
||||
// stopped. This can be done by either double buffering it or by using constant strings
|
||||
static void get_visualizer_layer_and_color(visualizer_state_t* state);
|
||||
|
||||
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
|
||||
// Add more tests, change the colors and layer texts here
|
||||
// Usually you want to check the high bits (higher layers first)
|
||||
// because that's the order layers are processed for keypresses
|
||||
// You can for check for example:
|
||||
// state->status.layer
|
||||
// state->status.default_layer
|
||||
// state->status.leds (see led.h for available statuses)
|
||||
|
||||
uint32_t prev_color = state->target_lcd_color;
|
||||
const char* prev_layer_text = state->layer_text;
|
||||
|
||||
get_visualizer_layer_and_color(state);
|
||||
|
||||
if (initial_update || prev_color != state->target_lcd_color) {
|
||||
start_keyframe_animation(&color_animation);
|
||||
}
|
||||
|
||||
if (initial_update || prev_layer_text != state->layer_text) {
|
||||
start_keyframe_animation(&lcd_layer_display);
|
||||
}
|
||||
// You can also stop existing animations, and start your custom ones here
|
||||
// remember that you should normally have only one animation for the LCD
|
||||
// and one for the background. But you can also combine them if you want.
|
||||
}
|
||||
|
||||
void user_visualizer_suspend(visualizer_state_t* state) {
|
||||
state->layer_text = "Suspending...";
|
||||
uint8_t hue = LCD_HUE(state->current_lcd_color);
|
||||
uint8_t sat = LCD_SAT(state->current_lcd_color);
|
||||
state->target_lcd_color = LCD_COLOR(hue, sat, 0);
|
||||
start_keyframe_animation(&default_suspend_animation);
|
||||
}
|
||||
|
||||
void user_visualizer_resume(visualizer_state_t* state) {
|
||||
state->current_lcd_color = initial_color;
|
||||
state->target_lcd_color = logo_background_color;
|
||||
initial_update = true;
|
||||
start_keyframe_animation(&default_startup_animation);
|
||||
}
|
||||
|
||||
#endif /* KEYBOARDS_ERGODOX_INFINITY_SIMPLE_VISUALIZER_H_ */
|
329
keyboards/ergodox/infinity/visualizer.c
Normal file
329
keyboards/ergodox/infinity/visualizer.c
Normal file
@@ -0,0 +1,329 @@
|
||||
/*
|
||||
Copyright 2016 Fred Sundvik <fsundvik@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Currently we are assuming that both the backlight and LCD are enabled
|
||||
// But it's entirely possible to write a custom visualizer that use only
|
||||
// one of them
|
||||
#ifndef LCD_BACKLIGHT_ENABLE
|
||||
#error This visualizer needs that LCD backlight is enabled
|
||||
#endif
|
||||
|
||||
#ifndef LCD_ENABLE
|
||||
#error This visualizer needs that LCD is enabled
|
||||
#endif
|
||||
|
||||
#include "visualizer.h"
|
||||
#include "visualizer_keyframes.h"
|
||||
#include "lcd_keyframes.h"
|
||||
#include "lcd_backlight_keyframes.h"
|
||||
#include "system/serial_link.h"
|
||||
#include "animations.h"
|
||||
|
||||
static const uint32_t logo_background_color = LCD_COLOR(0x00, 0x00, 0xFF);
|
||||
static const uint32_t initial_color = LCD_COLOR(0, 0, 0);
|
||||
|
||||
static const uint32_t led_emulation_colors[4] = {
|
||||
LCD_COLOR(0, 0, 0),
|
||||
LCD_COLOR(255, 255, 255),
|
||||
LCD_COLOR(84, 255, 255),
|
||||
LCD_COLOR(168, 255, 255),
|
||||
};
|
||||
|
||||
static uint32_t next_led_target_color = 0;
|
||||
|
||||
typedef enum {
|
||||
LCD_STATE_INITIAL,
|
||||
LCD_STATE_LAYER_BITMAP,
|
||||
LCD_STATE_BITMAP_AND_LEDS,
|
||||
} lcd_state_t;
|
||||
|
||||
static lcd_state_t lcd_state = LCD_STATE_INITIAL;
|
||||
|
||||
typedef struct {
|
||||
uint8_t led_on;
|
||||
uint8_t led1;
|
||||
uint8_t led2;
|
||||
uint8_t led3;
|
||||
} visualizer_user_data_t;
|
||||
|
||||
// Don't access from visualization function, use the visualizer state instead
|
||||
static visualizer_user_data_t user_data_keyboard = {
|
||||
.led_on = 0,
|
||||
.led1 = LED_BRIGHTNESS_HI,
|
||||
.led2 = LED_BRIGHTNESS_HI,
|
||||
.led3 = LED_BRIGHTNESS_HI,
|
||||
};
|
||||
|
||||
_Static_assert(sizeof(visualizer_user_data_t) <= VISUALIZER_USER_DATA_SIZE,
|
||||
"Please increase the VISUALIZER_USER_DATA_SIZE");
|
||||
|
||||
// Feel free to modify the animations below, or even add new ones if needed
|
||||
|
||||
|
||||
// The color animation animates the LCD color when you change layers
|
||||
static keyframe_animation_t one_led_color = {
|
||||
.num_frames = 1,
|
||||
.loop = false,
|
||||
.frame_lengths = {gfxMillisecondsToTicks(0)},
|
||||
.frame_functions = {backlight_keyframe_set_color},
|
||||
};
|
||||
|
||||
bool swap_led_target_color(keyframe_animation_t* animation, visualizer_state_t* state) {
|
||||
uint32_t temp = next_led_target_color;
|
||||
next_led_target_color = state->target_lcd_color;
|
||||
state->target_lcd_color = temp;
|
||||
return false;
|
||||
}
|
||||
|
||||
// The color animation animates the LCD color when you change layers
|
||||
static keyframe_animation_t two_led_colors = {
|
||||
.num_frames = 2,
|
||||
.loop = true,
|
||||
.frame_lengths = {gfxMillisecondsToTicks(1000), gfxMillisecondsToTicks(0)},
|
||||
.frame_functions = {backlight_keyframe_set_color, swap_led_target_color},
|
||||
};
|
||||
|
||||
// The LCD animation alternates between the layer name display and a
|
||||
// bitmap that displays all active layers
|
||||
static keyframe_animation_t lcd_bitmap_animation = {
|
||||
.num_frames = 1,
|
||||
.loop = false,
|
||||
.frame_lengths = {gfxMillisecondsToTicks(0)},
|
||||
.frame_functions = {lcd_keyframe_display_layer_bitmap},
|
||||
};
|
||||
|
||||
static keyframe_animation_t lcd_bitmap_leds_animation = {
|
||||
.num_frames = 2,
|
||||
.loop = true,
|
||||
.frame_lengths = {gfxMillisecondsToTicks(2000), gfxMillisecondsToTicks(2000)},
|
||||
.frame_functions = {lcd_keyframe_display_layer_bitmap, lcd_keyframe_display_led_states},
|
||||
};
|
||||
|
||||
void initialize_user_visualizer(visualizer_state_t* state) {
|
||||
// The brightness will be dynamically adjustable in the future
|
||||
// But for now, change it here.
|
||||
lcd_backlight_brightness(130);
|
||||
state->current_lcd_color = initial_color;
|
||||
state->target_lcd_color = logo_background_color;
|
||||
lcd_state = LCD_STATE_INITIAL;
|
||||
start_keyframe_animation(&default_startup_animation);
|
||||
}
|
||||
|
||||
inline bool is_led_on(visualizer_user_data_t* user_data, uint8_t num) {
|
||||
return user_data->led_on & (1u << num);
|
||||
}
|
||||
|
||||
static uint8_t get_led_index_master(visualizer_user_data_t* user_data) {
|
||||
for (int i=0; i < 3; i++) {
|
||||
if (is_led_on(user_data, i)) {
|
||||
return i + 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t get_led_index_slave(visualizer_user_data_t* user_data) {
|
||||
uint8_t master_index = get_led_index_master(user_data);
|
||||
if (master_index!=0) {
|
||||
for (int i=master_index; i < 3; i++) {
|
||||
if (is_led_on(user_data, i)) {
|
||||
return i + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t get_secondary_led_index(visualizer_user_data_t* user_data) {
|
||||
if (is_led_on(user_data, 0) &&
|
||||
is_led_on(user_data, 1) &&
|
||||
is_led_on(user_data, 2)) {
|
||||
return 3;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t get_brightness(visualizer_user_data_t* user_data, uint8_t index) {
|
||||
switch (index) {
|
||||
case 1:
|
||||
return user_data->led1;
|
||||
case 2:
|
||||
return user_data->led2;
|
||||
case 3:
|
||||
return user_data->led3;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void update_emulated_leds(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
|
||||
visualizer_user_data_t* user_data_new = (visualizer_user_data_t*)state->status.user_data;
|
||||
visualizer_user_data_t* user_data_old = (visualizer_user_data_t*)prev_status->user_data;
|
||||
|
||||
uint8_t new_index;
|
||||
uint8_t old_index;
|
||||
|
||||
if (is_serial_link_master()) {
|
||||
new_index = get_led_index_master(user_data_new);
|
||||
old_index = get_led_index_master(user_data_old);
|
||||
}
|
||||
else {
|
||||
new_index = get_led_index_slave(user_data_new);
|
||||
old_index = get_led_index_slave(user_data_old);
|
||||
}
|
||||
uint8_t new_secondary_index = get_secondary_led_index(user_data_new);
|
||||
uint8_t old_secondary_index = get_secondary_led_index(user_data_old);
|
||||
|
||||
uint8_t old_brightness = get_brightness(user_data_old, old_index);
|
||||
uint8_t new_brightness = get_brightness(user_data_new, new_index);
|
||||
|
||||
uint8_t old_secondary_brightness = get_brightness(user_data_old, old_secondary_index);
|
||||
uint8_t new_secondary_brightness = get_brightness(user_data_new, new_secondary_index);
|
||||
|
||||
if (lcd_state == LCD_STATE_INITIAL ||
|
||||
new_index != old_index ||
|
||||
new_secondary_index != old_secondary_index ||
|
||||
new_brightness != old_brightness ||
|
||||
new_secondary_brightness != old_secondary_brightness) {
|
||||
|
||||
if (new_secondary_index != 0) {
|
||||
state->target_lcd_color = change_lcd_color_intensity(
|
||||
led_emulation_colors[new_index], new_brightness);
|
||||
next_led_target_color = change_lcd_color_intensity(
|
||||
led_emulation_colors[new_secondary_index], new_secondary_brightness);
|
||||
|
||||
stop_keyframe_animation(&one_led_color);
|
||||
start_keyframe_animation(&two_led_colors);
|
||||
} else {
|
||||
state->target_lcd_color = change_lcd_color_intensity(
|
||||
led_emulation_colors[new_index], new_brightness);
|
||||
stop_keyframe_animation(&two_led_colors);
|
||||
start_keyframe_animation(&one_led_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void update_lcd_text(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
|
||||
if (state->status.leds) {
|
||||
if (lcd_state != LCD_STATE_BITMAP_AND_LEDS ||
|
||||
state->status.leds != prev_status->leds ||
|
||||
state->status.layer != prev_status->layer ||
|
||||
state->status.default_layer != prev_status->default_layer) {
|
||||
|
||||
// NOTE: that it doesn't matter if the animation isn't playing, stop will do nothing in that case
|
||||
stop_keyframe_animation(&lcd_bitmap_animation);
|
||||
|
||||
lcd_state = LCD_STATE_BITMAP_AND_LEDS;
|
||||
// For information:
|
||||
// The logic in this function makes sure that this doesn't happen, but if you call start on an
|
||||
// animation that is already playing it will be restarted.
|
||||
start_keyframe_animation(&lcd_bitmap_leds_animation);
|
||||
}
|
||||
} else {
|
||||
if (lcd_state != LCD_STATE_LAYER_BITMAP ||
|
||||
state->status.layer != prev_status->layer ||
|
||||
state->status.default_layer != prev_status->default_layer) {
|
||||
|
||||
stop_keyframe_animation(&lcd_bitmap_leds_animation);
|
||||
|
||||
lcd_state = LCD_STATE_LAYER_BITMAP;
|
||||
start_keyframe_animation(&lcd_bitmap_animation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void update_user_visualizer_state(visualizer_state_t* state, visualizer_keyboard_status_t* prev_status) {
|
||||
// Check the status here to start and stop animations
|
||||
// You might have to save some state, like the current animation here so that you can start the right
|
||||
// This function is called every time the status changes
|
||||
|
||||
// NOTE that this is called from the visualizer thread, so don't access anything else outside the status
|
||||
// This is also important because the slave won't have access to the active layer for example outside the
|
||||
// status.
|
||||
|
||||
update_emulated_leds(state, prev_status);
|
||||
update_lcd_text(state, prev_status);
|
||||
|
||||
}
|
||||
|
||||
void user_visualizer_suspend(visualizer_state_t* state) {
|
||||
state->layer_text = "Suspending...";
|
||||
uint8_t hue = LCD_HUE(state->current_lcd_color);
|
||||
uint8_t sat = LCD_SAT(state->current_lcd_color);
|
||||
state->target_lcd_color = LCD_COLOR(hue, sat, 0);
|
||||
start_keyframe_animation(&default_suspend_animation);
|
||||
}
|
||||
|
||||
void user_visualizer_resume(visualizer_state_t* state) {
|
||||
state->current_lcd_color = initial_color;
|
||||
state->target_lcd_color = logo_background_color;
|
||||
lcd_state = LCD_STATE_INITIAL;
|
||||
start_keyframe_animation(&default_startup_animation);
|
||||
}
|
||||
|
||||
void ergodox_board_led_on(void){
|
||||
// No board led support
|
||||
}
|
||||
|
||||
void ergodox_right_led_1_on(void){
|
||||
user_data_keyboard.led_on |= (1u << 0);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_2_on(void){
|
||||
user_data_keyboard.led_on |= (1u << 1);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_3_on(void){
|
||||
user_data_keyboard.led_on |= (1u << 2);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_board_led_off(void){
|
||||
// No board led support
|
||||
}
|
||||
|
||||
void ergodox_right_led_1_off(void){
|
||||
user_data_keyboard.led_on &= ~(1u << 0);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_2_off(void){
|
||||
user_data_keyboard.led_on &= ~(1u << 1);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_3_off(void){
|
||||
user_data_keyboard.led_on &= ~(1u << 2);
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_1_set(uint8_t n) {
|
||||
user_data_keyboard.led1 = n;
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_2_set(uint8_t n) {
|
||||
user_data_keyboard.led2 = n;
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
||||
|
||||
void ergodox_right_led_3_set(uint8_t n) {
|
||||
user_data_keyboard.led3 = n;
|
||||
visualizer_set_user_data(&user_data_keyboard);
|
||||
}
|
42
keyboards/ergodox/keymaps/default/visualizer.c
Normal file
42
keyboards/ergodox/keymaps/default/visualizer.c
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
Copyright 2017 Fred Sundvik
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "simple_visualizer.h"
|
||||
|
||||
// This function should be implemented by the keymap visualizer
|
||||
// Don't change anything else than state->target_lcd_color and state->layer_text as that's the only thing
|
||||
// that the simple_visualizer assumes that you are updating
|
||||
// Also make sure that the buffer passed to state->layer_text remains valid until the previous animation is
|
||||
// stopped. This can be done by either double buffering it or by using constant strings
|
||||
static void get_visualizer_layer_and_color(visualizer_state_t* state) {
|
||||
uint8_t saturation = 60;
|
||||
if (state->status.leds & (1u << USB_LED_CAPS_LOCK)) {
|
||||
saturation = 255;
|
||||
}
|
||||
if (state->status.layer & 0x4) {
|
||||
state->target_lcd_color = LCD_COLOR(0, saturation, 0xFF);
|
||||
state->layer_text = "Media & Mouse";
|
||||
}
|
||||
else if (state->status.layer & 0x2) {
|
||||
state->target_lcd_color = LCD_COLOR(168, saturation, 0xFF);
|
||||
state->layer_text = "Symbol";
|
||||
}
|
||||
else {
|
||||
state->target_lcd_color = LCD_COLOR(84, saturation, 0xFF);
|
||||
state->layer_text = "Default";
|
||||
}
|
||||
}
|
69
keyboards/ergodox/keymaps/familiar/README.md
Normal file
69
keyboards/ergodox/keymaps/familiar/README.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# ErgoDox Familiar Layout
|
||||
Familiar layout for those who regularly switch back and forth from ErgoDox to regular QWERTY.
|
||||
|
||||
[](../../../../license_GPLv3.md../../../../license_GPLv3.md) [](https://github.com/RichardLitt/standard-readme)
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Background](#background)
|
||||
- [Install](#install)
|
||||
- [Usage](#usage)
|
||||
- [Layers](#layers)
|
||||
- [Contribute](#contribute)
|
||||
- [Issues](#issues)
|
||||
- [License](#license)
|
||||
|
||||
## Background
|
||||
|
||||
This layout is built to be as familiar as possible for users coming directly from a default (QWERTY US) keyboard, while gaining as much advantage as possible from the ErgoDox and QMK featureset. I use an ErgoDoxEZ at home, but I don't have a regular office (CS grad student) so I regularly use either my laptop or a default-setup lab computer; I context switch daily so this layout is meant to reduce the mental overhead as much as possible.
|
||||
|
||||
The default ErgoDoxEZ layout is probably more optimized as a solo daily driver - as are a lot of the others available keymaps. The focus of this layout is to get as much from the 'Dox as possible without overly disrupting long-established muscle memory.
|
||||
|
||||
Key features of the familiar layout:
|
||||
1. QWERTY default layout.
|
||||
1. International symbols layer, mapped in the US-International layout default positions, through [UCIS](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable).
|
||||
1. Numpad layer on right hand.
|
||||
1. Thumb cluster holds spacebar, ALT, and access to secondary layers.
|
||||
1. Function-layer arrow keys in both the first-person-shooter (actually ESDF instead of WASD) and vim (HJKL) locations.
|
||||
|
||||
## Install
|
||||
|
||||
If you are on Windows or Mac, choose the proper line in [`keymap.c`](keymap.c) for [unicode/international character support](https://github.com/qmk/qmk_firmware/wiki/Unicode-and-additional-language-support#ucis_enable) (starts at line 235).
|
||||
```c
|
||||
void matrix_init_user(void) {
|
||||
set_unicode_input_mode(UC_LNX); // Linux
|
||||
//set_unicode_input_mode(UC_OSX); // Mac OSX
|
||||
//set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki)
|
||||
//set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki)
|
||||
};
|
||||
```
|
||||
|
||||
For instructions on building and installing this keymap, [go to the wiki](https://github.com/qmk/qmk_firmware/tree/master/keyboards/ergodox#build-dependencies). Below is the command for me; it may be different for you.
|
||||
```sh
|
||||
$ make ergodox-ez-familiar-teensy
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
[](http://www.keyboard-layout-editor.com/#/gists/13508a9f99cff381d58b7be6f7dcc644)
|
||||
|
||||
### Layers
|
||||
1. Base Layer: QWERTY, with arrow keys at bottom right.
|
||||
1. UCIS Layer: US-International symbols layer, plus —. Accessed by toggling the `INTL` layer using the UCIS key (bottom of left thumb cluster).
|
||||
1. UCIS-Shifted Layer: Making shift work for UCIS characters. An ugly workaround. Any ideas? Accessed through holding shift while the UCIS layer is active (toggles the `INSF` layer).
|
||||
1. Numpad Layer: Right hand number pad. Accessed by toggling the `NUMP` layer using the NPAD key (bottom of right thumb cluster).
|
||||
1. Function Layer: F1-F12, arrows on ESDF and HJKL, media player controls. Accessed by holding either FN key (center key of each thumb cluster), which toggles the `ARRW` layer. I know, I need to work on my naming conventions.
|
||||
|
||||
## Contribute
|
||||
|
||||
[Contributor Covenant](http://contributor-covenant.org/)
|
||||
|
||||
I'm terrible at this; I have no background in human-computer interaction, kinesiology, or keyboard-ology. Please send comments/issues/pull requests/angry tweets/etc. If you think there is a better way to take advantage of the ErgoDox/QMK comination without straying far from 84/101-key QWERTY, I want to know it.
|
||||
|
||||
### Issues
|
||||
1. The top two keys of the right thumb cluster are currently unused. I wanted them for screen brightness, but I haven't found a solution I like.
|
||||
1. The `'`, `"`, `[`, and `]` keys are terrible to access; I want to put them somewhere else but I haven't figured out where.
|
||||
1. The `INSF` layer is an ugly workaround. I should write a function for doing different things in the `INTL` layer depending on whether SHIFT is being held. Or something. Ideas?
|
||||
|
||||
## License
|
||||
QMK is licensed ([mostly](https://github.com/qmk/qmk_firmware/issues/1038)) under the [GPLv2](blob/master/license_GPLv2.md). Accordingly, to whatever extent applicable, this keymap is licensed under the [GPLv3](../../../../license_GPLv3.md).
|
BIN
keyboards/ergodox/keymaps/familiar/familiar.png
Normal file
BIN
keyboards/ergodox/keymaps/familiar/familiar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 146 KiB |
267
keyboards/ergodox/keymaps/familiar/keymap.c
Normal file
267
keyboards/ergodox/keymaps/familiar/keymap.c
Normal file
@@ -0,0 +1,267 @@
|
||||
#include "ergodox.h"
|
||||
#include "debug.h"
|
||||
#include "action_layer.h"
|
||||
#include "version.h"
|
||||
|
||||
// Layers
|
||||
#define BASE 0 // default layer
|
||||
#define INTL 1 // international symbols
|
||||
#define INSF 2 // international symbols shifted
|
||||
#define NUMP 3 // numpad
|
||||
#define ARRW 4 // function, media, arrow keys
|
||||
|
||||
// Fillers to make layering more clear
|
||||
#define _______ KC_TRNS
|
||||
#define XXXXXXX KC_NO
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
|
||||
// Otherwise, it needs KC_*
|
||||
/* layer 0 : default
|
||||
*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | BCKSPC |
|
||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||
* | TAB | Q | W | E | R | T | HOME | | PGUP | Y | U | I | O | P | DELETE |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | ` | A | S | D | F | G |------| |------| H | J | K | L | ; | ENTER |
|
||||
* |--------+------+------+------+------+------| END | | PGDN |------+------+------+------+------+--------|
|
||||
* | (/LSFT | Z | X | C | V | B | | | | N | M | , | . | UP | )/RSFT |
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | LCTRL | LGUI | MENU | ' | " | | [ | ] | LEFT | DOWN | RIGHT |
|
||||
* `------------------------------------' `------------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | VOL- | VOL+ | | | |
|
||||
* ,------|------|------| |------+------+------.
|
||||
* | SPC/ |SLASH/| MUTE | |NUMLCK|WHACK/| SPC/ |
|
||||
* | ALT | MO(1)|------| |------|MO(1) | ALT |
|
||||
* | | | LAY3 | | LAY2 | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
[BASE] = KEYMAP(
|
||||
// left hand
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME,
|
||||
KC_GRV, KC_A, KC_S, KC_D, KC_F, KC_G,
|
||||
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END,
|
||||
KC_LCTL, KC_LGUI, KC_MENU, KC_QUOT, S(KC_QUOT),
|
||||
KC_VOLD, KC_VOLU,
|
||||
KC_MUTE,
|
||||
ALT_T(KC_SPC), LT(ARRW,KC_SLSH), TG(INTL),
|
||||
// right hand
|
||||
KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
|
||||
KC_PGUP, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
|
||||
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER,
|
||||
KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC,
|
||||
KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_RGHT,
|
||||
_______, _______,
|
||||
KC_NLCK,
|
||||
TG(NUMP), LT(ARRW,KC_BSLS), ALT_T(KC_SPC)
|
||||
),
|
||||
|
||||
/* layer 1: International symbols, etc
|
||||
*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | ´ | ¡ | ² | ³ | ¤ | € | ¼ | | ½ | ¾ | ‘ | ’ | ¥ | × | |
|
||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||
* | | ä | å | é | ® | þ | | | | ü | ú | í | ó | ö | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | | á | ß | ð | | |------| |------| | | | ø | ¶ | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* |MO(INSF)| æ | | © | | | | | | ñ | µ | ç | | |MO(INSF)|
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | | | | ¬ | ¿ | | « | » | | | |
|
||||
* `------------------------------------' `------------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | | | | | |
|
||||
* ,------|------|------| |------+------+------.
|
||||
* | | | | | | | |
|
||||
* | | |------| |------| | |
|
||||
* | | | | | | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
[INTL] = KEYMAP(
|
||||
// left hand
|
||||
UC(0x00B4), UC(0x00A1), UC(0x00B2), UC(0x00B3), UC(0x00A4), UC(0x20AC), UC(0x00BC),
|
||||
_______, UC(0x00E4), UC(0x00E5), UC(0x00E9), UC(0x00AE), UC(0x00FE), _______,
|
||||
_______, UC(0x00E1), UC(0x00DF), UC(0x00F0), _______, _______,
|
||||
MO(INSF), UC(0x00E6), _______, UC(0x00A9), _______, _______, _______,
|
||||
_______, _______, _______, UC(0x00AC), UC(0x00BF),
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______,
|
||||
// right hand
|
||||
UC(0x00BD), UC(0x00BE), UC(0x2018), UC(0x2019), UC(0x00A5), UC(0x00D7), _______,
|
||||
_______, UC(0x00FC), UC(0x00FA), UC(0x00ED), UC(0x00F3), UC(0x00F6), _______,
|
||||
_______, _______, _______, UC(0x00F8), UC(0x00B6), _______,
|
||||
_______, UC(0x00F1), UC(0x00B5), UC(0x00E7), _______, _______, MO(INSF),
|
||||
UC(0x00AB), UC(0x00BB), _______, _______, _______,
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______
|
||||
),
|
||||
|
||||
/* layer 2 : international symbols, shifted
|
||||
* This layer is an ugly workaround; it pretends that SHIFT still works normally on keys
|
||||
* which don't produce an "upper case" or "shifted" international symobol.
|
||||
*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | ¨ | ¹ | | | £ | | | | | | | | — | ÷ | |
|
||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||
* | | Ä | Å | É | | Þ | | | | Ü | Ú | Í | Ó | Ö | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | | Á | § | Ð | | |------| |------| | | | Ø | ° | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | | Æ | | ¢ | | | | | | Ñ | | Ç | | | |
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | | | | ¦ | | | | | | | |
|
||||
* `------------------------------------' `------------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | | | | | |
|
||||
* ,------|------|------| |------+------+------.
|
||||
* | | | | | | | |
|
||||
* | | |------| |------| | |
|
||||
* | | | | | | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
[INSF] = KEYMAP(
|
||||
// left hand
|
||||
UC(0x00A8), UC(0x00B9), _______, _______, UC(0x00A3), _______, _______,
|
||||
_______, UC(0x00C4), UC(0x00C5), UC(0x00C9), _______, UC(0x00DE), _______,
|
||||
_______, UC(0x00C1), UC(0x00A7), UC(0x00D0), S(KC_F), S(KC_G),
|
||||
_______, UC(0x00C6), S(KC_X), UC(0x00A2), S(KC_V), S(KC_B), _______,
|
||||
_______, _______, _______, UC(0x00A6), _______,
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______,
|
||||
// right hand
|
||||
_______, _______, _______, _______, UC(0x2014), UC(0x00F7), _______,
|
||||
_______, UC(0x00DC), UC(0x00DA), UC(0x00CD), UC(0x00D3), UC(0x00D6), _______,
|
||||
S(KC_H), S(KC_J), S(KC_K), UC(0x00D8), UC(0x00B0), _______,
|
||||
_______, UC(0x00D1), _______, UC(0x00C7), S(KC_DOT), _______, _______,
|
||||
_______, _______, _______, _______, _______,
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______
|
||||
),
|
||||
|
||||
/* layer 3: numberpad
|
||||
*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | | | | | | | | | | | ( | ) | / | * | |
|
||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||
* | | | | | | | | | | | 7 | 8 | 9 | - | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | | | | | | |------| |------| | 4 | 5 | 6 | + | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | | | | | | | | | | | 1 | 2 | 3 | = | |
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | | | | | | | 0 | . | , | ENTER| |
|
||||
* `------------------------------------' `------------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | | | | | |
|
||||
* ,------|------|------| |------+------+------.
|
||||
* | | | | | | | |
|
||||
* | | |------| |------| | |
|
||||
* | | | | | | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
[NUMP] = KEYMAP(
|
||||
// left hand
|
||||
_______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______,
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______,
|
||||
// right hand
|
||||
_______, _______, S(KC_9), S(KC_0), KC_PSLS, KC_PAST, _______,
|
||||
_______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, _______,
|
||||
_______, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, _______,
|
||||
_______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PEQL, _______,
|
||||
KC_KP_0, KC_KP_DOT, KC_PCMM, KC_PENT, _______,
|
||||
_______, _______,
|
||||
_______,
|
||||
_______, _______, _______
|
||||
),
|
||||
|
||||
/* layer 4 : functions and arrows
|
||||
* This layer is at the top so that the functions still work no matter what layers are active.
|
||||
*
|
||||
* ,--------------------------------------------------. ,--------------------------------------------------.
|
||||
* | ESCAPE | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | SYSREQ |
|
||||
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
|
||||
* | | | | UP | | | | | | | | | | | INSERT |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* |CAPSLOCK| | LEFT | DOWN |RIGHT | |------| |------| LEFT | DOWN | UP | RIGHT| | |
|
||||
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
|
||||
* | |M_PREV|M_STOP|M_PLPS|M_NEXT| | | | | | | | | PGUP | |
|
||||
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
|
||||
* | | | | | | | | | HOME | PGDN | END |
|
||||
* `------------------------------------' `------------------------------------'
|
||||
* ,-------------. ,-------------.
|
||||
* | | PAUSE| | | |
|
||||
* ,------|------|------| |------+------+------.
|
||||
* | | | | |SCRLK | | |
|
||||
* | | |------| |------| | |
|
||||
* | | | | | | | |
|
||||
* `--------------------' `--------------------'
|
||||
*/
|
||||
[ARRW] = KEYMAP(
|
||||
// left hand
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,
|
||||
_______, _______, _______, KC_UP, _______, _______, _______,
|
||||
KC_CAPS, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______,
|
||||
_______, KC_PAUSE,
|
||||
_______,
|
||||
_______, _______, _______,
|
||||
// right hand
|
||||
KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_SYSREQ,
|
||||
_______, _______, _______, _______, _______, _______, KC_INS,
|
||||
KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
|
||||
_______, _______, _______, _______, _______, KC_PGUP, _______,
|
||||
_______, _______, KC_HOME, KC_PGDN, KC_END,
|
||||
_______, _______,
|
||||
KC_SLCK,
|
||||
_______, _______, _______
|
||||
),
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
set_unicode_input_mode(UC_LNX); // Linux
|
||||
//set_unicode_input_mode(UC_OSX); // Mac OSX
|
||||
//set_unicode_input_mode(UC_WIN); // Windows (with registry key, see wiki)
|
||||
//set_unicode_input_mode(UC_WINC); // Windows (with WinCompose, see wiki)
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
|
||||
uint8_t layer = biton32(layer_state);
|
||||
|
||||
ergodox_board_led_off();
|
||||
ergodox_right_led_1_off();
|
||||
ergodox_right_led_2_off();
|
||||
ergodox_right_led_3_off();
|
||||
switch (layer) {
|
||||
case INTL:
|
||||
case INSF:
|
||||
ergodox_right_led_1_on();
|
||||
break;
|
||||
case NUMP:
|
||||
ergodox_right_led_2_on();
|
||||
break;
|
||||
case ARRW:
|
||||
ergodox_right_led_3_on();
|
||||
break;
|
||||
default:
|
||||
// none
|
||||
break;
|
||||
}
|
||||
|
||||
};
|
@@ -48,6 +48,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/* number of backlight levels */
|
||||
#define BACKLIGHT_LEVELS 3
|
||||
#define BACKLIGHT_BREATHING
|
||||
|
||||
/* Set 0 if debouncing isn't needed */
|
||||
#define DEBOUNCING_DELAY 5
|
||||
|
@@ -37,6 +37,14 @@ enum planck_keycodes {
|
||||
#define _______ KC_TRNS
|
||||
#define XXXXXXX KC_NO
|
||||
|
||||
#define MACRO_BREATH_TOGGLE 21
|
||||
#define MACRO_BREATH_SPEED_INC 23
|
||||
#define MACRO_BREATH_SPEED_DEC 24
|
||||
#define MACRO_BREATH_DEFAULT 25
|
||||
#define M_BRTOG M(MACRO_BREATH_TOGGLE)
|
||||
#define M_BRINC M(MACRO_BREATH_SPEED_INC)
|
||||
#define M_BRDEC M(MACRO_BREATH_SPEED_DEC)
|
||||
#define M_BRDFT M(MACRO_BREATH_DEFAULT)
|
||||
// Tap Dance Declarations
|
||||
enum {
|
||||
ESC_CAP = 0,
|
||||
@@ -173,10 +181,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
* `-----------------------------------------------------------------------------------'
|
||||
*/
|
||||
[_ADJUST] = {
|
||||
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
|
||||
{_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
|
||||
{_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______},
|
||||
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_INS, C_A_DEL}
|
||||
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, M_BRDFT, KC_DEL },
|
||||
{_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, M_BRINC, _______},
|
||||
{_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, M_BRDEC, C_A_INS},
|
||||
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_BRTOG, C_A_DEL}
|
||||
}
|
||||
|
||||
|
||||
@@ -210,6 +218,32 @@ void persistant_default_layer_set(uint16_t default_layer) {
|
||||
default_layer_set(default_layer);
|
||||
}
|
||||
|
||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
|
||||
switch(id) {
|
||||
case MACRO_BREATH_TOGGLE:
|
||||
if (record->event.pressed) {
|
||||
breathing_toggle();
|
||||
}
|
||||
break;
|
||||
case MACRO_BREATH_SPEED_INC:
|
||||
if (record->event.pressed) {
|
||||
breathing_speed_inc(1);
|
||||
}
|
||||
break;
|
||||
case MACRO_BREATH_SPEED_DEC:
|
||||
if (record->event.pressed) {
|
||||
breathing_speed_dec(1);
|
||||
}
|
||||
break;
|
||||
case MACRO_BREATH_DEFAULT:
|
||||
if (record->event.pressed) {
|
||||
breathing_defaults();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return MACRO_NONE;
|
||||
}
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
switch (keycode) {
|
||||
case QWERTY:
|
||||
|
@@ -5,8 +5,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base Layer
|
||||
KEYMAP(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
|
||||
KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, F(0), KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
|
Reference in New Issue
Block a user