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 19:54] – [Configurer le layout] simon | ergodox [2020/10/19 12:50] – [Introduction] simon | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Ergodox ====== | ====== Ergodox ====== | ||
- | {{ : | + | {{tag> |
- | (D' | + | |
- | ===== Flasher le firmware | + | ===== Introduction |
- | J'ai tout d' | + | |
- | Pour mémoire: | + | Ça fait longtemps que j'ai le projet de me fabriquer et d' |
- | < | + | |
- | <code bash> | + | |
- | simon@deb: | + | |
- | </code> | + | |
- | < | + | |
- | <code bash> | + | |
- | Clonage dans ' | + | |
- | remote: Enumerating objects: 1, done. | + | |
- | remote: Counting objects: 100% (1/1), done. | + | |
- | remote: Total 17079 (delta 0), reused 0 (delta 0), pack-reused 17078 | + | |
- | Réception | + | |
- | Résolution des deltas: 100% (10038/10038), fait. | + | |
- | </code> | + | |
- | </ | + | |
- | <code bash> | + | |
- | simon@deb:~/Programmes$ cd tmk_keyboard/keyboard/ergodox/ | + | |
- | simon@deb:~/Programmes/ | + | |
- | </code> | + | |
- | < | + | |
- | <code bash> | + | |
- | simon@deb: | + | |
- | -------- begin -------- | + | Après avoir rêvé de tout reprendre de A à Z, de fabriquer le boitier en fibre de carbone et redessiner la carte électronique, |
- | 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. | + | |
- | (...) | + | {{ : |
+ | (D' | ||
+ | ===== Programmer le clavier ===== | ||
- | Creating load file for Flash: ergodox_lufa.hex | + | ==== Installation de QMK ==== |
- | avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature ergodox_lufa.elf ergodox_lufa.hex | + | |
- | Creating load file for EEPROM: ergodox_lufa.eep | + | Après avoir testé le [[https://github.com/ |
- | avr-objcopy -j .eeprom --set-section-flags=.eeprom=" | + | <code bash> |
- | --change-section-lma .eeprom=0 --no-change-warnings -O ihex ergodox_lufa.elf ergodox_lufa.eep || exit 0 | + | $ python3 |
+ | </ | ||
- | Creating Extended Listing: ergodox_lufa.lss | + | J'ai copié [[https://github.com/ |
- | avr-objdump | + | <code bash> |
+ | $ sudo vim / | ||
+ | $ sudo udevadm control | ||
+ | $ sudo udevadm trigger | ||
+ | </code> | ||
- | Creating Symbol Table: ergodox_lufa.sym | + | J'ai fait la configuration comme indiqué |
- | avr-nm -n ergodox_lufa.elf > ergodox_lufa.sym | + | |
- | + | ||
- | Size after: | + | |
- | | + | |
- | 23404 | + | |
- | </ | + | |
- | </ | + | |
- | Vérification du MCU (voir [[https:// | + | |
<code bash> | <code bash> | ||
- | simon@deb: | + | $ qmk setup |
- | # MCU name, you MUST set this to match the board you are using | + | |
- | MCU = atmega32u4 | + | |
- | #MCU = at90usb1286 | + | |
</ | </ | ||
+ | Il installe toutes les dépendances, | ||
- | {{ :: | + | ==== Créer une " |
- | {{ :: | + | |
- | {{ :: | + | |
- | </ | + | |
- | + | ||
- | Ensuite, j'ai essayé avec le firmware [[https:// | + | |
+ | J'ai créé une nouvelle keymap dans le dossier de l' | ||
<code bash> | <code bash> | ||
- | simon@deb: | + | $ qmk new-keymap -kb ergodox_ez |
+ | Keymap Name: my-ergodox | ||
+ | Ψ my-ergodox keymap directory created in: /home/simon/ | ||
+ | Ψ Compile a firmware with your new keymap by typing: | ||
- | simon@deb: | + | qmk compile -kb ergodox_ez -km my-ergodox |
+ | </code> | ||
- | simon@deb:~/ | + | On peut modifier cette keymap |
- | autocomplete.sh | + | <code bash> |
- | book.json | + | $ vim ~/ |
- | bootloader.mk | + | |
- | build_full_test.mk | + | |
- | build_keyboard.mk | + | |
- | build_layout.mk | + | |
- | build_test.mk | + | |
- | CODE_OF_CONDUCT.md | + | |
- | common_features.mk | + | |
- | + | ||
- | simon@deb: | + | |
- | total 980 | + | |
- | (...) | + | |
- | drwxr-xr-x | + | |
- | drwxr-xr-x | + | |
- | drwxr-xr-x | + | |
- | (...) | + | |
- | + | ||
- | simon@deb:~/git/ | + | |
- | total 84 | + | |
- | drwxr-xr-x | + | |
- | drwxr-xr-x 243 simon simon 4096 avr 10 19:49 .. | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | drwxr-xr-x | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | -rw-r--r-- | + | |
- | drwxr-xr-x | + | |
- | + | ||
- | simon@deb: | + | |
- | total 96 | + | |
- | (...) | + | |
- | drwxr-xr-x 2 simon simon 4096 avr 10 19:49 bdk | + | |
- | drwxr-xr-x | + | |
- | drwxr-xr-x | + | |
- | (...) | + | |
- | + | ||
- | simon@deb:~/git/ | + | |
- | + | ||
- | simon@deb: | + | |
- | QMK Firmware 0.6.328 | + | |
- | Making ergodox_ez with keymap | + | |
- | + | ||
- | 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. | + | |
- | + | ||
- | Size before: | + | |
- | | + | |
- | 0 30658 | + | |
- | + | ||
- | Compiling: tmk_core/ | + | |
- | Linking: .build/ | + | |
- | Creating load file for flashing: .build/ | + | |
- | Copying ergodox_ez_bepo_tm_style.hex to qmk_firmware folder | + | |
- | Checking file size of ergodox_ez_bepo_tm_style.hex | + | |
- | * The firmware size is fine - 30658/32256 (1598 bytes free) | + | |
</ | </ | ||
- | Le firmware ( ergodox_ez_bepo_tm_style.hex ) est dans le dossier courant. On peut l' | + | Ensuite, on peut la compiler |
<code bash> | <code bash> | ||
- | simon@deb: | + | $ qmk compile |
- | Teensy Loader, Command Line, Version 2.1 | + | |
- | Read " | + | |
- | Waiting for Teensy device... | + | |
- | | + | |
- | Found HalfKay Bootloader | + | |
- | Read " | + | |
- | Programming................................................................................................................................................................................................................................................ | + | |
- | Booting | + | |
</ | </ | ||
- | Maintenant qu'on a compris | + | ==== Envoyer |
- | ===== Configurer le layout ===== | + | Enfin, on peut l'envoyer sur le clavier avec [[informatique: |
- | On commence par faire une copie du layout bepo pour l'ergodox_ez | + | |
<code bash> | <code bash> | ||
- | simon@deb: | + | $ teensy_loader_cli |
- | + | ||
- | simon@deb:~/git/ | + | |
- | total 32 | + | |
- | drwxr-xr-x | + | |
- | drwxr-xr-x 25 simon simon 4096 avr 10 20:10 .. | + | |
- | -rwxr-xr-x | + | |
- | -rwxr-xr-x | + | |
- | -rwxr-xr-x | + | |
- | -rwxr-xr-x 1 simon simon 646 avr 10 20:10 rules.mk | + | |
</ | </ | ||
- | Keymap WIP ( 10/04/2019 ) : | + | **__État des lieux le 18/10/2020 :__** Toutes les touches fonctionnes mais je n'ai pas encore modifié la keymap |
- | < | + | |
- | < | + | |
- | // An Ergodox EZ keymap | + | |
- | // 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 | + | **__État des lieux le 19/10/2020 :__** J' |
- | #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; | ||
- | }; | ||
- | </ | ||
- | </ |
ergodox.txt · Dernière modification : 2021/02/08 21:31 de simon