ergodox
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
ergodox [2019/04/10 18:17] – simon | ergodox [2020/10/18 14:51] – [Octobre 2020] simon | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Ergodox ====== | ====== Ergodox ====== | ||
+ | {{tag> | ||
+ | |||
{{ : | {{ : | ||
(D' | (D' | ||
===== Flasher le firmware ===== | ===== Flasher le firmware ===== | ||
+ | |||
+ | ==== Prérequis ==== | ||
+ | Il faut installer : | ||
+ | |||
+ | <code bash> | ||
+ | $ sudo apt install gcc-avr | ||
+ | </ | ||
+ | |||
+ | ==== Avec TMK === | ||
+ | |||
J'ai tout d' | J'ai tout d' | ||
Ligne 68: | Ligne 80: | ||
{{ :: | {{ :: | ||
</ | </ | ||
+ | |||
+ | ==== Avec QMK ==== | ||
Ensuite, j'ai essayé avec le firmware [[https:// | Ensuite, j'ai essayé avec le firmware [[https:// | ||
Ligne 169: | Ligne 183: | ||
-rwxr-xr-x | -rwxr-xr-x | ||
-rwxr-xr-x | -rwxr-xr-x | ||
+ | </ | ||
+ | Keymap WIP ( 10/04/2019 ) : | ||
+ | < | ||
+ | < | ||
+ | // An Ergodox EZ keymap meant to be used with a bépo layout (FR ergonomic | ||
+ | // layout, dvorak style). The overall design is slightly inspired by the | ||
+ | // TypeMatrix keyboard. Switching between a TypeMatrix and an Ergodox with this | ||
+ | // layout should be relatively easy. | ||
+ | // | ||
+ | // See the README.md file for an image of this keymap. | ||
+ | |||
+ | #include QMK_KEYBOARD_H | ||
+ | #include " | ||
+ | |||
+ | // The layers that we are defining for this keyboards. | ||
+ | #define BASE 0 | ||
+ | #define FN 1 | ||
+ | #define MOUSE 2 | ||
+ | #define NUMS 3 | ||
+ | #define SWAP 4 | ||
+ | #define SYSLEDS 5 | ||
+ | |||
+ | // The Tap Dance identifiers, | ||
+ | #define TAP_MACRO 0 | ||
+ | |||
+ | // A ' | ||
+ | #define ___ KC_TRANSPARENT | ||
+ | |||
+ | // A ' | ||
+ | #define XXX KC_NO | ||
+ | |||
+ | // Some combined keys (one normal keycode when tapped and one modifier or layer | ||
+ | // toggle when held). | ||
+ | #define ESC_FN | ||
+ | #define M_RSFT | ||
+ | #define W_RCTL | ||
+ | #define SPC_RALT | ||
+ | #define PERC_FN | ||
+ | |||
+ | // The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators). | ||
+ | #define MK_CUT | ||
+ | #define MK_COPY | ||
+ | #define MK_PASTE | ||
+ | |||
+ | // Custom keycodes | ||
+ | enum { | ||
+ | // SAFE_RANGE must be used to tag the first element of the enum. | ||
+ | // DYNAMIC_MACRO_RANGE must always be the last element of the enum if other | ||
+ | // values are added (as its value is used to create a couple of other keycodes | ||
+ | // after it). | ||
+ | DYNAMIC_MACRO_RANGE = SAFE_RANGE, | ||
+ | }; | ||
+ | |||
+ | // This file must be included after DYNAMIC_MACRO_RANGE is defined... | ||
+ | #include " | ||
+ | |||
+ | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
+ | /* Keymap 0: Basic layer | ||
+ | * | ||
+ | * , | ||
+ | * | | " | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | TAB | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | SHIFT | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | CTRL | | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [BASE] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, BP_DQOT, BP_LGIL, | ||
+ | KC_TAB, | ||
+ | KC_LSFT, | ||
+ | KC_LCTRL, BP_ECRC, BP_A_GRAVE, BP_Y, BP_X, BP_DOT, | ||
+ | ESC_FN, | ||
+ | | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | BP_PLUS, BP_MINS, BP_SLSH, | ||
+ | BP_V, BP_D, BP_L, | ||
+ | | ||
+ | BP_T, BP_Q, BP_G, | ||
+ | KC_LEFT, | ||
+ | ___, S(KC_SLASH), | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | /* Keymap 1: Symbol Layer | ||
+ | * | ||
+ | * , | ||
+ | * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | | ||
+ | * |--------+------+------+------+------+------+------| | ||
+ | * | | | | | | | | | | Up | HOME | UP | END | PGUP | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | LSFT |------| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | CUT | COPY | PASTE| LCTRL| | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [FN] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, MK_CUT, MK_COPY, MK_PASTE, KC_LCTRL, | ||
+ | ___, | ||
+ | ___, KC_VOLU, | ||
+ | KC_VOLD, | ||
+ | | ||
+ | /* right hand */ | ||
+ | KC_F7, KC_F8, | ||
+ | ___, ___, KC_HOME, | ||
+ | ___, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, | ||
+ | ___, | ||
+ | ___, | ||
+ | KC_HOME, KC_END, | ||
+ | KC_PGUP, | ||
+ | KC_PGDN, ___, ___), | ||
+ | // Note that any change to the FN layer above must be added to | ||
+ | // the MOUSE layer below (except for the arrow keys). | ||
+ | |||
+ | /* Keymap 2: Media and mouse keys | ||
+ | * | ||
+ | * , | ||
+ | * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | | | | MsUp | | | | | | | | | | | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | |MsLeft|MsDown|MsRght| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | | | | | | | | | | | | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [MOUSE] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | /* Keymap 3: Numeric keypad and system keys. | ||
+ | * | ||
+ | * , | ||
+ | * |PrScreen|INSERT| PAUSE| | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | | | | | | | | | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | |------| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | CUT | COPY | PASTE| | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [NUMS] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | KC_PSCR, KC_INS, KC_PAUS, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | | ||
+ | | ||
+ | KC_PCMM, KC_P4, KC_P5, KC_P6, | ||
+ | | ||
+ | | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | // Layer 4: hand swap, all keys are mirrored to the other side of the keyboard | ||
+ | // except for the layer toggle itself (so there is no right arrow when this | ||
+ | // layer is activated). | ||
+ | [SWAP] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | ___, TT(SWAP), | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | // Layer 5: The LEDs are showing the " | ||
+ | // instead of their default which shows the currently active layers (FN, NUMS, | ||
+ | // and MOUSE in that order). | ||
+ | [SYSLEDS] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, TT(SYSLEDS), | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | }; | ||
+ | |||
+ | // Whether the macro 1 is currently being recorded. | ||
+ | static bool is_macro1_recording = false; | ||
+ | |||
+ | // The current set of active layers (as a bitmask). | ||
+ | // There is a global ' | ||
+ | // to layer_state_set_user(). | ||
+ | static uint32_t current_layer_state = 0; | ||
+ | uint32_t layer_state_set_user(uint32_t state); | ||
+ | |||
+ | // Method called at the end of the tap dance on the TAP_MACRO key. That key is | ||
+ | // used to start recording a macro (double tap or more), to stop recording (any | ||
+ | // number of tap), or to play the recorded macro (1 tap). | ||
+ | void macro_tapdance_fn(qk_tap_dance_state_t *state, void *user_data) { | ||
+ | uint16_t keycode; | ||
+ | keyrecord_t record; | ||
+ | dprintf(" | ||
+ | if (is_macro1_recording) { | ||
+ | keycode = DYN_REC_STOP; | ||
+ | is_macro1_recording = false; | ||
+ | layer_state_set_user(current_layer_state); | ||
+ | } else if (state-> | ||
+ | keycode = DYN_MACRO_PLAY1; | ||
+ | } else { | ||
+ | keycode = DYN_REC_START1; | ||
+ | is_macro1_recording = true; | ||
+ | layer_state_set_user(current_layer_state); | ||
+ | } | ||
+ | |||
+ | record.event.pressed = true; | ||
+ | process_record_dynamic_macro(keycode, | ||
+ | record.event.pressed = false; | ||
+ | process_record_dynamic_macro(keycode, | ||
+ | } | ||
+ | |||
+ | // The definition of the tap dance actions: | ||
+ | qk_tap_dance_action_t tap_dance_actions[] = { | ||
+ | // This Tap dance plays the macro 1 on TAP and records it on double tap. | ||
+ | [TAP_MACRO] = ACTION_TAP_DANCE_FN(macro_tapdance_fn), | ||
+ | }; | ||
+ | |||
+ | // Runs for each key down or up event. | ||
+ | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
+ | if (keycode != TD(TAP_MACRO)) { | ||
+ | // That key is processed by the macro_tapdance_fn. Not ignoring it here is | ||
+ | // mostly a no-op except that it is recorded in the macros (and uses space). | ||
+ | // We can't just return false when the key is a tap dance, because | ||
+ | // process_record_user, | ||
+ | // returning false would eat the tap dance). | ||
+ | if (!process_record_dynamic_macro(keycode, | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return true; // Let QMK send the enter press/ | ||
+ | } | ||
+ | |||
+ | // Runs just one time when the keyboard initializes. | ||
+ | void matrix_init_user(void) { | ||
+ | ergodox_right_led_1_off(); | ||
+ | ergodox_right_led_2_off(); | ||
+ | ergodox_right_led_3_off(); | ||
+ | }; | ||
+ | |||
+ | // Runs constantly in the background, in a loop. | ||
+ | void matrix_scan_user(void) { | ||
+ | |||
+ | }; | ||
+ | |||
+ | // The state of the LEDs requested by the system, as a bitmask. | ||
+ | static uint8_t sys_led_state = 0; | ||
+ | |||
+ | // Use these masks to read the system LEDs state. | ||
+ | static const uint8_t sys_led_mask_num_lock = 1 << USB_LED_NUM_LOCK; | ||
+ | static const uint8_t sys_led_mask_caps_lock = 1 << USB_LED_CAPS_LOCK; | ||
+ | static const uint8_t sys_led_mask_scroll_lock = 1 << USB_LED_SCROLL_LOCK; | ||
+ | |||
+ | // Value to use to switch LEDs on. The default value of 255 is far too bright. | ||
+ | static const uint8_t max_led_value = 20; | ||
+ | |||
+ | // Whether the given layer (one of the constant defined at the top) is active. | ||
+ | #define LAYER_ON(layer) (current_layer_state & (1<< | ||
+ | |||
+ | void led_1_on(void) { | ||
+ | ergodox_right_led_1_on(); | ||
+ | ergodox_right_led_1_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_2_on(void) { | ||
+ | ergodox_right_led_2_on(); | ||
+ | ergodox_right_led_2_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_3_on(void) { | ||
+ | ergodox_right_led_3_on(); | ||
+ | ergodox_right_led_3_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_1_off(void) { | ||
+ | ergodox_right_led_1_off(); | ||
+ | } | ||
+ | |||
+ | void led_2_off(void) { | ||
+ | ergodox_right_led_2_off(); | ||
+ | } | ||
+ | |||
+ | void led_3_off(void) { | ||
+ | ergodox_right_led_3_off(); | ||
+ | } | ||
+ | |||
+ | // Called when the computer wants to change the state of the keyboard LEDs. | ||
+ | void led_set_user(uint8_t usb_led) { | ||
+ | sys_led_state = usb_led; | ||
+ | if (LAYER_ON(SYSLEDS)) { | ||
+ | if (sys_led_state & sys_led_mask_caps_lock) { | ||
+ | led_1_on(); | ||
+ | } else { | ||
+ | led_1_off(); | ||
+ | } | ||
+ | if (sys_led_state & sys_led_mask_num_lock) { | ||
+ | led_2_on(); | ||
+ | } else { | ||
+ | led_2_off(); | ||
+ | } | ||
+ | if (sys_led_state & sys_led_mask_scroll_lock) { | ||
+ | led_3_on(); | ||
+ | } else { | ||
+ | led_3_off(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | uint32_t layer_state_set_user(uint32_t state) { | ||
+ | current_layer_state = state; | ||
+ | swap_hands = LAYER_ON(SWAP); | ||
+ | |||
+ | if (is_macro1_recording) { | ||
+ | led_1_on(); | ||
+ | led_2_on(); | ||
+ | led_3_on(); | ||
+ | return state; | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(SYSLEDS)) { | ||
+ | led_set_user(sys_led_state); | ||
+ | return state; | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(FN)) { | ||
+ | led_1_on(); | ||
+ | } else { | ||
+ | led_1_off(); | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(NUMS)) { | ||
+ | led_2_on(); | ||
+ | } else { | ||
+ | led_2_off(); | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(MOUSE)) { | ||
+ | led_3_on(); | ||
+ | } else { | ||
+ | led_3_off(); | ||
+ | } | ||
+ | |||
+ | return state; | ||
+ | }; | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Keymap WIP2 (12/ | ||
+ | < | ||
+ | < | ||
+ | // An Ergodox EZ keymap meant to be used with a bépo layout (FR ergonomic | ||
+ | // layout, dvorak style). The overall design is slightly inspired by the | ||
+ | // TypeMatrix keyboard. Switching between a TypeMatrix and an Ergodox with this | ||
+ | // layout should be relatively easy. | ||
+ | // | ||
+ | // See the README.md file for an image of this keymap. | ||
+ | |||
+ | #include QMK_KEYBOARD_H | ||
+ | #include " | ||
+ | |||
+ | // The layers that we are defining for this keyboards. | ||
+ | #define BASE 0 | ||
+ | #define FN 1 | ||
+ | #define MOUSE 2 | ||
+ | #define NUMS 3 | ||
+ | #define SWAP 4 | ||
+ | #define SYSLEDS 5 | ||
+ | |||
+ | // The Tap Dance identifiers, | ||
+ | #define TAP_MACRO 0 | ||
+ | |||
+ | // A ' | ||
+ | #define ___ KC_TRANSPARENT | ||
+ | |||
+ | // A ' | ||
+ | #define XXX KC_NO | ||
+ | |||
+ | // Some combined keys (one normal keycode when tapped and one modifier or layer | ||
+ | // toggle when held). | ||
+ | #define ESC_FN | ||
+ | #define M_RSFT | ||
+ | #define W_RCTL | ||
+ | #define SPC_RALT | ||
+ | #define PERC_FN | ||
+ | |||
+ | // The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators). | ||
+ | #define MK_CUT | ||
+ | #define MK_COPY | ||
+ | #define MK_PASTE | ||
+ | |||
+ | // Custom keycodes | ||
+ | enum { | ||
+ | // SAFE_RANGE must be used to tag the first element of the enum. | ||
+ | // DYNAMIC_MACRO_RANGE must always be the last element of the enum if other | ||
+ | // values are added (as its value is used to create a couple of other keycodes | ||
+ | // after it). | ||
+ | DYNAMIC_MACRO_RANGE = SAFE_RANGE, | ||
+ | }; | ||
+ | |||
+ | // This file must be included after DYNAMIC_MACRO_RANGE is defined... | ||
+ | #include " | ||
+ | |||
+ | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
+ | /* Keymap 0: Basic layer | ||
+ | * | ||
+ | * , | ||
+ | * | | " | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | TAB | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | SHIFT | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | CTRL | | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [BASE] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, BP_DQOT, BP_LGIL, | ||
+ | KC_TAB, | ||
+ | KC_LSFT, | ||
+ | KC_LCTRL, BP_ECRC, BP_A_GRAVE, BP_Y, BP_X, BP_DOT, | ||
+ | ESC_FN, | ||
+ | | ||
+ | KC_LALT, | ||
+ | BP_NBSP, KC_ENT, | ||
+ | /* right hand */ | ||
+ | BP_PLUS, BP_MINS, BP_SLSH, | ||
+ | BP_V, BP_D, BP_L, | ||
+ | | ||
+ | BP_T, BP_Q, BP_G, | ||
+ | KC_LEFT, | ||
+ | KC_BSPC, | ||
+ | KC_ALGR, | ||
+ | TT(MOUSE), KC_ENT, | ||
+ | |||
+ | /* Keymap 1: Symbol Layer | ||
+ | * | ||
+ | * , | ||
+ | * | | F1 | F2 | F3 | F4 | F5 | F6 | C | F7 | F8 | F9 | F10 | F11 | F12 | | | ||
+ | * |--------+------+------+------+------+------+------| | ||
+ | * | | | | | | | | | | Up | HOME | UP | END | PGUP | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | LSFT |------| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | CUT | COPY | PASTE| LCTRL| | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [FN] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, MK_CUT, MK_COPY, MK_PASTE, KC_LCTRL, | ||
+ | ___, | ||
+ | ___, KC_VOLU, | ||
+ | KC_VOLD, | ||
+ | | ||
+ | /* right hand */ | ||
+ | KC_F7, KC_F8, | ||
+ | ___, ___, KC_HOME, | ||
+ | ___, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, | ||
+ | ___, | ||
+ | ___, | ||
+ | KC_HOME, KC_END, | ||
+ | KC_PGUP, | ||
+ | KC_PGDN, ___, ___), | ||
+ | // Note that any change to the FN layer above must be added to | ||
+ | // the MOUSE layer below (except for the arrow keys). | ||
+ | |||
+ | /* Keymap 2: Media and mouse keys | ||
+ | * | ||
+ | * , | ||
+ | * | | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | | | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | | | | MsUp | | | | | | | | | | | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | |MsLeft|MsDown|MsRght| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | | | | | | | | | | | | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [MOUSE] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | /* Keymap 3: Numeric keypad and system keys. | ||
+ | * | ||
+ | * , | ||
+ | * |PrScreen|INSERT| PAUSE| | ||
+ | * |--------+------+------+------+------+-------------| | ||
+ | * | | | | | | | | | | | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | | | | |------| | ||
+ | * |--------+------+------+------+------+------| | ||
+ | * | | | CUT | COPY | PASTE| | ||
+ | * `--------+------+------+------+------+-------------' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | */ | ||
+ | [NUMS] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | KC_PSCR, KC_INS, KC_PAUS, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | | ||
+ | | ||
+ | KC_PCMM, KC_P4, KC_P5, KC_P6, | ||
+ | | ||
+ | | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | // Layer 4: hand swap, all keys are mirrored to the other side of the keyboard | ||
+ | // except for the layer toggle itself (so there is no right arrow when this | ||
+ | // layer is activated). | ||
+ | [SWAP] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | ___, TT(SWAP), | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | |||
+ | // Layer 5: The LEDs are showing the " | ||
+ | // instead of their default which shows the currently active layers (FN, NUMS, | ||
+ | // and MOUSE in that order). | ||
+ | [SYSLEDS] = LAYOUT_ergodox( | ||
+ | /* left hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___, | ||
+ | /* right hand */ | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, ___, ___, ___, ___, ___, | ||
+ | ___, ___, TT(SYSLEDS), | ||
+ | ___, ___, | ||
+ | ___, | ||
+ | ___, ___, ___), | ||
+ | }; | ||
+ | |||
+ | // Whether the macro 1 is currently being recorded. | ||
+ | static bool is_macro1_recording = false; | ||
+ | |||
+ | // The current set of active layers (as a bitmask). | ||
+ | // There is a global ' | ||
+ | // to layer_state_set_user(). | ||
+ | static uint32_t current_layer_state = 0; | ||
+ | uint32_t layer_state_set_user(uint32_t state); | ||
+ | |||
+ | // Method called at the end of the tap dance on the TAP_MACRO key. That key is | ||
+ | // used to start recording a macro (double tap or more), to stop recording (any | ||
+ | // number of tap), or to play the recorded macro (1 tap). | ||
+ | void macro_tapdance_fn(qk_tap_dance_state_t *state, void *user_data) { | ||
+ | uint16_t keycode; | ||
+ | keyrecord_t record; | ||
+ | dprintf(" | ||
+ | if (is_macro1_recording) { | ||
+ | keycode = DYN_REC_STOP; | ||
+ | is_macro1_recording = false; | ||
+ | layer_state_set_user(current_layer_state); | ||
+ | } else if (state-> | ||
+ | keycode = DYN_MACRO_PLAY1; | ||
+ | } else { | ||
+ | keycode = DYN_REC_START1; | ||
+ | is_macro1_recording = true; | ||
+ | layer_state_set_user(current_layer_state); | ||
+ | } | ||
+ | |||
+ | record.event.pressed = true; | ||
+ | process_record_dynamic_macro(keycode, | ||
+ | record.event.pressed = false; | ||
+ | process_record_dynamic_macro(keycode, | ||
+ | } | ||
+ | |||
+ | // The definition of the tap dance actions: | ||
+ | qk_tap_dance_action_t tap_dance_actions[] = { | ||
+ | // This Tap dance plays the macro 1 on TAP and records it on double tap. | ||
+ | [TAP_MACRO] = ACTION_TAP_DANCE_FN(macro_tapdance_fn), | ||
+ | }; | ||
+ | |||
+ | // Runs for each key down or up event. | ||
+ | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
+ | if (keycode != TD(TAP_MACRO)) { | ||
+ | // That key is processed by the macro_tapdance_fn. Not ignoring it here is | ||
+ | // mostly a no-op except that it is recorded in the macros (and uses space). | ||
+ | // We can't just return false when the key is a tap dance, because | ||
+ | // process_record_user, | ||
+ | // returning false would eat the tap dance). | ||
+ | if (!process_record_dynamic_macro(keycode, | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return true; // Let QMK send the enter press/ | ||
+ | } | ||
+ | |||
+ | // Runs just one time when the keyboard initializes. | ||
+ | void matrix_init_user(void) { | ||
+ | ergodox_right_led_1_off(); | ||
+ | ergodox_right_led_2_off(); | ||
+ | ergodox_right_led_3_off(); | ||
+ | }; | ||
+ | |||
+ | // Runs constantly in the background, in a loop. | ||
+ | void matrix_scan_user(void) { | ||
+ | |||
+ | }; | ||
+ | |||
+ | // The state of the LEDs requested by the system, as a bitmask. | ||
+ | static uint8_t sys_led_state = 0; | ||
+ | |||
+ | // Use these masks to read the system LEDs state. | ||
+ | static const uint8_t sys_led_mask_num_lock = 1 << USB_LED_NUM_LOCK; | ||
+ | static const uint8_t sys_led_mask_caps_lock = 1 << USB_LED_CAPS_LOCK; | ||
+ | static const uint8_t sys_led_mask_scroll_lock = 1 << USB_LED_SCROLL_LOCK; | ||
+ | |||
+ | // Value to use to switch LEDs on. The default value of 255 is far too bright. | ||
+ | static const uint8_t max_led_value = 20; | ||
+ | |||
+ | // Whether the given layer (one of the constant defined at the top) is active. | ||
+ | #define LAYER_ON(layer) (current_layer_state & (1<< | ||
+ | |||
+ | void led_1_on(void) { | ||
+ | ergodox_right_led_1_on(); | ||
+ | ergodox_right_led_1_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_2_on(void) { | ||
+ | ergodox_right_led_2_on(); | ||
+ | ergodox_right_led_2_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_3_on(void) { | ||
+ | ergodox_right_led_3_on(); | ||
+ | ergodox_right_led_3_set(max_led_value); | ||
+ | } | ||
+ | |||
+ | void led_1_off(void) { | ||
+ | ergodox_right_led_1_off(); | ||
+ | } | ||
+ | |||
+ | void led_2_off(void) { | ||
+ | ergodox_right_led_2_off(); | ||
+ | } | ||
+ | |||
+ | void led_3_off(void) { | ||
+ | ergodox_right_led_3_off(); | ||
+ | } | ||
+ | |||
+ | // Called when the computer wants to change the state of the keyboard LEDs. | ||
+ | void led_set_user(uint8_t usb_led) { | ||
+ | sys_led_state = usb_led; | ||
+ | if (LAYER_ON(SYSLEDS)) { | ||
+ | if (sys_led_state & sys_led_mask_caps_lock) { | ||
+ | led_1_on(); | ||
+ | } else { | ||
+ | led_1_off(); | ||
+ | } | ||
+ | if (sys_led_state & sys_led_mask_num_lock) { | ||
+ | led_2_on(); | ||
+ | } else { | ||
+ | led_2_off(); | ||
+ | } | ||
+ | if (sys_led_state & sys_led_mask_scroll_lock) { | ||
+ | led_3_on(); | ||
+ | } else { | ||
+ | led_3_off(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | uint32_t layer_state_set_user(uint32_t state) { | ||
+ | current_layer_state = state; | ||
+ | swap_hands = LAYER_ON(SWAP); | ||
+ | |||
+ | if (is_macro1_recording) { | ||
+ | led_1_on(); | ||
+ | led_2_on(); | ||
+ | led_3_on(); | ||
+ | return state; | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(SYSLEDS)) { | ||
+ | led_set_user(sys_led_state); | ||
+ | return state; | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(FN)) { | ||
+ | led_1_on(); | ||
+ | } else { | ||
+ | led_1_off(); | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(NUMS)) { | ||
+ | led_2_on(); | ||
+ | } else { | ||
+ | led_2_off(); | ||
+ | } | ||
+ | |||
+ | if (LAYER_ON(MOUSE)) { | ||
+ | led_3_on(); | ||
+ | } else { | ||
+ | led_3_off(); | ||
+ | } | ||
+ | |||
+ | return state; | ||
+ | }; | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | simon@deb: | ||
+ | </ | ||
+ | < | ||
+ | <code bash> | ||
+ | QMK Firmware 0.6.328 | ||
+ | Making ergodox_ez with keymap bepo_simon and target all | ||
+ | |||
+ | avr-gcc (GCC) 5.4.0 | ||
+ | Copyright (C) 2015 Free Software Foundation, Inc. | ||
+ | This is free software; see the source for copying conditions. | ||
+ | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
+ | |||
+ | Compiling: keyboards/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: quantum/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Assembling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: tmk_core/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Compiling: lib/ | ||
+ | Linking: .build/ | ||
+ | Creating load file for flashing: .build/ | ||
+ | Copying ergodox_ez_bepo_simon.hex to qmk_firmware folder | ||
+ | Checking file size of ergodox_ez_bepo_simon.hex | ||
+ | * The firmware size is fine - 30706/32256 (1550 bytes free) | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | simon@deb: | ||
+ | Teensy Loader, Command Line, Version 2.1 | ||
+ | Read " | ||
+ | Waiting for Teensy device... | ||
+ | | ||
+ | Found HalfKay Bootloader | ||
+ | Read " | ||
+ | Programming................................................................................................................................................................................................................................................ | ||
+ | Booting | ||
+ | </ | ||
+ | |||
+ | ===== Octobre 2020 ===== | ||
+ | |||
+ | Il faut que je remette de l' | ||
+ | |||
+ | J'ai suivi la [[https:// | ||
+ | <code bash> | ||
+ | $ python3 -m pip install --user qmk | ||
+ | </ | ||
+ | |||
+ | J'ai copié [[https:// | ||
+ | <code bash> | ||
+ | $ sudo vim / | ||
+ | $ sudo udevadm control --reload-rules | ||
+ | $ sudo udevadm trigger | ||
+ | </ | ||
+ | |||
+ | J'ai fait le setup comme indiqué : | ||
+ | <code bash> | ||
+ | $ qmk setup | ||
+ | </ | ||
+ | Il installe toutes les dépendances, | ||
+ | |||
+ | J'ai créé une nouvelle keymap dans le dossier de l' | ||
+ | <code bash> | ||
+ | $ qmk new-keymap -kb ergodox_ez | ||
+ | Keymap Name: my-ergodox | ||
+ | Ψ my-ergodox keymap directory created in: / | ||
+ | Ψ Compile a firmware with your new keymap by typing: | ||
+ | |||
+ | qmk compile -kb ergodox_ez -km my-ergodox | ||
+ | </ | ||
+ | |||
+ | On peut modifier cette keymap : | ||
+ | <code bash> | ||
+ | $ vim ~/ | ||
+ | </ | ||
+ | |||
+ | Ensuite, on peut la compiler : | ||
+ | <code bash> | ||
+ | $ qmk compile -kb ergodox_ez -km my-ergodox | ||
+ | </ | ||
+ | |||
+ | Enfin, on peut l' | ||
+ | <code bash> | ||
+ | $ teensy_loader_cli --mcu=atmega32u4 -v -w ~/ | ||
+ | </ | ||
+ | **__État des lieux le 18/10/2020 :__** Toutes les touches fonctionnes mais je n'ai pas encore modifié la keymap créée par défaut... Il faut que j' |
ergodox.txt · Dernière modification : 2021/02/08 21:31 de simon