Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bef554d18b | ||
|
|
9ed0c2d57b | ||
|
|
b0a021c07a | ||
|
|
c8267d9fea | ||
|
|
6539426f61 | ||
|
|
03d16db942 | ||
|
|
572c316e7d | ||
|
|
cb1e45b4ef | ||
|
|
95619bdaca | ||
|
|
8421a89820 | ||
|
|
5dc41446aa | ||
|
|
e26a7b0ed8 | ||
|
|
418a886ae4 |
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
|
||||||
@@ -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 }, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2,18 +2,14 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
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).
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#include "adb_usb.h"
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "quantum.h"
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
),
|
||||||
|
};
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
@@ -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
|
||||||
@@ -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}]
|
||||||
|
|||||||
@@ -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, ______, ______, ______, ______
|
||||||
|
),
|
||||||
|
};
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 | + | | |
|
||||||
* +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+
|
* +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+
|
||||||
|
|||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -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)))
|
||||||
@@ -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); }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
*/
|
||||||
|
|
||||||
Whitespace-only changes.
@@ -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
|
||||||
@@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# The default keymap for xd87
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# XD87
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
- 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).
|
||||||
@@ -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
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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
|
||||||
) \
|
) \
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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/>.
|
||||||
@@ -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
|
||||||
@@ -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
@@ -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"
|
||||||
|
|||||||
Reference in new issue
Block a user