Compare commits

..

47 Commits

Author SHA1 Message Date
Jack Humbert
bfc33a56d7 don't try to build the readme 2017-02-11 11:39:57 -05:00
Jack Humbert
835556da91 Merge pull request #1083 from VoodaGod/bone2planck
fixed readme (i swear)
2017-02-10 11:03:43 -05:00
VoodaGod
c0cfacda98 fixed readme (i swear) 2017-02-10 09:51:08 +01:00
Jack Humbert
6c462e0c01 Merge pull request #1073 from qmk/backlight_changes
Open backlight functionality to all ports
2017-02-09 20:14:35 -05:00
Jack Humbert
d537120eab Merge pull request #1078 from VoodaGod/bone2planck
updated Bone2Planck Keymap, Readme & fixed Makefile
2017-02-09 10:38:46 -05:00
Jack Humbert
93ee3bea37 Merge pull request #1079 from r2d2rogers/patch-1
[Typo] correct link to default keymap in readme.
2017-02-09 10:38:09 -05:00
Rob Rogers
2b95f41b91 [Typo] correct link to default keymap in readme. 2017-02-09 09:08:50 -06:00
VoodaGod
c330872f47 updated layout & readme 2017-02-09 13:07:59 +01:00
VoodaGod
986b065654 more formatting 2017-02-09 12:17:13 +01:00
VoodaGod
1becbcb013 readme formatting changes 2017-02-09 11:25:50 +01:00
VoodaGod
cb590bb37b updated readme 2017-02-09 11:21:52 +01:00
VoodaGod
9a64eb8533 updated bone2planck keymap & readme 2017-02-09 10:01:39 +01:00
Jack Humbert
0a9fda968d Merge pull request #1074 from dungdung/kc60_led
Moved KC60 capslock LED code to standard led_set_kb…
2017-02-07 21:25:00 -05:00
Jack Humbert
ad1327cd00 accept numbers in travis build 2017-02-07 20:51:50 -05:00
dungdung
304d84cd08 Moved KC60 capslock LED code to standard led_set_kb so it can be overridden by users 2017-02-07 16:55:40 -08:00
Jack Humbert
f5c8c5d4c8 Merge pull request #1070 from jimmyhchan/fixSplit
Lets split readme eeprom master hand fixes
2017-02-07 15:46:29 -05:00
Jimmy Chan
56d2198b3d rename I2C_MASTER_RIGHT to MASTER_RIGHT since this works for serial as well 2017-02-07 12:36:52 -08:00
Jimmy Chan
048ef311dc udpate readme to reflect QMK and not having the Makefile from ahtn's repo 2017-02-07 12:33:35 -08:00
Jimmy Chan
9c02e2ab49 correctly put eeprom EE_HANDS at addr 0x0a (decimal 10). default to rev2 project. do not default EE_HANDS for the serial keymap
if you compare split_util.h with the original project by ahtn, the
address we look for isLeftHand config went from addr 7 to addr 10
(decimal). The EEP files were not updated.

EE_HANDS should not be enabled by default since it's more confusing for
most users
2017-02-07 12:30:24 -08:00
Jack Humbert
b4e30d3929 added functionality for just a port 2017-02-07 15:23:56 -05:00
Jack Humbert
d639bd2021 Merge pull request #1072 from nicinabox/improve-ls-avrdude-target
Check for Pro Micro serial port automatically
2017-02-07 13:52:03 -05:00
Jack Humbert
42ea912fde Merge pull request #1062 from luizribeiro/fix-win
Fix V-USB bug on Windows 10
2017-02-07 13:49:10 -05:00
Jack Humbert
13c394fba4 Merge pull request #1071 from dungdung/rgb_tweaks
RGB tweaks
2017-02-07 13:32:31 -05:00
Jack Humbert
c0c69a1a7c Merge pull request #1068 from adzenith/master
Minor cleanup
2017-02-07 13:27:41 -05:00
Jack Humbert
3c7fa0acc1 Merge pull request #1046 from LukeSilva/master
Add Tapping Macros to QMK
2017-02-07 13:18:47 -05:00
Jack Humbert
0c2b6951a6 Merge pull request #1057 from priyadi/selectable_output
Implement runtime selectable output (USB or BT)
2017-02-07 13:12:29 -05:00
Nic Aitch
3dbdd15304 Check for a new serial port every second 2017-02-06 19:57:34 -06:00
dungdung
a7882b1ffc Added non-animated gradient mode 2017-02-06 14:18:20 -08:00
dungdung
5a1b68d562 Added mode reverse step function 2017-02-06 14:18:20 -08:00
dungdung
0e548f8b5d Christmas mode now works with even RGBED_NUM
Added Christmas mode steps to reduce red and green colors blending into each other
Added Christmas mode interval
Increased green hue to 120
2017-02-06 14:18:20 -08:00
Nikolaus Wittenstein
06d21009b2 Minor cleanup 2017-02-05 19:55:27 -05:00
Nikolaus Wittenstein
8cbf61c919 Add new DIODE_DIRECTION option
The previous two options were COL2ROW, ROW2COL; this adds CUSTOM_MATRIX
to disable the built-in matrix scanning code.

Most notably, this obviates the need to set MATRIX_ROW_PINS or
MATRIX_COL_PINS.
2017-02-05 19:47:33 -05:00
Nikolaus Wittenstein
d961c80df2 Remove unused matrix_raw variable in matrix.c 2017-02-05 19:41:08 -05:00
Nikolaus Wittenstein
101465b6ed Add missing header to ergodox ordinary keymap 2017-02-03 21:09:50 -05:00
Nikolaus Wittenstein
3faf06c880 Fix compile warnings in egodox robot_test_layout
Fixes the warning "right shift count >= width of type" by adding UL to
the end of constants.
2017-02-03 21:07:24 -05:00
Nikolaus Wittenstein
e667e9f6da Fix compile warnings in light_ws2812.c
Fixes the warning "function declaration isn't a prototype" by explicitly
making the parameter list void.
2017-02-03 21:00:13 -05:00
Luiz Ribeiro
a3da586505 Fix V-USB bug on Windows 10 2017-02-01 21:57:44 -05:00
Priyadi Iman Nurcahyo
e7c4f621f1 Restrict outputselect to LUFA only for now 2017-02-01 22:30:06 +07:00
Priyadi Iman Nurcahyo
98f9a2e6df Fix wrong include 2017-02-01 20:18:52 +07:00
Priyadi Iman Nurcahyo
2bef8b5b88 Limit outputselect to AVR only for now 2017-02-01 19:37:52 +07:00
Priyadi Iman Nurcahyo
72e95809a1 Move outputselect to parent dir to satisfy non LUFA keyboards 2017-02-01 17:55:13 +07:00
Priyadi Iman Nurcahyo
c17070eca5 Add layer switcher keycodes: OUT_AUTO, OUT_USB, OUT_BT, OUT_BLE 2017-02-01 15:35:21 +07:00
Priyadi Iman Nurcahyo
d8a9c63c26 Implement runtime selectable output (USB or BT) 2017-02-01 05:07:05 +07:00
Luke Silva
77e54e34e1 Add luke keymap, as an example of the tapping macros 2017-01-29 11:27:38 +11:00
Luke Silva
a3357d078e Add support for various tapping macros
A macro key can now be easily set to act as a modifier on hold, and
press a shifted key when tapped. Or to switch layers when held, and
again press a shifted key when tapped.

Various other helper defines have been created which send macros when
the key is pressed, released and tapped, cleaning up the
action_get_macro function inside keymap definitions.

The layer switching macros require a GCC extension - 'compound
statements enclosed within parentheses'. The use of this extension is
already present within the macro subsystem of this project, so its use
in this commit should not cause any additional issues.

MACRO_NONE had to be cast to a (macro_t*) to suppress compiler
warnings within some tapping macros.
2017-01-28 18:42:35 +11:00
Luke Silva
cfc4149712 Add ability to use tap macros without using functions 2017-01-27 10:28:42 +11:00
Luke Silva
87bc36253d Fix documentation for TMK actions 2017-01-26 22:44:22 +11:00
41 changed files with 976 additions and 247 deletions

View File

@@ -8,7 +8,7 @@ Beginner's keymap emulates standard QWERTY keyboard for beginners. Once you get
* Easy on beginners. It has everything you need for your day to day usage.
#### Cons
* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/default/readme.md)
* Keys are not ergonomically placed to take full advantage of Ergodox-EZ. Take a look at this [Default Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox/keymaps/default/readme.md)
* While multiple layers are possible, beginner's keymap only uses one additional layer for mouse, function and volume keys.
#### Notes

View File

@@ -1,5 +1,6 @@
#include "ergodox.h"
#include "led.h"
#include "mousekey.h"
#include "debug.h"
#include "action_layer.h"
#include "action_util.h"

View File

@@ -68,7 +68,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case RGB_FF0000:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
EZ_RGB(0xff0000);
EZ_RGB(0xff0000UL);
register_code(KC_1); unregister_code(KC_1);
#endif
}
@@ -77,7 +77,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case RGB_00FF00:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
EZ_RGB(0x00ff00);
EZ_RGB(0x00ff00UL);
register_code(KC_2); unregister_code(KC_2);
#endif
}
@@ -86,7 +86,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case RGB_0000FF:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
EZ_RGB(0x0000ff);
EZ_RGB(0x0000ffUL);
register_code(KC_3); unregister_code(KC_3);
#endif
}
@@ -95,7 +95,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case RGB_FFFFFF:
if (record->event.pressed) {
#ifdef RGBLIGHT_ENABLE
EZ_RGB(0xffffff);
EZ_RGB(0xffffffUL);
register_code(KC_4); unregister_code(KC_4);
#endif
}

View File

@@ -1 +1,16 @@
#include "kc60.h"
void led_set_kb(uint8_t usb_led)
{
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low
DDRB |= (1<<2);
PORTB &= ~(1<<2);
} else {
// Hi-Z
DDRB &= ~(1<<2);
PORTB &= ~(1<<2);
}
led_set_user(usb_led);
}

View File

@@ -1,6 +1,3 @@
# project specific files
SRC = led.c
# MCU name
#MCU = at90usb1287
MCU = atmega32u4

View File

@@ -1,3 +1,5 @@
SUBPROJECT_DEFAULT = rev2
ifndef MAKEFILE_INCLUDED
include ../../Makefile
endif
endif

View File

@@ -1,2 +1,2 @@
:080000000000000000000001F7
:0B0000000000000000000000000001F4
:00000001FF

View File

@@ -1,2 +1,2 @@
:080000000000000000000000F8
:0B0000000000000000000000000000F5
:00000001FF

View File

@@ -16,8 +16,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define USE_I2C
#define I2C_MASTER_LEFT
// #define I2C_MASTER_RIGHT
#define MASTER_LEFT
// #define _MASTER_RIGHT
// #define EE_HANDS
#ifdef SUBPROJECT_rev1
#include "../../rev1/config.h"
@@ -27,4 +28,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
#ifdef SUBPROJECT_rev2fliphalf
#include "../../rev2fliphalf/config.h"
#endif
#endif

View File

@@ -18,7 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define USE_SERIAL
#define EE_HANDS
#define MASTER_LEFT
// #define _MASTER_RIGHT
// #define EE_HANDS
#ifdef SUBPROJECT_rev1
@@ -29,4 +31,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
#ifdef SUBPROJECT_rev2fliphalf
#include "../../rev2fliphalf/config.h"
#endif
#endif

View File

@@ -6,9 +6,45 @@ This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/
Split keyboard firmware for Arduino Pro Micro or other ATmega32u4
based boards.
## First Time Setup
Download or clone the whole firmware and navigate to the keyboards/lets_split directory. Once your dev env is setup, you'll be able to generate the default .hex using:
```
$ make rev2
```
You will see a lot of output and if everything worked correctly you will see the built hex files:
```
lets_split_rev2_serial.hex
lets_split_rev2_i2c.hex
```
If you would like to use one of the alternative keymaps, or create your own, copy one of the existing [keymaps](keymaps/) and run make like so:
```
$ make rev2-YOUR_KEYMAP_NAME
```
If everything worked correctly you will see a file:
```
lets_split_rev2_YOUR_KEYMAP_NAME.hex
```
For more information on customizing keymaps, take a look at the primary documentation for [Customizing Your Keymap](/readme.md##customizing-your-keymap) in the main readme.md.
### Let's split 1.0
If you have a first generation Let's Split you will need to use the revision 1 code. To do so, use `rev1` in all your commands instead.
Features
--------
For the full Quantum Mechanical Keyboard feature list, see [the parent readme.md](/readme.md).
Some features supported by the firmware:
* Either half can connect to the computer via USB, or both halves can be used
@@ -62,7 +98,7 @@ unnecessary in simple use cases.
Notes on Software Configuration
-------------------------------
Configuring the firmware is similar to any other TMK project. One thing
Configuring the firmware is similar to any other QMK project. One thing
to note is that `MATIX_ROWS` in `config.h` is the total number of rows between
the two halves, i.e. if your split keyboard has 4 rows in each half, then
`MATRIX_ROWS=8`.
@@ -70,37 +106,59 @@ the two halves, i.e. if your split keyboard has 4 rows in each half, then
Also the current implementation assumes a maximum of 8 columns, but it would
not be very difficult to adapt it to support more if required.
Flashing
--------
-------
From the keymap directory run `make SUBPROJECT-KEYMAP-avrdude` for automatic serial port resolution and flashing.
Example: `make rev2-serial-avrdude`
Choosing which board to plug the USB cable into (choosing Master)
--------
Because the two boards are identical, the firmware has logic to differentiate the left and right board.
It uses two strategies to figure things out: look at the EEPROM (memory on the chip) or looks if the current board has the usb cable.
The EEPROM approach requires additional setup (flashing the eeeprom) but allows you to swap the usb cable to either side.
The USB cable approach is easier to setup and if you just want the usb cable on the left board, you do not need to do anything extra.
### Setting the left hand as master
If you always plug the usb cable into the left board, nothing extra is needed as this is the default. Comment out `EE_HANDS` and comment out `I2C_MASTER_RIGHT` or `MASTER_RIGHT` if for some reason it was set.
### Setting the right hand as master
If you always plug the usb cable into the right board, add an extra flag to your `config.h`
```
#define MASTER_RIGHT
```
### Setting EE_hands to use either hands as master
If you define `EE_HANDS` in your `config.h`, you will need to set the
EEPROM for the left and right halves. The EEPROM is used to store whether the
EEPROM for the left and right halves.
The EEPROM is used to store whether the
half is left handed or right handed. This makes it so that the same firmware
file will run on both hands instead of having to flash left and right handed
versions of the firmware to each half. To flash the EEPROM file for the left
half run:
```
make eeprom-left
avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep
// or the equivalent in dfu-programmer
```
and similarly for right half
```
make eeprom-right
avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep
// or the equivalent in dfu-programmer
```
After you have flashed the EEPROM for the first time, you then need to program
the flash memory:
```
make program
```
NOTE: replace `$(COM_PORT)` with the port of your device (e.g. `/dev/ttyACM0`)
After you have flashed the EEPROM, you then need to set `EE_HANDS` in your config.h, rebuild the hex files and reflash.
Note that you need to program both halves, but you have the option of using
different keymaps for each half. You could program the left half with a QWERTY
layout and the right half with a Colemak layout. Then if you connect the left
half to a computer by USB the keyboard will use QWERTY and Colemak when the
layout and the right half with a Colemak layout using bootmagic's default layout option.
Then if you connect the left half to a computer by USB the keyboard will use QWERTY and Colemak when the
right half is connected.

View File

@@ -76,10 +76,12 @@ CUSTOM_MATRIX = yes
avrdude: build
ls /dev/tty* > /tmp/1; \
echo "Reset your Pro Micro then hit any key to continue..."; \
read -n 1 -s; \
ls /dev/tty* > /tmp/2; \
USB=`diff /tmp/1 /tmp/2 | grep '>' | sed -e 's/> //'`; \
echo "Reset your Pro Micro now"; \
while [[ -z $$USB ]]; do \
sleep 1; \
ls /dev/tty* > /tmp/2; \
USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \
done; \
avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex
.PHONY: avrdude

View File

@@ -21,7 +21,8 @@ static void setup_handedness(void) {
#ifdef EE_HANDS
isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
#else
#ifdef I2C_MASTER_RIGHT
// I2C_MASTER_RIGHT is deprecated use MASTER_RIGHT instead since this works for both serial and i2c
#if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
isLeftHand = !has_usb();
#else
isLeftHand = has_usb();

View File

@@ -1,20 +1,16 @@
# Please remove if no longer applicable
$(warning THIS FILE MAY BE TOO LARGE FOR YOUR KEYBOARD)
$(warning Please disable some options in the Makefile to resolve)
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# 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)
MOUSEKEY_ENABLE = no # 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
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 = yes # Enable keyboard backlight functionality
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6
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.

View File

@@ -1,7 +1,8 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#endif
#include "../../config.h"
#define PREVENT_STUCK_MODIFIERS
#define PREVENT_STUCK_MODIFIERS
#endif

View File

@@ -7,11 +7,12 @@
// for intellisense, has to be commented for building
/*
#include "..\..\..\..\quantum\keymap_extras\keymap_german.h"
#include "..\..\..\..\quantum\keymap_common.h"
#include "..\..\..\..\tmk_core\common\keycode.h"
*/
#define _______ KC_TRNS
#define XXXXXXX KC_NO
/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
It has "üäöß" as it is optimized for a mix of German & English.
@@ -23,11 +24,11 @@ Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Bone2
/* Bone2 (adapted)
* ,-----------------------------------------------------------------------------------.
* | Q | J | D | U | A | X | P | H | L | M | W | |
* | ß | J | D | U | A | X | P | H | L | M | W | Q |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* |M1/Tab| C | T | I | E | O | B | N | R | S | G |M1/Ent| //hold for M1, tap for Tab/Enter
* | M1 | C | T | I | E | O | B | N | R | S | G |M1/Ent| //hold for M1, tap for Enter
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
@@ -35,20 +36,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
[0] = {
{ DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS },
{ LT(1,KC_TAB), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) },
{ DE_SS, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_Q },
//{ LT(1,KC_TAB), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) },
{ MO(1), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) },
{ KC_LSFT, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, KC_LSFT },
{ KC_LCTL, KC_RGUI, KC_LALT, MO(4), MO(2), KC_SPC, KC_SPC, MO(2), MO(4), KC_RALT, KC_ESC, KC_RCTL }
},
/* M1 Special Characters
very ergonomic placement for coding
* very ergonomic placement for coding
* ,-----------------------------------------------------------------------------------.
* | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | ´ |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* |M1/Tab| \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| //hold for M1, tap for Tab/Enter
* | M1 | \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| //hold for M1, tap for Enter
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| # | $ | | | ~ | € | + | % | " | ' | ; |Shift |
* | Shift| # | ~ | | | $ | € | + | % | " | ' | ; |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl |
* `-----------------------------------------------------------------------------------'
@@ -56,56 +58,55 @@ very ergonomic placement for coding
[1] = {
{ DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, DE_ACUT },
{ _______, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, _______ },
{ _______, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, _______ },
{ _______, DE_HASH, DE_TILD, DE_PIPE, DE_DLR, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, _______ },
{ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }
},
/* Navigation & Number Blocks
very easy to get used to & intuituve placement
/* M2 Navigation & Number Blocks
* very easy to get used to & intuituve placement
* ,-----------------------------------------------------------------------------------.
* | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | Ins |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Tab | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | Enter|
* | Tab | Home | Lft | Down | Right| End | | 4 | 5 | 6 | . | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | ; |Shift |
* | Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | , |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Alt | Esc | Ctrl |
* `-----------------------------------------------------------------------------------'
*/
[2] = {
{ KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_INS },
{ KC_TAB, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_ENT },
{ _______, KC_NO, KC_TAB, KC_NO, KC_ENT, KC_NO, DE_0, DE_1, DE_2, DE_3, DE_SCLN, _______ },
{ XXXXXXX, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, XXXXXXX, DE_7, DE_8, DE_9, XXXXXXX, KC_INS },
{ KC_TAB, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, DE_4, DE_5, DE_6, DE_DOT, KC_ENT },
{ _______, XXXXXXX, KC_TAB, XXXXXXX, KC_ENT, XXXXXXX, DE_0, DE_1, DE_2, DE_3, DE_COMM, _______ },
{ _______, _______, _______, MO(3), _______, _______, _______, _______, MO(3), _______, _______, _______ }
},
/* Flipped Navigation & Number Blocks for one handed use
accessed by sliding from M2 to M3 with thumb
/* M3 Switched Navigation & Number Blocks for one handed use
* accessed by sliding from M2 to M3 with thumb
* ,-----------------------------------------------------------------------------------.
* | Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | |
* | Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Tab | . | 4 | 5 | 6 | , | Home | Left | Down | Right| End | Enter|
* | Tab | | 4 | 5 | 6 | . | Home | Left | Down | Right| End | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| 0 | 1 | 2 | 3 | ; | | Tab | Ins | Enter| |Shift |
* | Shift| 0 | 1 | 2 | 3 | , | | Tab | | Enter| |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | | Space | | M3 | Alt | Esc | Ctrl |
* `-----------------------------------------------------------------------------------'
*/
[3] = {
{ KC_INS, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO },
{ _______, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______ },
{ _______, DE_0, DE_1, DE_2, DE_3, DE_SCLN, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, _______ },
{ _______, _______, _______, _______, KC_NO, _______, _______, KC_NO, _______, _______, _______, _______ }
{ KC_INS, XXXXXXX, DE_7, DE_8, DE_9, XXXXXXX, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, XXXXXXX },
{ _______, XXXXXXX, DE_4, DE_5, DE_6, DE_DOT, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______ },
{ _______, DE_0, DE_1, DE_2, DE_3, DE_COMM, XXXXXXX, KC_TAB, XXXXXXX, KC_ENT, XXXXXXX, _______ },
{ _______, _______, _______, _______, XXXXXXX, _______, _______, XXXXXXX, _______, _______, _______, _______ }
},
/* Function & Media Keys
slide from m4 to m5 to access flipped version
/* M4 Function & Media Keys
* ,-----------------------------------------------------------------------------------.
* | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | |
* | Tab | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
@@ -113,18 +114,19 @@ slide from m4 to m5 to access flipped version
* `-----------------------------------------------------------------------------------'
*/
[4] = {
{ KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO },
{ KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO },
{ _______, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, _______ },
{ XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, XXXXXXX },
{ KC_TAB, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_ENT },
{ _______, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, _______ },
{ _______, _______, _______, _______, MO(5), _______, _______, MO(5), _______, _______, _______, _______ }
},
/* flipped Function & Media Keys
/* M5 Switched Function & Media Keys|
* accessed by sliding from M4 to M5 with thumb
* ,-----------------------------------------------------------------------------------.
* | | | F7 | F8 | F9 | F12 | | Print|Scroll| Pause| | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | |
* | Tab | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ² | F1 | F2 | F3 | F10 | | Prev | Play | Next | |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
@@ -132,13 +134,14 @@ slide from m4 to m5 to access flipped version
* `-----------------------------------------------------------------------------------'
*/
[5] = {
{ KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO },
{ KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO },
{ _______, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, _______ },
{ _______, _______, _______, KC_NO, _______, _______, _______, _______, KC_NO, _______, _______, _______ }
{ XXXXXXX, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F12, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX },
{ _______, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, _______ },
{ _______, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, _______ },
{ _______, _______, _______, XXXXXXX, _______, _______, _______, _______, XXXXXXX, _______, _______, _______ }
}
};
const uint16_t PROGMEM fn_actions[] = {
};

View File

@@ -1,8 +1,96 @@
check keymap.c to the layers
Bone2Planck
=====================================
This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
This layout tries to emulate the Bone2 variant of Neo2, and is intended to be used with a German QWERTZ softwarelayout.
It has "üäöß" as it is optimized for a mix of German & English.
My favourite features are the placement of the special characters often used for programming right on the home row
and the number & navigation block combo, so you never have to move your hands from their home position.
The special character layer and the navigation & number block layer are inspired by the Neo2 layers,
designed to keep the fingers near the home row.
Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
To build, run "make" from within the \bone2planck folder.
## Bone2 (adapted) Base Layer
```
,-----------------------------------------------------------------------------------.
| ß | J | D | U | A | X | P | H | L | M | W | Q |
|------+------+------+------+------+-------------+------+------+------+------+------|
| M1 | C | T | I | E | O | B | N | R | S | G |M1/Ent| hold: M1, tap: Enter
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```
## M1 Special Characters
very ergonomic placement for coding
```
,-----------------------------------------------------------------------------------.
| ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | ´ |
|------+------+------+------+------+-------------+------+------+------+------+------|
| M1 | \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| hold: M1, tap: Enter
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| # | ~ | | | $ | € | + | % | " | ' | ; |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | M4 | M2 | Space | M2 | M4 | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```
## M2 Navigation & Number Blocks
very easy to get used to & intuituve placement
```
,-----------------------------------------------------------------------------------.
| | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | Ins |
|------+------+------+------+------+-------------+------+------+------+------+------|
| Tab | Home | Lft | Down | Right| End | | 4 | 5 | 6 | . | Enter|
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| | Tab | | Enter| | 0 | 1 | 2 | 3 | , |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```
## M4 Function & Media Keys
```
,-----------------------------------------------------------------------------------.
| | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | |
|------+------+------+------+------+-------------+------+------+------+------+------|
| Tab | | Mute | Vol- | Vol+ | | ³ | F4 | F5 | F6 | F11 | Enter|
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | M4 | M5 | Space | M5 | M4 | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```
##Switched layers for one handed access:
### M3 Switched Navigation & Number Blocks
accessed by sliding from M2 to M3 with thumb
```
,-----------------------------------------------------------------------------------.
| Ins | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | |
|------+------+------+------+------+-------------+------+------+------+------+------|
| Tab | | 4 | 5 | 6 | . | Home | Left | Down | Right| End | Enter|
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| 0 | 1 | 2 | 3 | , | | Tab | | Enter| |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | M3 | | Space | | M3 | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```
### M5 Switched Function & Media Keys
accessed by sliding from M4 to M5 with thumb
```
,-----------------------------------------------------------------------------------.
| | | F7 | F8 | F9 | F12 | | Print|Scroll| Pause| | |
|------+------+------+------+------+-------------+------+------+------+------+------|
| Tab | ³ | F4 | F5 | F6 | F11 | | Mute | Vol- | Vol+ | | Enter|
|------+------+------+------+------+------|------+------+------+------+------+------|
| Shift| ² | F1 | F2 | F3 | F10 | | Prev | Play | Next | |Shift |
|------+------+------+------+------+------+------+------+------+------+------+------|
| Ctrl | GUI | Alt | | M5 | Space | M5 | | Alt | Esc | Ctrl |
`-----------------------------------------------------------------------------------'
```

View File

@@ -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 = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = yes # 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.
# 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

View File

@@ -0,0 +1,355 @@
/*
* A keyboard layout for the gridded planck.
*
* Copyright (C) 2017 Luke Silva
*
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* ,-----------------------------------------------------------------------------------.
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*
* This layout uses colemak by default, and is designed for programming, with easy access to symbols
* through either double purpose modifiers or colemak style rolling for commonly used symbol clusters
* Eg: compare colemak 'this' to '(){\n}' on the symbol layer.
*
* The layout also supports a range of multilingual characters, covering those
* needed for French, German, Swedish and likely some other European Languages.
* In the future full support for Colemak's multilingual deadkeys may be introduced.
*
* The multilingual characters are inputted through QMK's unicode engine, using
* the Linux input method by default, however this can be changed at runtime.
*
*/
#include "planck.h"
#define _______ KC_TRNS
#define XXXXXXX KC_NO
// Layers
#define _COLEMAK 0
#define _QWERTY 1
#define _SYM 2
#define _NUM 3
#define _GR 4
#define _GR_S 5
#define _ADJ 6
#define _NAV 7
#define _PLOVER 8
// Macro ID numbers
#define M_ALT_HASH 1
#define M_GR_DASH 2
#define M_SYM_LPRN 3
#define M_NAV_UNDS 4
#define M_NUM_RPRN 5
#define M_CTRL_DLR 6
#define M_LCBR_ENT 7
#define M_PLOVER 8
#define M_EXT_PLV 9
#define M_WINDOWS 10
#define M_LINUX 11
#define M_OSX 12
#define M_FUNCTION 13
#define M_THEN 14
#define M_CATCH 15
// Macro keys
#define ALT_HASH MACROTAP(M_ALT_HASH) // tap for #, hold for Alt
#define GR_DASH MACROTAP(M_GR_DASH) // tap for -, hold for GR layer a-class-name
#define SYM_LPRN MACROTAP(M_SYM_LPRN) // tap for (, hold for symbols layer if()
#define NAV_UNDS MACROTAP(M_NAV_UNDS) // tap for _, hold for navigation layer snake_case_variable
#define NUM_RPRN MACROTAP(M_NUM_RPRN) // tap for ), hold for numbers layer else if()
#define CTRL_DLR MACROTAP(M_CTRL_DLR) // tap for $, hold for ctrl $php_is_really_weird
#define LCBR_ENT M(M_LCBR_ENT) // {\n easier code formatting
#define PLOVER M(M_PLOVER) // PHROPB (plover) or ERFVIK(qwerty) starts plover
#define EXT_PLV M(M_EXT_PLV) // PHRO*F (plover) or ERFVYU(qwerty) stops plover
#define WINDOWS M(M_WINDOWS) // Sets Unicode handler to windows
#define LINUX M(M_LINUX) // Sets Unicode handler to linux
#define OSX M(M_OSX) // Sets Unicode handler to OSX
#define FUNCTION M(M_FUNCTION)
#define THEN M(M_THEN)
#define CATCH M(M_CATCH)
// Renames of QMK keys... (would have otherwise been a macro)
#define QWERTY DF(_QWERTY)
#define COLEMAK DF(_COLEMAK)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Colemak
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | F | P | G | J | L | U | Y | ;: | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Bksp | A | R | S | T | D | H | N | E | I | O | '" |
* |------+------+------+------+------+------+------+------+------+------+------+------`---.
* |Shift=| Z | X | C | V | B | K | M | ,< | .> | /? |Shift/Ent |
* |------+------+------+------+------+------+------+------+------+------+------+----------|
* |CtCaps|GUIF4 | Alt# | Gr- | Sym( | Nav_ |Space | Num) |Ctrl$ | F11 | F12 |Nav toggle|
* `---------------------------------------------------------------------------------------'
*/
[_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},
{KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{SFT_T(KC_EQL), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) },
{CTL_T(KC_CAPS), KC_LGUI, ALT_HASH, GR_DASH, SYM_LPRN, NAV_UNDS, KC_SPC, NUM_RPRN, CTRL_DLR, KC_F11, KC_F12, TG(_NAV)}
},
/* QWERTY
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Bksp | A | S | D | F | G | H | J | K | L | ;: | '" |
* |------+------+------+------+------+------+------+------+------+------+------+------`---.
* |Shift=| Z | X | C | V | B | N | M | ,< | .> | /? |Shift/Ent |
* |------+------+------+------+------+------+------+------+------+------+------+----------|
* |CtCaps|GUIF4 | Alt# | Gr- | Sym( | Nav_ |Space | Num) |Ctrl$ | F11 | F12 |Nav toggle|
* `---------------------------------------------------------------------------------------'
*/
[_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_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) },
{CTL_T(KC_CAPS), KC_LGUI, KC_LALT, GR_DASH, SYM_LPRN,KC_SPC, KC_SPC, NUM_RPRN, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT}
},
/* Symbols
* ,-----------------------------------------------------------------------------------.
* | Tab | ` | @ | / | * | ^ | % | : | + | - | Del | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | [ | ; | } | ( | " | ' | ) | {\n | ! | ] | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* |Shift | . | { | < | > | ~ | X2 | = | & | | | ? |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | Sym | _ |Space | NUM | X2 | | | |
* `-----------------------------------------------------------------------------------'
*/
[_SYM] = {
{KC_TAB, KC_GRV, KC_AT, KC_SLSH, KC_ASTR, KC_CIRC, KC_PERC, KC_COLN, KC_PLUS, KC_MINS, KC_DEL, KC_BSPC},
{FUNCTION,KC_LBRC, KC_SCLN, KC_RCBR, KC_LPRN, KC_DQT, KC_QUOT, KC_RPRN, LCBR_ENT,KC_EXLM, KC_RBRC, KC_BSLS},
{KC_LSFT, KC_DOT, KC_LCBR, KC_LABK, KC_RABK, KC_TILD, _______, KC_EQL, KC_AMPR, KC_PIPE, KC_QUES, KC_ENT },
{THEN, CATCH, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______}
},
/* Numbers
* ,-----------------------------------------------------------------------------------.
* | Tab | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Bksp | x | D | E | F | + | - | 4 | 5 | 6 | 0 |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* |Shift | ( | A | B | C | * | / | 1 | 2 | 3 | ) |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | GR | SYM | _ |Space | NUM | 0 | . | f | |
* `-----------------------------------------------------------------------------------'
*/
[_NUM] = {
{KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_BSPC, KC_X, S(KC_D), S(KC_E), S(KC_F), KC_PLUS, KC_MINS, KC_4, KC_5, KC_6, KC_0, KC_ENT },
{KC_LSFT, KC_LPRN, S(KC_A), S(KC_B), S(KC_C), KC_ASTR, KC_SLSH, KC_1, KC_2, KC_3, KC_RPRN, KC_ENT },
{_______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_F, _______}
},
/* Gr layer / international keys
* ,-----------------------------------------------------------------------------------.
* | | ä | å | | ¢£ | €¥ | | ë | ê | ü | ù | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | â | à | ß | | | | è | é | ï | ö | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | æ | ô | ç | œ | | | û | « | » | î | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_GR] = {
{_______, UC(0xE4),UC(0xE5), _______,UC(0xA2), UC(0x20AC),_______,UC(0xEB),UC(0xEA),UC(0xFC),UC(0xF9), _______},
{_______, UC(0xE2),UC(0xE0),UC(0xDF), _______, _______, _______,UC(0xE8),UC(0xE9),UC(0xEF),UC(0xF6), _______},
{MO(_GR_S),UC(0xE6),UC(0xF4),UC(0xE7),UC(0x153),_______, _______,UC(0xFB),UC(0xAB),UC(0xBB),UC(0xEE), MO(_GR_S)},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
// Shifted layer of the above
[_GR_S] = {
{_______, UC(0xC4),UC(0xC5), _______, UC(0xA3), UC(0xA5),_______, UC(0xCB),UC(0xCA),UC(0xDC),UC(0xD9),_______},
{_______, UC(0xC2),UC(0xC0), UC(0xDF),_______, _______, _______, UC(0xC8),UC(0xC9),UC(0xCF),UC(0xD6),_______},
{MO(_GR_S),UC(0xC6),UC(0xD4), UC(0xC7),UC(0x152),_______, _______, UC(0xDB),UC(0xAB),UC(0xBB),UC(0xCE),MO(_GR_S)},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* Adjust Layer (Gr + Num)
* ,-----------------------------------------------------------------------------------.
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
* |------+-------------+------+------+------+------+------+------+------+------+------|
* | | |Prntscr| ESC |VOLUP | PLAY | PREV |QWERTY|COLEMAK|PLOVER| | |
* |------+-------------+------+------+------+------+------+------+------+------+------|
* | | |BACKLIT| INS |VOLDWN| MUTE | NEXT | WIND |LINUX | OSX | | |
* |------+-------------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJ] = {
{KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 },
{XXXXXXX, XXXXXXX, KC_PSCR, KC_ESC, KC_VOLU, KC_MPLY, KC_MPRV, QWERTY, COLEMAK, PLOVER, XXXXXXX, XXXXXXX},
{XXXXXXX, XXXXXXX, BL_STEP, KC_INS, KC_VOLD, KC_MUTE, KC_MNXT, WINDOWS, LINUX, OSX, XXXXXXX, XXXXXXX},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* Navigation
* ,-----------------------------------------------------------------------------------.
* | | | BTN3 | BTN2 | BTN1 | | ACL0 | HOME | PGDN | PGUP | END | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | |MSLEFT| MSDN | MSUP |MSRGHT| | ACL1 | LEFT | DOWN | UP | RGHT |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | |WHLEFT| WHDN | WHUP |WHRGHT| | ACL2 |C-LEFT|C-PGDN|C-PGUP|C-RGHT|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | _ |Space | ACL0 | ACL1 | ACL2 | |TGLNAV|
* `-----------------------------------------------------------------------------------'
*/
[_NAV] = {
{XXXXXXX, XXXXXXX, KC_BTN3, KC_BTN2, KC_BTN1, XXXXXXX, KC_ACL0, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_BSPC},
{XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, KC_ACL1, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_ENT },
{XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, XXXXXXX, KC_ACL2, LCTL(KC_LEFT), LCTL(KC_PGDN), LCTL(KC_PGUP), LCTL(KC_RIGHT), KC_ENT },
{_______, _______, _______, _______, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______}
},
/* Plover Layer
* ,-----------------------------------------------------------------------------------.
* | | S | T | P | H | * | * | F | P | L | T | D |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* |TogOut| S | K | W | R | * | * | R | B | G | S | Z |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | # | # | # | # | # | # | # | # | # | # | # | # |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Exit | | | # | A | O | E | U | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_PLOVER] = {
{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},
{KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
{EXT_PLV, XXXXXXX, XXXXXXX, KC_1, KC_C, KC_V, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX}
}
};
const uint16_t PROGMEM fn_actions[] = {
};
void matrix_init_user(){
set_unicode_input_mode(UC_LNX);
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case M_ALT_HASH:
return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 3, LALT);
case M_GR_DASH:
{
const macro_t* macro = MACRO_TAP_HOLD_LAYER(record, MACRO(T(MINS)), _GR);
update_tri_layer(_NUM, _GR, _ADJ);
return macro;
}
case M_SYM_LPRN:
return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 9, _SYM);
case M_NAV_UNDS:
return MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, MINS, _NAV);
case M_NUM_RPRN:
{
const macro_t* macro = MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, 0, _NUM);
update_tri_layer(_NUM, _GR, _ADJ);
return macro;
}
case M_CTRL_DLR:
return MACRO_TAP_SHFT_KEY_HOLD_MOD(record, 4, LCTL);
case M_LCBR_ENT:
return MACRODOWN(I(10), D(LSFT), T(LBRC), U(LSFT), T(ENT), END);
case M_PLOVER:
if (record->event.pressed) {
layer_and(0);
layer_on(_PLOVER);
default_layer_set(_PLOVER);
// Starts plover
return MACRO(I(10), D(E), D(R), D(F), D(V), D(I), D(K), U(E), U(R), U(F), U(V), U(I), U(K), END);
}
break;
case M_EXT_PLV:
if (!record->event.pressed) {
layer_off(_PLOVER);
default_layer_set(_COLEMAK);
//Pauses plover
return MACRO(I(10), D(E), D(R), D(F), D(V), D(Y), D(U), U(E), U(R), U(F), U(V), U(Y), U(U), END);
}
break;
case M_WINDOWS:
set_unicode_input_mode(UC_WIN);
break;
case M_LINUX:
set_unicode_input_mode(UC_LNX);
break;
case M_OSX:
set_unicode_input_mode(UC_OSX);
break;
case M_FUNCTION:
if (record->event.pressed) {
SEND_STRING("function");
}
break;
case M_THEN:
if (record->event.pressed) {
SEND_STRING("then");
}
break;
case M_CATCH:
if (record->event.pressed) {
SEND_STRING("catch");
}
break;
}
return MACRO_NONE;
};

View File

@@ -0,0 +1,2 @@
# A more basic Planck Layout for copying

View File

@@ -2,8 +2,10 @@
#define CONFIG_DEFINITIONS_H
/* diode directions */
#define COL2ROW 0
#define ROW2COL 1
#define COL2ROW 0
#define ROW2COL 1
#define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */
/* I/O pins */
#ifndef F0
#define B0 0x30

View File

@@ -80,7 +80,10 @@ action_t action_for_key(uint8_t layer, keypos_t key)
action.code = keymap_function_id_to_action( (int)keycode & 0xFFF );
break;
case QK_MACRO ... QK_MACRO_MAX:
action.code = ACTION_MACRO(keycode & 0xFF);
if (keycode & 0x800) // tap macros have upper bit set
action.code = ACTION_MACRO_TAP(keycode & 0xFF);
else
action.code = ACTION_MACRO(keycode & 0xFF);
break;
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);

View File

@@ -70,7 +70,7 @@ void I2C_WriteBit(unsigned char c)
// Inits bitbanging port, must be called before using the functions below
//
void I2C_Init()
void I2C_Init(void)
{
I2C_PORT &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK));
@@ -82,7 +82,7 @@ void I2C_Init()
// Send a START Condition
//
void I2C_Start()
void I2C_Start(void)
{
// set both to high at the same time
I2C_DDR &= ~ ((1 << I2C_DAT) | (1 << I2C_CLK));
@@ -97,7 +97,7 @@ void I2C_Start()
// Send a STOP Condition
//
void I2C_Stop()
void I2C_Stop(void)
{
I2C_CLOCK_HI();
_delay_us(I2C_DELAY);

View File

@@ -60,13 +60,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
extern const matrix_row_t matrix_mask[];
#endif
#if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
#endif
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_raw[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
@@ -76,7 +77,7 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static void unselect_rows(void);
static void select_row(uint8_t row);
static void unselect_row(uint8_t row);
#else // ROW2COL
#elif (DIODE_DIRECTION == ROW2COL)
static void init_rows(void);
static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col);
static void unselect_cols(void);
@@ -133,7 +134,7 @@ uint8_t matrix_cols(void) {
// /* PORTxn */
// _SFR_IO8((col_pins[c] >> 4) + 2) |= _BV(col_pins[c] & 0xF);
// }
// #else
// #elif (DIODE_DIRECTION == ROW2COL)
// for (int8_t c = MATRIX_COLS - 1; c >= 0; --c) {
// /* DDRxn */
// _SFR_IO8((col_pins[c] >> 4) + 1) |= _BV(col_pins[c] & 0xF);
@@ -158,7 +159,7 @@ void matrix_init(void) {
#if (DIODE_DIRECTION == COL2ROW)
unselect_rows();
init_cols();
#else // ROW2COL
#elif (DIODE_DIRECTION == ROW2COL)
unselect_cols();
init_rows();
#endif
@@ -166,7 +167,6 @@ void matrix_init(void) {
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
matrix_raw[i] = 0;
matrix_debouncing[i] = 0;
}
@@ -194,7 +194,7 @@ uint8_t matrix_scan(void)
}
#else // ROW2COL
#elif (DIODE_DIRECTION == ROW2COL)
// Set col, read rows
for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
@@ -336,7 +336,7 @@ static void unselect_rows(void)
}
}
#else // ROW2COL
#elif (DIODE_DIRECTION == ROW2COL)
static void init_rows(void)
{

View File

@@ -1,4 +1,7 @@
#include "quantum.h"
#ifdef PROTOCOL_LUFA
#include "outputselect.h"
#endif
#ifndef TAPPING_TERM
#define TAPPING_TERM 200
@@ -243,6 +246,36 @@ bool process_record_quantum(keyrecord_t *record) {
return false;
break;
#endif
#ifdef PROTOCOL_LUFA
case OUT_AUTO:
if (record->event.pressed) {
set_output(OUTPUT_AUTO);
}
return false;
break;
case OUT_USB:
if (record->event.pressed) {
set_output(OUTPUT_USB);
}
return false;
break;
#ifdef BLUETOOTH_ENABLE
case OUT_BT:
if (record->event.pressed) {
set_output(OUTPUT_BLUETOOTH);
}
return false;
break;
#endif
#ifdef ADAFRUIT_BLE_ENABLE
case OUT_BLE:
if (record->event.pressed) {
set_output(OUTPUT_ADAFRUIT_BLE);
}
return false;
break;
#endif
#endif
case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO:
if (record->event.pressed) {
// MAGIC actions (BOOTMAGIC without the boot)
@@ -561,34 +594,45 @@ static const uint8_t backlight_pin = BACKLIGHT_PIN;
# define COM1x1 COM1A1
# define OCR1x OCR1A
#else
# error "Backlight pin not supported - use B5, B6, or B7"
# define NO_BACKLIGHT_CLOCK
#endif
#ifndef BACKLIGHT_ON_STATE
#define BACKLIGHT_ON_STATE 0
#endif
__attribute__ ((weak))
void backlight_init_ports(void)
{
// Setup backlight pin as output and output low.
// Setup backlight pin as output and output to on state.
// DDRx |= n
_SFR_IO8((backlight_pin >> 4) + 1) |= _BV(backlight_pin & 0xF);
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#if BACKLIGHT_ON_STATE == 0
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#else
// PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#endif
// Use full 16-bit resolution.
ICR1 = 0xFFFF;
#ifndef NO_BACKLIGHT_CLOCK
// 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
// 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
// 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(COM1x1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
TCCR1A = _BV(COM1x1) | _BV(WGM11); // = 0b00001010;
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
#endif
backlight_init();
#ifdef BACKLIGHT_BREATHING
@@ -600,24 +644,43 @@ __attribute__ ((weak))
void backlight_set(uint8_t level)
{
// Prevent backlight blink on lowest level
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#if BACKLIGHT_ON_STATE == 0
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#else
// PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#endif
if ( level == 0 ) {
// Turn off PWM control on backlight pin, revert to output low.
TCCR1A &= ~(_BV(COM1x1));
OCR1x = 0x0;
} else if ( level == BACKLIGHT_LEVELS ) {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
// Set the brightness
OCR1x = 0xFFFF;
} else {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
// Set the brightness
OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
#ifndef NO_BACKLIGHT_CLOCK
// Turn off PWM control on backlight pin, revert to output low.
TCCR1A &= ~(_BV(COM1x1));
OCR1x = 0x0;
#else
#if BACKLIGHT_ON_STATE == 0
// PORTx |= n
_SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF);
#else
// PORTx &= ~n
_SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF);
#endif
#endif
}
#ifndef NO_BACKLIGHT_CLOCK
else if ( level == BACKLIGHT_LEVELS ) {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
// Set the brightness
OCR1x = 0xFFFF;
}
else {
// Turn on PWM control of backlight pin
TCCR1A |= _BV(COM1x1);
// Set the brightness
OCR1x = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
}
#endif
#ifdef BACKLIGHT_BREATHING
breathing_intensity_default();

View File

@@ -15,7 +15,6 @@
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
#include "action_layer.h"
#include "eeconfig.h"
#include <stddef.h>

View File

@@ -141,6 +141,16 @@ enum quantum_keycodes {
PRINT_ON,
PRINT_OFF,
// output selection
OUT_AUTO,
OUT_USB,
#ifdef BLUETOOTH_ENABLE
OUT_BT,
#endif
#ifdef ADAFRUIT_BLE_ENABLE
OUT_BLE,
#endif
// always leave at the end
SAFE_RANGE
};
@@ -246,8 +256,10 @@ enum quantum_keycodes {
#define M(kc) (kc | QK_MACRO)
#define MACROTAP(kc) (kc | QK_MACRO | FUNC_TAP<<8)
#define MACRODOWN(...) (record->event.pressed ? MACRO(__VA_ARGS__) : MACRO_NONE)
// L-ayer, T-ap - 256 keycode max, 16 layer max
#define LT(layer, kc) (kc | QK_LAYER_TAP | ((layer & 0xF) << 8))

View File

@@ -66,6 +66,8 @@ __attribute__ ((weak))
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
__attribute__ ((weak))
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20};
__attribute__ ((weak))
const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90};
rgblight_config_t rgblight_config;
rgblight_config_t inmem_config;
@@ -219,6 +221,14 @@ void rgblight_step(void) {
}
rgblight_mode(mode);
}
void rgblight_step_reverse(void) {
uint8_t mode = 0;
mode = rgblight_config.mode - 1;
if (mode < 1) {
mode = RGBLIGHT_MODES;
}
rgblight_mode(mode);
}
void rgblight_mode(uint8_t mode) {
if (!rgblight_config.enable) {
@@ -237,7 +247,7 @@ void rgblight_mode(uint8_t mode) {
#ifdef RGBLIGHT_ANIMATIONS
rgblight_timer_disable();
#endif
} else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 23) {
} else if (rgblight_config.mode >= 2 && rgblight_config.mode <= 24) {
// MODE 2-5, breathing
// MODE 6-8, rainbow mood
// MODE 9-14, rainbow swirl
@@ -247,6 +257,12 @@ void rgblight_mode(uint8_t mode) {
#ifdef RGBLIGHT_ANIMATIONS
rgblight_timer_enable();
#endif
} else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
// MODE 25-34, static gradient
#ifdef RGBLIGHT_ANIMATIONS
rgblight_timer_disable();
#endif
}
rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
}
@@ -350,6 +366,17 @@ void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) {
} else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) {
// rainbow mood and rainbow swirl, ignore the change of hue
hue = rgblight_config.hue;
} else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) {
// static gradient
uint16_t _hue;
int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1;
uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]);
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
_hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360;
dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range);
sethsv(_hue, sat, val, (LED_TYPE *)&led[i]);
}
rgblight_set();
}
}
rgblight_config.hue = hue;
@@ -450,7 +477,7 @@ void rgblight_task(void) {
} else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) {
// mode = 21 to 23, knight mode
rgblight_effect_knight(rgblight_config.mode - 21);
} else {
} else if (rgblight_config.mode == 24) {
// mode = 24, christmas mode
rgblight_effect_christmas();
}
@@ -604,13 +631,13 @@ void rgblight_effect_christmas(void) {
static uint16_t last_timer = 0;
uint16_t hue;
uint8_t i;
if (timer_elapsed(last_timer) < 1000) {
if (timer_elapsed(last_timer) < RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL) {
return;
}
last_timer = timer_read();
current_offset = (current_offset + 1) % 2;
for (i = 0; i < RGBLED_NUM; i++) {
hue = 0 + ((RGBLED_NUM * (i + current_offset)) % 2) * 80;
hue = 0 + ((i/RGBLIGHT_EFFECT_CHRISTMAS_STEP + current_offset) % 2) * 120;
sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]);
}
rgblight_set();

View File

@@ -2,7 +2,7 @@
#define RGBLIGHT_H
#ifdef RGBLIGHT_ANIMATIONS
#define RGBLIGHT_MODES 24
#define RGBLIGHT_MODES 34
#else
#define RGBLIGHT_MODES 1
#endif
@@ -22,6 +22,14 @@
#define RGBLIGHT_EFFECT_DUALKNIGHT_LENGTH 4
#endif
#ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000
#endif
#ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2
#endif
#ifndef RGBLIGHT_HUE_STEP
#define RGBLIGHT_HUE_STEP 10
#endif
@@ -65,6 +73,7 @@ void rgblight_decrease(void);
void rgblight_toggle(void);
void rgblight_enable(void);
void rgblight_step(void);
void rgblight_step_reverse(void);
void rgblight_mode(uint8_t mode);
void rgblight_set(void);
void rgblight_update_dword(uint32_t dword);

View File

@@ -46,7 +46,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS { F1, F0, B0 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
#define DIODE_DIRECTION COL2ROW
// #define BACKLIGHT_PIN B7

View File

@@ -47,10 +47,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* 0100|10| usage(10) (reserved)
* 0100|11| usage(10) (reserved)
*
* ACT_MOUSEKEY(0110): TODO: Not needed?
*
* ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space?
* 0101|xxxx| keycode Mouse key
*
* 011x|xxxx xxxx xxxx (reseved)
* ACT_SWAP_HANDS(0110):
* 0110|xxxx| keycode Swap hands (keycode on tap, or options)
*
*
* 0111|xxxx xxxx xxxx (reserved)
*
*
* Layer Actions(10xx)
@@ -67,7 +72,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* ee: on event(01:press, 10:release, 11:both)
*
* 1001|xxxx|xxxx xxxx (reserved)
* 1001|oopp|BBBB BBBB 8-bit Bitwise Operation???
*
* ACT_LAYER_TAP(101x):
* 101E|LLLL| keycode On/Off with tap key (0x00-DF)[TAP]

View File

@@ -20,11 +20,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "progmem.h"
#define MACRO_NONE 0
typedef uint8_t macro_t;
#define MACRO_NONE (macro_t*)0
#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })
#define MACRO_GET(p) pgm_read_byte(p)
typedef uint8_t macro_t;
// Sends press when the macro key is pressed, release when release, or tap_macro when the key has been tapped
#define MACRO_TAP_HOLD(record, press, release, tap_macro) ( ((record)->event.pressed) ? \
( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? (press) : MACRO_NONE ) : \
( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (tap_macro) : (release) ) )
// Holds down the modifier mod when the macro key is held, or sends macro instead when tapped
#define MACRO_TAP_HOLD_MOD(record, macro, mod) MACRO_TAP_HOLD(record, (MACRO(D(mod), END)), MACRO(U(mod), END), macro)
// Holds down the modifier mod when the macro key is held, or pressed a shifted key when tapped (eg: shift+3 for #)
#define MACRO_TAP_SHFT_KEY_HOLD_MOD(record, key, mod) MACRO_TAP_HOLD_MOD(record, (MACRO(I(10), D(LSFT), T(key), U(LSFT), END)), mod)
// Momentary switch layer when held, sends macro if tapped
#define MACRO_TAP_HOLD_LAYER(record, macro, layer) ( ((record)->event.pressed) ? \
( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? ({layer_on((layer)); MACRO_NONE; }) : MACRO_NONE ) : \
( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : ({layer_off((layer)); MACRO_NONE; }) ) )
// Momentary switch layer when held, presses a shifted key when tapped (eg: shift+3 for #)
#define MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, key, layer) MACRO_TAP_HOLD_LAYER(record, MACRO(I(10), D(LSFT), T(key), U(LSFT), END), layer)
#ifndef NO_ACTION_MACRO

View File

@@ -14,6 +14,7 @@ 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/>.
*/
#include <stdint.h>
#include "keyboard.h"
#include "matrix.h"

View File

@@ -50,7 +50,7 @@ void matrix_init(void);
uint8_t matrix_scan(void);
/* whether modified from previous scan. used after matrix_scan. */
bool matrix_is_modified(void) __attribute__ ((deprecated));
/* whether a swtich is on */
/* whether a switch is on */
bool matrix_is_on(uint8_t row, uint8_t col);
/* matrix state on row */
matrix_row_t matrix_get_row(uint8_t row);

View File

@@ -134,13 +134,6 @@ typedef union {
} nkro;
#endif
} __attribute__ ((packed)) report_keyboard_t;
/*
typedef struct {
uint8_t mods;
uint8_t reserved;
uint8_t keys[REPORT_KEYS];
} __attribute__ ((packed)) report_keyboard_t;
*/
typedef struct {
uint8_t buttons;

View File

@@ -8,13 +8,14 @@ LUFA_PATH ?= $(LUFA_DIR)/LUFA-git
ifneq (, $(wildcard $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk))
# New build system from 20120730
LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA
include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk
include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk
else
include $(TMK_PATH)/$(LUFA_PATH)/LUFA/makefile
endif
LUFA_SRC = lufa.c \
descriptor.c \
outputselect.c \
$(LUFA_SRC_USB)
ifeq ($(strip $(MIDI_ENABLE)), yes)

View File

@@ -53,6 +53,7 @@
#include "lufa.h"
#include "quantum.h"
#include <util/atomic.h>
#include "outputselect.h"
#ifdef NKRO_ENABLE
#include "keycode_config.h"
@@ -589,59 +590,33 @@ void EVENT_USB_Device_ControlRequest(void)
/*******************************************************************************
* Host driver
p
******************************************************************************/
static uint8_t keyboard_leds(void)
{
return keyboard_led_stats;
}
#define SendToUSB 1
#define SendToBT 2
#define SendToBLE 4
static inline uint8_t where_to_send(void) {
#ifdef ADAFRUIT_BLE_ENABLE
#if 0
if (adafruit_ble_is_connected()) {
// For testing, send to BLE as a priority
return SendToBLE;
}
#endif
// This is the real policy
if (USB_DeviceState != DEVICE_STATE_Configured) {
if (adafruit_ble_is_connected()) {
return SendToBLE;
}
}
#endif
return ((USB_DeviceState == DEVICE_STATE_Configured) ? SendToUSB : 0)
#ifdef BLUETOOTH_ENABLE
|| SendToBT
#endif
;
}
static void send_keyboard(report_keyboard_t *report)
{
#ifdef BLUETOOTH_ENABLE
bluefruit_serial_send(0xFD);
for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
bluefruit_serial_send(report->raw[i]);
}
#endif
uint8_t timeout = 255;
uint8_t where = where_to_send();
#ifdef BLUETOOTH_ENABLE
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
bluefruit_serial_send(0xFD);
for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
bluefruit_serial_send(report->raw[i]);
}
}
#endif
#ifdef ADAFRUIT_BLE_ENABLE
if (where & SendToBLE) {
if (where == OUTPUT_ADAFRUIT_BLE) {
adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
}
#endif
if (!(where & SendToUSB)) {
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
return;
}
@@ -681,30 +656,31 @@ static void send_keyboard(report_keyboard_t *report)
static void send_mouse(report_mouse_t *report)
{
#ifdef MOUSE_ENABLE
#ifdef BLUETOOTH_ENABLE
bluefruit_serial_send(0xFD);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x03);
bluefruit_serial_send(report->buttons);
bluefruit_serial_send(report->x);
bluefruit_serial_send(report->y);
bluefruit_serial_send(report->v); // should try sending the wheel v here
bluefruit_serial_send(report->h); // should try sending the wheel h here
bluefruit_serial_send(0x00);
#endif
uint8_t timeout = 255;
uint8_t where = where_to_send();
#ifdef BLUETOOTH_ENABLE
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
bluefruit_serial_send(0xFD);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x03);
bluefruit_serial_send(report->buttons);
bluefruit_serial_send(report->x);
bluefruit_serial_send(report->y);
bluefruit_serial_send(report->v); // should try sending the wheel v here
bluefruit_serial_send(report->h); // should try sending the wheel h here
bluefruit_serial_send(0x00);
}
#endif
#ifdef ADAFRUIT_BLE_ENABLE
if (where & SendToBLE) {
if (where == OUTPUT_ADAFRUIT_BLE) {
// FIXME: mouse buttons
adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
}
#endif
if (!(where & SendToUSB)) {
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
return;
}
@@ -746,32 +722,34 @@ static void send_system(uint16_t data)
static void send_consumer(uint16_t data)
{
#ifdef BLUETOOTH_ENABLE
static uint16_t last_data = 0;
if (data == last_data) return;
last_data = data;
uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
bluefruit_serial_send(0xFD);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x02);
bluefruit_serial_send((bitmap>>8)&0xFF);
bluefruit_serial_send(bitmap&0xFF);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
#endif
uint8_t timeout = 255;
uint8_t where = where_to_send();
#ifdef BLUETOOTH_ENABLE
if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
static uint16_t last_data = 0;
if (data == last_data) return;
last_data = data;
uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
bluefruit_serial_send(0xFD);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x02);
bluefruit_serial_send((bitmap>>8)&0xFF);
bluefruit_serial_send(bitmap&0xFF);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
bluefruit_serial_send(0x00);
}
#endif
#ifdef ADAFRUIT_BLE_ENABLE
if (where & SendToBLE) {
if (where == OUTPUT_ADAFRUIT_BLE) {
adafruit_ble_send_consumer_key(data, 0);
}
#endif
if (!(where & SendToUSB)) {
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
return;
}

View File

@@ -0,0 +1,56 @@
/*
Copyright 2017 Priyadi Iman Nurcahyo
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/>.
*/
#include "lufa.h"
#include "outputselect.h"
#ifdef ADAFRUIT_BLE_ENABLE
#include "adafruit_ble.h"
#endif
uint8_t desired_output = OUTPUT_DEFAULT;
void set_output(uint8_t output) {
set_output_user(output);
desired_output = output;
}
__attribute__((weak))
void set_output_user(uint8_t output) {
}
uint8_t auto_detect_output(void) {
if (USB_DeviceState == DEVICE_STATE_Configured) {
return OUTPUT_USB;
}
#ifdef ADAFRUIT_BLE_ENABLE
if (adafruit_ble_is_connected()) {
return OUTPUT_ADAFRUIT_BLE;
}
#endif
#ifdef BLUETOOTH_ENABLE
return OUTPUT_BLUETOOTH; // should check if BT is connected here
#endif
return OUTPUT_NONE;
}
uint8_t where_to_send(void) {
if (desired_output == OUTPUT_AUTO) {
return auto_detect_output();
}
return desired_output;
}

View File

@@ -1,5 +1,5 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2017 Priyadi Iman Nurcahyo
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
@@ -12,20 +12,30 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <avr/io.h>
#include "stdint.h"
#include "led.h"
enum outputs {
OUTPUT_AUTO,
OUTPUT_NONE,
OUTPUT_USB,
OUTPUT_BLUETOOTH,
OUTPUT_ADAFRUIT_BLE,
void led_set(uint8_t usb_led)
{
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low
DDRB |= (1<<2);
PORTB &= ~(1<<2);
} else {
// Hi-Z
DDRB &= ~(1<<2);
PORTB &= ~(1<<2);
}
}
// backward compatibility
OUTPUT_USB_AND_BT
};
/**
* backward compatibility for BLUETOOTH_ENABLE, send to BT and USB by default
*/
#ifndef OUTPUT_DEFAULT
#ifdef BLUETOOTH_ENABLE
#define OUTPUT_DEFAULT OUTPUT_USB_AND_BT
#else
#define OUTPUT_DEFAULT OUTPUT_AUTO
#endif
#endif
void set_output(uint8_t output);
void set_output_user(uint8_t output);
uint8_t auto_detect_output(void);
uint8_t where_to_send(void);

View File

@@ -280,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = {
0x95, 0x06, // Report Count (6),
0x75, 0x08, // Report Size (8),
0x15, 0x00, // Logical Minimum (0),
0x25, 0xFF, 0x00, // Logical Maximum(255),
0x26, 0xFF, 0x00, // Logical Maximum(255),
0x05, 0x07, // Usage Page (Key Codes),
0x19, 0x00, // Usage Minimum (0),
0x29, 0xFF, // Usage Maximum (255),
@@ -350,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = {
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_SYSTEM, // REPORT_ID (2)
0x15, 0x01, // LOGICAL_MINIMUM (0x1)
0x25, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7)
0x26, 0xb7, 0x00, // LOGICAL_MAXIMUM (0xb7)
0x19, 0x01, // USAGE_MINIMUM (0x1)
0x29, 0xb7, // USAGE_MAXIMUM (0xb7)
0x75, 0x10, // REPORT_SIZE (16)

View File

@@ -11,7 +11,7 @@ if [[ "$TRAVIS_COMMIT_MESSAGE" != *"[skip build]"* ]] ; then
make all-keyboards AUTOGEN="true"
: $((exit_code = $exit_code + $?))
else
MKB=$(git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} | grep -oP '(?<=keyboards\/)([a-zA-Z_]+)' | sort -u)
MKB=$(git diff --name-only -n 1 ${TRAVIS_COMMIT_RANGE} | grep -oP '(?<=keyboards\/)([a-zA-Z0-9_]+)(?=\/)' | sort -u)
for KB in $MKB ; do
echo "Making all keymaps for $KB"
make "$KB" AUTOGEN=true