Skip to content

Instantly share code, notes, and snippets.

@treeherder
Last active October 26, 2020 00:51
Show Gist options
  • Save treeherder/e4cbd19427f0d0b3a67f08cd0801eeef to your computer and use it in GitHub Desktop.
Save treeherder/e4cbd19427f0d0b3a67f08cd0801eeef to your computer and use it in GitHub Desktop.
QMK keymap configuration
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xABCD
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER treeherder
#define PRODUCT keyboard prototype
#define DESCRIPTION split ortholinear handwired keyboard
/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 6
/* key matrix pins */
#define MATRIX_ROW_PINS { D3, D2, D4, C6, D7 }
#define MATRIX_COL_PINS { E6, B4, B5, B6, B2, B3}
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* prevent stuck modifiers */
#define PREVENT_STUCK_MODIFIERS
#define SOFT_SERIAL_PIN D1
//#define
#define EE_HANDS
//#define MASTER_LEFT
#define SPLIT_USB_DETECT
#define SPLIT_USB_TIMEOUT 2000
#define SPLIT_USB_TIMEOUT_POLL 10
#define TAP_CODE_DELAY 10
#define UNICODE_SELECTED_MODES UC_LNX, UC_WINC
#endif
#include "diylily.h"
#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
#define _ADJUST 3
enum custom_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE,
ADJUST,
WOBBLE,
STRAFE,
MSUP,
MSDN,
CLEAR,
};
enum unicode_names {
runic_q,
runic_w,
runic_e,
runic_r,
runic_t,
runic_y,
runic_u,
runic_i,
runic_o,
runic_p,
runic_a,
runic_s,
runic_d,
runic_f,
runic_g,
runic_h,
runic_j,
runic_k,
runic_l,
runic_z,
runic_x,
runic_c,
runic_v,
runic_b,
runic_n,
runic_m,
};
const uint32_t PROGMEM unicode_map[] = {
[runic_q] = 0x16E9,
[runic_w] = 0x16A5,
[runic_e] = 0x16C2,
[runic_r] = 0x16B1,
[runic_t] = 0x16A6,
[runic_y] = 0x16A4,
[runic_u] = 0x16A2,
[runic_i] = 0x16C1,
[runic_o] = 0x16AE,
[runic_p] = 0x16C8,
[runic_a] = 0x16AA,
[runic_s] = 0x16CA,
[runic_d] = 0x16D1,
[runic_f] = 0x16A0,
[runic_g] = 0x16B5,
[runic_h] = 0x16BA,
//[runic_j] =
};
bool mouse_on;
bool spam_strafe;
bool do_wobble;
uint16_t spam_timer = false;
uint16_t spam_interval = 1000; // (1000ms == 1s)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_LCTL, KC_LALT, KC_SPC, KC_SPC, LM(_LOWER, MOD_LSFT), KC_SPC, KC_RCTL, TT(_LOWER)),
[_LOWER] = LAYOUT(
KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_CLCK, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_BSLS,
KC_END, KC_PGDN, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_EQL, KC_P4, KC_P5, KC_P6, KC_LBRC, KC_RBRC,
KC_INS, KC_LEFT, KC_DOWN, KC_RGHT, MSDN, MSUP, KC_P0, KC_P1, KC_P2, KC_P3, KC_QUOT, KC_TRNS,
KC_PSCR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F8, KC_F10, KC_F11,
KC_TRNS, KC_TRNS, KC_DEL, KC_LGUI, KC_F12, TO(_ADJUST), TT(_RAISE), KC_TRNS),
[_RAISE] = LAYOUT(
KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_MSTP, KC_MPLY, CLEAR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS,
KC_LOCK, STRAFE, WOBBLE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TT(_ADJUST)),
[_ADJUST] = LAYOUT(
KC_ESC, X(runic_q), X(runic_w), X(runic_e), X(runic_r), X(runic_t), X(runic_y), X(runic_u), X(runic_i), X(runic_o), X(runic_p), KC_BSPC,
KC_TRNS, X(runic_a), X(runic_s), X(runic_d), X(runic_f), X(runic_f), X(runic_g), X(runic_h), X(runic_j), X(runic_k), X(runic_l), KC_TRNS,
KC_TRNS, X(runic_z), X(runic_x), X(runic_c), X(runic_v), X(runic_b), X(runic_n), X(runic_m), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, UC_WIN, UC_LNX, KC_TRNS, TO(_QWERTY), KC_TRNS)};
void keyboard_post_init_user(void) {
// Customise these values to desired behaviour
debug_enable=true;
debug_matrix=true;
//debug_keyboard=true;
//debug_mouse=true;
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case WOBBLE:
if (record->event.pressed) {
do_wobble ^= 1;
spam_timer = timer_read();
}
case STRAFE:
if (record->event.pressed) {
spam_strafe ^= 1;
spam_timer = timer_read();
}
case MSDN:
if (record->event.pressed) {
mouse_on ^= 1;
case MSUP:
if (record->event.pressed) {
unregister_code(KC_MS_BTN1);
mouse_on ^=0;
}
case CLEAR:
if (record->event.pressed) {
clear_keyboard();
}
break;
// more cases here
}
}
return true;
}
void matrix_scan_user(void) {
if (spam_strafe && timer_elapsed(spam_timer) >= spam_interval) {
spam_timer = timer_read();
SEND_STRING(SS_DOWN(X_A));
_delay_ms(1000);
SEND_STRING(SS_UP(X_A));
SEND_STRING(SS_DOWN(X_D));
_delay_ms(1000);
SEND_STRING(SS_UP(X_D));
}
if (do_wobble && timer_elapsed(spam_timer) >= spam_interval) {
spam_timer = timer_read();
SEND_STRING(SS_DOWN(X_Q));
_delay_ms(1000);
SEND_STRING(SS_UP(X_Q));
SEND_STRING(SS_DOWN(X_E));
_delay_ms(1000);
SEND_STRING(SS_UP(X_E));
}
if (mouse_on){
register_code(KC_MS_BTN1);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment