[Jack & Erez] Comments + tiny updates and cleanup

This commit is contained in:
Erez Zukerman 2015-10-27 00:54:46 +02:00
parent cc1c32671e
commit 0c47e8b008
19 changed files with 65 additions and 1512 deletions

View file

@ -1,56 +0,0 @@
# TMK Generic
* I'm not sure what the Magic + H does.
Is this a menu that will pop up regardless of what platform and program is open?
Yes, this is sort of debugging.
Use PJRC's [hid_listen](https://www.pjrc.com/teensy/hid_listen.html) to see debug messages.
# TMK/Ergodox specific
* I would like to configure my leds to indicate the active layer.
I read that can be done, but I haven't seen an example for this firmware.
Can someone please post an example or a link?
TMK for Ergodox have support for seven (!) led's:
- three on right
- three on left (see http://geekhack.org/index.php?topic=22780.msg873819#msg873819 for more details)
- Teensy onboard led as well
Any of these leds can be used as layer indicator or NumLock/CapsLock/ScrollLock led.
[Here is example](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/matrix.c#L121-167)
how you can assign some meaning to each led.
In this code only left leds are used to show layers, but you can
[change `led_set()`](https://github.com/cub-uanic/tmk_keyboard/blob/cub_layout/keyboard/ergodox/led.c)
and do anything you want with all leds.
# Firmware
Q: Where to get binaries?
A:
Q: Where to get sources?
A:
Q: How to compile?
A:
# Layouts
description of layouts in base firmware binaries
# Things TO-DO
- [ ] Flash NumLock led only when "numpad" layer is active
- [ ] Command (in terms of IS_COMMAND) to switch to no-leds mode
- [ ] Increase count of ACTION keys
- [ ] Fix command_state() onboard led: it should flash only when kbd in some specific mode (CONSOLE || MOUSE)
- [ ] ergodox_blink_all_leds() should save current state of leds, and restore after blink. initial state of all leds == off
- [ ] add support for pseudo-backlight (reversed LEDs) + docs/photo
- [ ] command to debug all LEDs (on/off/blink)
- [ ] proper (in-core) implementation of DEBUG_MATRIX_SCAN_RATE (non-Ergodox specific)
- [ ] proper (in-core) support for per-layer fn_actions[]

View file

@ -1,61 +0,0 @@
#include <avr/io.h>
#include "backlight.h"
#define CHANNEL OCR1C
void backlight_init_ports()
{
// Setup PB7 as output and output low.
DDRB |= (1<<7);
PORTB &= ~(1<<7);
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
// I could write a wall of text here to explain... but TL;DW
// Go read the ATmega32u4 datasheet.
// And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
// Pin PB7 = OCR1C (Timer 1, Channel C)
// Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
// (i.e. start high, go low when counter matches.)
// WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
// Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
backlight_init();
}
void backlight_set(uint8_t level)
{
if ( level == 0 )
{
// Turn off PWM control on PB7, revert to output low.
TCCR1A &= ~(_BV(COM1C1));
CHANNEL = 0x0;
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
}
else if ( level == BACKLIGHT_LEVELS )
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF;
}
else
{
// Prevent backlight blink on lowest level
PORTB &= ~(_BV(PORTB7));
// Turn on PWM control of PB7
TCCR1A |= _BV(COM1C1);
// Set the brightness
CHANNEL = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
}

View file

@ -1,595 +0,0 @@
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Keymap: Default Layer in QWERTY
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | \ | | - | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | ~L5 | | ~L6 | Y | U | I | O | P | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
* |--------+------+------+------+------+------| L0 | | ~L7 |------+------+------+------+------+--------|
* | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | ] |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | +L2 | Home | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | End | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
*
*
****************************************************************************************************
*
* Under XOrg, I use my own mapping from QWERTY to "Workman for Programmers"
* See XOrg files in ./addons/ subdirectory.
*
* I have to do so, because of two things:
* 1) my native language is Russian, and XOrg keymap for it is based on QWERTY layout
* 2) I want to have non-standart shifted keys, like $ (as normal) and @ (as shifted), or _ and -
*
* And even if (2) could be solved using FN* keys (but there is limit in firmware for only 32 such
* keys), then (1) can't be solved at firmware level at all.
*
* So, I have to stick with QWERTY as my main layout + my own XOrg keyboard layout for English.
* But sometimes I have to input something when XOrg is not active - for example, in Linux console,
* or in firmware console (while debugging firmware), or when keyboard is connected to not my computer.
*
* For such cases I have Layer1 :)
* // hint: switch to Layer1 is only at Layer6
*
****************************************************************************************************
*
*
*
* Keymap: Default Layer in Workman
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ~ | ; | ! | # | { | } | ' | | ^ | [ | ] | * | ( | ) | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | $ | : |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | - |
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | L0 | +L2 | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | NO | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
* Keymap: Default Layer in Workman / with Shift
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | " | | \ | 6 | 7 | 8 | 9 | 0 | + |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | D | R | W | B | NO | | ~L7 | J | F | U | P | @ | % |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Tab/Shf| A | S | H | T | G |------| |------| Y | N | E | O | I | _ |
* |--------+------+------+------+------+------| Home | | End |------+------+------+------+------+--------|
* | LCtrl | Z | X | M | C | V | | | | K | L | , | . | / | & |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~L5 | ~L2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~L6 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | L0 | +L2 | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | NO | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*
*/
KEYMAP( // Layer0: default, leftled:none
// left hand
GRV, 1, 2, 3, 4, 5, BSLS,
FN2, Q, W, E, R, T, FN23,
FN11,FN28,FN29,FN30,FN31,G,
FN12,FN24,FN25,FN26,FN27,B, HOME,
FN21,FN20,CAPS,FN13,FN14,
FN17,FN19,
NO,
FN5, FN6, FN7,
// right hand
MINS,6, 7, 8, 9, 0, EQL,
FN23,Y, U, I, O, P, LBRC,
H, J, K, L, SCLN,FN15,
END, N, M, COMM,DOT, SLSH,FN16,
LEFT,UP, DOWN,RGHT,FN22,
PGUP,DEL,
PGDN,
FN8, FN9, FN10
),
KEYMAP( // Layer1: Workman layout, leftled:all
// left hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,Q, D, R, W, B, TRNS,
TRNS,A, S, H, T, G,
TRNS,Z, X, M, C, V, TRNS,
TRNS,TRNS,FN17,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,J, F, U, P, 4, TRNS,
Y, N, E, O, I, TRNS,
TRNS,K, L, TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer2: numpad, leftled:mid/blue
// left hand
TRNS,NO, NO, NO, NO, PAUS,PSCR,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, TRNS,NO,
TRNS,NO, NO, NO, TRNS,NO, TRNS,
TRNS,TRNS,FN17,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
SLCK,NLCK,PSLS,PAST,PAST,PMNS,BSPC,
TRNS,NO, P7, P8, P9, PMNS,PGUP,
NO, P4, P5, P6, PPLS,PGDN,
TRNS,NO, P1, P2, P3, PPLS,PENT,
P0, PDOT,SLSH,PENT,PENT,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer3: F-keys + PgUp/PgDn on right hand, leftled:bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, TRNS,NO, NO, NO,
TRNS,NO, TRNS,NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, F1, F2, F3, F4, PGUP,
NO, F5, F6, F7, F8, PGDN,
TRNS,NO, F9, F10, F11, F12, APP,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // Layer4: unconvenient keys on right hand, leftled:top/white
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,NO, NO, NO, NO,
TRNS,TRNS,NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
/* in Workman right hand will be:
{ } ( ) +
^ ! ? =
' ! $ " ; \
# [ < > ] \
*/
// right hand
NO, NO, 4, 5, 9, 0, PPLS,
TRNS,MINS,2, FN5, 9, 0, EQL,
BSLS,2, P, FN1, 1, FN2,
TRNS,3, 6, FN3, FN4, 7, FN2,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer5: F-keys instead of numbers, leftled:top/white
// left hand
TRNS,F1, F2, F3, F4, F5, F6,
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,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, 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,TRNS,TRNS
),
KEYMAP( // Layer6: F-keys + utils(Teensy, Workman-layer switch), leftled:top/white+onboard
// left hand
TRNS,F1, F2, F3, F4, F5, F6,
FN0, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
FN18,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,FN0,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
//
// rarely used
//
KEYMAP( // Layer7: F-keys only, leftled:top/white
// left hand
FN0, NO, NO, NO, NO, NO, NO,
FN1, F13, F14, F15, F16, NO, TRNS,
TRNS,F17, F18, F19, F20, NO,
TRNS,F21, F22, F23, F24, NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, F1, F2, F3, F4, TRNS,
NO, F5, F6, F7, F8, TRNS,
TRNS,NO, F9, F10, F11, F12, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
SLEP,TRNS,TRNS
),
KEYMAP( // Layer8: mouse and navigation, leftled:mid/blue+bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, ACL0,NO, TRNS,
TRNS,NO, NO, TRNS,ACL1,NO,
TRNS,NO, NO, TRNS,ACL2,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
F16, MPLY,MPRV,MNXT,VOLD,VOLU,MUTE,
F14, BTN2,WH_L,WH_U,WH_D,WH_R,PGUP,
BTN1,MS_L,MS_U,MS_D,MS_R,PGDN,
F15, BTN3,HOME,END, DEL, INS, NO,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // Layer9: application-specific shortcuts (mostly browser), leftled:top/white+bot/green
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, TRNS,NO, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, FN12,FN13,FN14,FN15,FN10,
FN1, FN2, FN3, FN4, FN5, FN11,
TRNS,TRNS,FN6, FN7, FN8, FN9, FN0,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
/*
// templates to copy from
KEYMAP( // LayerN: transparent on edges + hard-defined thumb keys, all others are empty
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // LayerN: fully transparent
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
*/
};
/* id for user defined functions & macros */
enum function_id {
TEENSY_KEY,
CUSTOM_KEY,
L_CTRL_ALT_ENT,
R_CTRL_ALT_ENT,
};
enum macro_id {
XMONAD_RESET,
PASSWORD1,
PASSWORD2,
PASSWORD3,
};
/*
* Fn action definition
*/
static const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
[2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
[3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
[4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
[5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_BSPC), // FN5 = LShift with tap BackSpace
[6] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_DEL), // FN6 = LCtrl with tap Delete
[7] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_ESC), // FN7 = LAlt with tap Escape
[8] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_INS), // FN8 = RAlt with tap Ins
[9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), // FN9 = RShift with tap Enter
[10] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_SPC), // FN10 = RCtrl with tap Space
[11] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), // FN11 = LShift with tap Tab
[12] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_GRV), // FN12 = LCtrl with tap Tilda
[13] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_SPC), // FN13 = LAlt with tap Space
[14] = ACTION_MODS_TAP_KEY(MOD_LGUI, KC_ESC), // FN14 = LGui with tap Escape
[15] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_QUOT), // FN15 = RShift with tap quotes
[16] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_RBRC), // FN16 = RCtrl with tap ]
[17] = ACTION_LAYER_SET(0, ON_BOTH), // FN17 - set Layer0
[18] = ACTION_LAYER_SET(1, ON_BOTH), // FN18 - set Layer1, to use Workman layout at firmware level
[19] = ACTION_LAYER_SET(2, ON_BOTH), // FN19 - set Layer2, to use with Numpad keys
[21] = ACTION_FUNCTION_TAP(L_CTRL_ALT_ENT), // FN21 - momentary Layer5+CTRL+ALT on Enter, to use with F* keys on top row
[22] = ACTION_FUNCTION_TAP(R_CTRL_ALT_ENT), // FN22 - momentary Layer6+CTRL+ALT on Enter, to use with F* keys on top row + utils
[28] = ACTION_LAYER_TAP_KEY(4, KC_A), // FN28 = momentary Layer4 on A key, to use with unconvenient keys
[29] = ACTION_LAYER_TAP_KEY(3, KC_S), // FN29 = momentary Layer3 on S key, to use with F* keys
[30] = ACTION_LAYER_TAP_KEY(8, KC_D), // FN30 = momentary Layer8 on D key, to use with mouse and navigation keys
[31] = ACTION_LAYER_TAP_KEY(2, KC_F), // FN31 = momentary Layer2 on F key, to use with Numpad keys
// i'd like to remove this - will try to get used to live without this and convert them to usual keys
[20] = ACTION_LAYER_MOMENTARY(2), // FN20 - momentary Layer2, to use with Numpad keys
// or
// [20] = ACTION_FUNCTION_TAP(CUSTOM_KEY), // FN20 - use custom key, with tapping support
[23] = ACTION_LAYER_TAP_KEY(7, KC_BSLS), // FN23 - momentary Layer7 on ' , to use with F* keys (F1-F24)
[24] = ACTION_LAYER_TAP_KEY(4, KC_Z), // FN24 = momentary Layer4 on Z key, to use with unconvenient keys
[25] = ACTION_LAYER_TAP_KEY(3, KC_X), // FN25 = momentary Layer3 on X key, to use with F* keys
[26] = ACTION_LAYER_TAP_KEY(8, KC_C), // FN26 = momentary Layer8 on C key, to use with mouse and navigation keys
[27] = ACTION_LAYER_TAP_KEY(9, KC_V), // FN27 = momentary Layer9 on V key, to use with application-specific shortcuts
};
static const uint16_t PROGMEM fn_actions_4[] = {
[1] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // FN1 = Shifted BackSlash // " in Workman
[2] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // FN2 = Shifted Minus // \ in Workman
[3] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), // FN3 = Shifted comma // < in Workman
[4] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // FN4 = Shifted dot // > in Workman
[5] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), // FN5 = Shifted slash // ? in Workman
};
static const uint16_t PROGMEM fn_actions_7[] = {
[0] = ACTION_MACRO(XMONAD_RESET), // FN0 = xmonad-reanimator
[1] = ACTION_MACRO(PASSWORD1), // FN1 = default password
[2] = ACTION_MACRO(PASSWORD1), // FN2 = other password
[3] = ACTION_MACRO(PASSWORD1), // FN3 = mega password
};
static const uint16_t PROGMEM fn_actions_9[] = {
[0] = ACTION_MODS_KEY(MOD_LCTL, KC_P0), // FN0 = Ctrl+0
[1] = ACTION_MODS_KEY(MOD_LALT, KC_P1), // FN1 = Alt+1
[2] = ACTION_MODS_KEY(MOD_LALT, KC_P2), // FN2 = Alt+2
[3] = ACTION_MODS_KEY(MOD_LALT, KC_P3), // FN3 = Alt+3
[4] = ACTION_MODS_KEY(MOD_LALT, KC_P4), // FN4 = Alt+4
[5] = ACTION_MODS_KEY(MOD_LALT, KC_P5), // FN5 = Alt+5
[6] = ACTION_MODS_KEY(MOD_LALT, KC_P6), // FN6 = Alt+6
[7] = ACTION_MODS_KEY(MOD_LALT, KC_P7), // FN7 = Alt+7
[8] = ACTION_MODS_KEY(MOD_LALT, KC_P8), // FN8 = Alt+8
[9] = ACTION_MODS_KEY(MOD_LALT, KC_P9), // FN9 = Alt+9
[10] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_TAB), // FN10 = Ctrl+Shift+Tab
[11] = ACTION_MODS_KEY(MOD_LCTL, KC_TAB), // FN11 = Ctrl+Tab
[12] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGUP), // FN12 = Ctrl+Shift+PgUp
[13] = ACTION_MODS_KEY(MOD_LCTL|MOD_LSFT, KC_PGDN), // FN13 = Ctrl+Shift+PgDn
[14] = ACTION_MODS_KEY(MOD_LCTL, KC_PMNS), // FN14 = Ctrl+Pad Minus
[15] = ACTION_MODS_KEY(MOD_LCTL, KC_PPLS), // FN15 = Ctrl+Pad Plus
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// print("action_function called\n");
// print("id = "); phex(id); print("\n");
// print("opt = "); phex(opt); print("\n");
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(50);
bootloader_jump(); // should not return
print("not supported.\n");
}
if (id == L_CTRL_ALT_ENT || id == R_CTRL_ALT_ENT) {
if (record->tap.count == 0 || record->tap.interrupted) {
uint8_t weak_mods;
uint8_t layer;
if (id == L_CTRL_ALT_ENT) {
weak_mods = MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT);
layer = 5;
} else {
weak_mods = MOD_BIT(KC_RCTL) | MOD_BIT(KC_RALT);
layer = 6;
}
if (record->event.pressed) {
layer_on(layer);
add_weak_mods(weak_mods);
} else {
del_weak_mods(weak_mods);
layer_off(layer);
}
} else {
if (record->event.pressed) {
add_key(KC_ENT);
send_keyboard_report();
} else {
del_key(KC_ENT);
send_keyboard_report();
}
}
}
/*
* just an example of custom key implementation
* not really needed with custom keymap_fn_to_action(),
* because it will allow you to have 32 FN** keys on EACH layer
*/
/*
keyevent_t event = record->event;
if (id == CUSTOM_KEY) {
uint8_t layer = biton32(layer_state);
uint8_t col = event.key.col;
uint8_t row = event.key.row;
uint8_t handled = 0;
if (event.pressed) {
if (layer == XXX && col == XXX && row == XXX) {
action_macro_play(
MACRO(
...........
END)
);
handled++;
}
}
}
if (!handled) {
print("custom key not handled");
print(": layer "); pdec(layer);
print(", col "); pdec(col);
print(", row "); pdec(row);
print("\n");
}
}
*/
}
#include "keymap_passwords.h"
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
if (record->event.pressed) {
switch (id) {
case XMONAD_RESET: return MACRO_XMONAD_RESET;
case PASSWORD1: return MACRO_PASSWORD1;
}
}
return MACRO_NONE;
}
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))
#define FN_ACTIONS_4_SIZE (sizeof(fn_actions_4) / sizeof(fn_actions_4[0]))
#define FN_ACTIONS_7_SIZE (sizeof(fn_actions_7) / sizeof(fn_actions_7[0]))
#define FN_ACTIONS_9_SIZE (sizeof(fn_actions_9) / sizeof(fn_actions_9[0]))
/*
* translates Fn keycode to action
* for some layers, use different translation table
*/
action_t keymap_fn_to_action(uint8_t keycode)
{
uint8_t layer = biton32(layer_state);
action_t action;
action.code = ACTION_NO;
if (layer == 4 && FN_INDEX(keycode) < FN_ACTIONS_4_SIZE) {
action.code = pgm_read_word(&fn_actions_4[FN_INDEX(keycode)]);
}
if (layer == 7 && FN_INDEX(keycode) < FN_ACTIONS_7_SIZE) {
action.code = pgm_read_word(&fn_actions_7[FN_INDEX(keycode)]);
}
if (layer == 9 && FN_INDEX(keycode) < FN_ACTIONS_9_SIZE) {
action.code = pgm_read_word(&fn_actions_9[FN_INDEX(keycode)]);
}
// by default, use fn_actions from default layer 0
// this is needed to get mapping for same key, that was used switch to some layer,
// to have possibility to switch layers back
if (action.code == ACTION_NO && FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
}
return action;
}

View file

@ -1,23 +0,0 @@
#define MACRO_XMONAD_RESET MACRO( \
I(15), \
D(LCTL), D(LALT), T(F2), W(255), U(LALT), U(LCTL), W(255), \
T(X), T(M), T(O), T(N), T(UP), T(ENT), W(255), \
D(LCTL), D(LALT), T(F5), W(255), U(LALT), U(LCTL), W(255), \
END) \
#define MACRO_PASSWORD1 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \
#define MACRO_PASSWORD2 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \
#define MACRO_PASSWORD2 MACRO( \
I(15), \
T(E), T(X), T(A), T(M), T(P), T(L), T(E), \
END) \

View file

@ -1,624 +0,0 @@
#include "action_util.h"
#include "action_layer.h"
#define KC_SW0 KC_FN0
#define DEBUG_ACTION
static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Default Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | ~ | 1 | 2 | 3 | 4 | 5 | \ | | ' | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | ~Fn1 | | ~Fn3 | Y | U | I | O | P | [ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | RShift |
* |--------+------+------+------+------+------| Fn0 | | ~Fn4 |------+------+------+------+------+--------|
* | LCtrl | Z | X | C | V | B | | | | N | M | , | . | / | RCtrl |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | ~Fn1 | ~Fn2 | Caps | LAlt | LGui | | Lft | Up | Dn | Rght | ~Fn4 |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | +Fn2 | Home | | PgUp | Del |
* ,------|------|------| |------+------+------.
* | | | End | | PgDn | | |
* | BkSp | ESC |------| |------| Enter| Space|
* | | | Spc | | Ins | | |
* `--------------------' `--------------------'
*/
// BASE LAYERS
KEYMAP( // layout: layer 0: customized dvorak with symbol row switched
// left hand
ESC, FN12,FN12,FN12,FN12,FN12,BSLS,
TAB, QUOT,COMM,DOT, P, Y, FN2,
LSFT,A, O, E, U, I,
LCTL,SCLN,Q, J, K, X, DEL,
FN3, FN1, LCTL,LALT,LGUI,
FN5, HOME,
END,
BSPC,LSFT,LGUI,
// right hand
MINS,FN12,FN12,FN12,FN12,FN12,MPLY,
FN3, F, G, C, R, L, MNXT,
D, H, T, N, S, RSFT,
DEL, B, M, W, V, Z, RCTL,
MPRV,MNXT,APP, FN8,FN2,
PGUP,MPLY,
PGDN,
ENT, FN1, SPC
),
KEYMAP( // layout: layer 1: customized dvorak
// left hand
ESC, 1, 2, 3, 4, 5, BSLS,
TAB, QUOT,COMM,DOT, P, Y, FN2,
LSFT,A, O, E, U, I,
LCTL,SCLN,Q, J, K, X, DEL,
FN3, FN1, LCTL,LALT,LGUI,
FN5, HOME,
END,
BSPC,LSFT,LGUI,
// right hand
MINS,6, 7, 8, 9, 0, EQL,
FN3, F, G, C, R, L, SLSH,
D, H, T, N, S, RSFT,
DEL, B, M, W, V, Z, RCTL,
LEFT,DOWN,UP, RGHT,FN2,
PGUP,MPLY,
PGDN,
ENT, FN1, SPC
),
KEYMAP( // layer 2 : qwerty
// left hand
TRNS,1, 2, 3, 4, 5, TRNS,
TRNS,Q, W, E, R, T, TRNS,
TRNS,A, S, D, F, G,
TRNS,Z, X, C, V, B, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,6, 7, 8, 9, 0, MINS,
TRNS,Y, U, I, O, P, RBRC,
H, J, K, L, SCLN,RSFT,
TRNS,N, M, COMM,DOT, SLSH,RSFT,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layer 3 : reserved
// left hand
TRNS,1, 2, 3, 4, 5, TRNS,
TRNS,Q, W, E, R, T, TRNS,
TRNS,A, S, D, F, G,
TRNS,Z, X, C, V, B, TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
TRNS,6, 7, 8, 9, 0, MINS,
TRNS,Y, U, I, O, P, RBRC,
H, J, K, L, SCLN,QUOT,
TRNS,N, M, COMM,DOT, SLSH,RSFT,
TRNS,TRNS,TRNS,TRNS,TRNS,
RALT,RCTL,
PGUP,
PGDN,ENT, SPC
),
// PLOVER (SPECIAL CASE)
KEYMAP( // layout: layer 4: Steno for Plover
// left hand
FN5, NO, NO, NO, NO, NO, NO,
NO, 1, 2, 3, 4, 5, NO,
NO, Q, W, E, R, T,
NO, A, S, D, F, G, NO,
NO, NO, NO, NO, NO,
FN5, NO,
NO,
C, V, NO,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
NO, 6, 7, 8, 9, 0, TRNS,
Y, U, I, O, P, LBRC,
NO, H, J, K, L, SCLN,QUOT,
TRNS,TRNS,NO, NO, NO,
TRNS,TRNS,
TRNS,
NO, N, M
),
KEYMAP( // layout: layer 5: reserved
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
// MODIFIERS THAT MIGHT BE STICKY
KEYMAP( // layout: layer 6: mouse + numpad
// left hand
FN0, NO, NO, NO, NO, PAUS,PSCR,
TRNS,NO, WH_U,MS_U,WH_D,BTN2,TRNS,
TRNS,NO, MS_L,MS_D,MS_R,BTN1,
TRNS,NO, NO, NO, NO, BTN3,TRNS,
TRNS,FN13,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
SLCK,NLCK,EQL, PSLS,PAST,PMNS,TRNS,
TRNS,NO, P7, P8, P9, PMNS,BSPC,
NO, P4, P5, P6, PPLS,PENT,
TRNS,NO, P1, P2, P3, PPLS,PENT,
P0, PDOT,PDOT,PENT,PENT,
TRNS,TRNS,
TRNS,
ENT, TRNS,BSPC
),
KEYMAP( // layout: layer 7: F-keys + cursor
// left hand
FN0, F1, F2, F3, F4, F5, F6,
FN4, NO, PGUP,UP, PGDN,NO, TRNS,
TRNS,HOME,LEFT,DOWN,RGHT,END,
TRNS,NO, NO, END, HOME,NO, TRNS,
TRNS,TRNS,TRNS,FN10,FN11,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, MINS,
TRNS,NO, PGUP,UP, PGDN, NO, FN4,
HOME,LEFT,DOWN,RGHT,END, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS, TRNS,RSFT,RCTL
),
KEYMAP( // layout: layer 8: "BlueShift"
// left hand
FN0, F1, F2, F3, F4, F5, F6,
TRNS,GRV, FN12,FN12,PSCR,BSLS,TRNS, // the FN12 entries are for inverted brace/bracket keys
TRNS,APP, TAB, EQL, TRNS,INS,
TRNS,TRNS,FN8, TRNS,CAPS,TRNS,TRNS, // quit (alt+f4)
FN13,TRNS,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
ESC, TRNS,TRNS,
// right hand
F7, F8, F9, F10, F11, F12, MINS,
TRNS,PGUP,HOME,UP, END, SLSH,RBRC,
PGDN,LEFT,DOWN,RGHT,MINS,TRNS,
TRNS,TRNS,NO, UP, NO, TRNS,TRNS,
LEFT,DOWN,RGHT,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layout: layer 9: reserved
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layout: layer 10: reserved
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
// MODIFIERS THAT WON'T BE STICKY
KEYMAP( // layout: layer 11: Special function-driven commands (any-key)
// left hand
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
LSFT,FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8,
FN8, FN8,
FN8,
FN8, FN10,FN8,
// right hand
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8, RSFT,
FN8, FN8, FN8, FN8, FN8, FN8, FN8,
FN8, FN8, FN8, FN8, FN8,
FN8, FN8,
FN8,
FN8, FN8, FN8
),
KEYMAP( // layout: layer 12: F-keys only
// left hand
FN0, NO, NO, NO, NO, NO, NO,
TRNS,F13, F14, F15, F16, NO, TRNS,
TRNS,F17, F18, F19, F20, NO,
TRNS,F21, F22, F23, F24, NO, TRNS,
FN13,FN13,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, F10, F11, F12, NO, TRNS,
TRNS,NO, F7, F8, F9, NO, TRNS,
NO, F4, F5, F6, NO, TRNS,
TRNS,NO, F1, F2, F3, NO, TRNS,
RGUI,RALT,RCTL,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // layout: layer 13: reserved
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
KEYMAP( // layout: layer 14: reserved
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
// TEMPLATES
/*
KEYMAP( // layout: layer N: transparent on edges, all others are empty
// left hand
TRNS,NO, NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO,
TRNS,NO, NO, NO, NO, NO, TRNS,
TRNS,TRNS,TRNS,LALT,LGUI,
TRNS,TRNS,
TRNS,
LCTL,LSFT,TRNS,
// right hand
NO, NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
NO, NO, NO, NO, NO, TRNS,
TRNS,NO, NO, NO, NO, NO, TRNS,
RGUI,RALT,TRNS,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,RSFT,RCTL
),
KEYMAP( // layout: layer N: fully transparent
// left hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS,
// right hand
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,TRNS,TRNS,
TRNS,TRNS,
TRNS,
TRNS,TRNS,TRNS
),
*/
};
/* id for user defined functions */
enum function_id {
TEENSY_KEY,
ANY_KEY,
PLOVER_SWITCH,
SHIFT_SWITCH,
FKEY_SWITCH,
};
enum macro_id {
MACRO_PASSWORD1,
MACRO_PASSWORD2,
MACRO_PASSWORD3,
};
/*
* Fn action definition
*/
static const uint16_t PROGMEM fn_actions[] = {
ACTION_LAYER_SET(0, ON_PRESS), // FN0 - set layer0 only
ACTION_LAYER_TAP_TOGGLE(8), // FN1 - switch to BlueShift
ACTION_LAYER_TAP_TOGGLE(7), // FN2 - movement tap/toggle
ACTION_LAYER_TAP_TOGGLE(6), // FN3 - numpad
ACTION_FUNCTION(TEENSY_KEY), // FN4 - Teensy key
ACTION_FUNCTION(PLOVER_SWITCH), // FN5 - enable Plover
ACTION_FUNCTION(PLOVER_SWITCH), // ** FN6 - suspend Plover (OUT OF USE)
ACTION_LAYER_MOMENTARY(11), // FN7 - Trigger the AnyKey layer
ACTION_FUNCTION(ANY_KEY), // FN8 - AnyKey functional layer
ACTION_MODS_TAP_TOGGLE(MOD_LSFT), // ** FN9 - tap toggle shift (OUT OF USE)
ACTION_MACRO(MACRO_PASSWORD1), // FN10 - password1
ACTION_MACRO(MACRO_PASSWORD2), // FN11 - password2
ACTION_FUNCTION(SHIFT_SWITCH), // FN12 - symbolized number row
ACTION_FUNCTION(FKEY_SWITCH), // FN13 - trigger Fkey layer and get rid of it appropriately
};
void simon_hotkey(keyrecord_t *record, action_t action)
{
keyevent_t event = record->event;
switch (action.kind.id) {
/* Key and Mods */
case ACT_LMODS:
case ACT_RMODS:
{
uint8_t mods = (action.kind.id == ACT_LMODS) ? action.key.mods :
action.key.mods<<4;
if (event.pressed) {
if (mods) {
add_weak_mods(mods);
send_keyboard_report();
}
register_code(action.key.code);
} else {
unregister_code(action.key.code);
if (mods) {
del_weak_mods(mods);
send_keyboard_report();
}
}
}
break;
default:
print("not supported.\n");
break;
}
}
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
keyevent_t event = record->event;
// print("action_function called\n");
// print("id = "); phex(id); print("\n");
// print("opt = "); phex(opt); print("\n");
if (id == TEENSY_KEY) {
clear_keyboard();
print("\n\nJump to bootloader... ");
_delay_ms(250);
bootloader_jump(); // should not return
print("not supported.\n");
}
else if (id == PLOVER_SWITCH) {
if (event.pressed) {
if (layer_state & 1<<4) { // plover is already on
print("switching off plover layout...\n");
action_macro_play(MACRO( D(A), D(W), D(P), D(F), D(SCLN), D(LBRC), D(QUOT), D(D), D(A), D(L), U(W), U(P), U(F), U(SCLN), U(LBRC), U(QUOT), U(D), U(L), END));
layer_off(4);
} else {
print("switching on plover layout...\n");
action_macro_play(MACRO(D(LANG5), U(LANG5), D(W), D(P), D(F), D(SCLN), D(LBRC), D(QUOT), D(D), D(A), U(W), U(P), U(F), U(SCLN), U(LBRC), U(QUOT), U(D), END));
layer_on(4);
}
}
}
else if (id == ANY_KEY) {
uint8_t col = event.key.col;
uint8_t row = event.key.row;
action_t action = { .code = ACTION_NO };
if (col == 3 && row == 2) { // Q
action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
}
if (col == 3 && row == 10) { // W
action.code = ACTION_MODS_KEY(MOD_LALT, KC_F4);
}
if (col == 4 && row == 12) { // Alt+tab
action.code = ACTION_MODS_KEY(MOD_LALT, KC_TAB);
}
if (action.code != ACTION_NO) {
simon_hotkey(record, action);
}
else
{
print("col = "); pdec(col); print("\n");
print("row = "); pdec(row); print("\n");
}
}
else if (id == SHIFT_SWITCH) {
uint8_t col = event.key.col;
uint8_t row = event.key.row;
uint8_t savedmods = get_mods();
uint8_t shiftpressed = (savedmods & (MOD_LSFT | MOD_RSFT));
uint8_t othermodspressed = (savedmods & (MOD_LGUI | MOD_RGUI | MOD_LCTL | MOD_RCTL | MOD_LALT | MOD_RALT ));
action_t action = { .code = ACTION_NO };
uint8_t keycode = KC_NO;
if (col == 0) { // Number row
switch (row) {
case 1:
keycode = KC_1;
break;
case 2:
keycode = KC_2;
break;
case 3:
keycode = KC_3;
break;
case 4:
keycode = KC_4;
break;
case 5:
keycode = KC_5;
break;
case 8:
keycode = KC_6;
break;
case 9:
keycode = KC_7;
break;
case 10:
keycode = KC_8;
break;
case 11:
keycode = KC_9;
break;
case 12:
keycode = KC_0;
break;
default:
break;
}
}
if (col == 1) { // next row
switch (row) {
case 2:
keycode = KC_LBRC;
break;
case 3:
keycode = KC_RBRC;
break;
default:
break;
}
}
if (keycode != KC_NO) {
action.code = ACTION_MODS_KEY(MOD_LSFT, keycode);
}
if (action.code != ACTION_NO) {
if (othermodspressed) {
action.key.mods = 0;
}
else if (shiftpressed) {
action.key.mods = 0;
del_mods(MOD_LSFT | MOD_RSFT);
}
simon_hotkey(record, action);
if (shiftpressed) {
set_mods(savedmods);
}
}
}
else if (id == FKEY_SWITCH) {
uint8_t row = event.key.row;
if (event.pressed) {
layer_on(12);
}
else {
if ((row == 0) && (layer_state & 1<<6)) { // left button and from numpad; out-of-order release
layer_off(6);
}
else if ((row == 1) && (layer_state & 1<<8)) { // right button and from BlueShift; out-of-order release
layer_off(8);
}
else {
layer_off(12);
}
}
}
}
/*
* Macro definition
*/
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
keyevent_t event = record->event;
if (event.pressed) {
switch (id) {
#include "keymap_simon_passwords.h"
}
}
return MACRO_NONE;
}

View file

@ -1,2 +0,0 @@
case MACRO_PASSWORD1:
return MACRO( D(LSFT), D(H), U(H), U(LSFT), D(E), U(E), D(L), U(L), D(L), U(L), D(O), U(O), D(DOT), U(DOT), D(W), U(W), D(O), U(O), D(R), U(R), D(L), U(L), D(D), U(D), D(ENTER), U(ENTER), END); // types "Hello.world{ENTER}"

View file

@ -1,45 +1,21 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
# make = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
# That's pretty much all you need. To compile, always go make clean,
# followed by make.
#
# For advanced users only:
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = ergodox
TARGET = ergodox_ez
# Directory common source filess exist
@ -49,9 +25,8 @@ TOP_DIR = ../..
TARGET_DIR = .
# # project specific files
SRC = ergodox.c \
twimaster.c \
backlight.c
SRC = ergodox_ez.c \
twimaster.c
ifdef KEYMAP
SRC := keymaps/keymap_$(KEYMAP).c $(SRC)

View file

@ -0,0 +1 @@
// TODO: Make up a proper readme for the ErgoDox EZ.

View file

@ -52,8 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 2
#define TAPPING_TERM 230
#define TAPPING_TOGGLE 2
#define TAPPING_TERM 100
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE

View file

@ -1,4 +1,4 @@
#include "ergodox.h"
#include "ergodox_ez.h"
#include "i2cmaster.h"
bool i2c_initialized = 0;

View file

@ -1,7 +1,8 @@
#include "ergodox.h"
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
// TODO: Define layer names that make sense for the ErgoDox EZ.
#define DEFAULT_LAYER 0
#define COLEMAK_LAYER 1
#define DVORAK_LAYER 2
@ -76,11 +77,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void * matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void * matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
@ -89,6 +91,7 @@ void * matrix_scan_user(void) {
ergodox_left_led_2_off();
ergodox_left_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
// all
ergodox_left_led_1_on();

View file

@ -1,3 +1,4 @@
// TODO: Move all of this stuff into the default keymap, and then get rid of this file.
#include "action_util.h"
#include "action_layer.h"
#define KC_SW0 KC_FN0

View file

@ -1,4 +1,10 @@
/*
Note for ErgoDox EZ customizers: Here be dragons!
This is not a file you want to be messing with.
All of the interesting stuff for you is under keymaps/ :)
Love, Erez
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>
This program is free software: you can redistribute it and/or modify
@ -27,7 +33,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "ergodox.h"
#include "ergodox_ez.h"
#include "i2cmaster.h"
#ifdef DEBUG_MATRIX_SCAN_RATE
#include "timer.h"
@ -80,7 +86,7 @@ void matrix_init(void)
// initialize row and col
mcp23018_status = init_mcp23018();
unselect_rows();
init_cols();
@ -133,69 +139,6 @@ uint8_t matrix_scan(void)
}
#endif
#ifdef KEYMAP_CUB
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_left_led_1_off();
ergodox_left_led_2_off();
ergodox_left_led_3_off();
switch (layer) {
case 1:
// all
ergodox_left_led_1_on();
ergodox_left_led_2_on();
ergodox_left_led_3_on();
break;
case 2:
// blue
ergodox_left_led_2_on();
break;
case 8:
// blue and green
ergodox_left_led_2_on();
// break missed intentionally
case 3:
// green
ergodox_left_led_3_on();
break;
case 6:
ergodox_board_led_on();
// break missed intentionally
case 4:
case 5:
case 7:
// white
ergodox_left_led_1_on();
break;
case 9:
// white+green
ergodox_left_led_1_on();
ergodox_left_led_3_on();
break;
default:
// none
break;
}
mcp23018_status = ergodox_left_leds_update();
#endif
#ifdef KEYMAP_SIMON
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
switch (layer) {
case 0:
// none
break;
default:
ergodox_board_led_on();
break;
}
#endif
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_row(i);
matrix_row_t cols = read_cols(i);
@ -268,11 +211,11 @@ uint8_t matrix_key_count(void)
*
* Teensy
* col: 0 1 2 3 4 5
* pin: F0 F1 F4 F5 F6 F7
* pin: F0 F1 F4 F5 F6 F7
*
* MCP23018
* col: 0 1 2 3 4 5
* pin: B5 B4 B3 B2 B1 B0
* pin: B5 B4 B3 B2 B1 B0
*/
static void init_cols(void)
{
@ -361,7 +304,7 @@ static void select_row(uint8_t row)
// set other rows hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out;
mcp23018_status = i2c_write( 0xFF & ~(1<<row)
mcp23018_status = i2c_write( 0xFF & ~(1<<row)
& ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
); if (mcp23018_status) goto out;
out:

View file

@ -1,6 +1,13 @@
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
// this is the style you want to emulate.
#include "planck.h"
#include "backlight.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.
#define _QW 0
#define _CM 1
#define _DV 2
@ -12,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
{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 },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(2), KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_RS), KC_SPC, KC_SPC, MO(_LW), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
},
[_CM] = { /* Colemak */
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
@ -50,11 +57,11 @@ const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
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:
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
backlight_step();
@ -62,6 +69,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
unregister_code(KC_RSFT);
}
break;
}
}
return MACRO_NONE;
};

View file

@ -1,43 +1,3 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
QUANTUM_DIR = quantum
# # project specific files

View file

@ -72,33 +72,51 @@ extern const uint16_t fn_actions[];
#define RGUI(kc) kc | 0x1800
// Aliases for shifted symbols
// Each key has a 4-letter code, and some have longer aliases too.
// While the long aliases are descriptive, the 4-letter codes
// make for nicer grid layouts (everything lines up), and are
// the preferred style for Quantum.
#define KC_TILD LSFT(KC_GRV) // ~
#define KC_TILDE KC_TILD
#define KC_EXLM LSFT(KC_1) // !
#define KC_EXCLAIM KC_EXLM
#define KC_AT LSFT(KC_2) // @
#define KC_HASH LSFT(KC_3) // #
#define KC_DLR LSFT(KC_4) // $
#define KC_DOLLAR KC_DLR
#define KC_PERC LSFT(KC_5) // %
#define KC_PERCENT KC_PERC
#define KC_CIRC LSFT(KC_6) // ^
#define KC_CIRCUMFLEX KC_CIRC
#define KC_AMPR LSFT(KC_7) // &
#define KC_AMPERSAND KC_AMPR
#define KC_ASTR LSFT(KC_8) // *
#define KC_ASTERISK KC_ASTR
#define KC_LPRN LSFT(KC_9) // (
#define KC_LEFT_PAREN KC_LPRN
#define KC_RPRN LSFT(KC_0) // )
#define KC_RIGHT_PAREN KC_RPRN
#define KC_UNDS LSFT(KC_MINS) // _
#define KC_UNDERSCORE KC_UNDS
#define KC_PLUS LSFT(KC_EQL) // +
#define KC_LCBR LSFT(KC_LBRC) // {
#define KC_LEFT_CURLY_BRACE KC_LCBR
#define KC_RCBR LSFT(KC_RBRC) // }
#define KC_RIGHT_CURLY_BRACE KC_RCBR
#define KC_PIPE LSFT(KC_SLSH) // |
// Alias for function layers than expand past FN31
@ -112,6 +130,9 @@ extern const uint16_t fn_actions[];
#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
// These affect the backlight (if your keyboard has one).
// We don't need to comment them out if your keyboard doesn't have a backlight,
// since they don't take up any space.
#define BL_ON 0x4009
#define BL_OFF 0x4000
#define BL_0 0x4000
@ -142,7 +163,7 @@ extern const uint16_t fn_actions[];
// when:
// ON_PRESS = 1
// ON_RELEASE = 2
// ON_BOTH = 3
// Unless you have a good reason not to do so, prefer ON_PRESS (1) as your default.
#define TO(layer, when) (layer | 0x5100 | (when << 0x4))
// Momentary switch layer - 256 layer max
@ -153,7 +174,11 @@ extern const uint16_t fn_actions[];
#define MIDI(n) (n | 0x6000)
#define UNI(n) (n | 0x8000)
// For sending unicode codes.
// You may not send codes over 1FFF -- this supports most of UTF8.
// To have a key that sends out Œ, go UC(0x0152)
#define UNICODE(n) (n | 0x8000)
#define UC(n) UNICODE(n)
#endif