Keymaps for several of my boards (#1641)
	
		
	
				
					
				
			* copied mjt keymaps from archive * All mjt boards now compile * fixed jd45-mjt breathing * Updates to fix SpaceFN but not tested yet. * Still missing either spacebar or an adjacent keypress. * Debugging rigged up for use with hid_listen. * Reverted the default keymap to use tap_layer_key rather than custom. Moved custom approach to keymap_debug.c * Fixed the lower-left side of the keymap, which needed more spacers due to the matrix being directly put into the array rather than using the keymap function. * Cleaned up JD45 keymap that uses tapkey. * Redid minivan keymap with numsym rather than raise/lower. Untested. * Created my MJT keymap for HHKB Enabled dynamic macros and moved somoe of the shortcuts around. * Minor keymap fixes to make them compile without errors. * Added home/end to right arrow cluster on DYN layer. * Added more keys to fn and dyn layers. * It wasn't using my custom layer last time somehow...? Now it will. * Compiled and installed at end of day on 8/23 * Moved macros to FKEY layer because Adjust was too hard to get into and out of without some sort of feedback. * Fixed volume controls... were reversed and disabled. * Added F13-F15 back to fkeys layer in Minivan * Created new Planck Keymap that uses the NumSym and FKeys layer approach like the Minivan. * Removed DYN layer. * Fixed diagram in planck numsym. * Cleanup for pull request. * Roadkit flip phone warning. * Replaced PLAY_NOTES_ARRAY to PLAY_SONG * reset the submodules * checked out specific commits for submodules * Removed debugging from JD45 shared config.h * Moved custom rules.mk to apropriate keymap Reset the shared rules.mk file. * Trailing return issue in rules.mk Gotta make for a smooth pull request :-)pull/1645/head
							parent
							
								
									de315c54eb
								
							
						
					
					
						commit
						7960302242
					
				@ -0,0 +1,29 @@
 | 
				
			||||
## not sure where this stuff goes ##
 | 
				
			||||
MCU = atmega32u4
 | 
				
			||||
F_CPU = 16000000
 | 
				
			||||
ARCH = AVR8
 | 
				
			||||
F_USB = $(F_CPU)
 | 
				
			||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
 | 
				
			||||
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = no         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = yes           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
TAP_DANCE_ENABLE=yes
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,171 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2012 Jun Wako <wakojun@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/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#include "config_common.h"
 | 
				
			||||
 | 
				
			||||
/* USB Device descriptor parameter */
 | 
				
			||||
#define VENDOR_ID    0xFEED
 | 
				
			||||
#define PRODUCT_ID   0x6060
 | 
				
			||||
#define DEVICE_VER   0x0001
 | 
				
			||||
#define MANUFACTURER    Some Guy
 | 
				
			||||
#define PRODUCT         Gherkin
 | 
				
			||||
#define DESCRIPTION     30 percent disaster
 | 
				
			||||
 | 
				
			||||
/* key matrix size */
 | 
				
			||||
#define MATRIX_ROWS 5
 | 
				
			||||
#define MATRIX_COLS 6
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Keyboard Matrix Assignments
 | 
				
			||||
 *
 | 
				
			||||
 * Change this to how you wired your keyboard
 | 
				
			||||
 * COLS: AVR pins used for columns, left to right
 | 
				
			||||
 * ROWS: AVR pins used for rows, top to bottom
 | 
				
			||||
 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
 | 
				
			||||
 *         ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
 | 
				
			||||
 *
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
// These are with USB on the left.
 | 
				
			||||
// #define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 }
 | 
				
			||||
// original from TMK:  #define MATRIX_COL_PINS { D0, D4, C6, D7, E6, B4 }
 | 
				
			||||
// #define MATRIX_COL_PINS { D0, D4, F6, D7, E6, B4 }
 | 
				
			||||
 | 
				
			||||
// these are with USB on the right.
 | 
				
			||||
#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 }
 | 
				
			||||
#define MATRIX_COL_PINS { B4, E6, D7, F6, D4, D0 }
 | 
				
			||||
 | 
				
			||||
#define CATERINA_BOOTLOADER
 | 
				
			||||
 | 
				
			||||
#define UNUSED_PINS
 | 
				
			||||
 | 
				
			||||
/* COL2ROW or ROW2COL */
 | 
				
			||||
#define DIODE_DIRECTION COL2ROW
 | 
				
			||||
 | 
				
			||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
 | 
				
			||||
#define DEBOUNCING_DELAY 5
 | 
				
			||||
 | 
				
			||||
/* define if matrix has ghost (lacks anti-ghosting diodes) */
 | 
				
			||||
//#define MATRIX_HAS_GHOST
 | 
				
			||||
 | 
				
			||||
/* number of backlight levels */
 | 
				
			||||
#define BACKLIGHT_LEVELS 3
 | 
				
			||||
#define BACKLIGHT_PIN B5
 | 
				
			||||
 | 
				
			||||
/* 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
 | 
				
			||||
 | 
				
			||||
#define AUDIO_VOICES
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Force NKRO
 | 
				
			||||
 *
 | 
				
			||||
 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
 | 
				
			||||
 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
 | 
				
			||||
 * makefile for this to work.)
 | 
				
			||||
 *
 | 
				
			||||
 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
 | 
				
			||||
 * until the next keyboard reset.
 | 
				
			||||
 *
 | 
				
			||||
 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
 | 
				
			||||
 * fully operational during normal computer usage.
 | 
				
			||||
 *
 | 
				
			||||
 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
 | 
				
			||||
 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
 | 
				
			||||
 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
 | 
				
			||||
 * power-up.
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
//#define FORCE_NKRO
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Magic Key Options
 | 
				
			||||
 *
 | 
				
			||||
 * Magic keys are hotkey commands that allow control over firmware functions of
 | 
				
			||||
 * the keyboard. They are best used in combination with the HID Listen program,
 | 
				
			||||
 * found here: https://www.pjrc.com/teensy/hid_listen.html
 | 
				
			||||
 *
 | 
				
			||||
 * The options below allow the magic key functionality to be changed. This is
 | 
				
			||||
 * useful if your keyboard/keypad is missing keys and you want magic key support.
 | 
				
			||||
 *
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* key combination for magic key command */
 | 
				
			||||
#define IS_COMMAND() ( \
 | 
				
			||||
  keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
/* control how magic key switches layers */
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
 | 
				
			||||
 | 
				
			||||
/* override magic key keymap */
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
 | 
				
			||||
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
 | 
				
			||||
//#define MAGIC_KEY_HELP1     H
 | 
				
			||||
//#define MAGIC_KEY_HELP2     SLASH
 | 
				
			||||
//#define MAGIC_KEY_DEBUG     D
 | 
				
			||||
//#define MAGIC_KEY_DEBUG_MATRIX  X
 | 
				
			||||
//#define MAGIC_KEY_DEBUG_KBD   K
 | 
				
			||||
//#define MAGIC_KEY_DEBUG_MOUSE  M
 | 
				
			||||
//#define MAGIC_KEY_VERSION    V
 | 
				
			||||
//#define MAGIC_KEY_STATUS     S
 | 
				
			||||
//#define MAGIC_KEY_CONSOLE    C
 | 
				
			||||
//#define MAGIC_KEY_LAYER0_ALT1  ESC
 | 
				
			||||
//#define MAGIC_KEY_LAYER0_ALT2  GRAVE
 | 
				
			||||
//#define MAGIC_KEY_LAYER0     0
 | 
				
			||||
//#define MAGIC_KEY_LAYER1     1
 | 
				
			||||
//#define MAGIC_KEY_LAYER2     2
 | 
				
			||||
//#define MAGIC_KEY_LAYER3     3
 | 
				
			||||
//#define MAGIC_KEY_LAYER4     4
 | 
				
			||||
//#define MAGIC_KEY_LAYER5     5
 | 
				
			||||
//#define MAGIC_KEY_LAYER6     6
 | 
				
			||||
//#define MAGIC_KEY_LAYER7     7
 | 
				
			||||
//#define MAGIC_KEY_LAYER8     8
 | 
				
			||||
//#define MAGIC_KEY_LAYER9     9
 | 
				
			||||
//#define MAGIC_KEY_BOOTLOADER   PAUSE
 | 
				
			||||
//#define MAGIC_KEY_LOCK      CAPS
 | 
				
			||||
//#define MAGIC_KEY_EEPROM     E
 | 
				
			||||
//#define MAGIC_KEY_NKRO      N
 | 
				
			||||
//#define MAGIC_KEY_SLEEP_LED   Z
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Feature disable options
 | 
				
			||||
 * These options are also useful to firmware size reduction.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* disable debug print */
 | 
				
			||||
//#define NO_DEBUG
 | 
				
			||||
 | 
				
			||||
/* disable print */
 | 
				
			||||
//#define NO_PRINT
 | 
				
			||||
 | 
				
			||||
/* disable action features */
 | 
				
			||||
//#define NO_ACTION_LAYER
 | 
				
			||||
//#define NO_ACTION_TAPPING
 | 
				
			||||
//#define NO_ACTION_ONESHOT
 | 
				
			||||
//#define NO_ACTION_MACRO
 | 
				
			||||
//#define NO_ACTION_FUNCTION
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,280 @@
 | 
				
			||||
#include "gherkin.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
//Tap Dance Declarations
 | 
				
			||||
enum {
 | 
				
			||||
  TD_Z_LCTL = 0,
 | 
				
			||||
  TD_X_LGUI = 1,
 | 
				
			||||
  TD_C_LALT = 2,
 | 
				
			||||
  TD_A_TAB = 3,
 | 
				
			||||
  TD_Q_ESC = 4,
 | 
				
			||||
//   M(0)
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
//Friendly Layer Names
 | 
				
			||||
enum gherkin_layers {
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _SONGS,
 | 
				
			||||
  _NUMBERS,
 | 
				
			||||
  _SYMBOLS,
 | 
				
			||||
  _PLOVER,
 | 
				
			||||
  _ADJUST
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// custom keycodes
 | 
				
			||||
enum gherkin_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  NUMBERS,
 | 
				
			||||
  SYMBOLS,
 | 
				
			||||
  SONGS,
 | 
				
			||||
  PLOVER,
 | 
				
			||||
  BACKLIT,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  EXT_PLV
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
  [_QWERTY] = KEYMAP(
 | 
				
			||||
		TD(TD_Q_ESC),   KC_W,              KC_E,           KC_R,  KC_T,               KC_Y,  KC_U,  KC_I,     KC_O,    KC_P,
 | 
				
			||||
		TD(TD_A_TAB),   LT(_SYMBOLS,KC_S), KC_D,           KC_F,  KC_G,               KC_H,  KC_J,  KC_K,     KC_L,    LT(_ADJUST,KC_SPC),
 | 
				
			||||
		TD(TD_Z_LCTL),  TD(TD_X_LGUI),    TD(TD_C_LALT),  KC_V,  KC_B,  LT(_NUMBERS, KC_N),  KC_M,  KC_COMM,  KC_DOT,  SFT_T(KC_ENT))
 | 
				
			||||
  ,
 | 
				
			||||
  [_NUMBERS] = KEYMAP(
 | 
				
			||||
    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,
 | 
				
			||||
    KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,   KC_F6,   KC_HOME, KC_PGDN, KC_PGUP,  KC_END ,
 | 
				
			||||
    KC_F7,  KC_F8,  KC_F9,  KC_F10, LT(_ADJUST,KC_F11),  _______, KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT)
 | 
				
			||||
  ,
 | 
				
			||||
  [_SYMBOLS] = KEYMAP(
 | 
				
			||||
    KC_EXLM,   KC_AT,   KC_HASH,   KC_DLR,   KC_PERC,  KC_CIRC,  KC_AMPR,  KC_ASTR, KC_LPRN,       KC_RPRN,
 | 
				
			||||
    KC_GRV,  _______,  XXXXXXX,  KC_LBRC,   KC_RBRC,  KC_BSLS,  KC_MINS,  KC_EQL ,  KC_SCLN,      KC_QUOT,
 | 
				
			||||
    KC_TILD,  MO(_ADJUST),  XXXXXXX,  KC_LCBR,   KC_RCBR,  KC_PIPE,  KC_UNDS,  KC_PLUS,  S(KC_SCLN), S(KC_QUOT))
 | 
				
			||||
  ,
 | 
				
			||||
  [_PLOVER] = KEYMAP(
 | 
				
			||||
    KC_Q,    KC_W,    KC_E,    KC_R,    KC_1,       KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC,
 | 
				
			||||
    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,       KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,
 | 
				
			||||
    EXT_PLV, XXXXXXX, KC_C,    KC_V,    XXXXXXX,    KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX)
 | 
				
			||||
  ,
 | 
				
			||||
  [_ADJUST] = KEYMAP(
 | 
				
			||||
    RESET,    _______,  _______,  _______,    _______,  QWERTY,  NUMBERS,  SYMBOLS,     PLOVER,  SONGS,
 | 
				
			||||
    MUV_DE,   MUV_IN,   MU_ON,    MU_OFF,     _______,  _______,  _______,  _______,     MACSLEEP,  _______,
 | 
				
			||||
    BACKLIT,  _______,  _______,  _______,    _______,  _______,  _______,  _______,     _______,  _______)
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]    = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_plover[][2]     = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
    case QWERTY:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_qwerty);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_QWERTY);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case NUMBERS:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_dvorak);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_NUMBERS);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case SYMBOLS:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_colemak);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_SYMBOLS);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case PLOVER:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          stop_all_notes();
 | 
				
			||||
          PLAY_SONG(tone_plover);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_NUMBERS);
 | 
				
			||||
        layer_off(_SYMBOLS);
 | 
				
			||||
        layer_off(_ADJUST);
 | 
				
			||||
        layer_on(_PLOVER);
 | 
				
			||||
        if (!eeconfig_is_enabled()) {
 | 
				
			||||
            eeconfig_init();
 | 
				
			||||
        }
 | 
				
			||||
        keymap_config.raw = eeconfig_read_keymap();
 | 
				
			||||
        keymap_config.nkro = 1;
 | 
				
			||||
        eeconfig_update_keymap(keymap_config.raw);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case EXT_PLV:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_plover_gb);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_PLOVER);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case MACSLEEP:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_RCTL);
 | 
				
			||||
          register_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_RCTL);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case BACKLIT:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        register_code(KC_RSFT);
 | 
				
			||||
        #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
          backlight_step();
 | 
				
			||||
        #endif
 | 
				
			||||
      } else {
 | 
				
			||||
        unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    }
 | 
				
			||||
    return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
 | 
				
			||||
	keyevent_t event = record->event;
 | 
				
			||||
 | 
				
			||||
	switch (id) {
 | 
				
			||||
        case 0: {
 | 
				
			||||
            if (record->event.pressed) {
 | 
				
			||||
                key_timer = timer_read(); // if the key is being pressed, we start the timer.
 | 
				
			||||
            }
 | 
				
			||||
            else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
 | 
				
			||||
                if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap.
 | 
				
			||||
                    return MACRO( D(LSFT), END  );
 | 
				
			||||
                }
 | 
				
			||||
                else {
 | 
				
			||||
                    return MACRO( T(N), END  );
 | 
				
			||||
                }
 | 
				
			||||
            }
 | 
				
			||||
            break;
 | 
				
			||||
        }
 | 
				
			||||
      }
 | 
				
			||||
	return MACRO_NONE;
 | 
				
			||||
}*/
 | 
				
			||||
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    #ifdef AUDIO_ENABLE
 | 
				
			||||
        startup_user();
 | 
				
			||||
    #endif
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
void startup_user()
 | 
				
			||||
{
 | 
				
			||||
    _delay_ms(20); // gets rid of tick
 | 
				
			||||
    PLAY_SONG(tone_startup);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void shutdown_user()
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(tone_goodbye);
 | 
				
			||||
    _delay_ms(150);
 | 
				
			||||
    stop_all_notes();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_on_user(void)
 | 
				
			||||
{
 | 
				
			||||
    music_scale_user();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_scale_user(void)
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(music_scale);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void matrix_scan_user(void) {
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
//Tap Dance Definitions
 | 
				
			||||
qk_tap_dance_action_t tap_dance_actions[] = {
 | 
				
			||||
  //Tap once for Esc, twice for Caps Lock
 | 
				
			||||
  [TD_Z_LCTL]  = ACTION_TAP_DANCE_DOUBLE(KC_Z, KC_LCTL),
 | 
				
			||||
  [TD_X_LGUI]  = ACTION_TAP_DANCE_DOUBLE(KC_X, KC_LGUI),
 | 
				
			||||
  [TD_C_LALT]  = ACTION_TAP_DANCE_DOUBLE(KC_C, KC_LALT),
 | 
				
			||||
  [TD_A_TAB]  = ACTION_TAP_DANCE_DOUBLE(KC_A, KC_TAB),
 | 
				
			||||
  [TD_Q_ESC]  = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC)
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// don't know what this is doing...
 | 
				
			||||
/*
 | 
				
			||||
void led_set_user(uint8_t usb_led) {
 | 
				
			||||
 | 
				
			||||
	if (usb_led & (1 << USB_LED_NUM_LOCK)) {
 | 
				
			||||
		DDRD |= (1 << 5); PORTD &= ~(1 << 5);
 | 
				
			||||
	} else {
 | 
				
			||||
		DDRD &= ~(1 << 5); PORTD &= ~(1 << 5);
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
 | 
				
			||||
		DDRB |= (1 << 0); PORTB &= ~(1 << 0);
 | 
				
			||||
	} else {
 | 
				
			||||
		DDRB &= ~(1 << 0); PORTB &= ~(1 << 0);
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
 | 
				
			||||
 | 
				
			||||
	} else {
 | 
				
			||||
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if (usb_led & (1 << USB_LED_COMPOSE)) {
 | 
				
			||||
 | 
				
			||||
	} else {
 | 
				
			||||
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if (usb_led & (1 << USB_LED_KANA)) {
 | 
				
			||||
 | 
				
			||||
	} else {
 | 
				
			||||
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
}
 | 
				
			||||
*/
 | 
				
			||||
@ -0,0 +1,77 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2012 Jun Wako <wakojun@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/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#include "config_common.h"
 | 
				
			||||
 | 
				
			||||
/* USB Device descriptor parameter */
 | 
				
			||||
#define VENDOR_ID       0xFEED
 | 
				
			||||
#define PRODUCT_ID      0xCAFE
 | 
				
			||||
#define DEVICE_VER      0x0104
 | 
				
			||||
#define MANUFACTURER    q.m.k
 | 
				
			||||
#define PRODUCT         HHKB mod
 | 
				
			||||
#define DESCRIPTION     q.m.k keyboard firmware for HHKB
 | 
				
			||||
 | 
				
			||||
/* key matrix size */
 | 
				
			||||
#ifdef HHKB_JP
 | 
				
			||||
#   define MATRIX_ROWS 16
 | 
				
			||||
#else
 | 
				
			||||
#   define MATRIX_ROWS 8
 | 
				
			||||
#endif
 | 
				
			||||
#define MATRIX_COLS 8
 | 
				
			||||
 | 
				
			||||
#define TAPPING_TERM    200
 | 
				
			||||
 | 
				
			||||
/* number of backlight levels */
 | 
				
			||||
#define BACKLIGHT_LEVELS 3
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
 | 
				
			||||
/* Set 0 if debouncing isn't needed */
 | 
				
			||||
#define DEBOUNCE    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)) \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Feature disable options
 | 
				
			||||
 *  These options are also useful to firmware size reduction.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
/* disable debug print */
 | 
				
			||||
//#define NO_DEBUG
 | 
				
			||||
 | 
				
			||||
/* disable print */
 | 
				
			||||
//#define NO_PRINT
 | 
				
			||||
 | 
				
			||||
/* disable action features */
 | 
				
			||||
//#define NO_ACTION_LAYER
 | 
				
			||||
//#define NO_ACTION_TAPPING
 | 
				
			||||
//#define NO_ACTION_ONESHOT
 | 
				
			||||
//#define NO_ACTION_MACRO
 | 
				
			||||
//#define NO_ACTION_FUNCTION
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,114 @@
 | 
				
			||||
/*  -*-  eval: (turn-on-orgtbl); -*-
 | 
				
			||||
 * default HHKB Layout
 | 
				
			||||
 */
 | 
				
			||||
#include "hhkb.h"
 | 
				
			||||
 | 
				
			||||
#define BASE 0
 | 
				
			||||
#define HHKB 1
 | 
				
			||||
#define FUNK 2
 | 
				
			||||
#define DYN 3
 | 
				
			||||
#define CTL_ESC CTL_T(KC_ESC)
 | 
				
			||||
#define MACSLEEP LCTL(LSFT(KC_POWER))
 | 
				
			||||
 | 
				
			||||
enum hhkb_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  DYNKEY,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
 | 
				
			||||
    /* BASE Level: Default Layer
 | 
				
			||||
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
 | 
				
			||||
     | Esc   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | -     | =   | \     | ` |
 | 
				
			||||
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
 | 
				
			||||
     | Tab   | Q | W | E | R | T | Y | U | I | O | P | [     | ]   | Backs |   |
 | 
				
			||||
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
 | 
				
			||||
     | Cont  | A | S | D | F | G | H | J | K | L | ; | '     | Ent |       |   |
 | 
				
			||||
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
 | 
				
			||||
     | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 |       |   |
 | 
				
			||||
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
 | 
				
			||||
 | 
				
			||||
            |------+------+-----------------------+------+------|
 | 
				
			||||
            | LAlt | LGUI | ******* Space ******* | RGUI | RAlt |
 | 
				
			||||
            |------+------+-----------------------+------+------|
 | 
				
			||||
    */
 | 
				
			||||
 | 
				
			||||
  [BASE] = KEYMAP(  //  default layer
 | 
				
			||||
  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_EQL,    KC_BSLS,  KC_DEL, \
 | 
				
			||||
  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,          \
 | 
				
			||||
  CTL_ESC,  KC_A,  KC_S,  KC_D,  KC_F,  KC_G,  KC_H,  KC_J,  KC_K,     KC_L,    KC_SCLN,  KC_QUOT,  KC_ENT,                      \
 | 
				
			||||
  KC_LSFT,  KC_Z,  KC_X,  KC_C,  KC_V,  KC_B,  KC_N,  KC_M,  KC_COMM,  KC_DOT,  KC_SLSH,  SFT_T(KC_ENT),  TT(FUNK),                    \
 | 
				
			||||
                    KC_LALT,  KC_LGUI,  /*        */ KC_SPC,      MO(DYN),  KC_RALT),
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    /* Layer HHKB: HHKB mode (HHKB Fn)
 | 
				
			||||
      |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
 | 
				
			||||
      | Pwr  | F1  | F2  | F3  | F4 | F5 | F6 | F7 | F8  | F9  | F10 | F11 | F12   | Ins   | Del |
 | 
				
			||||
      |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
 | 
				
			||||
      | Caps |     |     |     |    |    |    |    | Psc | Slk | Pus | Up  |       | Backs |     |
 | 
				
			||||
      |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
 | 
				
			||||
      |      | VoD | VoU | Mut |    |    | *  | /  | Hom | PgU | Lef | Rig | Enter |       |     |
 | 
				
			||||
      |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
 | 
				
			||||
      |      |     |     |     |    |    | +  | -  | End | PgD | Dow |     |       |       |     |
 | 
				
			||||
      |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
 | 
				
			||||
 | 
				
			||||
                 |------+------+----------------------+------+------+
 | 
				
			||||
                 | **** | **** | ******************** | **** | **** |
 | 
				
			||||
                 |------+------+----------------------+------+------+
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  [HHKB] = KEYMAP(
 | 
				
			||||
  KC_PWR,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_INS,   KC_DEL, \
 | 
				
			||||
  KC_CAPS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PSCR,  KC_SLCK,  KC_PAUS,  KC_UP,    KC_TRNS,  KC_BSPC,          \
 | 
				
			||||
  KC_TRNS,  KC_VOLD,  KC_VOLU,  KC_MUTE,  KC_TRNS,  KC_TRNS,  KC_PAST,  KC_PSLS,  KC_HOME,  KC_PGUP,  KC_LEFT,  KC_RGHT,  KC_PENT,                    \
 | 
				
			||||
  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PPLS,  KC_PMNS,  KC_END,   KC_PGDN,  KC_DOWN,  KC_TRNS,  KC_TRNS,                    \
 | 
				
			||||
                     KC_TRNS, KC_TRNS,           KC_TRNS,                KC_TRNS, KC_TRNS),
 | 
				
			||||
 | 
				
			||||
  */
 | 
				
			||||
 [FUNK] = KEYMAP(
 | 
				
			||||
 KC_PWR,   KC_F1,    KC_F2,    KC_F3,    KC_F4,    KC_F5,    KC_F6,    KC_F7,    KC_F8,    KC_F9,    KC_F10,   KC_F11,   KC_F12,   KC_INS,   KC_DEL, \
 | 
				
			||||
 KC_CAPS,  KC_TRNS,  KC_UP,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PSCR,  KC_SLCK,  KC_PAUS,  KC_UP,    KC_TRNS,  KC_BSPC,          \
 | 
				
			||||
 KC_TRNS,  KC_LEFT,  KC_DOWN,  KC_RGHT,  KC_TRNS,  KC_TRNS,  KC_PAST,  KC_PSLS,  KC_HOME,  KC_PGUP,  KC_LEFT,  KC_RGHT,  KC_PENT,                    \
 | 
				
			||||
 KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PPLS,  KC_PMNS,  KC_END,   KC_PGDN,  KC_DOWN,  KC_TRNS,  KC_TRNS,                    \
 | 
				
			||||
                    KC_TRNS, KC_TRNS,           KC_TRNS,                KC_TRNS, KC_TRNS),
 | 
				
			||||
[DYN] = KEYMAP(
 | 
				
			||||
KC_TRNS,  DYN_REC_START1,  DYN_REC_START2,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  DYN_MACRO_PLAY1,   DYN_MACRO_PLAY2, \
 | 
				
			||||
KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PGUP,  KC_TRNS,  KC_TRNS,          \
 | 
				
			||||
KC_TRNS,  KC_VOLD,  KC_VOLU,  KC_MUTE,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  MACSLEEP,  KC_HOME,  KC_END ,  KC_TRNS,                    \
 | 
				
			||||
KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_PGDN,  KC_TRNS,  KC_TRNS,                    \
 | 
				
			||||
                   KC_TRNS, KC_TRNS,           DYN_REC_STOP,                KC_TRNS, KC_TRNS)
 | 
				
			||||
  };
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
				
			||||
{
 | 
				
			||||
  // MACRODOWN only works in this function
 | 
				
			||||
      switch(id) {
 | 
				
			||||
        case 0:
 | 
				
			||||
          if (record->event.pressed) {
 | 
				
			||||
            register_code(KC_RSFT);
 | 
				
			||||
          } else {
 | 
				
			||||
            unregister_code(KC_RSFT);
 | 
				
			||||
          }
 | 
				
			||||
        break;
 | 
				
			||||
      }
 | 
				
			||||
    return MACRO_NONE;
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = (keycode == MO(DYN) ? DYN_REC_STOP : keycode);
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,16 @@
 | 
				
			||||
# Mike's HHKB
 | 
				
			||||
 | 
				
			||||
- Surprisingly stock for the most part
 | 
				
			||||
- Dynamic macros
 | 
				
			||||
- ctrl key has tapkey for escape
 | 
				
			||||
- right shift has tapkey for enter 
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Base for letters and mods.
 | 
				
			||||
 | 
				
			||||
Funk layer is my tweaked function layer
 | 
				
			||||
 | 
				
			||||
Dyn layer has dynamic macros.  Record with 1 and 2, playback with \ and
 | 
				
			||||
upper-right-most key.  Also turns the arrow clusters into nav keys.
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = no         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,85 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2012 Jun Wako <wakojun@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/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#include "config_common.h"
 | 
				
			||||
 | 
				
			||||
/* USB Device descriptor parameter */
 | 
				
			||||
#define VENDOR_ID       0xFEED
 | 
				
			||||
#define PRODUCT_ID      0x6060
 | 
				
			||||
#define DEVICE_VER      0x0001
 | 
				
			||||
#define MANUFACTURER    geekhack
 | 
				
			||||
#define PRODUCT         JD45
 | 
				
			||||
#define DESCRIPTION     q.m.k. keyboard firmware for JD45
 | 
				
			||||
 | 
				
			||||
/* key matrix size */
 | 
				
			||||
#define MATRIX_ROWS 4
 | 
				
			||||
#define MATRIX_COLS 13
 | 
				
			||||
 | 
				
			||||
/* Planck PCB default pin-out */
 | 
				
			||||
#define MATRIX_ROW_PINS { F0, F1, F5, B4 }
 | 
				
			||||
#define MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2, B0 }
 | 
				
			||||
#define UNUSED_PINS
 | 
				
			||||
 | 
				
			||||
#define BACKLIGHT_PIN B7
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
#define BACKLIGHT_BREATHING
 | 
				
			||||
 | 
				
			||||
/* COL2ROW or ROW2COL */
 | 
				
			||||
#define DIODE_DIRECTION COL2ROW
 | 
				
			||||
 | 
				
			||||
/* define if matrix has ghost */
 | 
				
			||||
//#define MATRIX_HAS_GHOST
 | 
				
			||||
 | 
				
			||||
/* number of backlight levels */
 | 
				
			||||
#define BACKLIGHT_LEVELS 3
 | 
				
			||||
 | 
				
			||||
/* 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)) \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Feature disable options
 | 
				
			||||
 *  These options are also useful to firmware size reduction.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* disable debug print */
 | 
				
			||||
//#define NO_DEBUG
 | 
				
			||||
 | 
				
			||||
/* disable print */
 | 
				
			||||
//#define NO_PRINT
 | 
				
			||||
 | 
				
			||||
/* disable action features */
 | 
				
			||||
//#define NO_ACTION_LAYER
 | 
				
			||||
//#define NO_ACTION_TAPPING
 | 
				
			||||
//#define NO_ACTION_ONESHOT
 | 
				
			||||
//#define NO_ACTION_MACRO
 | 
				
			||||
//#define NO_ACTION_FUNCTION
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,80 @@
 | 
				
			||||
#include "jd45.h"
 | 
				
			||||
 | 
				
			||||
/* Mike's Layout for JD45 with backlight LEDs acting as layer indicator
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
[0] = KEYMAP(
 | 
				
			||||
  TAB,    Q,    W,    E,    R,    T,    Y,    U,    I,    O,    P, MINS, BSLS,
 | 
				
			||||
  FN1,    A,    S,    D,    F,    G,    H,    J,    K,    L, QUOT,  ENT,
 | 
				
			||||
  FN0,    Z,    X,    C,    V,    B,    N,    M, COMM,  DOT, SLSH, RSFT,
 | 
				
			||||
   NO, LCTL, LALT, LGUI,  SPC,  BSPC, APP,  FN2,  ESC,   NO ),
 | 
				
			||||
[1] = KEYMAP(
 | 
				
			||||
GRV,  TRNS,   UP, TRNS,   7,    8,    9,    0, MINS,  EQL, PSCR, LBRC, RBRC,
 | 
				
			||||
TRNS, LEFT, DOWN, RGHT,   4,    5,    6,  INS, HOME, PGUP, SCLN, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS,   1,    2,    3,  DEL,  END, PGDN, TRNS, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, SPC, TRNS,  DEL, TRNS, FN3, TRNS, TRNS ),
 | 
				
			||||
[2] = KEYMAP(
 | 
				
			||||
TRNS, TRNS, VOLU, TRNS,   F7,   F8,   F9,  F10,  F11,  F12, PSCR, FN3, FN4,
 | 
				
			||||
TRNS, MPRV, VOLD, MNXT,   F4,   F5,   F6,    J,    K,    L, SCLN, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS,   F1,   F2,   F3, MUTE, MPRV, MNXT, MSTP, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, LGUI, TRNS, TRNS, TRNS, TRNS, PAUS, TRNS )
 | 
				
			||||
/*  ,
 | 
				
			||||
[3] = KEYMAP(
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS, TRNS, BTLD, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
 | 
				
			||||
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS )*/
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum macro_id {
 | 
				
			||||
    M_LAYER1,
 | 
				
			||||
    M_LAYER2
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
    [0] = ACTION_MODS_TAP_TOGGLE(MOD_LSFT),
 | 
				
			||||
    // [1] = ACTION_LAYER_TAP_TOGGLE(1),
 | 
				
			||||
    [1] = ACTION_MACRO(M_LAYER1),
 | 
				
			||||
    [2] = ACTION_LAYER_TAP_TOGGLE(2),
 | 
				
			||||
    [3] = ACTION_BACKLIGHT_STEP(),
 | 
				
			||||
    [4] = ACTION_BACKLIGHT_TOGGLE()
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
				
			||||
{
 | 
				
			||||
  // MACRODOWN only works in this function
 | 
				
			||||
      switch(id) {
 | 
				
			||||
        case M_LAYER1:
 | 
				
			||||
            // need to add a timer for doubletap: https://github.com/jackhumbert/qmk_firmware/wiki#timer-functionality
 | 
				
			||||
            // action_function_tap may also handle this...
 | 
				
			||||
            if (record->event.pressed)
 | 
				
			||||
            {
 | 
				
			||||
                breathing_speed_set(3);
 | 
				
			||||
                breathing_enable();
 | 
				
			||||
                layer_on(1);
 | 
				
			||||
            }
 | 
				
			||||
            else
 | 
				
			||||
            {
 | 
				
			||||
                breathing_speed_set(1);
 | 
				
			||||
                breathing_self_disable();
 | 
				
			||||
                layer_off(1);
 | 
				
			||||
            }
 | 
				
			||||
        break;
 | 
				
			||||
        case M_LAYER2:
 | 
				
			||||
            if (record->event.pressed)
 | 
				
			||||
            {
 | 
				
			||||
                breathing_speed_set(2);
 | 
				
			||||
                breathing_pulse();
 | 
				
			||||
                layer_on(2);
 | 
				
			||||
            }
 | 
				
			||||
            else
 | 
				
			||||
            {
 | 
				
			||||
                breathing_speed_set(1);
 | 
				
			||||
                breathing_self_disable();
 | 
				
			||||
                layer_off(2);
 | 
				
			||||
            }
 | 
				
			||||
        break;
 | 
				
			||||
      }
 | 
				
			||||
    return MACRO_NONE;
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,12 @@
 | 
				
			||||
# Mike's JD45 standard layout
 | 
				
			||||
 | 
				
			||||
- Backlight that matches active layer
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Base for letters and mods.
 | 
				
			||||
 | 
				
			||||
Function 1 layer adds a centered numpad to the board
 | 
				
			||||
 | 
				
			||||
Function 2 layer replaces the numpad numbers with Fkeys.
 | 
				
			||||
@ -0,0 +1,67 @@
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# MCU name
 | 
				
			||||
#MCU = at90usb1287
 | 
				
			||||
MCU = atmega32u4
 | 
				
			||||
 | 
				
			||||
# Processor frequency.
 | 
				
			||||
#     This will define a symbol, F_CPU, in all source code files equal to the
 | 
				
			||||
#     processor frequency in Hz. You can then use this symbol in your source code to
 | 
				
			||||
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
 | 
				
			||||
#     automatically to create a 32-bit value in your source code.
 | 
				
			||||
#
 | 
				
			||||
#     This will be an integer division of F_USB below, as it is sourced by
 | 
				
			||||
#     F_USB after it has run through any CPU prescalers. Note that this value
 | 
				
			||||
#     does not *change* the processor frequency - it should merely be updated to
 | 
				
			||||
#     reflect the processor speed set externally so that the code can use accurate
 | 
				
			||||
#     software delays.
 | 
				
			||||
F_CPU = 16000000
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#
 | 
				
			||||
# LUFA specific
 | 
				
			||||
#
 | 
				
			||||
# Target architecture (see library "Board Types" documentation).
 | 
				
			||||
ARCH = AVR8
 | 
				
			||||
 | 
				
			||||
# Input clock frequency.
 | 
				
			||||
#     This will define a symbol, F_USB, in all source code files equal to the
 | 
				
			||||
#     input clock frequency (before any prescaling is performed) in Hz. This value may
 | 
				
			||||
#     differ from F_CPU if prescaling is used on the latter, and is required as the
 | 
				
			||||
#     raw input clock is fed directly to the PLL sections of the AVR for high speed
 | 
				
			||||
#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
 | 
				
			||||
#     at the end, this will be done automatically to create a 32-bit value in your
 | 
				
			||||
#     source code.
 | 
				
			||||
#
 | 
				
			||||
#     If no clock division is performed on the input clock inside the AVR (via the
 | 
				
			||||
#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
 | 
				
			||||
F_USB = $(F_CPU)
 | 
				
			||||
 | 
				
			||||
# Interrupt driven control endpoint task(+60)
 | 
				
			||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Boot Section Size in *bytes*
 | 
				
			||||
#   Teensy halfKay   512
 | 
				
			||||
#   Teensy++ halfKay 1024
 | 
				
			||||
#   Atmel DFU loader 4096
 | 
				
			||||
#   LUFA bootloader  4096
 | 
				
			||||
#   USBaspLoader     2048
 | 
				
			||||
OPT_DEFS += -DBOOTLOADER_SIZE=4096
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Build Options
 | 
				
			||||
#   comment out to disable the options.
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes	# Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = yes	# Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes    # Commands for debug and configuration
 | 
				
			||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | 
				
			||||
SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
 | 
				
			||||
NKRO_ENABLE = yes		# USB Nkey Rollover - not yet supported in LUFA
 | 
				
			||||
BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no 		# MIDI controls
 | 
				
			||||
# UNICODE_ENABLE = YES 		# Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
@ -0,0 +1,23 @@
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = no        # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = yes        # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
DEBUG_ENABLE = yes
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,84 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2012 Jun Wako <wakojun@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/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#include "config_common.h"
 | 
				
			||||
 | 
				
			||||
/* USB Device descriptor parameter */
 | 
				
			||||
#define VENDOR_ID       0xFEED
 | 
				
			||||
#define PRODUCT_ID      0x6060
 | 
				
			||||
#define DEVICE_VER      0x0001
 | 
				
			||||
#define MANUFACTURER    geekhack
 | 
				
			||||
#define PRODUCT         JD45
 | 
				
			||||
#define DESCRIPTION     q.m.k. keyboard firmware for JD45
 | 
				
			||||
 | 
				
			||||
/* key matrix size */
 | 
				
			||||
#define MATRIX_ROWS 4
 | 
				
			||||
#define MATRIX_COLS 13
 | 
				
			||||
 | 
				
			||||
/* Planck PCB default pin-out */
 | 
				
			||||
#define MATRIX_ROW_PINS { F0, F1, F5, B4 }
 | 
				
			||||
#define MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2, B0 }
 | 
				
			||||
#define UNUSED_PINS
 | 
				
			||||
 | 
				
			||||
#define BACKLIGHT_PIN B7
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
 | 
				
			||||
/* COL2ROW or ROW2COL */
 | 
				
			||||
#define DIODE_DIRECTION COL2ROW
 | 
				
			||||
 | 
				
			||||
/* define if matrix has ghost */
 | 
				
			||||
//#define MATRIX_HAS_GHOST
 | 
				
			||||
 | 
				
			||||
/* number of backlight levels */
 | 
				
			||||
#define BACKLIGHT_LEVELS 3
 | 
				
			||||
 | 
				
			||||
/* 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)) \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Feature disable options
 | 
				
			||||
 *  These options are also useful to firmware size reduction.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* disable debug print */
 | 
				
			||||
//#define NO_DEBUG
 | 
				
			||||
 | 
				
			||||
/* disable print */
 | 
				
			||||
//#define NO_PRINT
 | 
				
			||||
 | 
				
			||||
/* disable action features */
 | 
				
			||||
//#define NO_ACTION_LAYER
 | 
				
			||||
//#define NO_ACTION_TAPPING
 | 
				
			||||
//#define NO_ACTION_ONESHOT
 | 
				
			||||
//#define NO_ACTION_MACRO
 | 
				
			||||
//#define NO_ACTION_FUNCTION
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,149 @@
 | 
				
			||||
#include "jd45.h"
 | 
				
			||||
 | 
				
			||||
enum jd45_layers
 | 
				
			||||
{
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _QWERTYNUMMODS,
 | 
				
			||||
  _NUMSYM,
 | 
				
			||||
  _FUNCTION,
 | 
				
			||||
  _NUMPAD,
 | 
				
			||||
  _FKEYNUMPAD,
 | 
				
			||||
  _ADJUST
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum jd45_keycodes
 | 
				
			||||
{
 | 
				
			||||
  NUMSYM = SAFE_RANGE,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  USEFNMODS,
 | 
				
			||||
  USENUMMODS,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
#define LONGPRESS_DELAY 150
 | 
				
			||||
#define LAYER_TOGGLE_DELAY 900
 | 
				
			||||
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define __MOD__ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
#define F_FNSPC F(0)
 | 
				
			||||
#define F_NUMSPC F(1)
 | 
				
			||||
#define F_FNTAB F(2)
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
  [_QWERTY] = {
 | 
				
			||||
  {F_FNTAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_MINS, KC_BSPC},
 | 
				
			||||
   {CTL_T(KC_ESC),    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN,  LT(_ADJUST, KC_QUOT)},
 | 
				
			||||
     {KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH, SFT_T(KC_ENT)},
 | 
				
			||||
  { XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX,  XXXXXXX,  XXXXXXX, F_FNSPC,  XXXXXXX, XXXXXXX, MO(_FUNCTION),  MO(_ADJUST) }
 | 
				
			||||
},
 | 
				
			||||
[_QWERTYNUMMODS] = {
 | 
				
			||||
  {F_FNTAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_MINS, KC_BSPC},
 | 
				
			||||
   {CTL_T(KC_ESC),    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L, KC_SCLN,  LT(_ADJUST, KC_QUOT)},
 | 
				
			||||
     {KC_LSFT,    KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH, SFT_T(KC_ENT)},
 | 
				
			||||
  {XXXXXXX,  KC_LALT, KC_LGUI, XXXXXXX,  XXXXXXX,  XXXXXXX, F_NUMSPC,  XXXXXXX, XXXXXXX,  MO(_FKEYNUMPAD), MO(_ADJUST) }
 | 
				
			||||
},
 | 
				
			||||
[_NUMSYM] = {
 | 
				
			||||
{KC_GRV,     KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,   KC_0, _______, KC_DEL},
 | 
				
			||||
 {__MOD__, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______},
 | 
				
			||||
  {_______, _______, _______, _______, _______, KC_SPC, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______},
 | 
				
			||||
{XXXXXXX, __MOD__, __MOD__, XXXXXXX,  XXXXXXX,  XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}
 | 
				
			||||
},
 | 
				
			||||
[_FUNCTION] = {
 | 
				
			||||
{__MOD__,   KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,  KC_F10,  KC_F11, KC_F12},
 | 
				
			||||
{__MOD__, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______},
 | 
				
			||||
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
 | 
				
			||||
{XXXXXXX, __MOD__, __MOD__, XXXXXXX,  XXXXXXX,  XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__ , __MOD__}
 | 
				
			||||
},
 | 
				
			||||
[_NUMPAD] = {
 | 
				
			||||
{KC_GRV,  _______,   KC_UP, _______,   KC_7,    KC_8,    KC_9,    KC_0, KC_MINS,  KC_EQL, KC_PSCR, KC_LBRC, KC_RBRC},
 | 
				
			||||
{_______, KC_LEFT, KC_DOWN, KC_RGHT,   KC_4,    KC_5,    KC_6,  KC_INS, KC_HOME, KC_PGUP, _______, _______},
 | 
				
			||||
{_______, _______, _______, _______,   KC_1,    KC_2,    KC_3,  KC_DEL,  KC_END, KC_PGDN, _______, _______},
 | 
				
			||||
{XXXXXXX, _______, _______, XXXXXXX,  XXXXXXX,  XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}
 | 
				
			||||
},
 | 
				
			||||
[_FKEYNUMPAD] = {
 | 
				
			||||
{_______, _______, KC_VOLU, _______,   KC_F7,   KC_F8,   KC_F9,  KC_F10,  KC_F11,  KC_F12, KC_PSCR, _______, _______},
 | 
				
			||||
{_______, KC_MPRV, KC_VOLD, KC_MNXT,   KC_F4,   KC_F5,   KC_F6,    KC_J,    KC_K,    KC_L, KC_SCLN, _______},
 | 
				
			||||
{_______, _______, _______, _______,   KC_F1,   KC_F2,   KC_F3, KC_MUTE, KC_MPRV, KC_MNXT, KC_MSTP, _______},
 | 
				
			||||
{XXXXXXX, _______, _______, XXXXXXX,  XXXXXXX,  XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__ }
 | 
				
			||||
},
 | 
				
			||||
[_ADJUST] = {
 | 
				
			||||
  {_______, RESET, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, KC_PSCR, _______, _______},
 | 
				
			||||
  { _______,  _______, _______, _______, USEFNMODS, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, MACSLEEP, _______, _______},
 | 
				
			||||
  {  _______, _______, _______, _______, _______, _______, USENUMMODS, _______, _______, _______, _______, _______},
 | 
				
			||||
  {XXXXXXX, _______, _______,XXXXXXX,  XXXXXXX,  XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}
 | 
				
			||||
 }
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
  [0] = ACTION_LAYER_TAP_KEY(_NUMSYM, KC_SPC),
 | 
				
			||||
  [1] = ACTION_LAYER_TAP_KEY(_NUMPAD, KC_SPC),
 | 
				
			||||
  [2] = ACTION_LAYER_TAP_KEY(_FUNCTION, KC_TAB),
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
void persistent_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
static bool singular_key = false;
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = (keycode == MO(_ADJUST) ? DYN_REC_STOP : keycode);
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
  println(" ");
 | 
				
			||||
  print("process record");
 | 
				
			||||
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
  case MACSLEEP:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
 | 
				
			||||
      register_code(KC_RSFT);
 | 
				
			||||
      register_code(KC_RCTL);
 | 
				
			||||
      register_code(KC_POWER);
 | 
				
			||||
      unregister_code(KC_POWER);
 | 
				
			||||
      unregister_code(KC_RCTL);
 | 
				
			||||
      unregister_code(KC_RSFT);
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  case USEFNMODS:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      persistent_default_layer_set(1UL<<_QWERTY);
 | 
				
			||||
      #ifdef AUDIO_ENABLE
 | 
				
			||||
        PLAY_NOTE_ARRAY(tone_fnpc, false, 0);
 | 
				
			||||
      #endif
 | 
				
			||||
      print("Space-FN");
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  case USENUMMODS:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      persistent_default_layer_set(1UL<<_QWERTYNUMMODS);
 | 
				
			||||
      #ifdef AUDIO_ENABLE
 | 
				
			||||
        PLAY_NOTE_ARRAY(tone_fnmac, false, 0);
 | 
				
			||||
      #endif
 | 
				
			||||
      print("Space-Numpad");
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  default:
 | 
				
			||||
      singular_key = false;
 | 
				
			||||
    break;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  return true;
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    #ifdef AUDIO_ENABLE
 | 
				
			||||
        startup_user();
 | 
				
			||||
    #endif
 | 
				
			||||
    // debug_enable = true;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,23 @@
 | 
				
			||||
# Mike's JD45 with 6u Spacebar
 | 
				
			||||
 | 
				
			||||
- Early draft of numsym that misses a lot of symbols
 | 
				
			||||
- Numpad layer available for evaluation
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
- Dynamic macros
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Qwerty for letters and mods.
 | 
				
			||||
 | 
				
			||||
Qwertymods layer switches some Modifiers around
 | 
				
			||||
 | 
				
			||||
Numsym puts the number keys across the top row like a Planck. Arrows are on hjkl
 | 
				
			||||
which makes the other NumSym dynamic from my other boards fall apart
 | 
				
			||||
 | 
				
			||||
Function layer replaces the top row numbers with Fkeys.
 | 
				
			||||
 | 
				
			||||
Numpad layer makes a number pad in the center.
 | 
				
			||||
 | 
				
			||||
Fkeynumpad replaces the numpad numbers with Fkeys.
 | 
				
			||||
 | 
				
			||||
Adjust layer has macros and configuration.
 | 
				
			||||
@ -0,0 +1,25 @@
 | 
				
			||||
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in 
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = no         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = no        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = no      # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = yes        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
ONEHAND_ENABLE = no        # Enable one-hand typing
 | 
				
			||||
 | 
				
			||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | 
				
			||||
SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,38 @@
 | 
				
			||||
/*
 | 
				
			||||
Copyright 2012 Jun Wako <wakojun@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/>.
 | 
				
			||||
*/
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define USE_SERIAL
 | 
				
			||||
 | 
				
			||||
#define MASTER_LEFT
 | 
				
			||||
// #define _MASTER_RIGHT
 | 
				
			||||
// #define EE_HANDS
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#ifdef SUBPROJECT_rev1
 | 
				
			||||
    #include "../../rev1/config.h"
 | 
				
			||||
#endif
 | 
				
			||||
#ifdef SUBPROJECT_rev2
 | 
				
			||||
    #include "../../rev2/config.h"
 | 
				
			||||
#endif
 | 
				
			||||
#ifdef SUBPROJECT_rev2fliphalf
 | 
				
			||||
	#include "../../rev2fliphalf/config.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#undef RGBLED_NUM
 | 
				
			||||
#define RGBLIGHT_ANIMATIONS
 | 
				
			||||
#define RGBLED_NUM 10
 | 
				
			||||
@ -0,0 +1,217 @@
 | 
				
			||||
#include "lets_split.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
#ifdef BACKLIGHT_ENABLE
 | 
				
			||||
  #include "backlight.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
 | 
				
			||||
// 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 _QWERTY 0
 | 
				
			||||
#define _COLEMAK 1
 | 
				
			||||
#define _DVORAK 2
 | 
				
			||||
#define _LOWER 3
 | 
				
			||||
#define _RAISE 4
 | 
				
			||||
#define _ADJUST 16
 | 
				
			||||
 | 
				
			||||
enum custom_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  COLEMAK,
 | 
				
			||||
  DVORAK,
 | 
				
			||||
  LOWER,
 | 
				
			||||
  RAISE,
 | 
				
			||||
  ADJUST,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
 | 
				
			||||
/* Qwerty
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_QWERTY] = KEYMAP( \
 | 
				
			||||
  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \
 | 
				
			||||
  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \
 | 
				
			||||
  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
 | 
				
			||||
  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
 | 
				
			||||
),
 | 
				
			||||
 | 
				
			||||
/* Colemak
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_COLEMAK] = KEYMAP( \
 | 
				
			||||
  KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \
 | 
				
			||||
  KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \
 | 
				
			||||
  KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \
 | 
				
			||||
  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
 | 
				
			||||
),
 | 
				
			||||
 | 
				
			||||
/* Dvorak
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |Adjust| Ctrl | Alt  | GUI  |Lower |Space |Space |Raise | Left | Down |  Up  |Right |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_DVORAK] = KEYMAP( \
 | 
				
			||||
  KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC, \
 | 
				
			||||
  KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \
 | 
				
			||||
  KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \
 | 
				
			||||
  ADJUST,  KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \
 | 
				
			||||
),
 | 
				
			||||
 | 
				
			||||
/* Lower
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |     |    \  |  |   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_LOWER] = KEYMAP( \
 | 
				
			||||
  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
 | 
				
			||||
  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
 | 
				
			||||
  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
 | 
				
			||||
  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 | 
				
			||||
),
 | 
				
			||||
 | 
				
			||||
/* Raise
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_RAISE] = KEYMAP( \
 | 
				
			||||
  KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \
 | 
				
			||||
  KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \
 | 
				
			||||
  _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, _______, _______, _______, \
 | 
				
			||||
  _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
 | 
				
			||||
),
 | 
				
			||||
 | 
				
			||||
/* Adjust (Lower + Raise)
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|      |      |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |      |      |      |      |      |      |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      |      |      |      |      |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_ADJUST] =  KEYMAP( \
 | 
				
			||||
  _______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
 | 
				
			||||
  _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \
 | 
				
			||||
  _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \
 | 
				
			||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistent_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
    case QWERTY:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistent_default_layer_set(1UL<<_QWERTY);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case COLEMAK:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_colemak, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistent_default_layer_set(1UL<<_COLEMAK);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case DVORAK:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistent_default_layer_set(1UL<<_DVORAK);
 | 
				
			||||
      }
 | 
				
			||||
      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;
 | 
				
			||||
    case ADJUST:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        layer_on(_ADJUST);
 | 
				
			||||
      } else {
 | 
				
			||||
        layer_off(_ADJUST);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
  }
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,74 @@
 | 
				
			||||
#ifndef CONFIG_H
 | 
				
			||||
#define CONFIG_H
 | 
				
			||||
 | 
				
			||||
#include "config_common.h"
 | 
				
			||||
 | 
				
			||||
/* USB Device descriptor parameter */
 | 
				
			||||
 | 
				
			||||
#define VENDOR_ID       0xFEEB
 | 
				
			||||
#define PRODUCT_ID      0x6060
 | 
				
			||||
#define DEVICE_VER      0x0001
 | 
				
			||||
#define MANUFACTURER    MJT
 | 
				
			||||
#define PRODUCT         Mitosis
 | 
				
			||||
#define DESCRIPTION     q.m.k. keyboard firmware for Mitosis
 | 
				
			||||
 | 
				
			||||
/* key matrix size */
 | 
				
			||||
#define MATRIX_ROWS 5
 | 
				
			||||
#define MATRIX_COLS 10
 | 
				
			||||
 | 
				
			||||
// fix iPhone power adapter issue
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
// #define CATERINA_BOOTLOADER
 | 
				
			||||
 | 
				
			||||
/* define if matrix has ghost */
 | 
				
			||||
//#define MATRIX_HAS_GHOST
 | 
				
			||||
 | 
				
			||||
/* number of backlight levels */
 | 
				
			||||
//#define BACKLIGHT_LEVELS 3
 | 
				
			||||
 | 
				
			||||
#define ONESHOT_TIMEOUT 500
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/* key combination for command */
 | 
				
			||||
#define IS_COMMAND() ( \
 | 
				
			||||
    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
 | 
				
			||||
)
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * Feature disable options
 | 
				
			||||
 *  These options are also useful to firmware size reduction.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#define PREVENT_STUCK_MODIFIERS
 | 
				
			||||
 | 
				
			||||
/* disable debug print */
 | 
				
			||||
//#define NO_DEBUG
 | 
				
			||||
 | 
				
			||||
/* disable print */
 | 
				
			||||
//#define NO_PRINT
 | 
				
			||||
 | 
				
			||||
/* disable action features */
 | 
				
			||||
//#define NO_ACTION_LAYER
 | 
				
			||||
//#define NO_ACTION_TAPPING
 | 
				
			||||
//#define NO_ACTION_ONESHOT
 | 
				
			||||
//#define NO_ACTION_MACRO
 | 
				
			||||
//#define NO_ACTION_FUNCTION
 | 
				
			||||
 | 
				
			||||
//UART settings for communication with the RF microcontroller
 | 
				
			||||
#define SERIAL_UART_BAUD 1000000
 | 
				
			||||
#define SERIAL_UART_DATA UDR1
 | 
				
			||||
#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
 | 
				
			||||
#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
 | 
				
			||||
#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
 | 
				
			||||
#define SERIAL_UART_INIT() do { \
 | 
				
			||||
    	/* baud rate */ \
 | 
				
			||||
    	UBRR1L = SERIAL_UART_UBRR; \
 | 
				
			||||
    	/* baud rate */ \
 | 
				
			||||
    	UBRR1H = SERIAL_UART_UBRR >> 8; \
 | 
				
			||||
    	/* enable TX and RX */ \
 | 
				
			||||
    	UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
 | 
				
			||||
    	/* 8-bit data */ \
 | 
				
			||||
    	UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
 | 
				
			||||
  	} while(0)
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,329 @@
 | 
				
			||||
// this is the style you want to emulate.
 | 
				
			||||
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
 | 
				
			||||
 | 
				
			||||
#include "mitosis.h"
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
 | 
				
			||||
// 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.
 | 
				
			||||
enum mitosis_layers
 | 
				
			||||
{
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _SHIFTED,
 | 
				
			||||
  _FUNCTIONPC,
 | 
				
			||||
  _FUNCTIONMAC,
 | 
				
			||||
  _FUNCSHIFT,
 | 
				
			||||
  _ADJUST
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum mitosis_keycodes
 | 
				
			||||
{
 | 
				
			||||
  FNKEY = SAFE_RANGE,
 | 
				
			||||
  SHIFT,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  FNMAC,
 | 
				
			||||
  FNPC,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// Macro definitions for readability
 | 
				
			||||
enum mitosis_macros
 | 
				
			||||
{
 | 
				
			||||
  VOLU,
 | 
				
			||||
  VOLD,
 | 
				
			||||
  ESCM
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
#define LONGPRESS_DELAY 150
 | 
				
			||||
#define LAYER_TOGGLE_DELAY 900
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define __MOD__ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
  [_QWERTY] = { /* QWERTY adapted to this crazy thing */
 | 
				
			||||
    {KC_Q,       KC_W,    KC_E,    KC_R,    KC_T,           KC_Y,    KC_U,    KC_I,    KC_O,        KC_P    },
 | 
				
			||||
    {KC_A,       KC_S,    KC_D,    KC_F,    KC_G,           KC_H,    KC_J,    KC_K,    KC_L,        KC_SCLN },
 | 
				
			||||
    {SFT_T(KC_Z), KC_X,   KC_C,    KC_V,    KC_B,           KC_N,    KC_M,    KC_COMM, KC_DOT,      SFT_T(KC_SLSH) },
 | 
				
			||||
    {XXXXXXX,    KC_LCTL, M(ESCM),  KC_TAB,  KC_QUOT,       KC_LEFT, KC_DOWN, KC_UP,   KC_RIGHT,    XXXXXXX },
 | 
				
			||||
    {XXXXXXX,    KC_LALT, KC_LGUI, KC_SPC,  SHIFT,          FNKEY,   KC_BSPC, KC_ENT,  MO(_ADJUST), XXXXXXX }
 | 
				
			||||
  },
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  [_SHIFTED] = { /* Shifted Layer, layered so that tri_layer can be used, or selectively
 | 
				
			||||
                                   able to modify individual key's shifted behaviour */
 | 
				
			||||
    {_______, _______, _______, _______, _______,       _______, _______, _______, _______, _______ },
 | 
				
			||||
    {_______, _______, _______, _______, _______,       _______, _______, _______, _______, _______ },
 | 
				
			||||
    {_______, _______, _______, _______, _______,       _______, _______, _______, _______, _______ },
 | 
				
			||||
    {XXXXXXX, __MOD__, KC_DEL,  _______, _______,       _______, _______, _______, _______, XXXXXXX },
 | 
				
			||||
    {XXXXXXX, __MOD__, __MOD__, _______, __MOD__,       __MOD__, _______, _______, KC_NO,   XXXXXXX }
 | 
				
			||||
  },
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  [_FUNCTIONPC] = { /* Function Layer mimicks planck's raise layer somewhat */
 | 
				
			||||
    {KC_1,       KC_2,          KC_3,    KC_4,      KC_5,          KC_6,    KC_7,    KC_8,    KC_9,    KC_0    },
 | 
				
			||||
    {LCTL(KC_A), LCTL(KC_S),    _______, LCTL(KC_F),_______,       _______, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC },
 | 
				
			||||
    {LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V),_______,       _______, KC_BSLS, _______, _______, KC_QUOT },
 | 
				
			||||
    {XXXXXXX,    __MOD__,        KC_DEL, _______,   KC_GRV,        KC_HOME, KC_PGDN, KC_PGUP, KC_END,  XXXXXXX },
 | 
				
			||||
    {XXXXXXX,    __MOD__,       __MOD__, _______,   __MOD__,       __MOD__, _______, KC_PSCR, KC_NO,   XXXXXXX }
 | 
				
			||||
  },
 | 
				
			||||
 | 
				
			||||
  [_FUNCTIONMAC] = { /* Function Layer mimicks planck's raise layer somewhat */
 | 
				
			||||
    {KC_1,       KC_2,          KC_3,    KC_4,      KC_5,          KC_6,    KC_7,    KC_8,    KC_9,    KC_0    },
 | 
				
			||||
    {LGUI(KC_A), LGUI(KC_S),    _______, LGUI(KC_F),_______,       _______, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC },
 | 
				
			||||
    {LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V),_______,       _______, KC_BSLS, _______, _______, KC_QUOT },
 | 
				
			||||
    {XXXXXXX,    __MOD__,        KC_DEL, _______,   KC_GRV,        KC_HOME, KC_PGDN, KC_PGUP, KC_END,  XXXXXXX },
 | 
				
			||||
    {XXXXXXX,    __MOD__,       __MOD__, _______,   __MOD__,       __MOD__, _______, KC_PSCR, KC_NO,   XXXXXXX }
 | 
				
			||||
  },
 | 
				
			||||
 | 
				
			||||
  [_FUNCSHIFT] = { /* Function Shifted Layer mimicks planck's lower layer somewhat */
 | 
				
			||||
    {_______, _______, _______, _______, _______,       _______, _______, _______, _______, _______ },
 | 
				
			||||
    {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,         KC_F6,   _______, _______, KC_LCBR, KC_RCBR },
 | 
				
			||||
    {KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,        KC_F12,  _______, _______, _______, _______ },
 | 
				
			||||
    {XXXXXXX, __MOD__, KC_DEL,  _______, KC_TILD,       _______, _______, _______, _______, XXXXXXX },
 | 
				
			||||
    {XXXXXXX, __MOD__, __MOD__, _______, __MOD__,       __MOD__, _______, _______, _______, XXXXXXX }
 | 
				
			||||
  },
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  [_ADJUST] = { /* Adjust layer for fancy stuff and macros */
 | 
				
			||||
    {RESET,   FNPC,    _______, _______,  _______,       _______, DYN_REC_START1,  DYN_REC_START2,  _______,  _______ },
 | 
				
			||||
    {FNMAC,   _______,   AU_ON, AU_OFF,   _______,       _______, _______,         _______,         MACSLEEP, _______ },
 | 
				
			||||
    {MUV_DE,  MUV_IN,    MU_ON, MU_OFF,   _______,       _______, KC_MUTE,         KC_MPRV,         KC_MNXT,  KC_MPLY },
 | 
				
			||||
    {XXXXXXX, __MOD__, _______, _______,  _______,       _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2,  _______,  XXXXXXX },
 | 
				
			||||
    {XXXXXXX, __MOD__, __MOD__, _______,  __MOD__,       __MOD__, _______,         _______,         __MOD__,  XXXXXXX }
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]    = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dyn_macro_rec[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_dyn_macro_play[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_fnpc[][2]     = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_fnmac[][2]  = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
static uint16_t function_layer = _FUNCTIONMAC;
 | 
				
			||||
static uint16_t key_timer;
 | 
				
			||||
 | 
				
			||||
void persistent_function_layer_set(uint16_t new_function_layer) {
 | 
				
			||||
  // eeconfig_update_function_layer(new_function_layer);
 | 
				
			||||
  function_layer = new_function_layer;
 | 
				
			||||
  // should clear layers to avoid getting stuck.
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
				
			||||
{
 | 
				
			||||
  // MACRODOWN only works in this function
 | 
				
			||||
  switch(id) {
 | 
				
			||||
 | 
				
			||||
  //switch multiplexing for media, short tap for volume up, long press for play/pause
 | 
				
			||||
  case VOLU:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      key_timer = timer_read();           // if the key is being pressed, we start the timer.
 | 
				
			||||
    } else {         // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
 | 
				
			||||
      if (timer_elapsed(key_timer) > LONGPRESS_DELAY) {           // LONGPRESS_DELAY being 150ms, the threshhold we pick for counting something as a tap.
 | 
				
			||||
        return MACRO(T(MPLY), END);
 | 
				
			||||
      } else {
 | 
				
			||||
        return MACRO(T(VOLU), END);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
    break;
 | 
				
			||||
 | 
				
			||||
  //switch multiplexing for media, short tap for volume down, long press for next track
 | 
				
			||||
  case VOLD:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      key_timer = timer_read();
 | 
				
			||||
    } else {
 | 
				
			||||
      if (timer_elapsed(key_timer) > LONGPRESS_DELAY) {
 | 
				
			||||
        return MACRO(T(MNXT), END);
 | 
				
			||||
      } else {
 | 
				
			||||
        return MACRO(T(VOLD), END);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
    break;
 | 
				
			||||
 | 
				
			||||
  //switch multiplexing for escape, short tap for escape, long press for context menu
 | 
				
			||||
  case ESCM:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      key_timer = timer_read();
 | 
				
			||||
    } else {
 | 
				
			||||
      if (timer_elapsed(key_timer) > LONGPRESS_DELAY) {
 | 
				
			||||
        return MACRO(T(APP), END);
 | 
				
			||||
      } else {
 | 
				
			||||
        return MACRO(T(ESC), END);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
    break;
 | 
				
			||||
  }
 | 
				
			||||
  return MACRO_NONE;
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
static bool singular_key = false;
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = (keycode == MO(_ADJUST) ? DYN_REC_STOP : keycode);
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
  uint8_t layer;
 | 
				
			||||
  layer = biton32(layer_state);  // get the current layer
 | 
				
			||||
 | 
				
			||||
  //custom layer handling for tri_layer,
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
  case MACSLEEP:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
 | 
				
			||||
      register_code(KC_RSFT);
 | 
				
			||||
      register_code(KC_RCTL);
 | 
				
			||||
      register_code(KC_POWER);
 | 
				
			||||
      unregister_code(KC_POWER);
 | 
				
			||||
      unregister_code(KC_RCTL);
 | 
				
			||||
      unregister_code(KC_RSFT);
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  case FNKEY:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      key_timer = timer_read();
 | 
				
			||||
      singular_key = true;
 | 
				
			||||
      // layer_on(_FUNCTION);
 | 
				
			||||
      layer_on(function_layer);
 | 
				
			||||
    } else {
 | 
				
			||||
      if (timer_elapsed(key_timer) < LAYER_TOGGLE_DELAY || !singular_key) {
 | 
				
			||||
        layer_off(function_layer);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
    update_tri_layer(function_layer, _SHIFTED, _FUNCSHIFT);
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  //SHIFT is handled as LSHIFT in the general case
 | 
				
			||||
  case SHIFT:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      key_timer = timer_read();
 | 
				
			||||
      singular_key = true;
 | 
				
			||||
      layer_on(_SHIFTED);
 | 
				
			||||
      register_code(KC_LSFT);
 | 
				
			||||
    } else {
 | 
				
			||||
      if (timer_elapsed(key_timer) < LAYER_TOGGLE_DELAY || !singular_key) {
 | 
				
			||||
        layer_off(_SHIFTED);
 | 
				
			||||
        unregister_code(KC_LSFT);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
    update_tri_layer(function_layer, _SHIFTED, _FUNCSHIFT);
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  case FNPC:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      persistent_function_layer_set(_FUNCTIONPC);
 | 
				
			||||
      #ifdef AUDIO_ENABLE
 | 
				
			||||
        PLAY_NOTE_ARRAY(tone_fnpc, false, 0);
 | 
				
			||||
      #endif
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  case FNMAC:
 | 
				
			||||
    if (record->event.pressed) {
 | 
				
			||||
      persistent_function_layer_set(_FUNCTIONMAC);
 | 
				
			||||
      #ifdef AUDIO_ENABLE
 | 
				
			||||
        PLAY_NOTE_ARRAY(tone_fnmac, false, 0);
 | 
				
			||||
      #endif
 | 
				
			||||
    }
 | 
				
			||||
    return false;
 | 
				
			||||
    break;
 | 
				
			||||
  //If any other key was pressed during the layer mod hold period,
 | 
				
			||||
  //then the layer mod was used momentarily, and should block latching
 | 
				
			||||
  default:
 | 
				
			||||
    singular_key = false;
 | 
				
			||||
    break;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  //FUNCSHIFT has been shifted by the SHIFT handling, some keys need to be excluded
 | 
				
			||||
  if (layer == _FUNCSHIFT) {
 | 
				
			||||
    //F1-F12 should be sent as unshifted keycodes,
 | 
				
			||||
    //and ] needs to be unshifted or it is sent as }
 | 
				
			||||
    if ( (keycode >= KC_F1 && keycode <= KC_F12)
 | 
				
			||||
         || keycode == KC_RBRC ) {
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        unregister_mods(MOD_LSFT);
 | 
				
			||||
      } else {
 | 
				
			||||
        register_mods(MOD_LSFT);
 | 
				
			||||
      }
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  return true;
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
void startup_user()
 | 
				
			||||
{
 | 
				
			||||
    _delay_ms(20); // gets rid of tick
 | 
				
			||||
    PLAY_NOTE_ARRAY(tone_startup, false, 0);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void shutdown_user()
 | 
				
			||||
{
 | 
				
			||||
    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
 | 
				
			||||
    _delay_ms(150);
 | 
				
			||||
    stop_all_notes();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_on_user(void)
 | 
				
			||||
{
 | 
				
			||||
    music_scale_user();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_scale_user(void)
 | 
				
			||||
{
 | 
				
			||||
    PLAY_NOTE_ARRAY(music_scale, false, 0);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void matrix_scan_user(void) {
 | 
				
			||||
  uint8_t layer = biton32(layer_state);
 | 
				
			||||
 | 
				
			||||
  switch (layer) {
 | 
				
			||||
  case _QWERTY:
 | 
				
			||||
    set_led_off;
 | 
				
			||||
    break;
 | 
				
			||||
  case _FUNCTIONMAC:
 | 
				
			||||
    set_led_blue;
 | 
				
			||||
    break;
 | 
				
			||||
  case _FUNCTIONPC:
 | 
				
			||||
    set_led_cyan;
 | 
				
			||||
    break;
 | 
				
			||||
  case _SHIFTED:
 | 
				
			||||
    set_led_red;
 | 
				
			||||
    break;
 | 
				
			||||
  case _FUNCSHIFT:
 | 
				
			||||
    set_led_green;
 | 
				
			||||
    break;
 | 
				
			||||
  case _ADJUST:
 | 
				
			||||
    set_led_white;
 | 
				
			||||
    break;
 | 
				
			||||
  default:
 | 
				
			||||
    break;
 | 
				
			||||
  }
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,33 @@
 | 
				
			||||
#ifndef CONFIG_USER_H
 | 
				
			||||
#define CONFIG_USER_H
 | 
				
			||||
 | 
				
			||||
#include "../../config.h"
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * MIDI options
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* Prevent use of disabled MIDI features in the keymap */
 | 
				
			||||
//#define MIDI_ENABLE_STRICT 1
 | 
				
			||||
 | 
				
			||||
/* enable basic MIDI features:
 | 
				
			||||
   - MIDI notes can be sent when in Music mode is on
 | 
				
			||||
*/
 | 
				
			||||
// #define MIDI_BASIC
 | 
				
			||||
 | 
				
			||||
/* enable advanced MIDI features:
 | 
				
			||||
   - MIDI notes can be added to the keymap
 | 
				
			||||
   - Octave shift and transpose
 | 
				
			||||
   - Virtual sustain, portamento, and modulation wheel
 | 
				
			||||
   - etc.
 | 
				
			||||
*/
 | 
				
			||||
//#define MIDI_ADVANCED
 | 
				
			||||
 | 
				
			||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 | 
				
			||||
//#define MIDI_TONE_KEYCODE_OCTAVES 2
 | 
				
			||||
 | 
				
			||||
// fix iPhone power adapter issue
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,283 @@
 | 
				
			||||
// This is MJT's bastardization of the planck and minivan defaults
 | 
				
			||||
 | 
				
			||||
#include "planck.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
 | 
				
			||||
// 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.
 | 
				
			||||
 | 
				
			||||
enum planck_layers {
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _LOWER,
 | 
				
			||||
  _RAISE,
 | 
				
			||||
  _PLOVER,
 | 
				
			||||
  _ADJUST,
 | 
				
			||||
  _DYN
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum planck_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  PLOVER,
 | 
				
			||||
  LOWER,
 | 
				
			||||
  RAISE,
 | 
				
			||||
  BACKLIT,
 | 
				
			||||
  EXT_PLV,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
 | 
				
			||||
/* Qwerty
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_QWERTY] = {
 | 
				
			||||
  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
 | 
				
			||||
  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
 | 
				
			||||
  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, SFT_T(KC_ENT) },
 | 
				
			||||
  {MO(_DYN), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Lower
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | | Home | End  |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_LOWER] = {
 | 
				
			||||
  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR,    KC_ASTR,    KC_LPRN, KC_RPRN, _______},
 | 
				
			||||
  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS,    KC_PLUS,    KC_LCBR, KC_RCBR, KC_PIPE},
 | 
				
			||||
  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END,  _______},
 | 
				
			||||
  {_______, _______, _______, _______, _______, _______, _______, _______,    KC_MNXT,    KC_VOLD, KC_VOLU, KC_MPLY}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Raise
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |Pg Dn |Pg Up |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Home |Pg Dn |Pg Up | End  |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_RAISE] = {
 | 
				
			||||
  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    _______},
 | 
				
			||||
  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
 | 
				
			||||
  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______},
 | 
				
			||||
  {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Plover layer (http://opensteno.org)
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
[_PLOVER] = {
 | 
				
			||||
  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
 | 
				
			||||
  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
 | 
				
			||||
  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
 | 
				
			||||
  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Adjust (Lower + Raise)
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |      | Reset|      |      |      |      |      |      |      |Pause |PR SC |  Del |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|      |Sleep |Plover|      |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |TogLED|      |      |      |      |             |      |      |      |      |      |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_ADJUST] = {
 | 
				
			||||
  {_______ , RESET,   _______, _______, _______, _______, _______, _______, _______, KC_PAUS, KC_PSCR, KC_DEL },
 | 
				
			||||
  {_______ , _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  _______, MACSLEEP,  PLOVER, _______},
 | 
				
			||||
  {_______ , MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
 | 
				
			||||
  {BACKLIT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 | 
				
			||||
},
 | 
				
			||||
[_DYN] = {
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______ },
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]    = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dyn_macro_rec[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_dyn_macro_play[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_plover[][2]     = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
    case QWERTY:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_qwerty);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_QWERTY);
 | 
				
			||||
      }
 | 
				
			||||
      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;
 | 
				
			||||
    case BACKLIT:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        register_code(KC_RSFT);
 | 
				
			||||
        #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
          backlight_step();
 | 
				
			||||
        #endif
 | 
				
			||||
      } else {
 | 
				
			||||
        unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case PLOVER:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          stop_all_notes();
 | 
				
			||||
          PLAY_SONG(tone_plover);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_RAISE);
 | 
				
			||||
        layer_off(_LOWER);
 | 
				
			||||
        layer_off(_ADJUST);
 | 
				
			||||
        layer_on(_PLOVER);
 | 
				
			||||
        if (!eeconfig_is_enabled()) {
 | 
				
			||||
            eeconfig_init();
 | 
				
			||||
        }
 | 
				
			||||
        keymap_config.raw = eeconfig_read_keymap();
 | 
				
			||||
        keymap_config.nkro = 1;
 | 
				
			||||
        eeconfig_update_keymap(keymap_config.raw);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case EXT_PLV:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_plover_gb);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_PLOVER);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case MACSLEEP:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_RCTL);
 | 
				
			||||
          register_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_RCTL);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
  }
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    #ifdef AUDIO_ENABLE
 | 
				
			||||
        startup_user();
 | 
				
			||||
    #endif
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
void startup_user()
 | 
				
			||||
{
 | 
				
			||||
    _delay_ms(20); // gets rid of tick
 | 
				
			||||
    PLAY_SONG(tone_startup);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void shutdown_user()
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(tone_goodbye);
 | 
				
			||||
    _delay_ms(150);
 | 
				
			||||
    stop_all_notes();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_on_user(void)
 | 
				
			||||
{
 | 
				
			||||
    music_scale_user();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_scale_user(void)
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(music_scale);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,22 @@
 | 
				
			||||
# Mike's Plancklike Planck
 | 
				
			||||
 | 
				
			||||
- Music/Audio
 | 
				
			||||
- Dynamic Macros
 | 
				
			||||
- Media Keys
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Qwerty for letters and mods.
 | 
				
			||||
 | 
				
			||||
Raise and Lower are mostly default with a few tweaks.
 | 
				
			||||
 | 
				
			||||
Adjust layer is tough to get to so it is only for keyboard configuration stuff.
 | 
				
			||||
 | 
				
			||||
## Dynamic Macros
 | 
				
			||||
 | 
				
			||||
Hold TAB key, then press ";" to record macro 1 and "'" to record macro 2.
 | 
				
			||||
 | 
				
			||||
When you are done recording, press TAB again.
 | 
				
			||||
 | 
				
			||||
For playback of macros, TAB+"," plays macro 1 and TAB+","plays macro 2.
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,33 @@
 | 
				
			||||
#ifndef CONFIG_USER_H
 | 
				
			||||
#define CONFIG_USER_H
 | 
				
			||||
 | 
				
			||||
#include "../../config.h"
 | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
 * MIDI options
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
/* Prevent use of disabled MIDI features in the keymap */
 | 
				
			||||
//#define MIDI_ENABLE_STRICT 1
 | 
				
			||||
 | 
				
			||||
/* enable basic MIDI features:
 | 
				
			||||
   - MIDI notes can be sent when in Music mode is on
 | 
				
			||||
*/
 | 
				
			||||
// #define MIDI_BASIC
 | 
				
			||||
 | 
				
			||||
/* enable advanced MIDI features:
 | 
				
			||||
   - MIDI notes can be added to the keymap
 | 
				
			||||
   - Octave shift and transpose
 | 
				
			||||
   - Virtual sustain, portamento, and modulation wheel
 | 
				
			||||
   - etc.
 | 
				
			||||
*/
 | 
				
			||||
//#define MIDI_ADVANCED
 | 
				
			||||
 | 
				
			||||
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 | 
				
			||||
//#define MIDI_TONE_KEYCODE_OCTAVES 2
 | 
				
			||||
 | 
				
			||||
// fix iPhone power adapter issue
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,282 @@
 | 
				
			||||
// This is MJT's bastardization of the planck and minivan defaults
 | 
				
			||||
 | 
				
			||||
#include "planck.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
// Each layer gets a name for readability, which is then used in the keymap matrix below.
 | 
				
			||||
// 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.
 | 
				
			||||
 | 
				
			||||
enum planck_layers {
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _FKEYS,
 | 
				
			||||
  _NUMSYM,
 | 
				
			||||
  _PLOVER,
 | 
				
			||||
  _ADJUST
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum planck_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  PLOVER,
 | 
				
			||||
  FKEYS,
 | 
				
			||||
  NUMSYM,
 | 
				
			||||
  BACKLIT,
 | 
				
			||||
  EXT_PLV,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
 | 
				
			||||
/* Qwerty
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * | Brite| Ctrl | Alt  | GUI  |FKEYS |    Space    |NUMSYM | Left | Down |  Up  |Right |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_QWERTY] = {
 | 
				
			||||
  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
 | 
				
			||||
  {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
 | 
				
			||||
  {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, SFT_T(KC_ENT) },
 | 
				
			||||
  {KC_LCTL, KC_LCTL, KC_LALT, KC_LGUI, FKEYS,   KC_SPC,  KC_SPC,  NUMSYM,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* FKEYS
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   ~  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * | Del  | F11  | F12  | F13  | F14  | F15  |      |      |Sleep |      | Rec1 | Rec2 |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |      |      |      | Mac1 | Mac2 |      | Stop |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_FKEYS] = {
 | 
				
			||||
  {KC_TILD, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  _______},
 | 
				
			||||
  {KC_DEL,  KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F6,   _______, _______, MACSLEEP, DYN_REC_START1, DYN_REC_START2},
 | 
				
			||||
  {_______, _______, _______, _______, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______, DYN_REC_STOP},
 | 
				
			||||
  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* NUMSYM
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |  Del |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  |  '   |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |   _  |   +  |   {  |   }  |   |  |   -  |   =  |   [  |   ]  |   \  |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |      |      |             |      | Home |Pg Dn |Pg Up | End  |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_NUMSYM] = {
 | 
				
			||||
  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    _______},
 | 
				
			||||
  {KC_DEL, KC_EXLM,  KC_AT,  KC_HASH, KC_DLR,  KC_PERC,  KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______},
 | 
				
			||||
  {_______,KC_UNDS,  KC_PLUS,KC_LCBR, KC_RCBR, KC_PIPE,  KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, _______},
 | 
				
			||||
  {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Plover layer (http://opensteno.org)
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
[_PLOVER] = {
 | 
				
			||||
  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
 | 
				
			||||
  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
 | 
				
			||||
  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
 | 
				
			||||
  {EXT_PLV, XXXXXXX, XXXXXXX, KC_C,    KC_V,    XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
 | 
				
			||||
},
 | 
				
			||||
 | 
				
			||||
/* Adjust (FKEYS + NUMSYM)
 | 
				
			||||
 * ,-----------------------------------------------------------------------------------.
 | 
				
			||||
 * |      | Reset|      |      |      |      |      |      |      |Pause |PR SC |  Del |
 | 
				
			||||
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 | 
				
			||||
 * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|      |Sleep |Plover|      |
 | 
				
			||||
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 | 
				
			||||
 * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
 | 
				
			||||
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 | 
				
			||||
 * |TogLED|      |      |      |      |             |      |      |      |      |      |
 | 
				
			||||
 * `-----------------------------------------------------------------------------------'
 | 
				
			||||
 */
 | 
				
			||||
[_ADJUST] = {
 | 
				
			||||
  {_______ , RESET,   _______, _______, _______, _______, _______, _______, _______, KC_PAUS, KC_PSCR, KC_DEL },
 | 
				
			||||
  {_______ , _______, _______, AU_ON,   AU_OFF,  AG_NORM, AG_SWAP, QWERTY,  _______, MACSLEEP,  PLOVER, _______},
 | 
				
			||||
  {_______ , MUV_DE,  MUV_IN,  MU_ON,   MU_OFF,  MI_ON,   MI_OFF,  _______, _______, _______, _______, _______},
 | 
				
			||||
  {BACKLIT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 | 
				
			||||
} /*,
 | 
				
			||||
[_DYN] = {
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______ },
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
 | 
				
			||||
  {_______ , _______, _______, _______, _______, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______}
 | 
				
			||||
}*/
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]    = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dyn_macro_rec[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_dyn_macro_play[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_plover[][2]     = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = (keycode == FKEYS ? DYN_REC_STOP : keycode);
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
    case QWERTY:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_qwerty);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_QWERTY);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case FKEYS:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        layer_on(_FKEYS);
 | 
				
			||||
        update_tri_layer(_FKEYS, _NUMSYM, _ADJUST);
 | 
				
			||||
      } else {
 | 
				
			||||
        layer_off(_FKEYS);
 | 
				
			||||
        update_tri_layer(_FKEYS, _NUMSYM, _ADJUST);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case NUMSYM:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        layer_on(_NUMSYM);
 | 
				
			||||
        update_tri_layer(_FKEYS, _NUMSYM, _ADJUST);
 | 
				
			||||
      } else {
 | 
				
			||||
        layer_off(_NUMSYM);
 | 
				
			||||
        update_tri_layer(_FKEYS, _NUMSYM, _ADJUST);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case BACKLIT:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        register_code(KC_RSFT);
 | 
				
			||||
        #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
          backlight_step();
 | 
				
			||||
        #endif
 | 
				
			||||
      } else {
 | 
				
			||||
        unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case PLOVER:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          stop_all_notes();
 | 
				
			||||
          PLAY_SONG(tone_plover);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_NUMSYM);
 | 
				
			||||
        layer_off(_FKEYS);
 | 
				
			||||
        layer_off(_ADJUST);
 | 
				
			||||
        layer_on(_PLOVER);
 | 
				
			||||
        if (!eeconfig_is_enabled()) {
 | 
				
			||||
            eeconfig_init();
 | 
				
			||||
        }
 | 
				
			||||
        keymap_config.raw = eeconfig_read_keymap();
 | 
				
			||||
        keymap_config.nkro = 1;
 | 
				
			||||
        eeconfig_update_keymap(keymap_config.raw);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case EXT_PLV:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_SONG(tone_plover_gb);
 | 
				
			||||
        #endif
 | 
				
			||||
        layer_off(_PLOVER);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case MACSLEEP:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_RCTL);
 | 
				
			||||
          register_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_RCTL);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
  }
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    #ifdef AUDIO_ENABLE
 | 
				
			||||
        startup_user();
 | 
				
			||||
    #endif
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
void startup_user()
 | 
				
			||||
{
 | 
				
			||||
    _delay_ms(20); // gets rid of tick
 | 
				
			||||
    PLAY_SONG(tone_startup);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void shutdown_user()
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(tone_goodbye);
 | 
				
			||||
    _delay_ms(150);
 | 
				
			||||
    stop_all_notes();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_on_user(void)
 | 
				
			||||
{
 | 
				
			||||
    music_scale_user();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_scale_user(void)
 | 
				
			||||
{
 | 
				
			||||
    PLAY_SONG(music_scale);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,26 @@
 | 
				
			||||
# Mike's Rethought Planck
 | 
				
			||||
 | 
				
			||||
- Music/Audio
 | 
				
			||||
- Dynamic Macros
 | 
				
			||||
- Media Keys
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Qwerty for letters and mods.
 | 
				
			||||
 | 
				
			||||
Numsym for all numbers and symbols used in typing. Follows a similar approach to
 | 
				
			||||
planck but puts both on the same layer eschewing the F-keys.  
 | 
				
			||||
 | 
				
			||||
Fkeys layer is for the seldom used stuff like F-keys and some additional features
 | 
				
			||||
such as dynamic macros, media keys, and a sleep shortcut for OS X.
 | 
				
			||||
 | 
				
			||||
Adjust layer is mainly for keyboard configuration stuff.
 | 
				
			||||
 | 
				
			||||
## Dynamic Macros
 | 
				
			||||
 | 
				
			||||
Hold TAB key, then press ";" to record macro 1 and "'" to record macro 2.
 | 
				
			||||
 | 
				
			||||
When you are done recording, press TAB again.
 | 
				
			||||
 | 
				
			||||
For playback of macros, TAB+"," plays macro 1 and TAB+","plays macro 2.
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in 
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = no         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,8 @@
 | 
				
			||||
#ifndef CONFIG_USER_H
 | 
				
			||||
#define CONFIG_USER_H
 | 
				
			||||
 | 
				
			||||
#include "../../config.h"
 | 
				
			||||
 | 
				
			||||
// place overrides here
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,216 @@
 | 
				
			||||
#include "roadkit.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
#ifdef BACKLIGHT_ENABLE
 | 
				
			||||
  #include "backlight.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void backlight_toggle(void){
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum roadkit_layers {
 | 
				
			||||
  _NUMPAD,
 | 
				
			||||
  _FPH,
 | 
				
			||||
  _FPHNOISY,
 | 
				
			||||
  _ADJUST,
 | 
				
			||||
  _DYN
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum roadkit_keycodes {
 | 
				
			||||
  NUMPAD = SAFE_RANGE,
 | 
				
			||||
  FPH_1,
 | 
				
			||||
  FPH_2,
 | 
				
			||||
  FPH_3,
 | 
				
			||||
  FPH_4,
 | 
				
			||||
  FPH_5,
 | 
				
			||||
  FPH_6,
 | 
				
			||||
  FPH_7,
 | 
				
			||||
  FPH_8,
 | 
				
			||||
  FPH_9,
 | 
				
			||||
  FN_0,
 | 
				
			||||
  BACKLIT,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
// Fillers to make keymaps cleaner looking
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
  [_NUMPAD] = /* Numpad */
 | 
				
			||||
    KEYMAP(KC_KP_7, KC_KP_8,   KC_KP_9, KC_KP_PLUS,  \
 | 
				
			||||
           KC_KP_4, KC_KP_5,   KC_KP_6,              \
 | 
				
			||||
           KC_KP_1, KC_KP_2,   KC_KP_3, KC_KP_ENTER, \
 | 
				
			||||
           LT(_ADJUST, KC_KP_0),  KC_KP_DOT),
 | 
				
			||||
  [_FPH] = /* Quiet T9 */
 | 
				
			||||
    KEYMAP(FPH_7, FPH_8,   FPH_9, KC_KP_PLUS,  \
 | 
				
			||||
           FPH_4, FPH_5,   FPH_6,              \
 | 
				
			||||
           FPH_1, FPH_2,   FPH_3, SFT_T(KC_KP_ENTER), \
 | 
				
			||||
           LT(_ADJUST, KC_SPACE),   KC_KP_DOT),
 | 
				
			||||
  [_FPHNOISY] = /* Noisy T9 */
 | 
				
			||||
    KEYMAP(FPH_7, FPH_8,   FPH_9, KC_KP_PLUS,  \
 | 
				
			||||
           FPH_4, FPH_5,   FPH_6,              \
 | 
				
			||||
           FPH_1, FPH_2,   FPH_3, SFT_T(KC_KP_ENTER), \
 | 
				
			||||
           LT(_ADJUST, KC_SPACE),   KC_KP_DOT),
 | 
				
			||||
 [_ADJUST] = /* Adjustments */
 | 
				
			||||
   KEYMAP(KC_NUMLOCK, TG(_FPHNOISY),  TG(_FPH), TG(_NUMPAD),  \
 | 
				
			||||
         KC_BSPC, BACKLIT,   KC_DEL,              \
 | 
				
			||||
         MACSLEEP, _______,   _______, _______, \
 | 
				
			||||
         _______,           MO(_DYN)),
 | 
				
			||||
 [_DYN] = /* DYNAMIC MACRO */
 | 
				
			||||
    KEYMAP(DYN_REC_START1, DYN_REC_START2, _______, DYN_REC_STOP,  \
 | 
				
			||||
         _______, _______,  _______,              \
 | 
				
			||||
         DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______, _______, \
 | 
				
			||||
         _______,            _______),
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
uint16_t fph_tap_qty = false;
 | 
				
			||||
uint16_t fph_keycode = 0; // stores which spacebar was used, either raise or lower...
 | 
				
			||||
 | 
				
			||||
uint16_t get_render_keycode(uint16_t keycode, uint16_t tap_qty){ // maybe replace shift with "mods"
 | 
				
			||||
  tap_qty--; // reduce by one to match array indexes.
 | 
				
			||||
  switch(keycode){
 | 
				
			||||
    case FPH_2:
 | 
				
			||||
      {uint16_t kc[] = {KC_A, KC_B, KC_C};
 | 
				
			||||
       if(tap_qty % 6 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 3]);
 | 
				
			||||
      return kc[tap_qty % 3];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_3:
 | 
				
			||||
      {uint16_t kc[] = {KC_D, KC_E, KC_F};
 | 
				
			||||
       if(tap_qty % 6 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 3]);
 | 
				
			||||
      return kc[tap_qty % 3];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_4:
 | 
				
			||||
      {uint16_t kc[] = {KC_G, KC_H, KC_I};
 | 
				
			||||
       if(tap_qty % 6 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 3]);
 | 
				
			||||
      return kc[tap_qty % 3];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_5:
 | 
				
			||||
      {uint16_t kc[] = {KC_J, KC_K, KC_L};
 | 
				
			||||
       if(tap_qty % 6 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 3]);
 | 
				
			||||
      return kc[tap_qty % 3];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_6:
 | 
				
			||||
      {uint16_t kc[] = {KC_M, KC_N, KC_O};
 | 
				
			||||
       if(tap_qty % 6 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 3]);
 | 
				
			||||
      return kc[tap_qty % 3];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_7:
 | 
				
			||||
      {uint16_t kc[] = {KC_P, KC_Q, KC_R, KC_S};
 | 
				
			||||
       if(tap_qty % 8 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 4]);
 | 
				
			||||
      return kc[tap_qty % 4];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_8:
 | 
				
			||||
      {uint16_t kc[] = {KC_T, KC_U, KC_V};
 | 
				
			||||
       if(tap_qty % 8 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 4]);
 | 
				
			||||
      return kc[tap_qty % 4];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_9:
 | 
				
			||||
      {uint16_t kc[] = {KC_W, KC_X, KC_Y, KC_Z};
 | 
				
			||||
       if(tap_qty % 8 > 2)
 | 
				
			||||
        return LSFT(kc[tap_qty % 4]);
 | 
				
			||||
      return kc[tap_qty % 4];}
 | 
				
			||||
    break;
 | 
				
			||||
    case FPH_1:
 | 
				
			||||
      {uint16_t kc[] = {KC_COMM, LSFT(KC_SLSH), KC_EXLM, KC_AT, KC_MINS, KC_UNDS, KC_PLUS, \
 | 
				
			||||
          KC_SCLN, LSFT(KC_SCLN), KC_QUOT, LSFT(KC_QUOT), KC_TILD, \
 | 
				
			||||
          KC_PIPE, KC_BSLS, KC_HASH, LSFT(KC_4), KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, \
 | 
				
			||||
          KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, LSFT(KC_COMM), LSFT(KC_DOT)};
 | 
				
			||||
      return kc[tap_qty % 26];}
 | 
				
			||||
  }
 | 
				
			||||
  return KC_NO;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
    if (!process_record_dynamic_macro(keycode, record)) {
 | 
				
			||||
      return false;
 | 
				
			||||
    }
 | 
				
			||||
    uint8_t layer;
 | 
				
			||||
    layer = biton32(layer_state);
 | 
				
			||||
 | 
				
			||||
    switch (keycode) {
 | 
				
			||||
    case FPH_1 ... FPH_9:
 | 
				
			||||
      if(layer == _FPHNOISY){
 | 
				
			||||
        if (record->event.pressed) {
 | 
				
			||||
          if(fph_keycode != keycode) { // key change
 | 
				
			||||
            fph_tap_qty = 0;
 | 
				
			||||
            fph_keycode = keycode;
 | 
				
			||||
          } else { // same key tapped again so erase and increment.
 | 
				
			||||
            register_code(KC_BSPC);
 | 
				
			||||
            unregister_code(KC_BSPC);
 | 
				
			||||
            fph_tap_qty++;
 | 
				
			||||
          }
 | 
				
			||||
          uint16_t render_keycode = get_render_keycode(keycode, fph_tap_qty);
 | 
				
			||||
          // find mods? Apply mods..
 | 
				
			||||
          register_code(render_keycode);
 | 
				
			||||
          unregister_code(render_keycode);
 | 
				
			||||
        } else {
 | 
				
			||||
          // do we need to do anything on key-release?
 | 
				
			||||
        }
 | 
				
			||||
      } else { // not noisy, be demure .
 | 
				
			||||
        if (record->event.pressed) {
 | 
				
			||||
          if(fph_keycode != keycode) { // key change, kill everything.
 | 
				
			||||
            uint16_t render_keycode = get_render_keycode(fph_keycode, fph_tap_qty);
 | 
				
			||||
            // find mods? Apply mods..
 | 
				
			||||
            register_code(render_keycode);
 | 
				
			||||
            unregister_code(render_keycode);
 | 
				
			||||
            fph_keycode = keycode;
 | 
				
			||||
            fph_tap_qty = 0;
 | 
				
			||||
          } else { // same key tapped again so increment counter silently
 | 
				
			||||
            fph_tap_qty++;
 | 
				
			||||
          }
 | 
				
			||||
        } else {
 | 
				
			||||
            // do we need to do anything on key-release?
 | 
				
			||||
            // maybe start a timer on this one?
 | 
				
			||||
        }
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case BACKLIT:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
          backlight_step();
 | 
				
			||||
        #endif
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case MACSLEEP:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_RCTL);
 | 
				
			||||
          register_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_RCTL);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
  }
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,26 @@
 | 
				
			||||
# Flip Phone layout for Roadkit
 | 
				
			||||
 | 
				
			||||
BEWARE, THIS DOES NOT WORK YET. 
 | 
				
			||||
 | 
				
			||||
Uses the numpad with classic cellular phone style letters assigned to the numbers.
 | 
				
			||||
 | 
				
			||||
# LAYERS
 | 
				
			||||
 | 
				
			||||
* Numpad - The layer that matches the caps mostly
 | 
				
			||||
* FPH - Base layer for text
 | 
				
			||||
* FPHNOISY - Text layer that outputs every character and then backspaces as they're replaced
 | 
				
			||||
* DYN - dynamic macro layer for recording and playing macros
 | 
				
			||||
 | 
				
			||||
## FPH
 | 
				
			||||
 | 
				
			||||
Poke the "2" key twice and it makes "B".
 | 
				
			||||
 | 
				
			||||
## FPHNOISY
 | 
				
			||||
 | 
				
			||||
Poke the "2" key twice and it makes "A"+backspace+"B" so you can see it cycle through.
 | 
				
			||||
 | 
				
			||||
## MACROS
 | 
				
			||||
 | 
				
			||||
May be able to record macros with the T9 layer because the "KC_*"s are only sent
 | 
				
			||||
at the end.  Trying to do a macro with T9NOISY would probably fill up the buffer
 | 
				
			||||
in just a few characters.
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in 
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = no         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = yes        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = yes           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,8 @@
 | 
				
			||||
#ifndef CONFIG_USER_H
 | 
				
			||||
#define CONFIG_USER_H
 | 
				
			||||
 | 
				
			||||
#include "../../config.h"
 | 
				
			||||
 | 
				
			||||
// place overrides here
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,236 @@
 | 
				
			||||
#include "roadkit.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
 | 
				
			||||
extern keymap_config_t keymap_config;
 | 
				
			||||
 | 
				
			||||
#ifdef BACKLIGHT_ENABLE
 | 
				
			||||
  #include "backlight.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
  #include "audio.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void backlight_toggle(void){
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum roadkit_layers {
 | 
				
			||||
  _NUMPAD,
 | 
				
			||||
  _NAVIGATION,
 | 
				
			||||
  _EXCEL,
 | 
				
			||||
  _ADJUST,
 | 
				
			||||
  _DYN
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum minivan_keycodes {
 | 
				
			||||
  NUMPAD = SAFE_RANGE,
 | 
				
			||||
  NAVIGATION,
 | 
				
			||||
  EXCEL,
 | 
				
			||||
  NUMPAD_LOCK,
 | 
				
			||||
  NAVIGATION_LOCK,
 | 
				
			||||
  EXCEL_LOCK,
 | 
				
			||||
  PARENS,
 | 
				
			||||
  BRACKETS,
 | 
				
			||||
  BRACES,
 | 
				
			||||
  BACKLIT,
 | 
				
			||||
  MACSLEEP,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
// Fillers to make keymaps cleaner looking
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
  [_NUMPAD] = /* Numpad */
 | 
				
			||||
    KEYMAP(KC_KP_7, KC_KP_8,   KC_KP_9, KC_KP_PLUS,  \
 | 
				
			||||
           KC_KP_4, KC_KP_5,   KC_KP_6,              \
 | 
				
			||||
           KC_KP_1, KC_KP_2,   KC_KP_3, NAVIGATION, \
 | 
				
			||||
           EXCEL,            KC_KP_DOT),
 | 
				
			||||
  [_EXCEL] = /* Excel related */
 | 
				
			||||
    KEYMAP(KC_KP_SLASH, KC_KP_ASTERISK,   KC_MINS, KC_TAB,  \
 | 
				
			||||
          KC_QUOT, KC_KP_EQUAL,  PARENS ,              \
 | 
				
			||||
          KC_DQT, BRACKETS,  BRACES, _______, \
 | 
				
			||||
          _______,            MO(_DYN)),
 | 
				
			||||
  [_NAVIGATION] = /* Navigation */
 | 
				
			||||
    KEYMAP(KC_HOME, _______,  KC_PGUP, KC_TAB,  \
 | 
				
			||||
          KC_END,  KC_UP,     KC_PGDN,              \
 | 
				
			||||
          KC_LEFT, KC_DOWN,   KC_RIGHT, _______, \
 | 
				
			||||
          _______,            MO(_DYN)),
 | 
				
			||||
 [_ADJUST] = /* Adjustments */
 | 
				
			||||
   KEYMAP(KC_NUMLOCK, MACSLEEP,   BACKLIT, _______,  \
 | 
				
			||||
         KC_BSPC, _______,   KC_DEL,              \
 | 
				
			||||
         EXCEL_LOCK, NUMPAD_LOCK,   NAVIGATION_LOCK, _______, \
 | 
				
			||||
         _______,          _______),
 | 
				
			||||
 [_DYN] = /* DYNAMIC MACRO */
 | 
				
			||||
    KEYMAP(DYN_REC_START1, DYN_REC_START2, _______, _______,  \
 | 
				
			||||
         _______, _______,  _______,              \
 | 
				
			||||
         DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______, _______, \
 | 
				
			||||
         _______,            _______),
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]    = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_numpad[][2]     = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_excel[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_navigation[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_plover[][2]     = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
bool fn_tap_used = false; // sets to false when space is pressed,
 | 
				
			||||
                          // sets to true when any other key is pressed,
 | 
				
			||||
                          //when space is lifted, if another key was prssed, don't send space.
 | 
				
			||||
uint16_t fn_keycode = 0; // stores which spacebar was used, either raise or lower...
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  if (!process_record_dynamic_macro(keycode, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  switch (keycode) {
 | 
				
			||||
      case NAVIGATION: // This key is enter if tapped, navigation if held
 | 
				
			||||
        if (record->event.pressed) {
 | 
				
			||||
          fn_keycode = NAVIGATION; // these two lines figure out if the next action is
 | 
				
			||||
          fn_tap_used = false;
 | 
				
			||||
          layer_on(_NAVIGATION);
 | 
				
			||||
          update_tri_layer(_EXCEL, _NAVIGATION, _ADJUST);
 | 
				
			||||
        } else {
 | 
				
			||||
          layer_off(_NAVIGATION);
 | 
				
			||||
          update_tri_layer(_EXCEL, _NAVIGATION, _ADJUST);
 | 
				
			||||
          if(!fn_tap_used && fn_keycode == NAVIGATION ){
 | 
				
			||||
              register_code(KC_KP_ENTER);
 | 
				
			||||
              unregister_code(KC_KP_ENTER);
 | 
				
			||||
              fn_keycode = 0;
 | 
				
			||||
              fn_tap_used = false;
 | 
				
			||||
          }
 | 
				
			||||
        }
 | 
				
			||||
        return false;
 | 
				
			||||
        break;
 | 
				
			||||
      case EXCEL:
 | 
				
			||||
        if (record->event.pressed) {
 | 
				
			||||
          fn_keycode = EXCEL;
 | 
				
			||||
          fn_tap_used = false;
 | 
				
			||||
          layer_on(_EXCEL);
 | 
				
			||||
          update_tri_layer(_EXCEL, _NAVIGATION, _ADJUST);
 | 
				
			||||
        } else {
 | 
				
			||||
          layer_off(_EXCEL);
 | 
				
			||||
          update_tri_layer(_EXCEL, _NAVIGATION, _ADJUST);
 | 
				
			||||
          if(!fn_tap_used && fn_keycode == EXCEL ){
 | 
				
			||||
              register_code(KC_KP_0);
 | 
				
			||||
              unregister_code(KC_KP_0);
 | 
				
			||||
              fn_keycode = 0;
 | 
				
			||||
              fn_tap_used = false;
 | 
				
			||||
          }
 | 
				
			||||
        }
 | 
				
			||||
        return false;
 | 
				
			||||
        break;
 | 
				
			||||
    default:
 | 
				
			||||
        fn_tap_used = true;
 | 
				
			||||
        break; // don't return because this just handles the spacebars.
 | 
				
			||||
    }
 | 
				
			||||
    // this is the normal keycode processing switch from Planck default layout.
 | 
				
			||||
    switch (keycode) {
 | 
				
			||||
    case NUMPAD_LOCK:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_numpad, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_NUMPAD);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case NAVIGATION_LOCK:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_navigation, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_NAVIGATION);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case EXCEL_LOCK:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef AUDIO_ENABLE
 | 
				
			||||
          PLAY_NOTE_ARRAY(tone_excel, false, 0);
 | 
				
			||||
        #endif
 | 
				
			||||
        persistant_default_layer_set(1UL<<_EXCEL);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case PARENS:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_9);
 | 
				
			||||
          unregister_code(KC_9);
 | 
				
			||||
          register_code(KC_0);
 | 
				
			||||
          unregister_code(KC_0);
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_LEFT);
 | 
				
			||||
          unregister_code(KC_LEFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case BRACKETS:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          register_code(KC_LBRC);
 | 
				
			||||
          unregister_code(KC_LBRC);
 | 
				
			||||
          register_code(KC_RBRC);
 | 
				
			||||
          unregister_code(KC_RBRC);
 | 
				
			||||
          register_code(KC_LEFT);
 | 
				
			||||
          unregister_code(KC_LEFT);
 | 
				
			||||
        }
 | 
				
			||||
        return false;
 | 
				
			||||
        break;
 | 
				
			||||
    case BRACES:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_LBRC);
 | 
				
			||||
          unregister_code(KC_LBRC);
 | 
				
			||||
          register_code(KC_RBRC);
 | 
				
			||||
          unregister_code(KC_RBRC);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_LEFT);
 | 
				
			||||
          unregister_code(KC_LEFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case BACKLIT:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
        #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
          backlight_step();
 | 
				
			||||
        #endif
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
    case MACSLEEP:
 | 
				
			||||
      if (record->event.pressed) {
 | 
				
			||||
          register_code(KC_RSFT);
 | 
				
			||||
          register_code(KC_RCTL);
 | 
				
			||||
          register_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_POWER);
 | 
				
			||||
          unregister_code(KC_RCTL);
 | 
				
			||||
          unregister_code(KC_RSFT);
 | 
				
			||||
      }
 | 
				
			||||
      return false;
 | 
				
			||||
      break;
 | 
				
			||||
  }
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,22 @@
 | 
				
			||||
# Mike's custom keymap for roadkit
 | 
				
			||||
 | 
				
			||||
Based on the 13 key layout.
 | 
				
			||||
 | 
				
			||||
## LAYERS
 | 
				
			||||
 | 
				
			||||
* Numpad - The layer that matches the caps
 | 
				
			||||
* Excel - / * - = and () [] {} macros
 | 
				
			||||
* Navigation - arrow keys and home/end
 | 
				
			||||
* ADJUST - just like planck adjust, lets you set default layer.
 | 
				
			||||
* DYN - dynamic macro layer for recording and playing macros
 | 
				
			||||
 | 
				
			||||
## MACROS
 | 
				
			||||
 | 
				
			||||
Sadly, the dynamic macros are probably going worthless because they keys that
 | 
				
			||||
they record have to be pressed on this keyboard. This keyboard doesn't have
 | 
				
			||||
most letters...
 | 
				
			||||
 | 
				
			||||
## LEADER KEYS
 | 
				
			||||
 | 
				
			||||
This board would probably be better with the user of leader keys instead of
 | 
				
			||||
complex layers with a raise/lower setup...  Something to look into for later. 
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
# Build Options
 | 
				
			||||
#   change to "no" to disable the options, or define them in the Makefile in
 | 
				
			||||
#   the appropriate keymap folder that will get included automatically
 | 
				
			||||
#
 | 
				
			||||
BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
 | 
				
			||||
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 | 
				
			||||
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 | 
				
			||||
CONSOLE_ENABLE = yes         # Console for debug(+400)
 | 
				
			||||
COMMAND_ENABLE = no        # Commands for debug and configuration
 | 
				
			||||
NKRO_ENABLE = no           # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 | 
				
			||||
BACKLIGHT_ENABLE = yes       # Enable keyboard backlight functionality
 | 
				
			||||
MIDI_ENABLE = no            # MIDI controls
 | 
				
			||||
AUDIO_ENABLE = no           # Audio output on port C6
 | 
				
			||||
UNICODE_ENABLE = no         # Unicode
 | 
				
			||||
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
				
			||||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
				
			||||
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
 | 
				
			||||
 | 
				
			||||
ifndef QUANTUM_DIR
 | 
				
			||||
	include ../../../../Makefile
 | 
				
			||||
endif
 | 
				
			||||
@ -0,0 +1,14 @@
 | 
				
			||||
#ifndef CONFIG_USER_H
 | 
				
			||||
#define CONFIG_USER_H
 | 
				
			||||
 | 
				
			||||
#include "../../config.h"
 | 
				
			||||
 | 
				
			||||
// place overrides here
 | 
				
			||||
#ifdef BACKLIGHT_ENABLE
 | 
				
			||||
    #define BACKLIGHT_PIN B2
 | 
				
			||||
    #define BACKLIGHT_LEVELS 7
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
#define USB_MAX_POWER_CONSUMPTION 50
 | 
				
			||||
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,199 @@
 | 
				
			||||
//Author: mike terhar
 | 
				
			||||
 | 
				
			||||
#include "tv44.h"
 | 
				
			||||
#include "action_layer.h"
 | 
				
			||||
#include "eeconfig.h"
 | 
				
			||||
#ifdef BACKLIGHT_ENABLE
 | 
				
			||||
  #include "backlight.h"
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
enum minivan_layers {
 | 
				
			||||
  _QWERTY,
 | 
				
			||||
  _NUMSYM,
 | 
				
			||||
  _FKEYS,
 | 
				
			||||
  _FKEYGRV,
 | 
				
			||||
  _PLOVER,
 | 
				
			||||
  _ADJUST
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
enum planck_keycodes {
 | 
				
			||||
  QWERTY = SAFE_RANGE,
 | 
				
			||||
  DYNKEY,
 | 
				
			||||
  DYNAMIC_MACRO_RANGE,
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
// Fillers to make layering more clear
 | 
				
			||||
#define _______ KC_TRNS
 | 
				
			||||
#define FKEYS F(_FKEYS)
 | 
				
			||||
#define NUMSYM F(_NUMSYM)
 | 
				
			||||
#define FKEYGRV F(_FKEYGRV)
 | 
				
			||||
#define MACSLEEP M(5)
 | 
				
			||||
#define PLOVER M(6)
 | 
				
			||||
#define LAYERRESET M(7)
 | 
				
			||||
#define BACKLIT M(8)
 | 
				
			||||
#define ADJUST M(9)
 | 
				
			||||
#define XXXXXXX KC_NO
 | 
				
			||||
 | 
				
			||||
#include "dynamic_macro.h"
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
				
			||||
[_QWERTY] = {
 | 
				
			||||
  {FKEYS, KC_Q,   KC_W,   KC_E, KC_R,   KC_T,   KC_Y,   KC_U, KC_I,   KC_O,  KC_P,   KC_BSPC},
 | 
				
			||||
  {KC_ESC, KC_A,   KC_S,   KC_D, KC_F,   KC_G,   KC_H,   KC_J, KC_K,   KC_L,  KC_SCLN,KC_QUOT},
 | 
				
			||||
  {KC_LSFT,KC_Z,   KC_X,   KC_C, KC_V,   KC_B,   KC_N,   KC_M, KC_COMM,KC_DOT,KC_SLSH,SFT_T(KC_ENT) },
 | 
				
			||||
  {KC_LCTL,KC_LALT,KC_LGUI, KC_SPC,XXXXXXX,XXXXXXX,XXXXXXX,NUMSYM,KC_LEFT,KC_DOWN,KC_UP ,KC_RIGHT}
 | 
				
			||||
},
 | 
				
			||||
[_NUMSYM] = {
 | 
				
			||||
  {FKEYGRV,  KC_1,  KC_2,    KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,  _______},
 | 
				
			||||
  {KC_DEL,KC_EXLM, KC_AT,  KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, ADJUST },
 | 
				
			||||
  { _______,  KC_UNDS,KC_PLUS, KC_LCBR,KC_RCBR,KC_PIPE , KC_MINS,KC_EQL,KC_LBRC, KC_RBRC, KC_BSLS, _______},
 | 
				
			||||
  {_______,_______,_______,_______,XXXXXXX,XXXXXXX,XXXXXXX,_______,    KC_HOME, KC_PGDN, KC_PGUP, KC_END}
 | 
				
			||||
},
 | 
				
			||||
[_FKEYS] ={
 | 
				
			||||
  {_______, KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5, KC_F6, KC_F7,  KC_F8,  KC_F9,  KC_F10, _______},
 | 
				
			||||
  {KC_DEL, KC_F11, KC_F12,  KC_F13,  KC_F14,  KC_F15, _______, _______,  _______,  MACSLEEP, DYN_REC_START1, DYN_REC_START2 },
 | 
				
			||||
  {KC_CAPS,  _______, _______,  _______,  _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2,_______,DYN_REC_STOP},
 | 
				
			||||
  {_______,_______,_______,LAYERRESET,XXXXXXX,XXXXXXX,XXXXXXX,LAYERRESET,    KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 | 
				
			||||
},
 | 
				
			||||
[_PLOVER] = {
 | 
				
			||||
  {KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1,    KC_1   },
 | 
				
			||||
  {XXXXXXX, KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC},
 | 
				
			||||
  {XXXXXXX, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
 | 
				
			||||
  {LAYERRESET, XXXXXXX, KC_C,    KC_V,   XXXXXXX ,  XXXXXXX, XXXXXXX, KC_N,    KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
 | 
				
			||||
},
 | 
				
			||||
[_ADJUST] = {
 | 
				
			||||
 {_______ , RESET,   _______, _______, _______, _______, _______, _______, KC_SLCK, KC_PAUS, KC_PSCR, KC_DEL },
 | 
				
			||||
 {_______ , _______, _______, _______, _______,  AG_NORM, AG_SWAP, QWERTY,  _______, MACSLEEP,  PLOVER, _______},
 | 
				
			||||
 {_______ , _______,  _______,  _______,   _______,  _______,   _______,  _______, _______, _______, _______, _______},
 | 
				
			||||
 {BACKLIT, _______, _______, LAYERRESET, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______}
 | 
				
			||||
}
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
float tone_startup[][2]           = SONG(STARTUP_SOUND);
 | 
				
			||||
float tone_qwerty[][2]            = SONG(QWERTY_SOUND);
 | 
				
			||||
float tone_dyn_macro_rec[][2]     = SONG(DVORAK_SOUND);
 | 
				
			||||
float tone_dyn_macro_play[][2]    = SONG(COLEMAK_SOUND);
 | 
				
			||||
float tone_plover[][2]            = SONG(PLOVER_SOUND);
 | 
				
			||||
float tone_adjust[][2]            = SONG(PLOVER_GOODBYE_SOUND);
 | 
				
			||||
float music_scale[][2]            = SONG(MUSIC_SCALE_SOUND);
 | 
				
			||||
 | 
				
			||||
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
 | 
				
			||||
#endif
 | 
				
			||||
 | 
				
			||||
void persistant_default_layer_set(uint16_t default_layer) {
 | 
				
			||||
  eeconfig_update_default_layer(default_layer);
 | 
				
			||||
  default_layer_set(default_layer);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
const uint16_t PROGMEM fn_actions[] = {
 | 
				
			||||
 [_FKEYS] = ACTION_LAYER_TAP_KEY(_FKEYS, KC_TAB),
 | 
				
			||||
 [_FKEYGRV] = ACTION_LAYER_TAP_KEY(_FKEYS, KC_GRV),
 | 
				
			||||
 [_NUMSYM] = ACTION_LAYER_TAP_TOGGLE(_NUMSYM),
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
				
			||||
{
 | 
				
			||||
      switch(id) {
 | 
				
			||||
        case 5: // MACSLEEP
 | 
				
			||||
            if (record->event.pressed) {
 | 
				
			||||
              register_code(KC_RSFT);
 | 
				
			||||
              register_code(KC_RCTL);
 | 
				
			||||
              register_code(KC_POWER);
 | 
				
			||||
              unregister_code(KC_POWER);
 | 
				
			||||
              unregister_code(KC_RCTL);
 | 
				
			||||
              unregister_code(KC_RSFT);
 | 
				
			||||
            }
 | 
				
			||||
        break;
 | 
				
			||||
        case 6: // PLOVER
 | 
				
			||||
              if (record->event.pressed) {
 | 
				
			||||
              #ifdef AUDIO_ENABLE
 | 
				
			||||
                stop_all_notes();
 | 
				
			||||
                PLAY_NOTE_ARRAY(tone_plover, false, 0);
 | 
				
			||||
              #endif
 | 
				
			||||
              layer_off(_NUMSYM);
 | 
				
			||||
              layer_off(_FKEYS);
 | 
				
			||||
              layer_off(_ADJUST);
 | 
				
			||||
              layer_on(_PLOVER);
 | 
				
			||||
            }
 | 
				
			||||
        break;
 | 
				
			||||
        case 7: // LAYERRESET
 | 
				
			||||
              if (record->event.pressed) {
 | 
				
			||||
              #ifdef AUDIO_ENABLE
 | 
				
			||||
                PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
 | 
				
			||||
              #endif
 | 
				
			||||
              layer_off(_NUMSYM);
 | 
				
			||||
              layer_off(_FKEYS);
 | 
				
			||||
              layer_off(_PLOVER);
 | 
				
			||||
              layer_off(_ADJUST);
 | 
				
			||||
            }
 | 
				
			||||
        break;
 | 
				
			||||
        case 8: // BACKLIT
 | 
				
			||||
          if (record->event.pressed) {
 | 
				
			||||
            register_code(KC_RSFT);
 | 
				
			||||
            #ifdef BACKLIGHT_ENABLE
 | 
				
			||||
              backlight_step();
 | 
				
			||||
            #endif
 | 
				
			||||
          } else {
 | 
				
			||||
            unregister_code(KC_RSFT);
 | 
				
			||||
          }
 | 
				
			||||
        break;
 | 
				
			||||
        case 9: // ADJUST
 | 
				
			||||
          if(record->event.pressed) {
 | 
				
			||||
            #ifdef AUDIO_ENABLE
 | 
				
			||||
              stop_all_notes();
 | 
				
			||||
              PLAY_NOTE_ARRAY(tone_adjust, false, 0);
 | 
				
			||||
            #endif
 | 
				
			||||
            layer_off(_NUMSYM);
 | 
				
			||||
            layer_off(_FKEYS);
 | 
				
			||||
            layer_off(_PLOVER);
 | 
				
			||||
            layer_on(_ADJUST);
 | 
				
			||||
          }
 | 
				
			||||
      }
 | 
				
			||||
    return MACRO_NONE;
 | 
				
			||||
};
 | 
				
			||||
 | 
				
			||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
 | 
				
			||||
  uint16_t macro_kc = keycode;
 | 
				
			||||
  if (keycode == FKEYS || keycode == ADJUST || keycode == FKEYGRV ){
 | 
				
			||||
    macro_kc = DYN_REC_STOP;
 | 
				
			||||
  }
 | 
				
			||||
  if (!process_record_dynamic_macro(macro_kc, record)) {
 | 
				
			||||
    return false;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  return true;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void matrix_init_user(void) {
 | 
				
			||||
    #ifdef AUDIO_ENABLE
 | 
				
			||||
        startup_user();
 | 
				
			||||
    #endif
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#ifdef AUDIO_ENABLE
 | 
				
			||||
 | 
				
			||||
void startup_user()
 | 
				
			||||
{
 | 
				
			||||
    _delay_ms(20); // gets rid of tick
 | 
				
			||||
    PLAY_NOTE_ARRAY(tone_startup, false, 0);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void shutdown_user()
 | 
				
			||||
{
 | 
				
			||||
    PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
 | 
				
			||||
    _delay_ms(150);
 | 
				
			||||
    stop_all_notes();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_on_user(void)
 | 
				
			||||
{
 | 
				
			||||
    music_scale_user();
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
void music_scale_user(void)
 | 
				
			||||
{
 | 
				
			||||
    PLAY_NOTE_ARRAY(music_scale, false, 0);
 | 
				
			||||
}
 | 
				
			||||
#endif
 | 
				
			||||
@ -0,0 +1,26 @@
 | 
				
			||||
# Mike's Minivan
 | 
				
			||||
 | 
				
			||||
- Arrow Layout (45key)
 | 
				
			||||
- Dynamic Macros
 | 
				
			||||
- Media Keys
 | 
				
			||||
- Works with iPhone Camera Adapter
 | 
				
			||||
 | 
				
			||||
## Layers
 | 
				
			||||
 | 
				
			||||
Qwerty for letters and mods.
 | 
				
			||||
 | 
				
			||||
Numsym for all numbers and symbols used in typing. Follows a similar approach to
 | 
				
			||||
planck but puts both on the same layer eschewing the F-keys.  
 | 
				
			||||
 | 
				
			||||
Fkeys layer is for the seldom used stuff like F-keys and some additional features
 | 
				
			||||
such as dynamic macros, media keys, and a sleep shortcut for OS X.
 | 
				
			||||
 | 
				
			||||
Adjust layer is tough to get to so it is only for keyboard configuration stuff.
 | 
				
			||||
 | 
				
			||||
## Dynamic Macros
 | 
				
			||||
 | 
				
			||||
Hold TAB key, then press ";" to record macro 1 and "'" to record macro 2.
 | 
				
			||||
 | 
				
			||||
When you are done recording, press TAB again.
 | 
				
			||||
 | 
				
			||||
For playback of macros, TAB+"," plays macro 1 and TAB+","plays macro 2.
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue