jlj-qmk/users/drashna
Drashna Jaelre a2cec0594b [Keymap] Update to Drashna Keymaps (#5594)
* Start to standardize macro timer

* Update Fractal layout

Specifically, limit the RGB Lighting, since it's too many for the power, and only have the KITT annimation on the front

* Update Iris keymap to use I2C for transport

* Remove TAP_CODE_DELAY from keyboard in favor of global setting

* Remove Woodpad

Since it\'s no longer in my possession

* Only enable LTO on AVR boards

* Run matrix_scans while doing startup light

* Run matrix_scan to get split keyboard code synced properly

* Fix rgb mode

* Remove custom debouncing settings

* Make RGB Light Startup Animation optional

* Fix opt def

* Remove extra tap code delay value

* Fix references to keebio boards

* Add support for LP Iris keyboard

* Add backlight code

* Make startup animation optional

* Update gitlab ci script

* Remove port declaration

* Revert avrgcc changes to gitlab ci file

* Don't re-set mods

* Remove MACRO_TIMER define

* Add custom name for crkbd

* Add name for Prime M pad

* Add names for ortho 4x12 boards

* Add some additional handling for rgb init

* Change thumb clusters on ergodox

* Switch Orthodox to I2C

* Fix Space in ergodox keymap

* Use OSL for ergodox layout

* Ugh, can't find a good layout

* Fix typo

* Fix up animation startup

* Cries in AVR

* Fix makefiles for ergodox ez boards

* Add support for "secret songs" in my userspace

* Reset debounce to 5ms for Ergodox EZ

* Fix gitlab CI yaml file

* More crying in AVR

* Cannot use rgb light and rgb matrix at the same time due to the WS2812 rgb matrix PR until the "Coexistance" PR is merged

* Update ODox for split common and i2c

* Add split config

* Impement Split code

* Add support for xscorpion OLED code

* Add OLED display config

* Fix OLED screen font

* Get OLED set up in vertical mode

* Remove old OLED code

* add per key support for crkbd

* Fix split changes

* RGB Tweeaks

* More OLED tweaks

* Fix rotation stuff

* Fix more OLED stuff

* Remove custom Debounce from Ergodox layout since it's no longer needed
2019-04-22 11:55:55 -07:00
..
.gitignore
.gitlab-ci.yml
config.h
drashna.c
drashna.h
process_records.c
process_records.h
readme.md
rgb_stuff.c
rgb_stuff.h
rules.mk
send_unicode.h
tap_dances.c
tap_dances.h
template.c
template.h
wrappers.h

Overview

This is my personal userspace file. Most of my code exists here, as it's heavily shared.

Custom userspace handlers

Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization.

matrix_scan calls matrix_scan_quantum, which alls matrix_scan_kb, which calls matrix_scan_user. process_record calls a bunch of stuff, but eventually calls process_record_kb which calls process_record_user The same goes for matrix_init, layer_state_set, led_set, and a few other functions.

All (most) _user functions are handled here instead. To allow keyboard specific configuration, I've created _keymap functions that can be called by the keymap.c files instead.

This allows for keyboard specific configuration while maintaining the ability to customize the board.

My Ergodox EZ Keymap is a good example of this, as it uses the LEDs as modifier indicators.

Keyboard Layout Templates

This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once.

This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once.

The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance:

#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)

Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine.

Credit goes to @jola5 for first implementing this awesome idea.

Custom Keycodes

Keycodes are defined in the drashna.h file and need to be included in the keymap.c files, so that they can be used there.

A bunch of macros are present and are only included on boards that are not the Ergodox EZ or Orthodox, as they are not needed for those boards.

Included is a custom macro for compiling my keyboards. This includes the bootloader target (:teensy, :avrdude, or :dfu), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file).

This also includes a modified RESET keycode as well, that sets the underglow to red.

Layer Indication

This uses the layer_state_set_* command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well.

Since this is done via userspace, it is the same between all systems.

Additionally, there is a custom keycode to toggle layer indication. And all RGB keycodes disable layer indication by default, as well. This way, I can leave special effects doing when I want.

Also. I use rgblight_sethsv since it works with animation modes (that support it).

Diablo Layer

This layer has some special handling.

When Tap Dances are enabled, this layer has the ability to "spam" keypresses.

For instance, tapping the TD "1" twice causes the layer to hit "1" ever 1 second (appoximately). This is useful for auto-hotkeying skills (such as bone armor or devour).

Tappind once disables this, and switching layers temporarily disables this, until you switch back to the layer.

For critics that think this is cheating, search "diablo 3 num lock auto cast". This is just a simpler method, since I no longer own a normal (non QMK) numpad.

Secret Macros

With help from gitter and Colinta, this adds the ability to add hidden macros from other users.

First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open .git/info/exclude and add secrets.c and secrets.h to that file, below the comments.

And this requires KC_SECRET_1 through KC_SECRET_5 to be defined in your <name>.h file to define the keycodes for the new macros.

.git/info/exclude

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
/users/drashna/secrets.c
/users/drashna/secrets.h

Then you can create these files:

secrets.c

#include "drashna.h"  // replace with your keymap's "h" file, or whatever file stores the keycodes

#if (__has_include("secrets.h") && !defined(NO_SECRETS))
#include "secrets.h"
#else
// `PROGMEM const char secret[][x]` may work better, but it takes up more space in the firmware
// And I'm not familiar enough to know which is better or why...
static const char * const secret[] = {
  "test1",
  "test2",
  "test3",
  "test4",
  "test5"
};
#endif

bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case KC_SECRET_1 ... KC_SECRET_5: // Secrets!  Externally defined strings, not stored in repo
      if (!record->event.pressed) {
        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
        send_string_with_delay(secret[keycode - KC_SECRET_1], MACRO_TIMER);
      }
      return false;
      break;
  }
  return true;
}

secrets.h

static const char * const secrets[] = {
  "secret1",
  "secret2",
  "secret3",
  "secret4",
  "secret5"
};

Replacing the strings with the codes that you need.

name.c

In the <name>.c file, you will want to add this to the top:

__attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
  return true;
}

This is so that the function can be called here, and replaced in the secrets.c file, and so it won't error out if it doesn't exist.

And then, in the process_record_user function, assuming you have return process_record_keymap(keycode, record) here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the return true; with return process_record_secrets(keycode, record);

  return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
}

rules.mk

Here, you want your /users/<name>/rules.mk file to "detect" the existence of the secrets.c file, and only add it if the file exists. To do so, add this block:

ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
  SRC += secrets.c
endif

Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your /users/<name>/rules.mk, so that it catches the flag:

ifeq ($(strip $(NO_SECRETS)), yes)
    OPT_DEFS += -DNO_SECRETS
endif

Then, if you run make keyboard:name NO_SECRETS=yes, it will default to the test strings in your <name>.c file, rather than reading from your file.

Pro Micro Hacking

Well, you can get the QMK DFU bootloader working on the ProMicro. But you need to change fuses.

What worked to get into the firmware properly was:

Low: 0x5E High: 0xD9 Extended: 0xC3 Lock: 0x3F

The reason that there was some issues before, is that JTAG was still enabled, and using some of the pins that the keyboard uses. Disabling JTAG (either by fuse, or modifying the matrix code for splits fixes the issue).

And for reference, if you want to go back to caterina, the default fuse settings I believe were:

Low: 0xFF High: 0xD8 Extended: 0xC3 Lock: 0x3F