Compare commits

...
13 Commits
Author SHA1 Message Date
MechMerlin bef554d18b Bug: Users had to be in the /util directory to run the script (#4228) 2018-10-24 08:57:08 -07:00
Callum Oakley 9ed0c2d57b Keymap update (#4223)
* change window focus shortcuts

* hangul

* macos goodness

* re-arrange tab keys

* remove tab switching keys

* left hand func

* glorious macro pad

* workspace rotation keys

* tabbing hotkeys

* left hand tab change keys

* SEND_STRING("!") on KC_EXLM

* use SEND_STRING for all shifted symbols

* SEND_STRING even for non shifted symbols so they play nicely with the shifted ones
2018-10-23 16:28:40 -07:00
Ajax b0a021c07a Made a userspace that allows you to use your keyboard as an order of operations based calculator (#2864)
* Made DZ60 layout with calculator

* Cleaned up and commented, preparing to fix bug with negative in front of open parenthesis as first character

* Fixed bug where negative sign infront of parenthesis as first character was parsed incorrectly

* Made a better solution for the bug from the previous commit

* Modularized and added a userfile so that this code can be used on various keyboards, found in doogle999

* Removed commented code from keymap

* Made the layer that is used for calculations a define so that it can be changed per keyboard

* Made the readme

* Made the readme in the correct place

* Revert "Made the readme in the correct place"

This reverts commit 7f8b59ed9e59c77401a48be3a7ac1e8fd8e84e32.

* Manually synced with qmk upstream

* Stopped repeat, made keys print character that they are defined as rather than what the keyboard wants them to do

* Added support for numpad, might make all keycodes custom so that there is no need to change doogle999.c if you want to change the keycode that is associated with a function, also made numpad automatically activating an option

* Fixed some bugs with backspacing, updated the readme

* Fixed some bugs with numlock turning on at the wrong times when a shift key was down

* Made the return to layer work automatically instead of just forcing it to layer 0

* fixes and style changes, 20% decreased binary size

* Fixed some bugs with double printing and compilation errors on my side

* Fixed bug with exceeding the buffer size

* Removed changes that added const-ness

* Made changes so that backspace does not repeat to remove backspace bugs, still some bugs with recalculating without having typed anything

* Fixed obo error with calc main loop

* Made includes more accurate in keymap for dz60

* Moved flags to user makefile
2018-10-23 12:44:48 -07:00
Konstantin Đorđević c8267d9fea Update whitefox/konstantin keymap (#4220)
* Change brace style to QMK OTBS

* Change Unicode input mode to UC_WINC

* Align constant values in config.h
2018-10-23 12:34:06 -07:00
mike fettis 6539426f61 keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance (#4208)
* keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance

* Update config.h

typo

* cleanup

Co-Authored-By: ridingintraffic <[email protected]>

* layers are using layout macro
replaced the include guard (the ifndef, define, and endif at the end) with just #pragma once
changed undergrow to use layer-change-code
emoji macros are using send_hex_code_string
cleaned up the includes

* tap() removed
maxtrix_scan_user updated
conf.h cleanup
2018-10-23 12:00:54 -07:00
Peter Roe 03d16db942 Keyboard: Ported ADB-to-USB converter from TMK to QMK (#3931)
* Ported ADB-to-USB converter from TMK to QMK

* Updated pull request with reviewer suggestions.

* Removed precompiled header file type (gch) from gitignore per reviewer request

* Update keyboards/converter/adb_usb/matrix.c

Changed instances of matrix_init_quantum to matrix_scan_quantum.

* Update keyboards/converter/adb_usb/matrix.c

Co-Authored-By: 13-bit <[email protected]>
2018-10-23 11:52:57 -07:00
Scott Gorsuch 572c316e7d Keymap: Fix missing 4 key (#4219) 2018-10-23 09:29:35 -07:00
Drashna Jaelre cb1e45b4ef Include quantum.h to fix travis CI errors 2018-10-22 21:35:35 -04:00
Drashna Jaelre 95619bdaca Fix file location for mmacdougal's keymap 2018-10-22 21:35:19 -04:00
SpacebarRacecar 8421a89820 added ASCII representation to dz60 iso-split layout and adjusted it so that it's consistent with the other layouts. (#4207) 2018-10-22 14:20:31 -07:00
noroadsleft 5dc41446aa Keyboard: Chimera LS refactor and Configurator support (#3715)
* Matrix/keymap refactor

- Deleted `KC_KEYMAP` macro
- Renamed `KEYMAP` macro to `LAYOUT_ortho_4x12`
- Default keymap updated to current QMK standards
  - #include QMK_KEYBOARD_H
  - Refactored from `KC_KEYMAP` to `LAYOUT_ortho_4x12` macro
  - `action_get_macro()` deprecated in favor of `process_record_user()`

`rules.mk` *not* updated to include `LAYOUTS = ortho_4x12` because I have no idea if and how that works on a split and/or wireless keyboard.

* readme cleanup: markdown formatting

* Add Configurator support

* added support for ortho_4x12 layout

* Macro and readme updates

Macros updated to use `KC_NO` directly.

Readme updates and cleanup.
2018-10-22 14:18:47 -07:00
fougner e26a7b0ed8 Keyboard: initial support for XD87 (#4182)
* Keyboard: initial support for XD87

* Add row/col pin configuration for XD87 PCB

* Add default ISO layout

* Fix incorrect KC in default_tkl_iso

The KC_NUBS is duplicated in the TKL ISO layout.
Compare with the fullsize ISO which has a KC_NUHS
in the corresponding place.

* Add support for community layouts

* Add TKL ANSI layout

* Enable TKL ISO/ANSI community layout

* Fix LAYOUT_all

* Configure backlighting for XD87

* Various documentation changes
2018-10-22 14:01:45 -07:00
Colin T.A. Gray 418a886ae4 adds 'dfu-util' to macos_install.sh 2018-10-22 13:32:47 -07:00
47 changed files with 2429 additions and 200 deletions

No files matched your search

@@ -0,0 +1,15 @@
#pragma once
/* tap dance stuff*/
#undef TAPPING_TERM
#define TAPPING_TERM 500
#define TAPPING_TOGGLE 2
#define EXAMPLESTRING1 "tapdance_1"
#define EXAMPLESTRING2 "tapdance_2"
#define EXAMPLESTRING3 "tapdance_3"
#define EXAMPLESTRING4 "tapdance_4"
#undef RGBLED_NUM
#define RGBLED_NUM 16
@@ -0,0 +1,215 @@
/*
tap danc eis turned on in the rules now...
*/
#include QMK_KEYBOARD_H
#define _EMOJI 0
#define _TAPLAND 1
#define _LEDCNTL 2
enum custom_keycodes {
SHRUG,
DISFACE,
FU,
TFLIP,
TFLIP2,
SAD_EYES,
TPUT,
HAPPYFACE,
HEARTFACE,
CLOUD,
CHANFACE,
CMDCLEAR
};
//Tap Dance Declarations
enum {
TD_EXAMPLE1 = 0,
TD_EXAMPLE2,
TD_EXAMPLE3,
TD_EXAMPLE4
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* EMOJI Pad
* ,-------------------------------.
* |TFLIP | TFlIP2|DISFACE| FU |
* |------+-------+-------+--------|
* | CLOUD| | | CLEAR |
* |------+-------+-------+--------|
* |SHRUG |DISFACE| HRTFAC| HAPPYF |
* |------+-------+-------+--------|
* | ENTER| |LEDCNTR| tapland|
* `-------------------------------'
*/
//purple
[_EMOJI] = LAYOUT_ortho_4x4(
TFLIP, TFLIP2, KC_NO, FU ,
CLOUD, KC_NO, KC_NO, CMDCLEAR,
SHRUG, DISFACE, HEARTFACE, HAPPYFACE,
KC_ENT, RGB_TOG, MO(_LEDCNTL), MO(_TAPLAND)
),
/* TapLand //
* ,-------------------------------.
* | str1 | str2 | str3 | str4 |
* |------+-------+-------+--------|
* | | | | |
* |------+-------+-------+--------|
* | | | | |
* |------+-------+-------+--------|
* | | | | |
* `-------------------------------'
*/
//blue
[_TAPLAND] = LAYOUT_ortho_4x4(
TD(TD_EXAMPLE1), TD(TD_EXAMPLE2), TD(TD_EXAMPLE3), TD(TD_EXAMPLE4),
KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO
),
/* LEDControl Pad
* ,-------------------------------.
* | snake|breathe|rainbow|gradient|
* |------+-------+-------+--------|
* | xmas | Val+ | Sat+ | HUE+ |
* |------+-------+-------+--------|
* |kngrdr| Val- | Sat- | HUE- |
* |------+-------+-------+--------|
* | swirl| PLAIN | | ON/OFF |
* `-------------------------------'
*/
//blue
[_LEDCNTL] = LAYOUT_ortho_4x4(
RGB_M_SN, RGB_M_B, RGB_M_R, RGB_M_G,
RGB_M_X, RGB_VAI, RGB_SAI, RGB_HUI,
RGB_M_K, RGB_VAD, RGB_SAD, RGB_HUD,
RGB_M_SW, RGB_M_P, KC_NO, RGB_TOG
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
case CLOUD: // (っ◕‿◕)っ
if(record->event.pressed){
send_unicode_hex_string("0028 3063 25D5 203F 25D5 0029 3063");
}
return false;
break;
case FU: // t(-_-t)
if(record->event.pressed){
SEND_STRING("t(-_-t)");
}
return false;
break;
case HAPPYFACE: // ʘ‿ʘ
if(record->event.pressed){
send_unicode_hex_string("0298 203F 0298");
}
return false;
break;
case CMDCLEAR:
if (record->event.pressed) {
register_code(KC_LGUI);
tap_code(KC_A);
unregister_code(KC_LGUI);
tap_code(KC_DEL);
}
return false;
break;
case SHRUG: // ¯\_(ツ)_/¯
if (record->event.pressed) {
send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
}
return false;
break;
case HEARTFACE: // ♥‿♥
if(record->event.pressed){
send_unicode_hex_string("2665 203F 2665");
}
return false;
break;
case DISFACE: // ಠ_ಠ
if(record->event.pressed){
send_unicode_hex_string("0CA0 005F 0CA0");
}
return false;
break;
case TFLIP: // (╯°□°)╯ ︵ ┻━┻
if(record->event.pressed){
send_unicode_hex_string("0028 256F 00B0 25A1 00B0 0029 256F 0020 FE35 0020 253B 2501 253B");
}
return false;
break;
case TFLIP2: // ┻━┻︵ \(°□°)/ ︵ ┻━┻
if(record->event.pressed){
send_unicode_hex_string("253B 2501 253B FE35 0020 005C 0028 00B0 25A1 00B0 0029 002F 0020 FE35 0020 253B 2501 253B");
}
return false;
break;
}
}
return true;
}
/* tap dance time */
void tdexample1(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 2) {
SEND_STRING(EXAMPLESTRING1);
reset_tap_dance (state);
}
}
void tdexample2(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 2) {
SEND_STRING(EXAMPLESTRING2);
reset_tap_dance (state);
}
}
void tdexample3(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 2) {
SEND_STRING(EXAMPLESTRING3);
reset_tap_dance (state);
}
}
void tdexample4(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 2) {
SEND_STRING(EXAMPLESTRING4);
reset_tap_dance (state);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_EXAMPLE1] = ACTION_TAP_DANCE_FN(tdexample1),
[TD_EXAMPLE2] = ACTION_TAP_DANCE_FN(tdexample2),
[TD_EXAMPLE3] = ACTION_TAP_DANCE_FN(tdexample3),
[TD_EXAMPLE4] = ACTION_TAP_DANCE_FN(tdexample4)
};
// Runs just one time when the keyboard initializes.
void matrix_scan_user(void) {
static bool has_ran_yet;
if (!has_ran_yet) {
has_ran_yet = true;
rgblight_setrgb (16, 0, 16);
}
}
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case _TAPLAND:
rgblight_setrgb(0, 16, 0); //green
break;
case _LEDCNTL:
rgblight_setrgb(0, 0, 16); //blue
break;
case _EMOJI:
rgblight_setrgb (16, 0, 16); //purple
break;
default: // for any other layers, or the default layer
rgblight_setrgb (16, 0, 16); //purple
break;
}
return state;
}
@@ -0,0 +1,10 @@
# Ridingtraffic's examples
===
This keymap has many features:
3 layers
Momentary layer switching
16 pixel neopixel
Unicode Enabled
Tap dance enabled
The rgb also updates depending on what layer you are on, and then flips back when done.
@@ -0,0 +1,5 @@
# turning on tap dance
TAP_DANCE_ENABLE = yes
RGBLIGHT_ENABLE = yes
MOUSEKEY_ENABLE = no
UNICODE_ENABLE = yes
+22 -24
View File
@@ -50,32 +50,30 @@
// The first section contains all of the arguements // The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array // The second converts the arguments into a two-dimensional array
#define KC_KEYMAP( \ #define LAYOUT_ortho_4x12( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \
k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \
k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \
k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \
) \ ) { \
{ \ { k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \
{ KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \ { k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \
{ KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \ { k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \
{ KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \ { k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \
{ KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \ { k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO } \
{ KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO }, \
} }
#define KEYMAP( \ #define LAYOUT_kc_ortho_4x12( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \
k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \
k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \
k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \
) \ ) { \
{ \ { KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \
{ k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \ { KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \
{ k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \ { KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \
{ k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \ { KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \
{ k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \ { KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO } \
{ k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO }, \
} }
+13
View File
@@ -0,0 +1,13 @@
{
"keyboard_name": "Chimera LS",
"url": "",
"maintainer": "qmk",
"width": 13,
"height": 4,
"layouts": {
"LAYOUT_ortho_4x12": {
"key_count": 48,
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}]
}
}
}
+111 -116
View File
@@ -1,7 +1,7 @@
// this is the style you want to emulate. // this is the style you want to emulate.
// This is the canonical layout file for the Quantum project. If you want to add another keyboard, // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
#include "chimera_ls.h" #include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below. // 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. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
@@ -24,168 +24,163 @@ enum chimera_lets_split_layers
#define KC_SCTR MT(MOD_LCTL, KC_RBRC) #define KC_SCTR MT(MOD_LCTL, KC_RBRC)
#define KC_SPLT MT(MOD_LALT, KC_MINS) #define KC_SPLT MT(MOD_LALT, KC_MINS)
#define KC_MESC LT(_MACROS, KC_ESC) #define KC_MESC LT(_MACROS, KC_ESC)
#define KC_INCL M(0)
#define KC_PULL M(1)
#define KC_PUSH M(2)
#define KC_SCAP M(3)
#define KC_SCOF M(4)
#define KC_CAD LALT(LCTL(KC_DEL)) #define KC_CAD LALT(LCTL(KC_DEL))
enum custom_keycodes {
KC_INCL = SAFE_RANGE,
KC_PULL,
KC_PUSH,
KC_SCAP,
KC_SCOF
};
#define LONGPRESS_DELAY 150 #define LONGPRESS_DELAY 150
//#define LAYER_TOGGLE_DELAY 300 //#define LAYER_TOGGLE_DELAY 300
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define KC_ KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = KC_KEYMAP( [_QWERTY] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
MESC, Q , W , E , R , T , Y , U , I , O , P ,BSPC, KC_MESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
TAB , A , S , D , F , G , H , J , K , L ,SCLN, ENT, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
LSPO, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,RSPC, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
SCTL,SPFN,SPLT,AMPR,NMPD,SPC , SPC ,SYMB,ASTR,EXLM,LBRC,SCTR KC_SCTL, KC_SPFN, KC_SPLT, KC_AMPR, KC_NMPD, KC_SPC, KC_SPC, KC_SYMB, KC_ASTR, KC_EXLM, KC_LBRC, KC_SCTR
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
[_CAPS] = KC_KEYMAP( [_CAPS] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
, , , , , , , , , , , , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , , , , , , ,COLN, , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , , , , , , , , , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, ,UNDS, , , , , , , , , _______, _______, KC_UNDS, _______, _______, _______, _______, _______, _______, _______, _______, _______
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
[_NUMPAD] = KC_KEYMAP( [_NUMPAD] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
, , , , , , , 7 , 8 , 9 ,MINS,QUOT, _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_MINS, KC_QUOT,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , , , , 4 , 5 , 6 ,PLUS, ENT, _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
LSFT, , , , , , , 1 , 2 , 3 ,ASTR, EQL, KC_LSFT, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_ASTR, KC_EQL,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , ,BSPC, SPC , 0 , 0 , DOT,SLSH, _______, _______, _______, _______, _______, KC_BSPC, KC_SPC, KC_0, KC_0, KC_DOT, KC_SLSH, _______
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
[_SYMBOLS] = KC_KEYMAP( [_SYMBOLS] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,QUOT, _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_QUOT,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
F1 , F2 , F3 , F4 , F5 , F6 , TILD,EQL ,UNDS,LCBR,RCBR,PIPE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TILD, KC_EQL, KC_UNDS, KC_LCBR, KC_RCBR, KC_PIPE,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
F7 , F8 , F9 , F10, F11, F12, GRV ,PLUS,MINS,LBRC,RBRC,BSLS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_GRV, KC_PLUS, KC_MINS, KC_LBRC, KC_RBRC, KC_BSLS,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , NO ,BSPC, SPC , , , , , _______, _______, _______, _______, XXXXXXX, KC_BSPC, KC_SPC, _______, _______, _______, _______, _______
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
[_NAV] = KC_KEYMAP( [_NAV] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
, , , , DEL,BSPC, ,HOME, UP , END, INS,PSCR, _______, _______, _______, _______, KC_DEL, KC_BSPC, _______, KC_HOME, KC_UP, KC_END, KC_INS, KC_PSCR,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , ,LSFT,LCTL, ENT, ,LEFT,DOWN,RGHT, DEL, , _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , , , ,PGUP,PGDN, , , , _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , ,DEL , , , , , , _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
[_MACROS] = KC_KEYMAP( [_MACROS] = LAYOUT_ortho_4x12(
//,----+----+----+----+----+----. ,----+----+----+----+----+----. //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
, , , , , , , ,INCL, , , , _______, _______, _______, _______, _______, _______, _______, _______, KC_INCL, _______, _______, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , ,CAD , , , , , , , , , _______, _______, _______, KC_CAD, _______, _______, _______, _______, _______, _______, _______, _______,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
SCAP, , , , , , , ,PULL,PUSH, ,SCAP, KC_SCAP, _______, _______, _______, _______, _______, _______, _______, KC_PULL, KC_PUSH, _______, KC_SCAP,
//|----+----+----+----+----+----| |----+----+----+----+----+----| //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
, , , , , , , , , , , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
//`----+----+----+----+----+----' `----+----+----+----+----+----' //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------'
), ),
}; };
const uint16_t PROGMEM fn_actions[] = { bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
/* include some kind of library or header */ /* include some kind of library or header */
case 0: case KC_INCL:
if (record->event.pressed) { if (record->event.pressed) {
SEND_STRING("#include <>"); SEND_STRING("#include <>" SS_TAP(X_LEFT) );
return MACRO( T(LEFT), END); return false;
} }
break; break;
case 1: case KC_PULL:
if (record->event.pressed) { if (record->event.pressed) {
SEND_STRING("git pull"); SEND_STRING("git pull" SS_TAP(X_ENTER) );
return MACRO( T(ENT), END ); return false;
} }
break; break;
case 2: case KC_PUSH:
if (record->event.pressed){ if (record->event.pressed){
SEND_STRING("git push"); SEND_STRING("git push" SS_TAP(X_ENTER) );
return MACRO( T(ENT), END ); return false;
} }
break; break;
case 3: case KC_SCAP:
if (record->event.pressed){ if (record->event.pressed){
layer_on(_CAPS); layer_on(_CAPS);
register_code(KC_CAPSLOCK); register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK);
return false;
} }
break; break;
case 4: case KC_SCOF:
if (record->event.pressed){ if (record->event.pressed){
layer_off(_CAPS); layer_off(_CAPS);
register_code(KC_CAPSLOCK); register_code(KC_CAPSLOCK);
unregister_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK);
return false;
} }
break; break;
} }
return MACRO_NONE; return true;
}; };
void matrix_scan_user(void) { void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state); uint8_t layer = biton32(layer_state);
switch (layer) { switch (layer) {
case _QWERTY: case _QWERTY:
set_led_green; set_led_green;
break; break;
case _CAPS: case _CAPS:
set_led_white; set_led_white;
break; break;
case _NUMPAD: case _NUMPAD:
set_led_blue; set_led_blue;
break; break;
case _SYMBOLS: case _SYMBOLS:
set_led_red; set_led_red;
break; break;
case _NAV: case _NAV:
set_led_magenta; set_led_magenta;
break; break;
case _MACROS: case _MACROS:
set_led_cyan; set_led_cyan;
break; break;
default: default:
set_led_green; set_led_green;
break; break;
} }
}; };
+3 -7
View File
@@ -2,18 +2,14 @@
![Chimera LS](https://imgur.com/FOGlO4M.jpg) ![Chimera LS](https://imgur.com/FOGlO4M.jpg)
A wireless version of the let's split: a split 40% ortholinear keyboard A wireless version of the Let's Split: a split 40% ortholinear keyboard.
Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle) Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle)
Hardware Supported: Chimera LS PCB, WaveShare core nRF51822
Hardware Supported: Chimera LS PCB, WaveShare core nRF51822
Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ls/gerbers) Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ls/gerbers)
Make example for this keyboard (after setting up your build environment): Make example for this keyboard (after setting up your build environment):
make chimera_ls:default make chimera_ls:default
See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+3 -1
View File
@@ -46,7 +46,7 @@ F_USB = $(F_CPU)
# Bootloader # Bootloader
# This definition is optional, and if your keyboard supports multiple bootloaders of # This definition is optional, and if your keyboard supports multiple bootloaders of
# different sizes, comment this out, and the correct address will be loaded # different sizes, comment this out, and the correct address will be loaded
# automatically (+60). See bootloader.mk for all options. # automatically (+60). See bootloader.mk for all options.
BOOTLOADER = caterina BOOTLOADER = caterina
@@ -80,3 +80,5 @@ UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
USB = /dev/ttyACM0 USB = /dev/ttyACM0
LAYOUTS = ortho_4x12
+83
View File
@@ -0,0 +1,83 @@
ADB-to USB Keyboard Converter
=============================
This firmware converts Apple Desktop Bus (ADB) keyboard protocol to USB so that you can use an ADB keyboard on a modern computer. It works on the PJRC Teensy 2.0 and other USB AVR MCUs (ATMega32U4, AT90USB64/128, etc) and needs at least 10KB of flash memory.
This is a port of the TMK ADB-to-USB converter to QMK. For information on QMK, please consult the following:
https://github.com/qmk/qmk_firmware
https://docs.qmk.fm
Wiring
------
Connect the VCC, GND, and DATA lines of the ADB keyboard to the controller (Teensy 2.0 or similar). By default the DATA line uses port PD0. The Power SW line is unused by the converter.
ADB female socket from the front:
,--_--.
/ o4 3o \ 1: DATA
| o2 1o | 2: Power SW
- === - 3: VCC
`-___-' 4: GND
This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. Using an external pull-up resistor (1K-10K Ohm) between the DATA and VCC lines is strongly recommended.
Pull-up resistor:
Keyboard Converter
,------.
5V------+------|VCC |
| | |
[R] | |
| | |
Signal--+------|PD0 |
| |
GND------------|GND |
`------'
R: 1K Ohm resistor
Define following macros for ADB connection in config.h if you use other than port PD0.
ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT
Building the Firmware
------------------------------------------
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
Keymap
------
To build the default keymap run this command:
$ make converter/adb_usb:default
You may add your own keymap to the converter/adb_usb/keymaps directory, as you would with any other QMK-powered keyboard.
To build your custom keymap, change the build command to:
$ make converter/adb_usb:my_keymap
Where 'my_keymap' is the name of your custom keymap directory.
Locking Caps Lock
----------------
Many old ADB keyboards use a locking switch for the caps lock key. This converter supports the locking caps lock key by default.
Notes
-----
Non-extended ADB keyboards make no distinction between the left and right modifiers,
i.e. the keycode for the left modifier will be sent even if the right modifier
The Apple Extended Keyboard and Apple Extended Keyboard II can differentiate between the left and right modifiers except for the GUI key (Windows/Command).
Most ADB keyboards have no diodes in its matrix so they are not NKRO,
though the ADB protocol itself supports it. See protocol/adb.c for more info.
QMK Port Changelog
---------
- 2018/09/16 - Initial release.
+3
View File
@@ -0,0 +1,3 @@
#include "adb_usb.h"
#include <avr/io.h>
#include "quantum.h"
+109
View File
@@ -0,0 +1,109 @@
/*
Copyright 2011,2012,2013 Jun Wako <[email protected]>
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/>.
Ported to QMK by Peter Roe <[email protected]>
*/
#ifndef KEYMAP_COMMON_H
#define KEYMAP_COMMON_H
#include "quantum.h"
/* M0115/M3501 Apple Extended Keyboard ANSI
* ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---.
* |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr|
* `---' `---------------' `---------------' `---------------' `-----------' `---'
* ,-----------------------------------------------------------. ,-----------. ,---------------.
* | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *|
* |-----------------------------------------------------------| |-----------| |---------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -|
* |-----------------------------------------------------------| `-----------' |---------------|
* |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +|
* |-----------------------------------------------------------| ,---. |---------------|
* |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| |
* |-----------------------------------------------------------| ,-----------. |-----------|Ent|
* |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| |
* `-----------------------------------------------------------' `-----------' `---------------'
*/
#define LAYOUT_ext_ansi( \
K35, K7A,K78,K63,K76,K60,K61,K62,K64,K65,K6D,K67,K6F, K69,K6B,K71, K7F, \
K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \
K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \
K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07 }, \
{ K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \
{ K10, K11, K12, K13, K14, K15, K16, K17 }, \
{ K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
{ K20, K21, K22, K23, K24, K25, K26, K27 }, \
{ K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
{ K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \
{ K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO, }, \
{ KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \
{ KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO, }, \
{ KC_NO, KC_NO, K52, K53, K54, K55, K56, K57 }, \
{ K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO, }, \
{ K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \
{ KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \
{ KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \
{ K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \
}
/* M0116 Apple Standard Keyboard ANSI
* +-------+
* | power |
* +-------+
* +---+---+---+---+---+---+---+---+---+---+---+---+---+-----+ +---+---+---+---+
* |esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | bks | |clr| = | / | * |
* +---------------------------------------------------------+ +---+---+---+---+
* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | | | 7 | 8 | 9 | + |
* +-----------------------------------------------------+ | +---+---+---+---+
* | ctrl | a | s | d | f | g | h | j | k | l | ; | ' |return| | 4 | 5 | 6 | - |
* +---------------------------------------------------------+ +---+---+---+---+
* | shift | z | x | c | v | b | n | m | , | . | / | shift | | 1 | 2 | 3 | |
* +---------------------------------------------------------+ +-------+---|ent|
* |cap|opt|comnd| ` | | \ |lef|rig|dwn|up | | 0 | . | |
* +---------------------------------------------------------+ +-------+---+---+
*/
#define LAYOUT_m0116_ansi( \
K7F, \
K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \
K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K45, \
K36,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K4E, \
K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K53,K54,K55, \
K39,K3A,K37,K32, K31, K2A,K3B,K3C,K3D,K3E, K52, K41,K4C \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07 }, \
{ K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \
{ K10, K11, K12, K13, K14, K15, K16, K17 }, \
{ K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
{ K20, K21, K22, K23, K24, K25, K26, K27 }, \
{ K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
{ K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \
{ K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \
{ KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \
{ KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO }, \
{ KC_NO, K51, K52, K53, K54, K55, K56, K57 }, \
{ K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, K7B, KC_NO, KC_NO, KC_NO, K7F } \
}
#endif
+43
View File
@@ -0,0 +1,43 @@
/*
Copyright 2011 Jun Wako <[email protected]>
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/>.
Ported to QMK by Peter Roe <[email protected]>
*/
#pragma once
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0ADB
#define DEVICE_VER 0x0101
#define MANUFACTURER QMK
#define PRODUCT ADB keyboard converter
#define DESCRIPTION Convert ADB keyboard to USB
/* matrix size */
#define MATRIX_ROWS 16 // keycode bit: 3-0
#define MATRIX_COLS 8 // keycode bit: 6-4
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* ADB port setting */
#define ADB_PORT PORTD
#define ADB_PIN PIND
#define ADB_DDR DDRD
#define ADB_DATA_BIT 0
//#define ADB_PSW_BIT 1 // optional
@@ -0,0 +1,26 @@
#include QMK_KEYBOARD_H
#define MCTL LCTL(KC_UP)
#define SCST LSFT(LGUI(KC_4))
#define SLP LALT(LGUI(KC_EJCT))
#define APP1 LSFT(LALT(LCTL(LGUI(KC_1))))
#define APP2 LSFT(LALT(LCTL(LGUI(KC_2))))
#define APP3 LSFT(LALT(LCTL(LGUI(KC_3))))
#define APP4 LSFT(LALT(LCTL(LGUI(KC_4))))
#define APP5 LSFT(LALT(LCTL(LGUI(KC_5))))
#define APP6 LSFT(LALT(LCTL(LGUI(KC_6))))
#define APP7 LSFT(LALT(LCTL(LGUI(KC_7))))
#define APP8 LSFT(LALT(LCTL(LGUI(KC_8))))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_ext_ansi(
KC_ESC, APP1, APP2, APP3, APP4, APP5, APP6, APP7, APP8, MCTL, KC_MUTE, KC_VOLD, KC_VOLU, SCST, KC_SLCK, KC_PAUS, SLP,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_EQL, KC_PSLS, KC_PAST,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
};
@@ -0,0 +1,13 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_ext_ansi(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS, KC_EJCT,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_EQL, KC_PSLS, KC_PAST,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
),
};
+27
View File
@@ -0,0 +1,27 @@
/*
Copyright 2011 Jun Wako <[email protected]>
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 <stdint.h>
#include <util/delay.h>
#include "adb.h"
#include "led.h"
void led_set(uint8_t usb_led)
{
adb_host_kbd_led(ADB_ADDR_KEYBOARD, ~usb_led);
}
+43
View File
@@ -0,0 +1,43 @@
/*
Copyright 2011 Jun Wako <[email protected]>
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/>.
Ported to QMK by Peter Roe <[email protected]>
*/
#ifndef LED_H
#define LED_H
#include "stdint.h"
/* keyboard LEDs */
#define USB_LED_NUM_LOCK 0
#define USB_LED_CAPS_LOCK 1
#define USB_LED_SCROLL_LOCK 2
#define USB_LED_COMPOSE 3
#define USB_LED_KANA 4
#ifdef __cplusplus
extern "C" {
#endif
void led_set(uint8_t usb_led);
#ifdef __cplusplus
}
#endif
#endif
+267
View File
@@ -0,0 +1,267 @@
/*
Copyright 2011 Jun Wako <[email protected]>
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/>.
Ported to QMK by Peter Roe <[email protected]>
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "print.h"
#include "util.h"
#include "debug.h"
#include "adb.h"
#include "matrix.h"
#include "report.h"
#include "host.h"
#include "led.h"
#include "timer.h"
static bool is_iso_layout = false;
// matrix state buffer(1:on, 0:off)
static matrix_row_t matrix[MATRIX_ROWS];
static void register_key(uint8_t key);
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
void matrix_init(void)
{
// LED on
DDRD |= (1<<6); PORTD |= (1<<6);
adb_host_init();
// wait for keyboard to boot up and receive command
_delay_ms(2000);
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
led_set(host_keyboard_leds());
// debug_enable = false;
// debug_matrix = true;
// debug_keyboard = true;
// debug_mouse = true;
// print("debug enabled.\n");
// LED off
DDRD |= (1<<6); PORTD &= ~(1<<6);
matrix_init_quantum();
}
#ifdef ADB_MOUSE_ENABLE
#ifdef MAX
#undef MAX
#endif
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
static report_mouse_t mouse_report = {};
void adb_mouse_task(void)
{
uint16_t codes;
int16_t x, y;
static int8_t mouseacc;
/* tick of last polling */
static uint16_t tick_ms;
// polling with 12ms interval
if (timer_elapsed(tick_ms) < 12) return;
tick_ms = timer_read();
codes = adb_host_mouse_recv();
// If nothing received reset mouse acceleration, and quit.
if (!codes) {
mouseacc = 1;
return;
};
// Bit sixteen is button.
if (~codes & (1 << 15))
mouse_report.buttons |= MOUSE_BTN1;
if (codes & (1 << 15))
mouse_report.buttons &= ~MOUSE_BTN1;
// lower seven bits are movement, as signed int_7.
// low byte is X-axis, high byte is Y.
y = (codes>>8 & 0x3F);
x = (codes>>0 & 0x3F);
// bit seven and fifteen is negative
// usb does not use int_8, but int_7 (measuring distance) with sign-bit.
if (codes & (1 << 6))
x = (x-0x40);
if (codes & (1 << 14))
y = (y-0x40);
// Accelerate mouse. (They weren't meant to be used on screens larger than 320x200).
x *= mouseacc;
y *= mouseacc;
// Cap our two bytes per axis to one byte.
// Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)...
// I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127)
mouse_report.x = -MAX(-MAX(x, -127), -127);
mouse_report.y = -MAX(-MAX(y, -127), -127);
if (debug_mouse) {
print("adb_host_mouse_recv: "); print_bin16(codes); print("\n");
print("adb_mouse raw: [");
phex(mouseacc); print(" ");
phex(mouse_report.buttons); print("|");
print_decs(mouse_report.x); print(" ");
print_decs(mouse_report.y); print("]\n");
}
// Send result by usb.
host_mouse_send(&mouse_report);
// increase acceleration of mouse
mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 );
return;
}
#endif
uint8_t matrix_scan(void)
{
/* extra_key is volatile and more convoluted than necessary because gcc refused
to generate valid code otherwise. Making extra_key uint8_t and constructing codes
here via codes = extra_key<<8 | 0xFF; would consistently fail to even LOAD
extra_key from memory, and leave garbage in the high byte of codes. I tried
dozens of code variations and it kept generating broken assembly output. So
beware if attempting to make extra_key code more logical and efficient. */
static volatile uint16_t extra_key = 0xFFFF;
uint16_t codes;
uint8_t key0, key1;
/* tick of last polling */
static uint16_t tick_ms;
codes = extra_key;
extra_key = 0xFFFF;
if ( codes == 0xFFFF )
{
// polling with 12ms interval
if (timer_elapsed(tick_ms) < 12) return 0;
tick_ms = timer_read();
codes = adb_host_kbd_recv();
}
key0 = codes>>8;
key1 = codes&0xFF;
if (debug_matrix && codes) {
print("adb_host_kbd_recv: "); phex16(codes); print("\n");
}
if (codes == 0) { // no keys
return 0;
} else if (codes == 0x7F7F) { // power key press
register_key(0x7F);
} else if (codes == 0xFFFF) { // power key release
register_key(0xFF);
} else if (key0 == 0xFF) { // error
xprintf("adb_host_kbd_recv: ERROR(%d)\n", codes);
// something wrong or plug-in
matrix_init();
return key1;
} else {
/* Swap codes for ISO keyboard
* https://github.com/tmk/tmk_keyboard/issues/35
*
* ANSI
* ,----------- ----------.
* | *a| 1| 2 =|Backspa|
* |----------- ----------|
* |Tab | Q| | ]| *c|
* |----------- ----------|
* |CapsLo| A| '|Return |
* |----------- ----------|
* |Shift | Shift |
* `----------- ----------'
*
* ISO
* ,----------- ----------.
* | *a| 1| 2 =|Backspa|
* |----------- ----------|
* |Tab | Q| | ]|Retur|
* |----------- -----` |
* |CapsLo| A| '| *c| |
* |----------- ----------|
* |Shif| *b| Shift |
* `----------- ----------'
*
* ADB scan code USB usage
* ------------- ---------
* Key ANSI ISO ANSI ISO
* ---------------------------------------------
* *a 0x32 0x0A 0x35 0x35
* *b ---- 0x32 ---- 0x64
* *c 0x2A 0x2A 0x31 0x31(or 0x32)
*/
if (is_iso_layout) {
if ((key0 & 0x7F) == 0x32) {
key0 = (key0 & 0x80) | 0x0A;
} else if ((key0 & 0x7F) == 0x0A) {
key0 = (key0 & 0x80) | 0x32;
}
}
register_key(key0);
if (key1 != 0xFF) // key1 is 0xFF when no second key.
extra_key = key1<<8 | 0xFF; // process in a separate call
}
matrix_scan_quantum();
return 1;
}
void matrix_print(void){
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
inline
static void register_key(uint8_t key)
{
uint8_t col, row;
col = key&0x07;
row = (key>>3)&0x0F;
if (key&0x80) {
matrix[row] &= ~(1<<col);
} else {
matrix[row] |= (1<<col);
}
}
+73
View File
@@ -0,0 +1,73 @@
# MCU name
# atmega32u4 Teensy2.0
# atemga32u4 TMK Converter rev.1
# atemga32u2 TMK Converter rev.2
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
#
F_CPU = 16000000
# F_CPU = 8000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Bootloader
# This definition is optional, and if your keyboard supports multiple bootloaders of
# different sizes, comment this out, and the correct address will be loaded
# automatically (+60). See bootloader.mk for all options.
BOOTLOADER = caterina
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096 for TMK Converter rev.1/rev.2
# LUFA bootloader 4096
# USBaspLoader 2048
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
NKRO_ENABLE = no # USB Nkey Rollover - not yet supported in LUFA
EXTRAKEY_ENABLE = yes
USB_HID_ENABLE = yes
BACKLIGHT_ENABLE = no
#BLUETOOTH = AdafruitBLE # For Adafruit Feather 32U4 BLE support, uncomment this line
CUSTOM_MATRIX = yes
SRC = matrix.c \
adb.c
+28 -14
View File
@@ -196,20 +196,6 @@
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \
{ k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \
} }
// iso split
#define LAYOUT_60_iso_split( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \
K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \
K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \
K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \
{ K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \
{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \
{ K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \
}
/* LAYOUT_60_iso_5x1u /* LAYOUT_60_iso_5x1u
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
@@ -238,6 +224,33 @@
{ k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \
} }
/* LAYOUT_60_iso_split
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
* │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
* │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │
* │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
* │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │
* ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴───┼───┴┬────┬────┤
* │40 │41 │43 │44 │46 │48 │4a │4b │4d │4e │
* └────┴────┴────┴────────┴────┴──────────┴────┴────┴────┴────┘
*/
#define LAYOUT_60_iso_split( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \
k40, k41, k43, k44, k46, k48, k4a, k4b, k4d, k4e \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \
{ k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \
{ k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \
{ k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \
}
/* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI) /* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI)
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │
@@ -292,4 +305,5 @@
{ k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \
} }
#endif #endif
+4 -4
View File
@@ -28,10 +28,6 @@
"LAYOUT_60_iso": { "LAYOUT_60_iso": {
"key_count": 62, "key_count": 62,
"layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_iso_split": {
"key_count": 64,
"layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
}, },
"LAYOUT_60_hhkb": { "LAYOUT_60_hhkb": {
"key_count": 60, "key_count": 60,
@@ -41,6 +37,10 @@
"key_count": 63, "key_count": 63,
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}]
}, },
"LAYOUT_60_iso_split": {
"key_count": 64,
"layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_b_ansi": { "LAYOUT_60_b_ansi": {
"key_count": 66, "key_count": 66,
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}]
+74
View File
@@ -0,0 +1,74 @@
#include QMK_KEYBOARD_H
#include "doogle999.h"
#define ______ KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base layer
* ,-----------------------------------------------------------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace |
* |-----------------------------------------------------------------------------------------+
* | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
* |-----------------------------------------------------------------------------------------+
* | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
* |-----------------------------------------------------------------------------------------+
* | Shift | Z | X | C | V | B | N | M | , | . | Shift | U | Del |
* |-----------------------------------------------------------------------------------------+
* | Ctrl | Cmd | Alt | Space | / | Fn | L | D | R |
* `-----------------------------------------------------------------------------------------'
*/
LAYOUT_directional(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, ______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_DELETE,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SLSH, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT
),
/* Fn layer
* ,-----------------------------------------------------------------------------------------.
* | ~ | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10 | F11 | F12 | Backspace |
* |-----------------------------------------------------------------------------------------+
* | Reset | NP1 | NP2 | NP3 | NP4 | NP5 | NP6 | NP7 | NP8 | NP9 | NP0 |VolD |VolU | Mute |
* |-----------------------------------------------------------------------------------------+
* | | | | | | | | | | BlD | BlI | BlT | Menu |
* |-----------------------------------------------------------------------------------------+
* | Shift | Cyc+| Cyc-| Val+| Val-| Hue+| Hue-| Sat+| Sat-| Tog | Shift | Pup | Ins |
* |-----------------------------------------------------------------------------------------+
* | Ctrl | Cmd | Alt | Space |HwCal| |Home | Pdn | End |
* `-----------------------------------------------------------------------------------------'
*/
LAYOUT_directional(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ______, KC_CALC,
RESET, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_0, KC_VOLD, KC_VOLU, KC_MUTE,
______, ______, ______, ______, ______, ______, ______, ______, ______, BL_DEC, BL_INC, BL_TOGG, KC_APP,
KC_LSFT, ______, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_TOG, KC_RSFT, KC_PGUP, KC_INSERT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, TO(2), ______, KC_HOME, KC_PGDOWN, KC_END
),
/* Hardware calculator layer
* ,-----------------------------------------------------------------------------------------.
* |EndCa| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace |
* |-----------------------------------------------------------------------------------------+
* | | Q | | E | | T | | | | | P | | | |
* |-----------------------------------------------------------------------------------------+
* | | | S | | | | | | | L | | | Calc |
* |-----------------------------------------------------------------------------------------+
* | Shift | | | | C | | | | | . | Shift | | |
* |-----------------------------------------------------------------------------------------+
* | | | | | / | | | | |
* `-----------------------------------------------------------------------------------------'
*/
LAYOUT_directional(
ENDCALC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, ______, KC_BSPC,
______, KC_Q, ______, KC_E, ______, KC_T, ______, ______, ______, ______, KC_P, ______, ______, ______,
______, ______, KC_S, ______, ______, ______, ______, ______, ______, KC_L, ______, ______, CALC,
KC_LSFT, ______, ______, ______, KC_C, ______, ______, ______, ______, ______, KC_DOT, KC_RSFT, ______, ______,
______, ______, ______, ______, ______, ______, KC_SLSH, ______, ______, ______, ______
),
};
+2
View File
@@ -1,3 +1,5 @@
#include "quantum.h"
//Control //Control
#define MO_FNLR MO(FN_LAYER) #define MO_FNLR MO(FN_LAYER)
#define BACKSPC KC_BSPC #define BACKSPC KC_BSPC
+1 -1
View File
@@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-----+-----+-----+-----+-----+-----+ ,-----+-----+-----+-----+-----+-----+ * ,-----+-----+-----+-----+-----+-----+ ,-----+-----+-----+-----+-----+-----+
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC| * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC|
* |-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ * |-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+
* | RST | 1 | 2 | 3 | 5 | 5 | | 6 | 7 | 8 | 9 | 0 | | * | RST | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
* +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ * +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+
* | DEL | | LEFT| RGHT| UP | [ | | ] | 4 | 5 | 6 | + | | | * | DEL | | LEFT| RGHT| UP | [ | | ] | 4 | 5 | 6 | + | | |
* +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+ * +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+
+66 -8
View File
@@ -172,7 +172,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn| * |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn|
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | F21 | F22 | F23 | F24 | | | | |Clmak|Qwrty| | * | | | |TabL |TabR | | | | |Clmak|Qwrty| |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | | | | |Prev |Mute |Play |Next | | | | | * | | | | |Prev |Mute |Play |Next | | | | |
* `-----------------------------------------------------------------------' * `-----------------------------------------------------------------------'
@@ -189,8 +189,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_F18, KC_F19, KC_F20, KC_VOLD KC_F18, KC_F19, KC_F20, KC_VOLD
}, },
{ {
_______, KC_F21, KC_F22, KC_F23, _______, XXXXXXX, XXXXXXX, SC(KC_TAB),
KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_TAB), XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, COLEMAK, QWERTY, _______ XXXXXXX, COLEMAK, QWERTY, _______
}, },
{ {
@@ -229,13 +229,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
set_colemak(); set_colemak();
} }
return false; return false;
break;
case QWERTY: case QWERTY:
if (record->event.pressed) { if (record->event.pressed) {
set_qwerty(); set_qwerty();
} }
return false; return false;
break;
case SYMB: case SYMB:
if (record->event.pressed) { if (record->event.pressed) {
layer_on(_SYMB); layer_on(_SYMB);
@@ -243,7 +241,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
layer_off(_SYMB); layer_off(_SYMB);
} }
return false; return false;
break;
case MOVE: case MOVE:
if (record->event.pressed) { if (record->event.pressed) {
layer_on(_MOVE); layer_on(_MOVE);
@@ -251,7 +248,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
layer_off(_MOVE); layer_off(_MOVE);
} }
return false; return false;
break;
case FUNC: case FUNC:
if (record->event.pressed) { if (record->event.pressed) {
layer_on(_FUNC); layer_on(_FUNC);
@@ -259,7 +255,69 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
layer_off(_FUNC); layer_off(_FUNC);
} }
return false; return false;
break;
// Override the defualt auto shifted symbols to use SEND_STRING
// See https://github.com/qmk/qmk_firmware/issues/4072
case KC_EXLM:
if (record->event.pressed) { SEND_STRING("!"); }
return false;
case KC_AT:
if (record->event.pressed) { SEND_STRING("@"); }
return false;
case KC_HASH:
if (record->event.pressed) { SEND_STRING("#"); }
return false;
case KC_DLR:
if (record->event.pressed) { SEND_STRING("$"); }
return false;
case KC_PERC:
if (record->event.pressed) { SEND_STRING("%"); }
return false;
case KC_CIRC:
if (record->event.pressed) { SEND_STRING("^"); }
return false;
case KC_AMPR:
if (record->event.pressed) { SEND_STRING("&"); }
return false;
case KC_ASTR:
if (record->event.pressed) { SEND_STRING("*"); }
return false;
case KC_LPRN:
if (record->event.pressed) { SEND_STRING("("); }
return false;
case KC_RPRN:
if (record->event.pressed) { SEND_STRING(")"); }
return false;
case KC_TILD:
if (record->event.pressed) { SEND_STRING("~"); }
return false;
case KC_GRV:
if (record->event.pressed) { SEND_STRING("`"); }
return false;
case KC_PLUS:
if (record->event.pressed) { SEND_STRING("+"); }
return false;
case KC_EQL:
if (record->event.pressed) { SEND_STRING("="); }
return false;
case KC_PIPE:
if (record->event.pressed) { SEND_STRING("|"); }
return false;
case KC_BSLS:
if (record->event.pressed) { SEND_STRING("\\"); }
return false;
case KC_LBRC:
if (record->event.pressed) { SEND_STRING("["); }
return false;
case KC_RBRC:
if (record->event.pressed) { SEND_STRING("]"); }
return false;
case KC_LCBR:
if (record->event.pressed) { SEND_STRING("{"); }
return false;
case KC_RCBR:
if (record->event.pressed) { SEND_STRING("}"); }
return false;
} }
return true; return true;
} }
@@ -2,16 +2,16 @@
#define FORCE_NKRO #define FORCE_NKRO
#define PERMISSIVE_HOLD #define MOUSEKEY_DELAY 50
#define TAPPING_TERM 200 #define MOUSEKEY_INTERVAL 15
#define TAPPING_TOGGLE 2 #define MOUSEKEY_MAX_SPEED 4
#define MOUSEKEY_TIME_TO_MAX 50
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
#define MOUSEKEY_DELAY 50 #define PERMISSIVE_HOLD
#define MOUSEKEY_INTERVAL 15 #define TAPPING_TERM 200
#define MOUSEKEY_MAX_SPEED 4 #define TAPPING_TOGGLE 2
#define MOUSEKEY_TIME_TO_MAX 50
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
#undef IS_COMMAND #undef IS_COMMAND
#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL)))
+6 -12
View File
@@ -19,9 +19,8 @@
#define UC_DIVS UC(0x00F7) #define UC_DIVS UC(0x00F7)
#define UC_MINS UC(0x2212) #define UC_MINS UC(0x2212)
void matrix_init_user(void) void matrix_init_user(void) {
{ set_unicode_input_mode(UC_WINC);
set_unicode_input_mode(UC_WIN);
} }
enum layers { enum layers {
@@ -35,13 +34,10 @@ enum custom_keycodes {
NUMPAD, NUMPAD,
}; };
bool process_record_user(uint16_t keycode, keyrecord_t *record) bool process_record_user(uint16_t keycode, keyrecord_t *record) {
{
switch (keycode) { switch (keycode) {
case CLEAR: case CLEAR:
if (record->event.pressed) { if (record->event.pressed) { SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); }
SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
}
return false; return false;
case NUMPAD: case NUMPAD:
@@ -65,15 +61,13 @@ enum tap_dance {
TD_DESKTOP, TD_DESKTOP,
}; };
void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) {
{
// Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc. // Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc.
if (state->count & 1) { layer_on(L_FN); } if (state->count & 1) { layer_on(L_FN); }
if (state->count & 2) { register_code(KC_RCTL); } if (state->count & 2) { register_code(KC_RCTL); }
} }
void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) {
{
if (state->count & 1) { layer_off(L_FN); } if (state->count & 1) { layer_off(L_FN); }
if (state->count & 2) { unregister_code(KC_RCTL); } if (state->count & 2) { unregister_code(KC_RCTL); }
} }
+227
View File
@@ -0,0 +1,227 @@
/*
Copyright 2018 Alexander Fougner <fougner89 at gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
#define MANUFACTURER KP Republic
#define PRODUCT XD87 TKL
#define DESCRIPTION KP Republic XD87
/* key matrix size */
#define MATRIX_ROWS 6
#define MATRIX_COLS 17
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { D1, B0, B1, C7, D3, D5 }
#define MATRIX_COL_PINS { E6, F0, F1, F4, F5, F6, F7, B5, B6, C6, D4, D6, D7, B4, B2, B3, D2 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
#define DIODE_DIRECTION COL2ROW
#define BACKLIGHT_PIN D0
// #define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
// #define RGB_DI_PIN E2
// #ifdef RGB_DI_PIN
// #define RGBLIGHT_ANIMATIONS
// #define RGBLED_NUM 16
// #define RGBLIGHT_HUE_STEP 8
// #define RGBLIGHT_SAT_STEP 8
// #define RGBLIGHT_VAL_STEP 8
// #endif
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
// #define GRAVE_ESC_CTRL_OVERRIDE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
/*
* MIDI options
*/
/* Prevent use of disabled MIDI features in the keymap */
//#define MIDI_ENABLE_STRICT 1
/* enable basic MIDI features:
- MIDI notes can be sent when in Music mode is on
*/
//#define MIDI_BASIC
/* enable advanced MIDI features:
- MIDI notes can be added to the keymap
- Octave shift and transpose
- Virtual sustain, portamento, and modulation wheel
- etc.
*/
//#define MIDI_ADVANCED
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
//#define MIDI_TONE_KEYCODE_OCTAVES 1
/*
* HD44780 LCD Display Configuration
*/
/*
#define LCD_LINES 2 //< number of visible lines of the display
#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display
#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode
#if LCD_IO_MODE
#define LCD_PORT PORTB //< port for the LCD lines
#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0
#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1
#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2
#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3
#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0
#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1
#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2
#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3
#define LCD_RS_PORT LCD_PORT //< port for RS line
#define LCD_RS_PIN 3 //< pin for RS line
#define LCD_RW_PORT LCD_PORT //< port for RW line
#define LCD_RW_PIN 2 //< pin for RW line
#define LCD_E_PORT LCD_PORT //< port for Enable line
#define LCD_E_PIN 1 //< pin for Enable line
#endif
*/
View File
Whitespace-only changes.
+19
View File
@@ -0,0 +1,19 @@
/* Copyright 2018 Alexander Fougner <fougner89 at gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// place overrides here
+68
View File
@@ -0,0 +1,68 @@
/* Copyright 2018 Alexander Fougner <fougner89 at gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
QMKBEST = SAFE_RANGE,
QMKURL
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_tkl_iso(\
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, \
KC_CAPS,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT, \
KC_LSFT,KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_UP, \
KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT )
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QMKBEST:
if (record->event.pressed) {
// when keycode QMKBEST is pressed
SEND_STRING("QMK is the best thing ever!");
} else {
// when keycode QMKBEST is released
}
break;
case QMKURL:
if (record->event.pressed) {
// when keycode QMKURL is pressed
SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
} else {
// when keycode QMKURL is released
}
break;
}
return true;
}
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
}
void led_set_user(uint8_t usb_led) {
}
+1
View File
@@ -0,0 +1 @@
# The default keymap for xd87
+26
View File
@@ -0,0 +1,26 @@
# XD87
![XD87](https://i.imgur.com/qVyOies.jpg)
- Keyboard Maintainer: [Alexander Fougner](https://github.com/fougner)
- Hardware Supported: XD87 PCB v1.1
- Hardware Availability:
- [KPrepublic.com](https://kprepublic.com/products/xd87-xd87-xd80-custom-mechanical-keyboard-kit80-supports-tkg-tools-support-underglow-rgb-pcb-programmed-gh80-kle)
- [AliExpress](https://www.aliexpress.com/item/xd87-XD87-XD80-Custom-Mechanical-Keyboard-Kit80-Supports-TKG-TOOLS-Support-Underglow-RGB-PCB-programmed-gh80/32892540743.html)
Make example for this keyboard (after setting up your build environment):
make xd87:default
It also supports the tkl_ansi and tkl_iso community layouts:
# Build firmware with ANSI layout
make xd87:default_tkl_ansi
# Build firmware with ISO layout
make xd87:default_tkl_iso
The keyboard can be reset to bootloader by using bootmagic (space+b by default) or short out the small connector between the Delete and End keys.
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+84
View File
@@ -0,0 +1,84 @@
# MCU name
#MCU = at90usb1286
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# atmega32a bootloadHID
BOOTLOADER = atmel-dfu
# If you don't know the bootloader type, then you can specify the
# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
# OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
# Supported layouts
LAYOUTS = tkl_ansi tkl_iso
+43
View File
@@ -0,0 +1,43 @@
/* Copyright 2018 Alexander Fougner <fougner89 at gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "xd87.h"
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
return process_record_user(keycode, record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
}
+70
View File
@@ -0,0 +1,70 @@
/* Copyright 2018 Alexander Fougner <fougner89 at gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef XD87_H
#define XD87_H
#include "quantum.h"
#define LAYOUT_all( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K3E, K1E, K1F, K1G, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, \
K50, K51, K52, K55, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \
) { \
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F G */ \
/* 0 */ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G }, \
/* 1 */ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G }, \
/* 2 */ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G }, \
/* 3 */ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, KC_NO, KC_NO }, \
/* 4 */ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G }, \
/* 5 */ { K50, K51, K52, KC_NO, KC_NO, K55, KC_NO, KC_NO, K58, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G } \
}
#define LAYOUT_tkl_ansi( \
K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \
K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \
K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \
) LAYOUT_all( \
K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, KC_NO, K1D, KC_NO, K1E, K1F, K1G, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, \
K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \
K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \
)
#define LAYOUT_tkl_iso( \
K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, K2F, K2G, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \
K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \
) LAYOUT_all( \
K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO, K1E, K1F, K1G, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KC_NO, K2E, K2F, K2G, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \
K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \
)
#endif
@@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
) \ ) \
-1
View File
@@ -103,7 +103,6 @@ endif
CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst) CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
CFLAGS += $(CSTANDARD) CFLAGS += $(CSTANDARD)
#---------------- Compiler Options C++ ---------------- #---------------- Compiler Options C++ ----------------
# -g*: generate debugging information # -g*: generate debugging information
# -O*: optimization level # -O*: optimization level
+460
View File
@@ -0,0 +1,460 @@
#include "doogle999.h"
static unsigned char inputLocation = 0; // Current index in text input
static double calc(const char input[CALC_BUFFER_SIZE +1]) // Finds value of input char array, relatively small and fast I think
{
char inputToken[CALC_BUFFER_SIZE + 1]; // Input buffer, used when a single token (generally a number) takes up more
unsigned char inputTokenLocation = 0, inputLocation = 0; // Keep track of indices
struct Token tokens[CALC_BUFFER_SIZE + 1]; // Input, converted to tokens, one extra large to accomodate for possible negative sign then open parenthesis as first character
unsigned char tokenCount = 0; // Keep track of index
bool dashAsMinus = false; // Kind of a hacky solution to determining whether to treat a dash as a minus sign or a negative sign
while(inputLocation < CALC_BUFFER_SIZE + 1)
{
char digit = input[inputLocation];
if(inputLocation == 0 && input[inputLocation] == CALC_CHAR_SUB && input[inputLocation + 1] == CALC_CHAR_BEG)
{
tokens[tokenCount].raw.num = 0;
tokens[tokenCount].isNum = true;
tokenCount++;
dashAsMinus = true;
}
if ((digit >= '0' && digit <= '9') || /* valid digit */
(inputTokenLocation != 0 && input[inputLocation] == CALC_CHAR_DEC) || /* valid floating point */
(!dashAsMinus && inputTokenLocation == 0 && input[inputLocation] == CALC_CHAR_SUB)) /* - is negative sign */
{
inputToken[inputTokenLocation] = input[inputLocation];
inputTokenLocation++;
inputLocation++;
continue;
}
if(inputTokenLocation != 0)
{
// sscanf(inputToken, "%lf", &tokens[tokenCount].raw.num); // I would like to use sscanf here, but the small version of stdio.h on the chip doesn't allow sscanf or its sister functions to be used to process floats
tokens[tokenCount].raw.num = atof(inputToken);
tokens[tokenCount].isNum = true;
for(unsigned char i = 0; i < inputTokenLocation + 1; i++)
{
inputToken[i] = '\0';
}
inputTokenLocation = 0;
tokenCount++;
dashAsMinus = true;
continue;
}
/* inputTokenLocation == 0 */
tokens[tokenCount].isNum = false;
tokens[tokenCount].raw.op.c = input[inputLocation];
tokens[tokenCount].raw.op.priority = 0;
tokens[tokenCount].raw.op.ltr = true;
dashAsMinus = false;
switch(input[inputLocation])
{
case CALC_CHAR_BEG:
break;
case CALC_CHAR_END:
dashAsMinus = true;
break;
case CALC_CHAR_ADD:
tokens[tokenCount].raw.op.priority = CALC_PRIO_ADD;
break;
case CALC_CHAR_SUB:
tokens[tokenCount].raw.op.priority = CALC_PRIO_SUB;
break;
case CALC_CHAR_MUL:
tokens[tokenCount].raw.op.priority = CALC_PRIO_MUL;
break;
case CALC_CHAR_DIV:
tokens[tokenCount].raw.op.priority = CALC_PRIO_DIV;
break;
case CALC_CHAR_EXP:
tokens[tokenCount].raw.op.priority = CALC_PRIO_EXP;
tokens[tokenCount].raw.op.ltr = false;
break;
case CALC_CHAR_SIN:
case CALC_CHAR_COS:
case CALC_CHAR_TAN:
case CALC_CHAR_ASN:
case CALC_CHAR_ACS:
case CALC_CHAR_ATN:
case CALC_CHAR_LGE:
case CALC_CHAR_LOG:
case CALC_CHAR_SQT:
break;
case CALC_CHAR_EUL:
tokens[tokenCount].isNum = true;
tokens[tokenCount].raw.num = CALC_VALU_EUL;
dashAsMinus = true;
break;
case CALC_CHAR_PI:
tokens[tokenCount].isNum = true;
tokens[tokenCount].raw.num = CALC_VALU_PI;
dashAsMinus = true;
break;
case '\0':
tokenCount--;
inputLocation = CALC_BUFFER_SIZE;
break;
default:
tokenCount--;
break;
}
tokenCount++;
inputLocation++;
}
struct Token output[CALC_BUFFER_SIZE + 1]; // Final output tokens before evaluation
struct Token opstack[CALC_BUFFER_SIZE + 1]; // Stack of operators
unsigned char outputLocation = 0, opstackLocation = 0; // Keep track of indices
unsigned char numBrackets = 0; // The number of parenthesis
for(unsigned char i = 0; i < tokenCount; i++)
{
if(tokens[i].isNum)
{
output[outputLocation] = tokens[i];
outputLocation++;
}
else if(tokens[i].raw.op.c == CALC_CHAR_BEG)
{
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
else if(tokens[i].raw.op.c == CALC_CHAR_END)
{
while(opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG)
{
output[outputLocation] = opstack[opstackLocation - 1];
outputLocation++;
opstackLocation--;
}
opstackLocation--;
numBrackets += 2;
}
else if(tokens[i].raw.op.priority == 0)
{
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
else
{
while(opstackLocation != 0
&& (opstack[opstackLocation - 1].raw.op.priority == 0
|| tokens[i].raw.op.priority < opstack[opstackLocation - 1].raw.op.priority
|| (tokens[i].raw.op.priority == opstack[opstackLocation - 1].raw.op.priority && opstack[opstackLocation - 1].raw.op.ltr))
&& opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG)
{
output[outputLocation] = opstack[opstackLocation - 1];
outputLocation++;
opstackLocation--;
}
opstack[opstackLocation] = tokens[i];
opstackLocation++;
}
}
tokenCount -= numBrackets;
for(signed char i = opstackLocation - 1; i >= 0; i--)
{
output[outputLocation] = opstack[i];
outputLocation++;
opstackLocation--;
}
double answer[CALC_BUFFER_SIZE];
unsigned char answerLocation = 0;
for(unsigned char i = 0; i < tokenCount; i++)
{
if(output[i].isNum)
{
answer[answerLocation] = output[i].raw.num;
answerLocation++;
continue;
}
if(output[i].raw.op.priority == 0)
{
if (answerLocation < 1) { /* not handled here -- ERROR? */ } else
if(answerLocation >= 1)
{
double (*op)(double);
switch(output[i].raw.op.c)
{
case CALC_CHAR_SIN:
op = sin;
break;
case CALC_CHAR_COS:
op = cos;
break;
case CALC_CHAR_TAN:
op = tan;
break;
case CALC_CHAR_ASN:
op = asin;
break;
case CALC_CHAR_ACS:
op = acos;
break;
case CALC_CHAR_ATN:
op = atan;
break;
case CALC_CHAR_LGE:
op = log;
break;
case CALC_CHAR_LOG:
op = log10;
break;
case CALC_CHAR_SQT:
op = sqrt;
break;
default:
continue; /* invalid input */
}
answer[answerLocation - 1] = op(answer[answerLocation - 1]);
}
}
/* priority != 0 */
else if(answerLocation >= 2)
{
switch(output[i].raw.op.c)
{
case CALC_CHAR_ADD:
answer[answerLocation - 2] += answer[answerLocation - 1];
break;
case CALC_CHAR_SUB:
answer[answerLocation - 2] -= answer[answerLocation - 1];
break;
case CALC_CHAR_MUL:
answer[answerLocation - 2] *= answer[answerLocation - 1];
break;
case CALC_CHAR_DIV:
answer[answerLocation - 2] /= answer[answerLocation - 1];
break;
case CALC_CHAR_EXP:
answer[answerLocation - 2] = pow(answer[answerLocation - 2], answer[answerLocation - 1]);
break;
}
answerLocation--;
}
}
return answer[0];
}
/*
* @returns 0 when nothing should happen and QMK should work as usual
* @returns -1 when invalid input was given, QMK should ignore it
* @returns -2 when BSP should be done
* @returns -3 when CALC should be done
* @returns -4 when ENDCALC should be done
* @returns positive value of CALC_* when normal input was processed
*/
static int process_input(const uint16_t keycode, const uint8_t mods, const keyevent_t event)
{
/* handle even when no key was pressed */
if(!event.pressed)
{
switch(keycode)
{
/* QMK should handle those */
case KC_RSFT:
case KC_LSFT:
return 0;
break;
}
/* ??? ignore */
return -1;
}
/* when shift key is pressed handle characters differently */
char characterPressed;
if((get_mods() & MODS_SHIFT_MASK))
{
switch(keycode)
{
case KC_9:
characterPressed = CALC_CHAR_BEG;
break;
case KC_0:
characterPressed = CALC_CHAR_END;
break;
case KC_EQUAL:
characterPressed = CALC_CHAR_ADD;
break;
case KC_KP_PLUS:
characterPressed = CALC_CHAR_ADD;
break;
case KC_6:
characterPressed = CALC_CHAR_EXP;
break;
case KC_8:
characterPressed = CALC_CHAR_MUL;
break;
case KC_KP_ASTERISK:
characterPressed = CALC_CHAR_MUL;
break;
case KC_S:
characterPressed = CALC_CHAR_ASN;
break;
case KC_C:
characterPressed = CALC_CHAR_ACS;
break;
case KC_T:
characterPressed = CALC_CHAR_ATN;
break;
case KC_L:
characterPressed = CALC_CHAR_LOG;
break;
default:
return -1;
break;
}
return characterPressed;
}
/* normal key handling: shift not pressed */
/* digits */
if (keycode == KC_KP_0 || keycode == KC_0) {
return '0';
} else if (keycode >= KC_KP_1 && keycode <= KC_KP_9) {
return keycode - KC_KP_1 +1 + '0';
} else if (keycode >= KC_1 && keycode <= KC_9) {
return keycode - KC_1 +1 + '0';
}
/* other tokens */
switch (keycode) {
case KC_MINUS:
case KC_KP_MINUS:
return characterPressed = CALC_CHAR_SUB;
case KC_SLASH:
case KC_KP_SLASH:
return characterPressed = CALC_CHAR_DIV;
case KC_S:
return characterPressed = CALC_CHAR_SIN;
case KC_C:
return characterPressed = CALC_CHAR_COS;
case KC_T:
return characterPressed = CALC_CHAR_TAN;
case KC_Q:
return characterPressed = CALC_CHAR_SQT;
case KC_L:
return characterPressed = CALC_CHAR_LGE;
case KC_DOT:
case KC_KP_DOT:
return characterPressed = CALC_CHAR_DEC;
case KC_P:
return characterPressed = CALC_CHAR_PI;
case KC_E:
return characterPressed = CALC_CHAR_EUL;
case KC_BSPC:
return -2;
case KC_RSFT:
return 0;
case KC_LSFT:
return 0;
case CALC:
return -3;
case ENDCALC:
return -4;
default:
return -1;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t* record)
{
static char text[CALC_BUFFER_SIZE + 1]; // Used to store input and then output when ready to print
static char backspaceText[CALC_BUFFER_SIZE + 1]; // Pretty dumb waste of memory because only backspace characters, used with send_string to backspace and remove input
if((biton32(layer_state) == CALC_LAYER && CALC_FORCE_NUM_LOCK_INSIDE_CALC) || (biton32(layer_state) != CALC_LAYER && CALC_FORCE_NUM_LOCK_OUTSIDE_CALC))
{
bool numpadKeyPressed = record->event.pressed &&
!(get_mods() & MODS_SHIFT_MASK) &&
/* KC_KP_1, KC_KP_2, ..., KC_KP_0, KC_KP_DOT */
(keycode >= KC_KP_1 && keycode <= KC_KP_DOT);
if(numpadKeyPressed && !(host_keyboard_leds() & (1 << USB_LED_NUM_LOCK)))
{
add_key(KC_NLCK);
send_keyboard_report();
del_key(KC_NLCK);
}
}
if(biton32(layer_state) != CALC_LAYER) { return true; }
int action = process_input(keycode, get_mods(), record->event);
switch(action)
{
case 0:
return true;
case -1:
return false;
case -2:
if(inputLocation > 0)
{
inputLocation--;
text[inputLocation] = '\0';
backspaceText[0] = (char)8;
backspaceText[1] = '\0';
send_string(backspaceText);
}
return false;
case -3:
for(int i = 0; i < inputLocation; i++)
{
backspaceText[i] = (char)8;
}
send_string(backspaceText);
dtostrf(calc(text), CALC_PRINT_SIZE, CALC_PRINT_SIZE, text);
send_string(text);
for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++)
{
text[i] = '\0';
backspaceText[i] = '\0';
}
inputLocation = 0;
return false;
case -4:
for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++)
{
text[i] = '\0';
backspaceText[i] = '\0';
}
inputLocation = 0;
layer_off(CALC_LAYER);
return false;
default:
break;
}
char characterPressed = (char)action;
if(inputLocation < CALC_BUFFER_SIZE)
{
text[inputLocation] = characterPressed;
inputLocation++;
char characterToSend[2];
characterToSend[0] = characterPressed;
characterToSend[1] = '\0';
send_string(characterToSend);
}
return false;
}
+99
View File
@@ -0,0 +1,99 @@
#ifndef USERSPACE
#define USERSPACE
#include "quantum.h"
#define NO_ACTION_ONESHOT
#define NO_ACTION_MACRO
#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
// Layer the calculator is on
#define CALC_LAYER 2
// Inside is whether when you are in calc mode it should automatically force numlock, outside is whether it should do it outside of calculator mode
#define CALC_FORCE_NUM_LOCK_INSIDE_CALC true
#define CALC_FORCE_NUM_LOCK_OUTSIDE_CALC true
// Maximum number of characters the calculator can have
#define CALC_BUFFER_SIZE 32
// Minimum width of the printed text / the number of decimal places
#define CALC_PRINT_SIZE 6
/*-----
Special
-----*/
#define CALC_CHAR_BEG '('
#define CALC_CHAR_END ')'
#define CALC_CHAR_DEC '.'
/*-----
Operators - Can add more here such as modulo %, factorial !
-----*/
#define CALC_CHAR_ADD '+'
#define CALC_PRIO_ADD 1
#define CALC_CHAR_SUB '-'
#define CALC_PRIO_SUB 1
#define CALC_CHAR_MUL '*'
#define CALC_PRIO_MUL 2
#define CALC_CHAR_DIV '/'
#define CALC_PRIO_DIV 2
#define CALC_CHAR_EXP '^'
#define CALC_PRIO_EXP 3
/*-----
Functions
-----*/
#define CALC_CHAR_SIN 's'
#define CALC_CHAR_COS 'c'
#define CALC_CHAR_TAN 't'
#define CALC_CHAR_ASN 'S'
#define CALC_CHAR_ACS 'C'
#define CALC_CHAR_ATN 'T'
#define CALC_CHAR_LGE 'l'
#define CALC_CHAR_LOG 'L'
#define CALC_CHAR_SQT 'q'
/*-----
Constants
-----*/
#define CALC_CHAR_EUL 'e'
#define CALC_VALU_EUL 2.71828182845904523536
#define CALC_CHAR_PI 'p'
#define CALC_VALU_PI 3.14159265358979323846
struct OP // Operator/function
{
char c;
unsigned char priority;
bool ltr;
};
union TokenRaw // A token after the input has been processed, can either be a number or an operator/function
{
double num;
struct OP op;
};
struct Token // Encapsulator
{
bool isNum;
union TokenRaw raw;
};
enum CalcFunctions // Hardware calculator key functionality
{
CALC = SAFE_RANGE,
ENDCALC
};
#endif
+41
View File
@@ -0,0 +1,41 @@
Copyright 2018 <name> <email> @doogle999
Overview
========
This folder is just for some calculator code for my keyboards.
Making Your Keyboard Into A Calculator
--------------------------------------
If you'd like to make your keyboard into a calculator, you can do it with this userspace (hopefully!)
You can make a keymap for your keyboard of choice named doogle999 and then you can make it regularly.
You should make one layer that is just the functionality for your calculator, so it just has the keys you need (numbers, symbols, some letters for functions). It should also have END_CALC and CALC somewhere. END_CALC gets you out of calculator mode, and CALC evaluates the calculation.
On one of your other keymaps you should make a key that is TO(layer of calculator). This is how you will activate the calculator. You should also define the layer your calculator is on with the define CALC_LAYER in doogle999.h (this means that for all your keyboards, your calculator layer has to be the same layer).
You can change what characters coorespond to what operators and functions and you can add more functions in doogle999.h and doogle999.c, you can also change which characters are sued for which keys. However, as of now standard keys should be used for operations. By that I mean if you want your multiplication sign to be an x, you should change the CALC_CHAR_MUL to an x but you should keep your multiplication keycode on the keymap either as KC_8 (shifted) or KC_KP_ASTERISK. This might be changed in the future so there are custom keycodes so this is less of a pain and more intuitive.
You can look at my dz60 keymap doogle999 for an example.
Issues
------
Unfortunately the chip onboard my dz60 only does single precision floating point numbers, but I have everything set up as double so if your chip supports doubles it should work for you.
This Was Here When I Made The ReadMe
------------------------------------
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/>.
+14
View File
@@ -0,0 +1,14 @@
SRC += doogle999.c
CFLAGS += -fstrict-aliasing -ftree-vrp
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB 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
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = yes
+1 -1
View File
@@ -22,4 +22,4 @@ fi
brew tap osx-cross/avr brew tap osx-cross/avr
brew tap PX4/homebrew-px4 brew tap PX4/homebrew-px4
brew update brew update
brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util
+1 -1
View File
@@ -18,7 +18,7 @@ if [ -z "$USERNAME" ]; then
exit 1 exit 1
fi fi
cd .. cd "$(dirname "$0")/.."
if [ ! -d "keyboards/$KB_PATH" ]; then if [ ! -d "keyboards/$KB_PATH" ]; then
printf "Error! keyboards/%s does not exist!\n" "$KB_PATH" printf "Error! keyboards/%s does not exist!\n" "$KB_PATH"