This commit is contained in:
Alex Ong 2019-01-26 11:36:28 +11:00
commit d977daa8dc
1320 changed files with 28827 additions and 13485 deletions

View file

@ -1,7 +1,3 @@
ifndef QUANTUM_DIR
include ../../../../Makefile
endif
AUDIO_ENABLE = no
MOUSEKEY_ENABLE = yes

View file

@ -1,3 +0,0 @@
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View file

@ -1,3 +0,0 @@
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View file

@ -0,0 +1,87 @@
/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
/* Taken from the DataHand PS/2-USB adaptor. */
#define VENDOR_ID 0x13BA
#define PRODUCT_ID 0x0017
#define DEVICE_VER 0x0001
#define MANUFACTURER DataHand
#define PRODUCT DataHand
#define DESCRIPTION DataHand Teensy++ 2.0 conversion
/* key matrix size */
#define MATRIX_ROWS 13
#define MATRIX_COLS 4
#define DIODE_DIRECTION CUSTOM_MATRIX
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 0
/* 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
/*
* 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)) \
)
/*
* Command/Windows key option
*
* If you define this, the thumb enter key becomes the Command/Windows key. There's still an enter key on the right
* ring finger, so this key is much better utilized as the otherwise nonexistent Command key. I think some newer
* DataHands let you remap right ring east as Command, but having it on the thumb is nicer. Comment out this define
* to use the original layout.
*/
#define DATAHAND_THUMB_RETURN_COMMAND

View file

@ -0,0 +1,133 @@
/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#pragma once
#include "quantum.h"
/* This a shortcut to help you visually see your layout.
* The first section contains all of the arguements; the second converts the arguments into a two-dimensional array.
*/
/* Each code is three letters
* l or r - left or right hand
* p, r, m, i, t - pinky, ring finger, middle finger, index finger, thumb
* fingers: n, s, e, w, c - north, south, east, west, and center (manual calls this "well" but we already have "west")
* thumb: p, n, c, l, u, k - pad, nail, center, lock (harder center), up, knuckle
*/
#define LAYOUT( \
lpn, lrn, lmn, lin, rin, rmn, rrn, rpn, \
lpw, lpc, lpe, lrw, lrc, lre, lmw, lmc, lme, liw, lic, lie, riw, ric, rie, rmw, rmc, rme, rrw, rrc, rre, rpw, rpc, rpe, \
lps, lrs, lms, lis, ris, rms, rrs, rps, \
ltp, ltn, rtn, rtp, \
ltc, rtc, \
ltl, rtl, \
ltu, ltk, rtk, rtu) \
{ \
{riw, rin, lpw, lpn},\
{ric, rie, lpc, lpe},\
{ris, rms, lps, lrs},\
{rmw, rmn, lrw, lrn},\
{rmc, rme, lrc, lre},\
{rrw, rrn, lmw, lmn},\
{rrc, rre, lmc, lme},\
{rrs, rps, lms, lis},\
{rpw, rpn, liw, lin},\
{rpc, rpe, lic, lie},\
{rtk, rtn, ltk, ltn},\
{rtc, rtl, ltc, ltl},\
{rtp, rtu, ltp, ltu},\
}
/* Mode LEDs are active-low on Port B on the Teensy. */
#define LED_MODE_PORT PORTB
#define LED_TENKEY (1<<3)
#define LED_FN (1<<4)
#define LED_NORMAL (1<<5)
#define LED_NAS (1<<6)
/* Lock LEDs are active-low on Port F on the Teensy. */
#define LED_LOCK_PORT PORTF
#define LED_CAPS_LOCK (1<<4)
#define LED_MOUSE_LOCK (1<<5)
#define LED_NUM_LOCK (1<<6)
#define LED_SCROLL_LOCK (1<<7)
/* Appendix:
* Table based on https://geekhack.org/index.php?topic=12212.msg2059319#msg2059319
* Some pin assignments (e.g. for PS/2 I/O) have been fixed.
*
* Teensy Datahand 8051 pin pin 8051 Datahand Teensy
* ------ -------- ---- --- --- ---- -------- ------
* GND Mtrx send A P1.0 1 40 VCC VCC VCC
* PB7 Mtrx send B P1.1 2 39 P0.0 LED RH NAS PB6
* PD0 Mtrx send C P1.2 3 38 P0.1 LED RH NORM PB5
* PD1 Mtrx send D P1.3 4 37 P0.2 LED RH FCTN PB4
* PD2 RH rcv 0 P1.4 5 36 P0.3 LED RH 10K PB3
* PD3 RH rcv 1 P1.5 6 35 P0.4 LED RH unused PB2
* PD4 LH rcv 0 P1.6 7 34 P0.5 LED RH unused PE1
* PD5 LH rcv 1 P1.7 8 33 P0.6 LED RH unused PE0
* PD6 Reset button RST 9 32 P0.7 ? PE7
* PD7 ? P3.0 10 31 VPP - PE6
* PE0 ? P3.1 11 30 ALE - GND
* PE1 kbd data P3.2 12 29 PSEN - AREF
* PC0 ? P3.3 13 28 P2.7 ? PF0
* PC1 kbd clk P3.4 14 27 P2.6 ? PF1
* PC2 ? P3.5 15 26 P2.5 ? PF2
* PC3 RAM P3.6 16 25 P2.4 ? PF3
* PC4 RAM P3.7 17 24 P2.3 LED D15 LH (CAPLK) PF4
* PC5 XTAL2 XTAL2 18 23 P2.2 LED D13 LH (MSELK) PF5
* PC6 XTAL1 XTAL1 19 22 P2.1 LED D6 LH (NUMLK) PF6
* PC7 GND GND 20 21 P2.0 LED D14 LH (SCRLK) PF7
*
* JP3 Pinout
* 2 - keyboard data
* 3 - keyboard clock
*
* In order to get the Teensy to work, we need to move pin 1 to a different pin. This is
* because on the Teensy pin 1 is ground, but we need to write to pin 1 in order to read
* the keyboard matrix. An ideal pin to move it to is VPP (pin 31), because this pin tells
* the 8051 whether it should read from external or internal memory. The Teensy doesn't
* care about that.
*
* The easiest way to reassign the pin is to use standoffs. You can check out this thread:
* https://geekhack.org/index.php?topic=12212.msg235382#msg235382 for a picture of what
* this looks like. Note that in the picture the pin has been reassigned to pin 12. We
* don't want to do that because we're going to use that pin to send data over PS/2.
*
* We could if we wanted also reassign the PS/2 pins to Teensy hardware UART pins, but
* that's more work. Instead we'll just bit-bang PS/2 because it's an old, slow protocol
* (and because there's already a bit-banged PS/2 host implementation in QMK - we just
* need to add the device side).
*
* So overall, we want the following inputs and outputs:
* Outputs:
* Matrix:
* PB7
* PD0
* PD1
* PE6 (moved from pin1, GND)
* LEDs:
* PB3-6
* PF4-7
* Inputs:
* Matrix:
* PD2-5
* I/Os (start up as inputs):
* PS/2:
* PC1
* PE1
*/

View file

@ -0,0 +1,313 @@
/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include QMK_KEYBOARD_H
#include <stdbool.h>
/* Datahand features not supported:
* * All online reprogramming (user settings using the reset button).
* * Program Selection features.
* * Macros.
* * Direct substitutions.
* * L/R Modf.
* * Mouse Click Lock (Function Direct Access + Mouse Button key).
* * Different mouse movement speeds with the two pointer fingers, and using both pointer fingers to move even faster.
*
* As far as I know, everything else works.
*/
enum layer {
NORMAL,
#ifdef DATAHAND_THUMB_RETURN_COMMAND
NORMAL_THUMB_RETURN_COMMAND,
#endif
FUNCTION_MOUSE,
FUNCTION_ARROWS,
NAS,
NAS_NUMLOCK,
NAS_TENKEY,
NAS_TENKEY_NUMLOCK,
NUM_LAYERS
};
enum custom_keycodes {
N = SAFE_RANGE, /* Normal */
NS, /* NAS */
NSL, /* NAS Lock */
NLK, /* Numlock */
FN, /* Function mode - needs to be able to switch to mouse or arrow layer */
TK0, /* Ten-key off button */
TK1, /* Ten-key on button */
AR, /* FN arrow mode */
MS, /* FN mouse mode */
DZ, /* Double zero button */
};
static bool mouse_enabled = true;
static bool tenkey_enabled = false;
static bool numlock_enabled = false;
static bool nas_locked = false;
/* Declared weak so that it can easily be overridden. */
__attribute__((weak)) const uint16_t PROGMEM keymaps[NUM_LAYERS][MATRIX_ROWS][MATRIX_COLS] = {
[NORMAL] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_U, KC_I, KC_O, KC_P,
KC_DEL, KC_A, KC_LBRC, KC_ESC, KC_S, KC_B, KC_GRV, KC_D, KC_T, KC_DQT, KC_F, KC_G, KC_H, KC_J, KC_QUOT, KC_Y, KC_K, KC_COLN, KC_N, KC_L, KC_ENT, KC_RBRC, KC_SCLN, KC_BSLS,
KC_Z, KC_X, KC_C, KC_V, KC_M, KC_COMM, KC_DOT, KC_SLSH,
KC_ENT, KC_TAB, KC_BSPC, KC_SPC,
KC_LSFT, NS,
KC_CAPS, NSL,
N, KC_LCTL, KC_LALT, FN),
#ifdef DATAHAND_THUMB_RETURN_COMMAND
[NORMAL_THUMB_RETURN_COMMAND] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______,
KC_LCMD, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
#endif
[FUNCTION_MOUSE] = LAYOUT(
KC_F2, KC_F4, KC_F6, KC_MS_U, KC_MS_U, KC_F8, KC_F10, KC_PGUP,
_______, KC_NO, KC_SLCK, _______, KC_BTN3, NLK, KC_BTN1, MS, KC_BTN2, KC_MS_L, KC_BTN1, KC_MS_R, KC_MS_L, KC_BTN2, KC_MS_R, KC_END, AR, KC_LSFT, KC_INS, KC_9, KC_ENT, KC_F11, KC_0, KC_F12,
KC_F1, KC_F3, KC_F5, KC_MS_D, KC_MS_D, KC_F7, KC_F9, KC_PGDN,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
[FUNCTION_ARROWS] = LAYOUT(
_______, _______, _______, KC_UP, KC_UP, _______, _______, _______,
_______, _______, _______, _______, KC_LCTL, _______, _______, _______, _______, KC_LEFT, KC_HOME, KC_RGHT, KC_LEFT, KC_HOME, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, KC_DOWN, KC_DOWN, _______, _______, _______,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
[NAS] = LAYOUT(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
_______, KC_1, KC_TILD, _______, KC_2, NLK, KC_LABK, KC_3, KC_RABK, KC_SLSH, KC_4, KC_5, KC_6, KC_7, KC_UNDS, KC_CIRC, KC_8, KC_ENT, KC_SCLN, KC_9, KC_BSLS, TK0, KC_0, TK1,
KC_EQL, KC_X, KC_PERC, KC_MINS, KC_PLUS, KC_DOT, KC_SLSH, KC_QUES,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
[NAS_NUMLOCK] = LAYOUT(
_______, _______, _______, _______, _______, KC_PAST, _______, _______,
_______, KC_KP_1, _______, _______, KC_KP_2, _______, _______, KC_KP_3, _______, KC_PSLS, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, _______, _______, KC_KP_8, _______, _______, KC_KP_9, KC_PENT, _______, KC_KP_0, _______,
KC_PEQL, _______, _______, KC_PMNS, KC_PPLS, _______, KC_PDOT, _______,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
[NAS_TENKEY] = LAYOUT(
_______, _______, _______, KC_UP, KC_7, KC_8, KC_9, KC_ASTR,
_______, KC_QUOT, _______, _______, KC_DLR, _______, _______, KC_AMPR, _______, KC_LEFT, KC_HOME, KC_RGHT, KC_0, KC_4, DZ, KC_PLUS, KC_5, KC_MINS, KC_EQL, KC_6, KC_ENT, _______, KC_DOT, _______,
KC_LPRN, KC_RPRN, _______, KC_DOWN, KC_1, KC_2, KC_3, KC_SLSH,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
[NAS_TENKEY_NUMLOCK] = LAYOUT(
_______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_PAST,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_4, _______, KC_PPLS, KC_KP_5, KC_PMNS, KC_PEQL, KC_KP_6, KC_PENT, _______, KC_PDOT, _______,
_______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_PSLS,
_______, _______, _______, _______,
_______, _______,
_______, _______,
_______, _______, _______, _______),
};
static void lock_led_set(bool on, uint8_t led) {
if (on) {
LED_LOCK_PORT &= ~led;
} else {
LED_LOCK_PORT |= led;
}
}
static void mode_led_set(uint8_t led) {
static const uint8_t ALL_MODE_LEDS = LED_FN | LED_NORMAL | LED_NAS | LED_TENKEY;
LED_MODE_PORT |= ALL_MODE_LEDS;
LED_MODE_PORT &= ~led;
}
static void layer_set(bool on, uint8_t layer) {
if (on) {
layer_on(layer);
} else {
layer_off(layer);
}
if (layer_state_is(NAS) || layer_state_is(NAS_NUMLOCK) || layer_state_is(NAS_TENKEY) || layer_state_is(NAS_TENKEY_NUMLOCK)) {
if (tenkey_enabled) {
mode_led_set(LED_NAS | LED_TENKEY);
} else {
mode_led_set(LED_NAS);
}
} else if (layer_state_is(FUNCTION_MOUSE) || layer_state_is(FUNCTION_ARROWS)) {
mode_led_set(LED_FN);
} else if (layer_state_is(NORMAL)) {
mode_led_set(LED_NORMAL);
}
}
static void set_normal(void) {
layer_move(NORMAL);
#ifdef DATAHAND_THUMB_RETURN_COMMAND
layer_set(true, NORMAL_THUMB_RETURN_COMMAND);
#endif
/* Then call layer_set to update LEDs. */
layer_set(true, NORMAL);
}
static void set_nas(bool on) {
/* Always turn on the base NAS layer so other layers can fall through. */
layer_set(on, NAS);
layer_set(on && numlock_enabled, NAS_NUMLOCK);
layer_set(on && tenkey_enabled, NAS_TENKEY);
layer_set(on && tenkey_enabled && numlock_enabled, NAS_TENKEY_NUMLOCK);
}
static void set_tenkey(bool on) {
tenkey_enabled = on;
/* We have to be on the NAS layer in order to be able to toggle TK.
* Re-toggle it on so that we move to the right layer (and set the right LED).
*/
set_nas(true);
}
static void toggle_numlock(void) {
numlock_enabled = !numlock_enabled;
lock_led_set(numlock_enabled, LED_NUM_LOCK);
if (layer_state_is(NAS)) {
/* If we're already in NAS, re-set it so that we activate the numlock layer. */
set_nas(true);
}
}
static void set_function(void) {
/* Make sure to turn off NAS if we're entering function */
set_nas(false);
/* Always turn on the mouse layer so the arrow layer can fall through. */
layer_set(true, FUNCTION_MOUSE);
layer_set(!mouse_enabled, FUNCTION_ARROWS);
}
static void set_mouse_enabled(bool on) {
mouse_enabled = on;
/* Re-run set_function to set our layers correctly. */
set_function();
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool pressed = record->event.pressed;
switch(keycode) {
case N:
if (pressed) {
set_normal();
}
break;
case NS:
if (pressed) {
nas_locked = false;
}
set_nas(pressed);
break;
case NSL:
if (pressed) {
nas_locked = true;
set_nas(true);
}
break;
case NLK:
if (pressed) {
toggle_numlock();
SEND_STRING(SS_DOWN(X_NUMLOCK));
} else {
SEND_STRING(SS_UP(X_NUMLOCK));
}
break;
case FN:
if (pressed) {
set_function();
}
break;
case TK0:
if (pressed) {
set_tenkey(false);
}
break;
case TK1:
if (pressed) {
set_tenkey(true);
}
break;
case MS:
if (pressed) {
set_mouse_enabled(true);
}
break;
case AR:
if (pressed) {
set_mouse_enabled(false);
}
break;
case DZ:
if (pressed) {
SEND_STRING(SS_TAP(X_KP_0) SS_TAP(X_KP_0));
}
break;
}
return true;
};
void matrix_init_user(void) {
#ifdef DATAHAND_THUMB_RETURN_COMMAND
set_normal();
#endif
}
void matrix_scan_user(void) {
}
void led_set_user(uint8_t usb_led) {
lock_led_set(usb_led & (1<<USB_LED_NUM_LOCK), LED_NUM_LOCK);
lock_led_set(usb_led & (1<<USB_LED_CAPS_LOCK), LED_CAPS_LOCK);
lock_led_set(usb_led & (1<<USB_LED_SCROLL_LOCK), LED_SCROLL_LOCK);
}

View file

@ -0,0 +1,125 @@
/* Copyright 2017-2019 Nikolaus Wittenstein <nikolaus.wittenstein@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "datahand.h"
#include "matrix.h"
#include "action.h"
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t read_cols(void);
static void select_row(uint8_t row);
void matrix_init(void) {
/* See datahand.h for more detail on pins. */
/* 7 - matrix scan; 6-3 - mode LEDs */
DDRB = 0b11111000;
/* 1-0 - matrix scan */
DDRD = 0b00000011;
/* 6 - matrix scan */
DDRE = 0b01000000;
/* 7-4 - lock LEDs */
DDRF = 0b11110000;
/* Turn off the non-Normal LEDs (they're active low). */
PORTB |= LED_TENKEY | LED_FN | LED_NAS;
/* Turn off the lock LEDs. */
PORTF |= LED_CAPS_LOCK | LED_NUM_LOCK | LED_SCROLL_LOCK | LED_MOUSE_LOCK;
matrix_init_user();
}
uint8_t matrix_scan(void) {
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
select_row(row);
/* The default hardware works down to at least 100us, but I have a replacement
* photodiode that responds a little more slowly. Cranking it up to 1000us fixes
* shadowing issues.
*/
_delay_us(1000);
matrix[row] = read_cols();
}
matrix_scan_user();
return 1;
}
matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}
void matrix_print(void) {
print("\nr/c 01234567\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row);
print(": ");
print_bin_reverse8(matrix_get_row(row));
print("\n");
}
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
return process_record_user(keycode, record);
}
static void select_row(uint8_t row) {
/* Original 8051: P1 bits 0-3 (pins 1-4)
* Teensy++: PE0, PB7, PD0, PD1
*/
if (row & (1<<0)) {
PORTE |= (1<<6);
} else {
PORTE &= ~(1<<6);
}
if (row & (1<<1)) {
PORTB |= (1<<7);
} else {
PORTB &= ~(1<<7);
}
if (row & (1<<2)) {
PORTD |= (1<<0);
} else {
PORTD &= ~(1<<0);
}
if (row & (1<<3)) {
PORTD |= (1<<1);
} else {
PORTD &= ~(1<<1);
}
}
static matrix_row_t read_cols(void) {
/* Original 8051: P1 bits 4-7 (pins 5-8)
* Teensy++: PD bits 2-5
*/
return (PIND & 0b00111100) >> 2;
}

View file

@ -0,0 +1,15 @@
# DataHand
A keyboard designed to prevent RSI. See [Wikipedia](https://en.wikipedia.org/wiki/DataHand) and [this website](http://octopup.org/computer/datahand) for more info.
To use this firmware, you have to replace the stock microcontroller with a Teensy++ 2.0. This is relatively easy and also reversible. See the notes at the bottom of datahand.h for more info.
Keyboard Maintainer: [Nikolaus Wittenstein](https://github.com/adzenith)
Hardware Supported: DataHand Personal or Pro II
Hardware Availability: No longer in production
Make example for this keyboard (after setting up your build environment):
make handwired/datahand:default
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).

View file

@ -0,0 +1,59 @@
# Project-specific includes
SRC = matrix.c
# MCU name
MCU = at90usb1286
# 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 = halfkay
# Build Options
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE = no # MIDI controls
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
CUSTOM_MATRIX = yes # We definitely have a nonstandard matrix
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend

View file

@ -0,0 +1,245 @@
/*
Copyright 2018 Don Chiou
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 Flehrad
#define PRODUCT downbubble
#define DESCRIPTION An Ergonomic Centered Numpad Keyboard
/* key matrix size */
#define MATRIX_ROWS 6
#define MATRIX_COLS 20
/*
* 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 { F1, F2, F3, F4, F5, F6 }
#define MATRIX_COL_PINS { F7, C7, C6, C5, C4, C3, C2, C1, C0, E1, E0, D7, D6, D5, D4, D3, D2, D1, D0, B7 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
#define DIODE_DIRECTION COL2ROW
/*
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
*/
//#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
// #define RGB_DI_PIN E2
// #ifdef RGB_DI_PIN
// #define RGBLED_NUM 16
// #define RGBLIGHT_HUE_STEP 8
// #define RGBLIGHT_SAT_STEP 8
// #define RGBLIGHT_VAL_STEP 8
// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */
// /*== all animations enable ==*/
// #define RGBLIGHT_ANIMATIONS
// /*== or choose animations ==*/
// #define RGBLIGHT_EFFECT_BREATHING
// #define RGBLIGHT_EFFECT_RAINBOW_MOOD
// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
// #define RGBLIGHT_EFFECT_SNAKE
// #define RGBLIGHT_EFFECT_KNIGHT
// #define RGBLIGHT_EFFECT_CHRISTMAS
// #define RGBLIGHT_EFFECT_STATIC_GRADIENT
// #define RGBLIGHT_EFFECT_RGB_TEST
// #define RGBLIGHT_EFFECT_ALTERNATING
// #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
*/
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
// #define BOOTMAGIC_LITE_COLUMN 0

View file

@ -0,0 +1,16 @@
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
*
* 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 "downbubble.h"

View file

@ -0,0 +1,111 @@
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
*
* 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 "quantum.h"
/* This a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT_standard( \
K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K418, \
K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
{ K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
}
#define LAYOUT_split_bs( \
K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K418, \
K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
{ K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
}
#define LAYOUT_split_rshift( \
K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
K30, K31, K32, K33, K34, K35, K36, K37, K38, K29, K310, K311, K312, K313, K314, K315, K317, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K410, K411, K412, K413, K414, K416, K417, K418, \
K50, K51, K52, K53, K54, K56, K58, K49, K510, K512, K513, K514, K516, K517, K518, K519 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, KC_NO, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, K417, K418, KC_NO }, \
{ K50, K51, K52, K53, K54, KC_NO, K56, KC_NO, K58, KC_NO, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
}
#define LAYOUT_split_numpad( \
K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K118, K119,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, K317, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, K416, K418, \
K50, K51, K52, K53, K54, K56, K57, K58, K59, K510, K512, K513, K514, K516, K517, K518, K519 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, KC_NO, K118, K119 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, KC_NO, K418, KC_NO }, \
{ K50, K51, K52, K53, K54, KC_NO, K56, K57, K58, K59, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
}
#define LAYOUT_all( \
K00, K01, K02, K03, K04, K05, K06, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019,\
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119,\
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219,\
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, K317, \
K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, K416, K417, K418, \
K50, K51, K52, K53, K54, K56, K57, K58, K59, K510, K512, K513, K514, K516, K517, K518, K519 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, KC_NO, KC_NO, KC_NO, K010, K011, K012, K013, K014, K015, K016, K017, K018, K019 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K310, K311, K312, K313, K314, K315, KC_NO, K317, KC_NO, KC_NO }, \
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K410, K411, K412, K413, K414, KC_NO, K416, K417, K418, KC_NO }, \
{ K50, K51, K52, K53, K54, KC_NO, K56, K57, K58, K59, K510, KC_NO, K512, K513, K514, KC_NO, K516, K517, K518, K519 }, \
}

View file

@ -0,0 +1,559 @@
{
"keyboard_name": "downbubble",
"url": "",
"maintainer": "flehrad",
"width": 22.75,
"height": 6,
"layouts": {
"LAYOUT_standard": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K05", "x":5, "y":0},
{"label":"K06", "x":6, "y":0},
{"label":"K010", "x":12.75, "y":0},
{"label":"K011", "x":13.75, "y":0},
{"label":"K012", "x":14.75, "y":0},
{"label":"K013", "x":15.75, "y":0},
{"label":"K014", "x":16.75, "y":0},
{"label":"K015", "x":17.75, "y":0},
{"label":"K016", "x":18.75, "y":0},
{"label":"K017", "x":19.75, "y":0},
{"label":"K018", "x":20.75, "y":0},
{"label":"K019", "x":21.75, "y":0},
{"label":"K10", "x":0, "y":1},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K15", "x":5, "y":1},
{"label":"K16", "x":6, "y":1},
{"label":"K17", "x":8.75, "y":1},
{"label":"K18", "x":9.75, "y":1},
{"label":"K19", "x":10.75, "y":1},
{"label":"K110", "x":12.75, "y":1},
{"label":"K111", "x":13.75, "y":1},
{"label":"K112", "x":14.75, "y":1},
{"label":"K113", "x":15.75, "y":1},
{"label":"K114", "x":16.75, "y":1},
{"label":"K115", "x":17.75, "y":1},
{"label":"K116", "x":18.75, "y":1, "w":2},
{"label":"K118", "x":20.75, "y":1},
{"label":"K119", "x":21.75, "y":1},
{"label":"K20", "x":0, "y":2, "w":1.5},
{"label":"K21", "x":1.5, "y":2},
{"label":"K22", "x":2.5, "y":2},
{"label":"K23", "x":3.5, "y":2},
{"label":"K24", "x":4.5, "y":2},
{"label":"K25", "x":5.5, "y":2},
{"label":"K26", "x":7.75, "y":2},
{"label":"K17", "x":8.75, "y":2},
{"label":"K28", "x":9.75, "y":2},
{"label":"K210", "x":12.25, "y":2},
{"label":"K211", "x":13.25, "y":2},
{"label":"K212", "x":14.25, "y":2},
{"label":"K213", "x":15.25, "y":2},
{"label":"K214", "x":16.25, "y":2},
{"label":"K215", "x":17.25, "y":2},
{"label":"K216", "x":18.25, "y":2},
{"label":"K217", "x":19.25, "y":2, "w":1.5},
{"label":"K218", "x":20.75, "y":2},
{"label":"K219", "x":21.75, "y":2},
{"label":"K30", "x":0, "y":3, "w":1.75},
{"label":"K31", "x":1.75, "y":3},
{"label":"K32", "x":2.75, "y":3},
{"label":"K33", "x":3.75, "y":3},
{"label":"K34", "x":4.75, "y":3},
{"label":"K35", "x":5.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":8.75, "y":3},
{"label":"K38", "x":9.75, "y":3},
{"label":"K29", "x":10.75, "y":2, "h":2},
{"label":"K310", "x":12.5, "y":3},
{"label":"K311", "x":13.5, "y":3},
{"label":"K312", "x":14.5, "y":3},
{"label":"K313", "x":15.5, "y":3},
{"label":"K314", "x":16.5, "y":3},
{"label":"K315", "x":17.5, "y":3},
{"label":"K317", "x":18.5, "y":3, "w":2.25},
{"label":"K40", "x":0, "y":4, "w":2.25},
{"label":"K41", "x":2.25, "y":4},
{"label":"K42", "x":3.25, "y":4},
{"label":"K43", "x":4.25, "y":4},
{"label":"K44", "x":5.25, "y":4},
{"label":"K45", "x":6.25, "y":4},
{"label":"K46", "x":7.75, "y":4},
{"label":"K47", "x":8.75, "y":4},
{"label":"K48", "x":9.75, "y":4},
{"label":"K410", "x":13, "y":4},
{"label":"K411", "x":14, "y":4},
{"label":"K412", "x":15, "y":4},
{"label":"K413", "x":16, "y":4},
{"label":"K414", "x":17, "y":4},
{"label":"K416", "x":18, "y":4, "w":2.75},
{"label":"K418", "x":20.75, "y":4},
{"label":"K50", "x":0, "y":5, "w":1.25},
{"label":"K51", "x":1.25, "y":5, "w":1.25},
{"label":"K52", "x":2.5, "y":5, "w":1.25},
{"label":"K53", "x":3.75, "y":5, "w":1.25},
{"label":"K54", "x":5, "y":5, "w":2.25},
{"label":"K56", "x":7.75, "y":5, "w":2},
{"label":"K58", "x":9.75, "y":5},
{"label":"K49", "x":10.75, "y":4, "h":2},
{"label":"K510", "x":13, "y":5, "w":2},
{"label":"K512", "x":15, "y":5, "w":1.25},
{"label":"K513", "x":16.25, "y":5, "w":1.25},
{"label":"K514", "x":17.5, "y":5, "w":1.25},
{"label":"K516", "x":18.75, "y":5},
{"label":"K517", "x":19.75, "y":5},
{"label":"K518", "x":20.75, "y":5},
{"label":"K519", "x":21.75, "y":5}
]
},
"LAYOUT_split_bs": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K05", "x":5, "y":0},
{"label":"K06", "x":6, "y":0},
{"label":"K010", "x":12.75, "y":0},
{"label":"K011", "x":13.75, "y":0},
{"label":"K012", "x":14.75, "y":0},
{"label":"K013", "x":15.75, "y":0},
{"label":"K014", "x":16.75, "y":0},
{"label":"K015", "x":17.75, "y":0},
{"label":"K016", "x":18.75, "y":0},
{"label":"K017", "x":19.75, "y":0},
{"label":"K018", "x":20.75, "y":0},
{"label":"K019", "x":21.75, "y":0},
{"label":"K10", "x":0, "y":1},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K15", "x":5, "y":1},
{"label":"K16", "x":6, "y":1},
{"label":"K17", "x":8.75, "y":1},
{"label":"K18", "x":9.75, "y":1},
{"label":"K19", "x":10.75, "y":1},
{"label":"K110", "x":12.75, "y":1},
{"label":"K111", "x":13.75, "y":1},
{"label":"K112", "x":14.75, "y":1},
{"label":"K113", "x":15.75, "y":1},
{"label":"K114", "x":16.75, "y":1},
{"label":"K115", "x":17.75, "y":1},
{"label":"K116", "x":18.75, "y":1},
{"label":"K117", "x":19.75, "y":1},
{"label":"K118", "x":20.75, "y":1},
{"label":"K119", "x":21.75, "y":1},
{"label":"K20", "x":0, "y":2, "w":1.5},
{"label":"K21", "x":1.5, "y":2},
{"label":"K22", "x":2.5, "y":2},
{"label":"K23", "x":3.5, "y":2},
{"label":"K24", "x":4.5, "y":2},
{"label":"K25", "x":5.5, "y":2},
{"label":"K26", "x":7.75, "y":2},
{"label":"K17", "x":8.75, "y":2},
{"label":"K28", "x":9.75, "y":2},
{"label":"K210", "x":12.25, "y":2},
{"label":"K211", "x":13.25, "y":2},
{"label":"K212", "x":14.25, "y":2},
{"label":"K213", "x":15.25, "y":2},
{"label":"K214", "x":16.25, "y":2},
{"label":"K215", "x":17.25, "y":2},
{"label":"K216", "x":18.25, "y":2},
{"label":"K217", "x":19.25, "y":2, "w":1.5},
{"label":"K218", "x":20.75, "y":2},
{"label":"K219", "x":21.75, "y":2},
{"label":"K30", "x":0, "y":3, "w":1.75},
{"label":"K31", "x":1.75, "y":3},
{"label":"K32", "x":2.75, "y":3},
{"label":"K33", "x":3.75, "y":3},
{"label":"K34", "x":4.75, "y":3},
{"label":"K35", "x":5.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":8.75, "y":3},
{"label":"K38", "x":9.75, "y":3},
{"label":"K29", "x":10.75, "y":2, "h":2},
{"label":"K310", "x":12.5, "y":3},
{"label":"K311", "x":13.5, "y":3},
{"label":"K312", "x":14.5, "y":3},
{"label":"K313", "x":15.5, "y":3},
{"label":"K314", "x":16.5, "y":3},
{"label":"K315", "x":17.5, "y":3},
{"label":"K317", "x":18.5, "y":3, "w":2.25},
{"label":"K40", "x":0, "y":4, "w":2.25},
{"label":"K41", "x":2.25, "y":4},
{"label":"K42", "x":3.25, "y":4},
{"label":"K43", "x":4.25, "y":4},
{"label":"K44", "x":5.25, "y":4},
{"label":"K45", "x":6.25, "y":4},
{"label":"K46", "x":7.75, "y":4},
{"label":"K47", "x":8.75, "y":4},
{"label":"K48", "x":9.75, "y":4},
{"label":"K410", "x":13, "y":4},
{"label":"K411", "x":14, "y":4},
{"label":"K412", "x":15, "y":4},
{"label":"K413", "x":16, "y":4},
{"label":"K414", "x":17, "y":4},
{"label":"K416", "x":18, "y":4, "w":2.75},
{"label":"K418", "x":20.75, "y":4},
{"label":"K50", "x":0, "y":5, "w":1.25},
{"label":"K51", "x":1.25, "y":5, "w":1.25},
{"label":"K52", "x":2.5, "y":5, "w":1.25},
{"label":"K53", "x":3.75, "y":5, "w":1.25},
{"label":"K54", "x":5, "y":5, "w":2.25},
{"label":"K56", "x":7.75, "y":5, "w":2},
{"label":"K58", "x":9.75, "y":5},
{"label":"K49", "x":10.75, "y":4, "h":2},
{"label":"K510", "x":13, "y":5, "w":2},
{"label":"K512", "x":15, "y":5, "w":1.25},
{"label":"K513", "x":16.25, "y":5, "w":1.25},
{"label":"K514", "x":17.5, "y":5, "w":1.25},
{"label":"K516", "x":18.75, "y":5},
{"label":"K517", "x":19.75, "y":5},
{"label":"K518", "x":20.75, "y":5},
{"label":"K519", "x":21.75, "y":5}
]
},
"LAYOUT_split_rshift": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K05", "x":5, "y":0},
{"label":"K06", "x":6, "y":0},
{"label":"K010", "x":12.75, "y":0},
{"label":"K011", "x":13.75, "y":0},
{"label":"K012", "x":14.75, "y":0},
{"label":"K013", "x":15.75, "y":0},
{"label":"K014", "x":16.75, "y":0},
{"label":"K015", "x":17.75, "y":0},
{"label":"K016", "x":18.75, "y":0},
{"label":"K017", "x":19.75, "y":0},
{"label":"K018", "x":20.75, "y":0},
{"label":"K019", "x":21.75, "y":0},
{"label":"K10", "x":0, "y":1},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K15", "x":5, "y":1},
{"label":"K16", "x":6, "y":1},
{"label":"K17", "x":8.75, "y":1},
{"label":"K18", "x":9.75, "y":1},
{"label":"K19", "x":10.75, "y":1},
{"label":"K110", "x":12.75, "y":1},
{"label":"K111", "x":13.75, "y":1},
{"label":"K112", "x":14.75, "y":1},
{"label":"K113", "x":15.75, "y":1},
{"label":"K114", "x":16.75, "y":1},
{"label":"K115", "x":17.75, "y":1},
{"label":"K116", "x":18.75, "y":1, "w":2},
{"label":"K118", "x":20.75, "y":1},
{"label":"K119", "x":21.75, "y":1},
{"label":"K20", "x":0, "y":2, "w":1.5},
{"label":"K21", "x":1.5, "y":2},
{"label":"K22", "x":2.5, "y":2},
{"label":"K23", "x":3.5, "y":2},
{"label":"K24", "x":4.5, "y":2},
{"label":"K25", "x":5.5, "y":2},
{"label":"K26", "x":7.75, "y":2},
{"label":"K17", "x":8.75, "y":2},
{"label":"K28", "x":9.75, "y":2},
{"label":"K210", "x":12.25, "y":2},
{"label":"K211", "x":13.25, "y":2},
{"label":"K212", "x":14.25, "y":2},
{"label":"K213", "x":15.25, "y":2},
{"label":"K214", "x":16.25, "y":2},
{"label":"K215", "x":17.25, "y":2},
{"label":"K216", "x":18.25, "y":2},
{"label":"K217", "x":19.25, "y":2, "w":1.5},
{"label":"K218", "x":20.75, "y":2},
{"label":"K219", "x":21.75, "y":2},
{"label":"K30", "x":0, "y":3, "w":1.75},
{"label":"K31", "x":1.75, "y":3},
{"label":"K32", "x":2.75, "y":3},
{"label":"K33", "x":3.75, "y":3},
{"label":"K34", "x":4.75, "y":3},
{"label":"K35", "x":5.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":8.75, "y":3},
{"label":"K38", "x":9.75, "y":3},
{"label":"K29", "x":10.75, "y":2, "h":2},
{"label":"K310", "x":12.5, "y":3},
{"label":"K311", "x":13.5, "y":3},
{"label":"K312", "x":14.5, "y":3},
{"label":"K313", "x":15.5, "y":3},
{"label":"K314", "x":16.5, "y":3},
{"label":"K315", "x":17.5, "y":3},
{"label":"K317", "x":18.5, "y":3, "w":2.25},
{"label":"K40", "x":0, "y":4, "w":2.25},
{"label":"K41", "x":2.25, "y":4},
{"label":"K42", "x":3.25, "y":4},
{"label":"K43", "x":4.25, "y":4},
{"label":"K44", "x":5.25, "y":4},
{"label":"K45", "x":6.25, "y":4},
{"label":"K46", "x":7.75, "y":4},
{"label":"K47", "x":8.75, "y":4},
{"label":"K48", "x":9.75, "y":4},
{"label":"K410", "x":13, "y":4},
{"label":"K411", "x":14, "y":4},
{"label":"K412", "x":15, "y":4},
{"label":"K413", "x":16, "y":4},
{"label":"K414", "x":17, "y":4},
{"label":"K416", "x":18, "y":4, "w":1.75},
{"label":"K417", "x":19.75, "y":4},
{"label":"K418", "x":20.75, "y":4},
{"label":"K50", "x":0, "y":5, "w":1.25},
{"label":"K51", "x":1.25, "y":5, "w":1.25},
{"label":"K52", "x":2.5, "y":5, "w":1.25},
{"label":"K53", "x":3.75, "y":5, "w":1.25},
{"label":"K54", "x":5, "y":5, "w":2.25},
{"label":"K56", "x":7.75, "y":5, "w":2},
{"label":"K58", "x":9.75, "y":5},
{"label":"K49", "x":10.75, "y":4, "h":2},
{"label":"K510", "x":13, "y":5, "w":2},
{"label":"K512", "x":15, "y":5, "w":1.25},
{"label":"K513", "x":16.25, "y":5, "w":1.25},
{"label":"K514", "x":17.5, "y":5, "w":1.25},
{"label":"K516", "x":18.75, "y":5},
{"label":"K517", "x":19.75, "y":5},
{"label":"K518", "x":20.75, "y":5},
{"label":"K519", "x":21.75, "y":5}
]
},
"LAYOUT_split_numpad": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K05", "x":5, "y":0},
{"label":"K06", "x":6, "y":0},
{"label":"K010", "x":12.75, "y":0},
{"label":"K011", "x":13.75, "y":0},
{"label":"K012", "x":14.75, "y":0},
{"label":"K013", "x":15.75, "y":0},
{"label":"K014", "x":16.75, "y":0},
{"label":"K015", "x":17.75, "y":0},
{"label":"K016", "x":18.75, "y":0},
{"label":"K017", "x":19.75, "y":0},
{"label":"K018", "x":20.75, "y":0},
{"label":"K019", "x":21.75, "y":0},
{"label":"K10", "x":0, "y":1},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K15", "x":5, "y":1},
{"label":"K16", "x":6, "y":1},
{"label":"K17", "x":8.75, "y":1},
{"label":"K18", "x":9.75, "y":1},
{"label":"K19", "x":10.75, "y":1},
{"label":"K110", "x":12.75, "y":1},
{"label":"K111", "x":13.75, "y":1},
{"label":"K112", "x":14.75, "y":1},
{"label":"K113", "x":15.75, "y":1},
{"label":"K114", "x":16.75, "y":1},
{"label":"K115", "x":17.75, "y":1},
{"label":"K116", "x":18.75, "y":1, "w":2},
{"label":"K118", "x":20.75, "y":1},
{"label":"K119", "x":21.75, "y":1},
{"label":"K20", "x":0, "y":2, "w":1.5},
{"label":"K21", "x":1.5, "y":2},
{"label":"K22", "x":2.5, "y":2},
{"label":"K23", "x":3.5, "y":2},
{"label":"K24", "x":4.5, "y":2},
{"label":"K25", "x":5.5, "y":2},
{"label":"K26", "x":7.75, "y":2},
{"label":"K17", "x":8.75, "y":2},
{"label":"K28", "x":9.75, "y":2},
{"label":"K29", "x":10.75, "y":2},
{"label":"K210", "x":12.25, "y":2},
{"label":"K211", "x":13.25, "y":2},
{"label":"K212", "x":14.25, "y":2},
{"label":"K213", "x":15.25, "y":2},
{"label":"K214", "x":16.25, "y":2},
{"label":"K215", "x":17.25, "y":2},
{"label":"K216", "x":18.25, "y":2},
{"label":"K217", "x":19.25, "y":2, "w":1.5},
{"label":"K218", "x":20.75, "y":2},
{"label":"K219", "x":21.75, "y":2},
{"label":"K30", "x":0, "y":3, "w":1.75},
{"label":"K31", "x":1.75, "y":3},
{"label":"K32", "x":2.75, "y":3},
{"label":"K33", "x":3.75, "y":3},
{"label":"K34", "x":4.75, "y":3},
{"label":"K35", "x":5.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":8.75, "y":3},
{"label":"K38", "x":9.75, "y":3},
{"label":"K39", "x":10.75, "y":3},
{"label":"K310", "x":12.5, "y":3},
{"label":"K311", "x":13.5, "y":3},
{"label":"K312", "x":14.5, "y":3},
{"label":"K313", "x":15.5, "y":3},
{"label":"K314", "x":16.5, "y":3},
{"label":"K315", "x":17.5, "y":3},
{"label":"K317", "x":18.5, "y":3, "w":2.25},
{"label":"K40", "x":0, "y":4, "w":2.25},
{"label":"K41", "x":2.25, "y":4},
{"label":"K42", "x":3.25, "y":4},
{"label":"K43", "x":4.25, "y":4},
{"label":"K44", "x":5.25, "y":4},
{"label":"K45", "x":6.25, "y":4},
{"label":"K46", "x":7.75, "y":4},
{"label":"K47", "x":8.75, "y":4},
{"label":"K48", "x":9.75, "y":4},
{"label":"K49", "x":10.75, "y":4},
{"label":"K410", "x":13, "y":4},
{"label":"K411", "x":14, "y":4},
{"label":"K412", "x":15, "y":4},
{"label":"K413", "x":16, "y":4},
{"label":"K414", "x":17, "y":4},
{"label":"K416", "x":18, "y":4, "w":2.75},
{"label":"K418", "x":20.75, "y":4},
{"label":"K50", "x":0, "y":5, "w":1.25},
{"label":"K51", "x":1.25, "y":5, "w":1.25},
{"label":"K52", "x":2.5, "y":5, "w":1.25},
{"label":"K53", "x":3.75, "y":5, "w":1.25},
{"label":"K54", "x":5, "y":5, "w":2.25},
{"label":"K56", "x":7.75, "y":5},
{"Label":"K57", "x":8.75, "y":5},
{"label":"K58", "x":9.75, "y":5},
{"label":"K59", "x":10.75, "y":5},
{"label":"K510", "x":13, "y":5, "w":2},
{"label":"K512", "x":15, "y":5, "w":1.25},
{"label":"K513", "x":16.25, "y":5, "w":1.25},
{"label":"K514", "x":17.5, "y":5, "w":1.25},
{"label":"K516", "x":18.75, "y":5},
{"label":"K517", "x":19.75, "y":5},
{"label":"K518", "x":20.75, "y":5},
{"label":"K519", "x":21.75, "y":5}
]
},
"LAYOUT_all": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K05", "x":5, "y":0},
{"label":"K06", "x":6, "y":0},
{"label":"K010", "x":12.75, "y":0},
{"label":"K011", "x":13.75, "y":0},
{"label":"K012", "x":14.75, "y":0},
{"label":"K013", "x":15.75, "y":0},
{"label":"K014", "x":16.75, "y":0},
{"label":"K015", "x":17.75, "y":0},
{"label":"K016", "x":18.75, "y":0},
{"label":"K017", "x":19.75, "y":0},
{"label":"K018", "x":20.75, "y":0},
{"label":"K019", "x":21.75, "y":0},
{"label":"K10", "x":0, "y":1},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K15", "x":5, "y":1},
{"label":"K16", "x":6, "y":1},
{"label":"K17", "x":8.75, "y":1},
{"label":"K18", "x":9.75, "y":1},
{"label":"K19", "x":10.75, "y":1},
{"label":"K110", "x":12.75, "y":1},
{"label":"K111", "x":13.75, "y":1},
{"label":"K112", "x":14.75, "y":1},
{"label":"K113", "x":15.75, "y":1},
{"label":"K114", "x":16.75, "y":1},
{"label":"K115", "x":17.75, "y":1},
{"label":"K116", "x":18.75, "y":1},
{"label":"K117", "x":19.75, "y":1},
{"label":"K118", "x":20.75, "y":1},
{"label":"K119", "x":21.75, "y":1},
{"label":"K20", "x":0, "y":2, "w":1.5},
{"label":"K21", "x":1.5, "y":2},
{"label":"K22", "x":2.5, "y":2},
{"label":"K23", "x":3.5, "y":2},
{"label":"K24", "x":4.5, "y":2},
{"label":"K25", "x":5.5, "y":2},
{"label":"K26", "x":7.75, "y":2},
{"label":"K27", "x":8.75, "y":2},
{"label":"K28", "x":9.75, "y":2},
{"label":"K29", "x":10.75, "y":2},
{"label":"K210", "x":12.25, "y":2},
{"label":"K211", "x":13.25, "y":2},
{"label":"K212", "x":14.25, "y":2},
{"label":"K213", "x":15.25, "y":2},
{"label":"K214", "x":16.25, "y":2},
{"label":"K215", "x":17.25, "y":2},
{"label":"K216", "x":18.25, "y":2},
{"label":"K217", "x":19.25, "y":2, "w":1.5},
{"label":"K218", "x":20.75, "y":2},
{"label":"K219", "x":21.75, "y":2},
{"label":"K30", "x":0, "y":3, "w":1.75},
{"label":"K31", "x":1.75, "y":3},
{"label":"K32", "x":2.75, "y":3},
{"label":"K33", "x":3.75, "y":3},
{"label":"K34", "x":4.75, "y":3},
{"label":"K35", "x":5.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":8.75, "y":3},
{"label":"K38", "x":9.75, "y":3},
{"label":"K39", "x":10.75, "y":3},
{"label":"K310", "x":12.5, "y":3},
{"label":"K311", "x":13.5, "y":3},
{"label":"K312", "x":14.5, "y":3},
{"label":"K313", "x":15.5, "y":3},
{"label":"K314", "x":16.5, "y":3},
{"label":"K315", "x":17.5, "y":3},
{"label":"K317", "x":18.5, "y":3, "w":2.25},
{"label":"K40", "x":0, "y":4, "w":2.25},
{"label":"K41", "x":2.25, "y":4},
{"label":"K42", "x":3.25, "y":4},
{"label":"K43", "x":4.25, "y":4},
{"label":"K44", "x":5.25, "y":4},
{"label":"K45", "x":6.25, "y":4},
{"label":"K46", "x":7.75, "y":4},
{"label":"K47", "x":8.75, "y":4},
{"label":"K48", "x":9.75, "y":4},
{"label":"K49", "x":10.75, "y":4},
{"label":"K410", "x":13, "y":4},
{"label":"K411", "x":14, "y":4},
{"label":"K412", "x":15, "y":4},
{"label":"K413", "x":16, "y":4},
{"label":"K414", "x":17, "y":4},
{"label":"K416", "x":18, "y":4, "w":1.75},
{"label":"K417", "x":19.75, "y":4},
{"label":"K418", "x":20.75, "y":4},
{"label":"K50", "x":0, "y":5, "w":1.25},
{"label":"K51", "x":1.25, "y":5, "w":1.25},
{"label":"K52", "x":2.5, "y":5, "w":1.25},
{"label":"K53", "x":3.75, "y":5, "w":1.25},
{"label":"K54", "x":5, "y":5, "w":2.25},
{"label":"K56", "x":7.75, "y":5},
{"label":"K57", "x":8.75, "y":5},
{"label":"K58", "x":9.75, "y":5},
{"label":"K59", "x":10.75, "y":5},
{"label":"K510", "x":13, "y":5, "w":2},
{"label":"K512", "x":15, "y":5, "w":1.25},
{"label":"K513", "x":16.25, "y":5, "w":1.25},
{"label":"K514", "x":17.5, "y":5, "w":1.25},
{"label":"K516", "x":18.75, "y":5},
{"label":"K517", "x":19.75, "y":5},
{"label":"K518", "x":20.75, "y":5},
{"label":"K519", "x":21.75, "y":5}
]
}
}
}

View file

@ -0,0 +1,19 @@
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
*
* 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

View file

@ -0,0 +1,103 @@
/* Copyright 2018 REPLACE_WITH_YOUR_NAME
*
* 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_standard(\
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_NLCK, KC_HOME, KC_TRNS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, 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_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
LAYOUT_split_bs(\
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_NLCK, KC_HOME, KC_TRNS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_END, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, 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_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
LAYOUT_split_rshift(\
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_NLCK, KC_HOME, KC_TRNS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_PPLS, 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_P1, KC_P2, KC_P3, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_PDOT, KC_PENT, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
LAYOUT_split_numpad(\
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_NLCK, KC_HOME, KC_TRNS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_TRNS, 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_P1, KC_P2, KC_P3, KC_PENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_TRNS, KC_PDOT, KC_TRNS, KC_BSPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
LAYOUT_all(\
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_NLCK, KC_HOME, KC_TRNS,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_PSLS, KC_PAST, KC_PMNS, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_TRNS, KC_END, KC_PGUP,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_PGDN,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_P4, KC_P5, KC_P6, KC_TRNS, 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_P1, KC_P2, KC_P3, KC_PENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_SPC, KC_P0, KC_TRNS, KC_PDOT, KC_TRNS, KC_BSPC, 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) {
}

View file

@ -0,0 +1 @@
# The default keymaps for downbubble

View file

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -0,0 +1,15 @@
# downbubble
Prototype hand-wired version of this keyboard - https://imgur.com/a/0KbX1JH
This is an ergonomic keyboard with a 5 degree rotation on keyboard halves, and a rotated numpad in the center for RH users.
Keyboard Maintainer: [Flehrad](https://github.com/flehrad)
Hardware Supported: downbubble PCB, AT90USB1286 MCU, MX switches and MiniUSB connector
Hardware Availability: The Board Podcast Slack
Make example for this keyboard (after setting up your build environment):
make downbubble:default
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).

View file

@ -0,0 +1,81 @@
# 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 = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = 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 = no # 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)

View file

@ -176,11 +176,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
const uint16_t PROGMEM fn_actions[] = {
};
void hold_shift(void) {
shift_count = shift_count + 1;
register_code(KC_LSHIFT);
@ -359,10 +354,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE;
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
}
void matrix_init_user(void) {
}

View file

@ -87,6 +87,3 @@ AUDIO_ENABLE = no # Audio output on port C6
RGBLIGHT_ENABLE = no
API_SYSEX_ENABLE = no
#ifndef QUANTUM_DIR
# include ../../../Makefile
#endif

View file

@ -0,0 +1,60 @@
// see https://github.com/pepaslabs/hexon38
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER pepaslabs
#define PRODUCT hexon38
#define DESCRIPTION "A handmade non-split ergonomic 38-key keyboard, inspired by the lil38. See https://github.com/pepaslabs/hexon38."
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
/* key matrix pins */
#define MATRIX_ROW_PINS { B0, F0, B2, F4 }
#define MATRIX_COL_PINS { C6, D3, D2, D1, D0, B7, F6, F7, B6, B5, B4, D7 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION ROW2COL
/* number of backlight levels */
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 0
#endif
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 0
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif
// Disabled features:
/* 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
/* prevent stuck modifiers */
//#define PREVENT_STUCK_MODIFIERS

View file

@ -0,0 +1,3 @@
// see https://github.com/pepaslabs/hexon38
#include "hexon38.h"

View file

@ -0,0 +1,17 @@
// see https://github.com/pepaslabs/hexon38
#pragma once
#include "quantum.h"
#define LAYOUT( \
K002, K003, K004, K005, K006, K007, K008, K009, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
K200, K201, K202, K203, K204, K207, K208, K209, K210, K211, \
K302, K303, K304, K305, K306, K307, K308, K309 \
) { \
{ KC_NO, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, KC_NO, KC_NO }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
{ K200, K201, K202, K203, K204, KC_NO, KC_NO, K207, K208, K209, K210, K211 }, \
{ KC_NO, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, KC_NO, KC_NO } \
}

View file

@ -0,0 +1,407 @@
// see https://github.com/pepaslabs/hexon38
#include "hexon38.h"
#define A_ KC_A
#define B_ KC_B
#define C_ KC_C
#define D_ KC_D
#define E_ KC_E
#define F_ KC_F
#define G_ KC_G
#define H_ KC_H
#define I_ KC_I
#define J_ KC_J
#define K_ KC_K
#define L_ KC_L
#define M_ KC_M
#define N_ KC_N
#define O_ KC_O
#define P_ KC_P
#define Q_ KC_Q
#define R_ KC_R
#define S_ KC_S
#define T_ KC_T
#define U_ KC_U
#define V_ KC_V
#define W_ KC_W
#define X_ KC_X
#define Y_ KC_Y
#define Z_ KC_Z
// Dual-role keys: modifier when held, alpha when tapped.
#define A_CTL CTL_T(KC_A)
#define S_ALT ALT_T(KC_S)
#define D_GUI GUI_T(KC_D)
#define F_SFT SFT_T(KC_F)
#define J_SFT SFT_T(KC_J)
#define K_GUI GUI_T(KC_K)
#define L_ALT ALT_T(KC_L)
#define COLN_CTL CTL_T(KC_SCLN)
#define ______ KC_TRNS
#define LSHIFT KC_LSHIFT
#define RSHIFT KC_RSHIFT
#define COMMA KC_COMM
#define SLASH KC_SLSH
#define SPACE KC_SPC
#define TAB KC_TAB
#define BKSPC KC_BSPC
#define ENTER KC_ENT
#define PERIOD KC_DOT
#define BASE_LAYER LAYOUT
#define BLANK_LAYER LAYOUT
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
BASE_LAYER(
// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
W_ , E_ , R_ , T_ , Y_ , U_ , I_ , O_ ,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------.
Q_ , A_CTL , S_ALT , D_GUI , F_SFT , G_ , H_ , J_SFT , K_GUI , L_ALT ,COLN_CTL, P_ ,
//|--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------|
B_ , Z_ , X_ , C_ , V_ , M_ , COMMA , PERIOD , SLASH , N_ ,
//`--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------'
// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
LSHIFT , SPACE , TAB , DEBUG , SPACE , BKSPC , ENTER , RSHIFT
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
BLANK_LAYER(
// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------.
______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
//|--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------|
______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ , ______ ,
//`--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------'
// ,--------+--------+--------+--------. ,--------+--------+--------+--------.
______ , ______ , ______ , ______ , ______ , ______ , ______ , ______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
)
};
// a linked list of pending key events (press or release) which we haven't processed yet.
struct _pending_key_t {
uint16_t keycode;
keyrecord_t record;
struct _pending_key_t *next;
};
typedef struct _pending_key_t pending_key_t;
// worst case is 10 down strokes and 1 up stroke before we can start disambiguating.
#define RINGSIZE 11
// a ring buffer and linked list to store pending key events (presses and releases).
// (basically, this is a fixed-allocation linked list.)
struct _kring_t {
// the actual key events.
pending_key_t items[RINGSIZE];
// the index of the oldest item, or -1 if no items.
int8_t ifirst;
// the index of the most recently added item, or -1 if no items.
int8_t ilast;
// the number of items in the ring.
uint8_t count;
// the head of the linked list.
pending_key_t *head;
};
typedef struct _kring_t kring_t;
// safe accessor to the i-th item of the linked list (returns pointer or NULL).
pending_key_t* kring_get(kring_t *ring, uint8_t i) {
if (i >= ring->count) {
return NULL;
}
uint8_t j = (ring->ifirst + i) % RINGSIZE;
return &(ring->items[j]);
}
// return the last key in the list of buffered keys.
pending_key_t* kring_last(kring_t *ring) {
if (ring->count == 0) {
return NULL;
}
return kring_get(ring, ring->count - 1);
}
// remove the oldest item from the ring (the head of the list).
void kring_pop(kring_t *ring) {
if (ring->count > 0) {
ring->ifirst += 1;
ring->ifirst %= RINGSIZE;
ring->head = ring->head->next;
ring->count -= 1;
}
}
// add an item to the ring (append to the list).
void kring_append(kring_t *ring, uint16_t keycode, keyrecord_t *record) {
if (ring->count >= RINGSIZE) {
// uh oh, we overflowed the capacity of our buffer :(
return;
}
// if the ring is empty, insert at index 0.
if (ring->count == 0) {
ring->count += 1;
ring->ifirst = 0;
ring->ilast = 0;
ring->head = &(ring->items[0]);
}
// else, append it onto the end.
else {
ring->count += 1;
ring->ilast += 1;
ring->ilast %= RINGSIZE;
}
// the index at which we should insert this item.
int8_t i = ring->ilast;
// insert the item.
ring->items[i].keycode = keycode;
ring->items[i].record.event = record->event;
#ifndef NO_ACTION_TAPPING
ring->items[i].record.tap = record->tap;
#endif
ring->items[i].next = NULL;
// update the previous item to point to this item.
if (ring->count > 1) {
kring_get(ring, ring->count - 2)->next = &(ring->items[i]);
}
}
kring_t g_pending;
void matrix_init_user(void) {
g_pending.ifirst = -1;
g_pending.ilast = -1;
g_pending.count = 0;
g_pending.head = NULL;
}
void matrix_scan_user(void) {}
/*
a_ a-: emit a
a_ b_ b- a-: emit SHIFT+b
a_ b_ a- b-: emit a, b
dual1down, dual1up -> norm1down, norm1up
dual1down, norm2down, norm2up -> mod1down, norm2down, norm2up
dual1down, norm2down, dual1up -> norm1down, norm2down, norm1up
dual1down, dual2down, norm3down, norm3up -> mod1down, mod2down, norm3down, norm3up
so, a dual key can't be disambiguated until the next keyup of a keydown (not including keyups from keys before it).
*/
bool is_ambiguous_kc(uint16_t kc) {
// See the MT() define: https://github.com/qmk/qmk_firmware/blob/master/quantum/quantum_keycodes.h#L642
// See the QK_MOD_TAP case: https://github.com/qmk/qmk_firmware/blob/master/quantum/keymap_common.c#L134
uint8_t mod = mod_config((kc >> 0x8) & 0x1F);
return mod != 0;
}
bool is_down(pending_key_t *k) {
return k->record.event.pressed;
}
bool is_up(pending_key_t *k) {
return !is_down(k);
}
bool keys_match(pending_key_t *a, pending_key_t *b) {
return a->record.event.key.col == b->record.event.key.col
&& a->record.event.key.row == b->record.event.key.row;
}
// both the down and corresponding upstroke of a keypress.
struct _pending_pair_t {
pending_key_t *down;
pending_key_t *up;
};
typedef struct _pending_pair_t pending_pair_t;
// returns true if this keydown event has a corresponding keyup event in the
// list of buffered keys. also fills out 'p'.
bool is_downup_pair(pending_key_t *k, pending_pair_t *p) {
// first, make sure this event is keydown.
if (!is_down(k)) {
return false;
}
// now find its matching keyup.
pending_key_t *next = k->next;
while (next != NULL) {
if (keys_match(k, next) && is_up(next)) {
// found it.
if (p != NULL) {
p->down = k;
p->up = next;
}
return true;
}
next = next->next;
}
// didn't find it.
return false;
}
// given a QK_MOD_TAP keycode, return the KC_* version of the modifier keycode.
uint16_t get_mod_kc(uint16_t keycode) {
uint8_t mod = mod_config((keycode >> 0x8) & 0x1F);
switch (mod) {
case MOD_LCTL:
return KC_LCTL;
case MOD_RCTL:
return KC_RCTL;
case MOD_LSFT:
return KC_LSFT;
case MOD_RSFT:
return KC_RSFT;
case MOD_LALT:
return KC_LALT;
case MOD_RALT:
return KC_RALT;
case MOD_LGUI:
return KC_LGUI;
case MOD_RGUI:
return KC_RGUI;
default:
// shrug? this shouldn't happen.
return keycode;
}
}
bool is_mod_kc(uint16_t keycode) {
switch (keycode) {
case QK_MODS ... QK_MODS_MAX:
return true;
default:
return false;
}
}
void interpret_as_mod(pending_pair_t *p) {
// see https://github.com/qmk/qmk_firmware/issues/1503
pending_key_t *k;
k = p->down;
if (k != NULL) {
k->keycode = get_mod_kc(k->keycode);
}
k = p->up;
if (k != NULL) {
k->keycode = get_mod_kc(k->keycode);
}
}
void interpret_as_normal(pending_pair_t *p) {
pending_key_t *k;
k = p->down;
if (k != NULL) {
k->keycode = k->keycode & 0xFF;
}
k = p->up;
if (k != NULL) {
k->keycode = k->keycode & 0xFF;
}
}
void execute_head_and_pop(kring_t *ring) {
pending_key_t *head = kring_get(ring, 0);
uint16_t kc = head->keycode;
if (is_mod_kc(kc)) {
if (is_down(head)) {
dprintf(" %s: mod down 0x%04X\n", __func__, kc);
set_mods(get_mods() | MOD_BIT(kc));
} else {
dprintf(" %s: mod up 0x%04X\n", __func__, kc);
set_mods(get_mods() & ~MOD_BIT(kc));
}
} else {
if (is_down(head)) {
dprintf(" %s: key down 0x%04X\n", __func__, kc);
register_code16(kc);
} else {
dprintf(" %s: key up 0x%04X\n", __func__, kc);
unregister_code16(kc);
}
}
kring_pop(ring);
}
// try to figure out what the next pending keypress means.
bool parse_next(kring_t *pending) {
pending_pair_t p;
pending_key_t *first = kring_get(pending, 0);
if (!is_ambiguous_kc(first->keycode)) {
// this pending key isn't ambiguous, so execute it.
dprintf(" %s: found unambiguous key\n", __func__);
execute_head_and_pop(pending);
return true;
} else if (is_ambiguous_kc(first->keycode) && is_up(first)) {
dprintf(" %s: interpreting keyup as mod\n", __func__);
p.down = NULL;
p.up = first;
interpret_as_mod(&p);
execute_head_and_pop(pending);
return true;
} else if (is_downup_pair(first, &p)) {
// 'first' was released before any other pressed key, so treat this as
// a rolling series of normal key taps.
dprintf(" %s: found down-up pair, interpreting as normal key\n", __func__);
interpret_as_normal(&p);
execute_head_and_pop(pending);
return true;
} else {
// if another key was pressed and released while 'first' was held, then we
// should treat it like a modifier.
pending_key_t *next = first->next;
while (next != NULL) {
if (is_downup_pair(next, NULL)) {
dprintf(" %s: found subsequent downup pair, interpreting head as mod\n", __func__);
p.down = first;
p.up = NULL;
interpret_as_mod(&p);
execute_head_and_pop(pending);
return true;
}
next = next->next;
}
// we can't disambiguate 'first' yet. wait for another keypress.
dprintf(" %s: can't disambiguate (yet)\n", __func__);
return false;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (keycode == DEBUG) {
return true;
}
if (g_pending.count == 0 && !is_ambiguous_kc(keycode)) {
// we have no pending keys and this key isn't ambiguous, so we should
// just let QMK take care of it.
dprintf("%s: handled by qmk\n", __func__);
return true;
} else {
dprintf("%s: got dual-role key\n", __func__);
// append the keypress and then try parsing all pending keypresses.
kring_append(&g_pending, keycode, record);
while (g_pending.count > 0) {
dprintf("%s: looping through %d keys...\n", __func__, g_pending.count);
if (!parse_next(&g_pending)) {
// one of our keypresses is ambiguous and we can't proceed until
// we get further keypresses to disambiguate it.
dprintf("%s: %d pending keys are ambiguous\n", __func__, g_pending.count);
break;
}
}
return false;
}
}

View file

@ -0,0 +1,11 @@
# hexon38
QMK support for the [hexon38](https://github.com/pepaslabs/hexon38).
## Building
```
$ cd qmk_firmware
$ make handwired/hexon38
```

View file

@ -0,0 +1,64 @@
# see https://github.com/pepaslabs/hexon38
# MCU name
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 = halfkay
# Enabled build options:
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# Disabled build options:
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = no

View file

@ -137,10 +137,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),*/
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function

View file

@ -13,4 +13,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/ibm122m: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 [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.

View file

@ -12,7 +12,7 @@ Make example for this keyboard (after setting up your build environment):
make not_so_minidox/rev1: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 [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
Flashing
-------

View file

@ -0,0 +1,51 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Flehrad
#define PRODUCT Numbrero
#define DESCRIPTION Pro Micro-powered Reversible L/H Numpad with Extra Macro Keys
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 5
/* key matrix pins */
#define MATRIX_ROW_PINS { F6, B5, B4, E6, F7 }
#define MATRIX_COL_PINS { D1, D0, D4, F5, F4 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* number of backlight levels */
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 3
#endif
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 5
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#endif

View file

@ -0,0 +1,62 @@
{
"keyboard_name": "Numbrero",
"url": "",
"maintainer": "Flehrad",
"width": 5,
"height": 5,
"layouts": {
"LAYOUT_numbrero_numpad": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K10", "x":0, "y":1, "h":1.5},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K20", "x":0, "y":2.5},
{"label":"K21", "x":1, "y":2},
{"label":"K22", "x":2, "y":2},
{"label":"K23", "x":3, "y":2},
{"label":"K14", "x":4, "y":1, "h":2},
{"label":"K30", "x":0, "y":3.5, "h":1.5},
{"label":"K31", "x":1, "y":3},
{"label":"K32", "x":2, "y":3},
{"label":"K33", "x":3, "y":3},
{"label":"K41", "x":1, "y":4, "w":2},
{"label":"K43", "x":3, "y":4},
{"label":"K34", "x":4, "y":3, "h":2}
]
},
"LAYOUT_numbrero_ortho": {
"layout": [
{"label":"K00", "x":0, "y":0},
{"label":"K01", "x":1, "y":0},
{"label":"K02", "x":2, "y":0},
{"label":"K03", "x":3, "y":0},
{"label":"K04", "x":4, "y":0},
{"label":"K10", "x":0, "y":1, "h":1.5},
{"label":"K11", "x":1, "y":1},
{"label":"K12", "x":2, "y":1},
{"label":"K13", "x":3, "y":1},
{"label":"K14", "x":4, "y":1},
{"label":"K20", "x":0, "y":2.5},
{"label":"K21", "x":1, "y":2},
{"label":"K22", "x":2, "y":2},
{"label":"K23", "x":3, "y":2},
{"label":"K24", "x":4, "y":2},
{"label":"K30", "x":0, "y":3.5, "h":1.5},
{"label":"K31", "x":1, "y":3},
{"label":"K32", "x":2, "y":3},
{"label":"K33", "x":3, "y":3},
{"label":"K34", "x":4, "y":3},
{"label":"K41", "x":1, "y":4},
{"label":"K42", "x":2, "y":4},
{"label":"K43", "x":3, "y":4},
{"label":"K44", "x":4, "y":4}
]
}
}
}

View file

@ -0,0 +1,30 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_numbrero_numpad(
KC_TRNS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
KC_TRNS, KC_P7, KC_P8, KC_P9,
KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_TRNS, KC_P1, KC_P2, KC_P3,
KC_P0, KC_PDOT, KC_PENT),
LAYOUT_numbrero_ortho(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}

View file

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -0,0 +1 @@
#include "numbrero.h"

View file

@ -0,0 +1,30 @@
#pragma once
#include "quantum.h"
#define LAYOUT_numbrero_numpad( \
K00, K01, K02, K03, K04, \
K10, K11, K12, K13, \
K20, K21, K22, K23, K14, \
K30, K31, K32, K33, \
K41, K43, K34 \
) { \
{ K00, K01, K02, K03, K04 }, \
{ K10, K11, K12, K13, K14 }, \
{ K20, K21, K22, K23, KC_NO }, \
{ K30, K31, K32, K33, K34 }, \
{ KC_NO, K41, KC_NO, K43, KC_NO } \
}
#define LAYOUT_numbrero_ortho(\
K00, K01, K02, K03, K04, \
K10, K11, K12, K13, K14, \
K20, K21, K22, K23, K24, \
K30, K31, K32, K33, K34, \
K41, K42, K43, K44 \
){ \
{ K00, K01, K02, K03, K04 }, \
{ K10, K11, K12, K13, K14 }, \
{ K20, K21, K22, K23, K24 }, \
{ K30, K31, K32, K33, K34 }, \
{ KC_NO, K41, K42, K43, K44 } \
}

View file

@ -0,0 +1,13 @@
# Numbrero
A reversible numpad (left/right-handed) with extra macro keys.
Keyboard Maintainer: [Flehrad](https://github.com/flehrad)
Hardware Supported: Numbrero PCB, Pro Micro
Hardware Availability: The Board Podcast Slack
Make example for this keyboard (after setting up your build environment):
make handwired/numbrero/numbrero:default
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).

View file

@ -0,0 +1,59 @@
# MCU name
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
#Bootloder
#Pro Micro = caterina
BOOTLOADER = caterina
# Boot Section Size in *bytes*
#OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = 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 = no # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = no

View file

@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/numpad20: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 [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.

View file

@ -1,5 +1,4 @@
#ifndef ORTHO5X13_H
#define ORTHO5X13_H
#pragma once
#include "quantum.h"
@ -18,7 +17,7 @@
{ k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b, k4c } \
}
#define LAYOUT_compact( \
#define LAYOUT_kc( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
@ -32,5 +31,3 @@
{ KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k35, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_##k3c }, \
{ KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_NO, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c } \
}
#endif

View file

@ -65,8 +65,71 @@
{"label":"Raise", "x":7, "y":4},
{"label":"Left", "x":8, "y":4},
{"label":"Down", "x":9, "y":4},
{"label":"Right", "x":10, "y":4},
{"label":"up", "x":11, "y":4}
{"label":"Up", "x":10, "y":4},
{"label":"Right", "x":11, "y":4}
]
},
"LAYOUT_1x2uC": {
"layout": [
{"label":"`", "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":"Backspace", "x":11, "y":0},
{"label":"Tab", "x":0, "y":1},
{"label":"Q", "x":1, "y":1},
{"label":"W", "x":2, "y":1},
{"label":"E", "x":3, "y":1},
{"label":"R", "x":4, "y":1},
{"label":"T", "x":5, "y":1},
{"label":"Y", "x":6, "y":1},
{"label":"U", "x":7, "y":1},
{"label":"I", "x":8, "y":1},
{"label":"O", "x":9, "y":1},
{"label":"P", "x":10, "y":1},
{"label":"Delete", "x":11, "y":1},
{"label":"Esc", "x":0, "y":2},
{"label":"A", "x":1, "y":2},
{"label":"S", "x":2, "y":2},
{"label":"D", "x":3, "y":2},
{"label":"F", "x":4, "y":2},
{"label":"G", "x":5, "y":2},
{"label":"H", "x":6, "y":2},
{"label":"J", "x":7, "y":2},
{"label":"K", "x":8, "y":2},
{"label":"L", "x":9, "y":2},
{"label":";", "x":10, "y":2},
{"label":"'", "x":11, "y":2},
{"label":"Shift", "x":0, "y":3},
{"label":"Z", "x":1, "y":3},
{"label":"X", "x":2, "y":3},
{"label":"C", "x":3, "y":3},
{"label":"V", "x":4, "y":3},
{"label":"B", "x":5, "y":3},
{"label":"N", "x":6, "y":3},
{"label":"M", "x":7, "y":3},
{"label":",", "x":8, "y":3},
{"label":".", "x":9, "y":3},
{"label":"/", "x":10, "y":3},
{"label":"Enter", "x":11, "y":3},
{"label":"Fn", "x":0, "y":4},
{"label":"Ctrl", "x":1, "y":4},
{"label":"Alt", "x":2, "y":4},
{"label":"Meta", "x":3, "y":4},
{"label":"Lower", "x":4, "y":4},
{"label":"Space", "x":5, "y":4, "w":2},
{"label":"Raise", "x":7, "y":4},
{"label":"Left", "x":8, "y":4},
{"label":"Down", "x":9, "y":4},
{"label":"Up", "x":10, "y":4},
{"label":"Right", "x":11, "y":4}
]
}
}

View file

@ -1,3 +1,12 @@
# Ortho 60
Blue Pill STM32F103C8T6 based 12x5 Ortholinear Board
A Blue Pill STM32F103C8T6-based 12x5 ortholinear keyboard.
Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan1)
Hardware Supported: Blue Pill STM32F103C8T6
Make example for this keyboard (after setting up your build environment):
make handwired/ortho60:default
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).

View file

@ -52,5 +52,3 @@ NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
LAYOUTS = ortho_5x12
DEFAULT_FOLDER = handwired/ortho60

View file

@ -60,7 +60,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Fillers to make layering clearer
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define G(x) LGUI(x)
#define KC_WWWB KC_WWW_BACK
#define KC_WWWF KC_WWW_FORWARD

View file

@ -60,7 +60,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Fillers to make layering clearer
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define G(x) LGUI(x)
#define KC_WWWB KC_WWW_BACK
#define KC_WWWF KC_WWW_FORWARD

View file

@ -10,10 +10,8 @@ enum pteron_layers {
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
// use S() to produce shifted versions of keys
// #define S(kc) LSFT(kc) // defined by default
// alt gr
#undef G
#define G(kc) RALT(kc)
// custom keycodes

View file

@ -1,5 +1,4 @@
QC60
========
# QC60
![qc60 layout](https://i.imgur.com/BAW1VGc.png)
@ -19,4 +18,4 @@ Example of flashing this keyboard:
make handwired/qc60/proto:avrdude
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).

View file

@ -1,11 +1,93 @@
{
"keyboard_name": "QC60",
"url": "",
"maintainer": "coarse",
"width": 15,
"height": 5,
"keyboard_name": "QC60",
"url": "",
"maintainer": "coarse",
"width": 16,
"height": 5,
"layouts": {
"LAYOUT_ANSI_DEFAULT": {
"LAYOUT": {
"key_count": 67,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R06", "x":14, "y":0},
{"label":"R07", "x":15, "y":0},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"R17", "x":14.5, "y":1, "w":1.5},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R27", "x":13.75, "y":2, "w":2.25},
{"label":"L30", "x":0, "y":3, "w":1.25},
{"label":"L31", "x":1.25, "y":3},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":1.75},
{"label":"R37", "x":15, "y":3},
{"label":"L40", "x":0, "y":4, "w":1.25},
{"label":"L41", "x":1.25, "y":4, "w":1.25},
{"label":"L42", "x":2.5, "y":4, "w":1.25},
{"label":"L43", "x":3.75, "y":4, "w":2.75},
{"label":"L44", "x":6.5, "y":4, "w":1.25},
{"label":"R43", "x":8.75, "y":4, "w":1.25},
{"label":"R44", "x":10, "y":4, "w":2},
{"label":"R42", "x":12, "y":4},
{"label":"R45", "x":13, "y":4},
{"label":"R46", "x":14, "y":4},
{"label":"R47", "x":15, "y":4}
]
},
"LAYOUT_ansi_default": {
"key_count": 64,
"layout": [
{"label":"Esc", "x":0, "y":0},
@ -16,13 +98,13 @@
{"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},
{"label":"Backspace", "x":13, "y":0, "w":2.0},
{"label":"7", "x":8, "y":0},
{"label":"8", "x":9, "y":0},
{"label":"9", "x":10, "y":0},
{"label":"0", "x":11, "y":0},
{"label":"-", "x":12, "y":0},
{"label":"=", "x":13, "y":0},
{"label":"Backspace", "x":14, "y":0, "w":2.0},
{"label":"Tab", "x":0, "y":1, "w":1.5},
{"label":"Q", "x":1.5, "y":1},
@ -31,14 +113,14 @@
{"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":"Y", "x":7.5, "y":1},
{"label":"U", "x":8.5, "y":1},
{"label":"I", "x":9.5, "y":1},
{"label":"O", "x":10.5, "y":1},
{"label":"P", "x":11.5, "y":1},
{"label":"[", "x":12.5, "y":1},
{"label":"]", "x":13.5, "y":1},
{"label":"\\", "x":14.5, "y":1, "w":1.5},
{"label":"CapsLock", "x":0, "y":2, "w":1.75},
{"label":"A", "x":1.75, "y":2},
@ -47,13 +129,13 @@
{"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":"H", "x":7.75, "y":2},
{"label":"J", "x":8.75, "y":2},
{"label":"K", "x":9.75, "y":2},
{"label":"L", "x":10.75, "y":2},
{"label":";", "x":11.75, "y":2},
{"label":"'", "x":12.75, "y":2},
{"label":"Enter", "x":13.75, "y":2, "w":2.25},
{"label":"Shift", "x":0, "y":3, "w":2.25},
{"label":"Z", "x":2.25, "y":3},
@ -62,12 +144,12 @@
{"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":"N", "x":8.25, "y":3},
{"label":"M", "x":9.25, "y":3},
{"label":",", "x":10.25, "y":3},
{"label":".", "x":11.25, "y":3},
{"label":"/", "x":12.25, "y":3},
{"label":"Shift", "x":13.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},
@ -75,13 +157,483 @@
{"x":3.75, "y":4, "w":2.75},
{"x":6.5, "y":4, "w":1.25},
{"x":7.75, "y":4, "w":1.25},
{"x":9, "y":4, "w":2.0},
{"label":"Alt", "x":11, "y":4},
{"label":"Win", "x":12, "y":4},
{"label":"Menu", "x":13, "y":4},
{"label":"Ctrl", "x":14, "y":4}
{"x":8.75, "y":4, "w":1.25},
{"x":10, "y":4, "w":2.0},
{"label":"Alt", "x":12, "y":4},
{"label":"Win", "x":13, "y":4},
{"label":"Menu", "x":14, "y":4},
{"label":"Ctrl", "x":15, "y":4}
]
},
"LAYOUT_ansi_alt": {
"key_count": 63,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R07", "x":14, "y":0, "w":2},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"R17", "x":14.5, "y":1, "w":1.5},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R27", "x":13.75, "y":2, "w":2.25},
{"label":"L31", "x":0, "y":3, "w":2.25},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":2.75},
{"label":"L40", "x":0, "y":4, "w":1.5},
{"label":"L41", "x":1.5, "y":4},
{"label":"L42", "x":2.5, "y":4, "w":1.5},
{"label":"L43", "x":4, "y":4, "w":2.75},
{"label":"L44", "x":6.75, "y":4},
{"label":"R43", "x":8.75, "y":4},
{"label":"R44", "x":9.75, "y":4, "w":2.25},
{"label":"R45", "x":12, "y":4, "w":1.5},
{"label":"R46", "x":13.5, "y":4},
{"label":"R47", "x":14.5, "y":4, "w":1.5}
]
},
"LAYOUT_iso_default": {
"key_count": 65,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R07", "x":14, "y":0, "w":2},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R17", "x":13.75, "y":2},
{"label":"R27", "x":14.75, "y":1, "w":1.25, "h":2},
{"label":"L30", "x":0, "y":3, "w":1.25},
{"label":"L31", "x":1.25, "y":3},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":2.75},
{"label":"L40", "x":0, "y":4, "w":1.25},
{"label":"L41", "x":1.25, "y":4, "w":1.25},
{"label":"L42", "x":2.5, "y":4, "w":1.25},
{"label":"L43", "x":3.75, "y":4, "w":2.75},
{"label":"L44", "x":6.5, "y":4, "w":1.25},
{"label":"R43", "x":8.75, "y":4, "w":1.25},
{"label":"R44", "x":10, "y":4, "w":2},
{"label":"R42", "x":12, "y":4},
{"label":"R45", "x":13, "y":4},
{"label":"R46", "x":14, "y":4},
{"label":"R47", "x":15, "y":4}
]
},
"LAYOUT_iso_alt": {
"key_count": 64,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R07", "x":14, "y":0, "w":2},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R17", "x":13.75, "y":2},
{"label":"R27", "x":14.75, "y":1, "w":1.25, "h":2},
{"label":"L30", "x":0, "y":3, "w":1.25},
{"label":"L31", "x":1.25, "y":3},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":2.75},
{"label":"L40", "x":0, "y":4, "w":1.5},
{"label":"L41", "x":1.5, "y":4},
{"label":"L42", "x":2.5, "y":4, "w":1.5},
{"label":"L43", "x":4, "y":4, "w":2.75},
{"label":"L44", "x":6.75, "y":4},
{"label":"R43", "x":8.75, "y":4},
{"label":"R44", "x":9.75, "y":4, "w":2.25},
{"label":"R45", "x":12, "y":4, "w":1.5},
{"label":"R46", "x":13.5, "y":4},
{"label":"R47", "x":14.5, "y":4, "w":1.5}
]
},
"LAYOUT_hhkb_default": {
"key_count": 63,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R06", "x":14, "y":0},
{"label":"R07", "x":15, "y":0},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"R17", "x":14.5, "y":1, "w":1.5},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R27", "x":13.75, "y":2, "w":2.25},
{"label":"L31", "x":0, "y":3, "w":2.25},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":1.75},
{"label":"R37", "x":15, "y":3},
{"label":"L41", "x":1.5, "y":4},
{"label":"L42", "x":2.5, "y":4, "w":1.5},
{"label":"L43", "x":4, "y":4, "w":2.75},
{"label":"L44", "x":6.75, "y":4},
{"label":"R43", "x":8.75, "y":4},
{"label":"R44", "x":9.75, "y":4, "w":2.25},
{"label":"R45", "x":12, "y":4, "w":1.5},
{"label":"R46", "x":13.5, "y":4}
]
},
"LAYOUT_hhkb_split_lshift": {
"key_count": 64,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R06", "x":14, "y":0},
{"label":"R07", "x":15, "y":0},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"R17", "x":14.5, "y":1, "w":1.5},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R27", "x":13.75, "y":2, "w":2.25},
{"label":"L30", "x":0, "y":3, "w":1.25},
{"label":"L31", "x":1.25, "y":3},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":1.75},
{"label":"R37", "x":15, "y":3},
{"label":"L41", "x":1.5, "y":4},
{"label":"L42", "x":2.5, "y":4, "w":1.5},
{"label":"L43", "x":4, "y":4, "w":2.75},
{"label":"L44", "x":6.75, "y":4},
{"label":"R43", "x":8.75, "y":4},
{"label":"R44", "x":9.75, "y":4, "w":2.25},
{"label":"R45", "x":12, "y":4, "w":1.5},
{"label":"R46", "x":13.5, "y":4}
]
},
"LAYOUT_wkl_default": {
"key_count": 61,
"layout": [
{"label":"L00", "x":0, "y":0},
{"label":"L01", "x":1, "y":0},
{"label":"L02", "x":2, "y":0},
{"label":"L03", "x":3, "y":0},
{"label":"L04", "x":4, "y":0},
{"label":"L05", "x":5, "y":0},
{"label":"L06", "x":6, "y":0},
{"label":"R00", "x":8, "y":0},
{"label":"R01", "x":9, "y":0},
{"label":"R02", "x":10, "y":0},
{"label":"R03", "x":11, "y":0},
{"label":"R04", "x":12, "y":0},
{"label":"R05", "x":13, "y":0},
{"label":"R07", "x":14, "y":0, "w":2},
{"label":"L10", "x":0, "y":1, "w":1.5},
{"label":"L11", "x":1.5, "y":1},
{"label":"L12", "x":2.5, "y":1},
{"label":"L13", "x":3.5, "y":1},
{"label":"L14", "x":4.5, "y":1},
{"label":"L15", "x":5.5, "y":1},
{"label":"R10", "x":7.5, "y":1},
{"label":"R11", "x":8.5, "y":1},
{"label":"R12", "x":9.5, "y":1},
{"label":"R13", "x":10.5, "y":1},
{"label":"R14", "x":11.5, "y":1},
{"label":"R15", "x":12.5, "y":1},
{"label":"R16", "x":13.5, "y":1},
{"label":"R17", "x":14.5, "y":1, "w":1.5},
{"label":"L20", "x":0, "y":2, "w":1.75},
{"label":"L21", "x":1.75, "y":2},
{"label":"L22", "x":2.75, "y":2},
{"label":"L23", "x":3.75, "y":2},
{"label":"L24", "x":4.75, "y":2},
{"label":"L25", "x":5.75, "y":2},
{"label":"R21", "x":7.75, "y":2},
{"label":"R22", "x":8.75, "y":2},
{"label":"R23", "x":9.75, "y":2},
{"label":"R24", "x":10.75, "y":2},
{"label":"R25", "x":11.75, "y":2},
{"label":"R26", "x":12.75, "y":2},
{"label":"R27", "x":13.75, "y":2, "w":2.25},
{"label":"L31", "x":0, "y":3, "w":2.25},
{"label":"L32", "x":2.25, "y":3},
{"label":"L33", "x":3.25, "y":3},
{"label":"L34", "x":4.25, "y":3},
{"label":"L35", "x":5.25, "y":3},
{"label":"L36", "x":6.25, "y":3},
{"label":"R31", "x":8.25, "y":3},
{"label":"R32", "x":9.25, "y":3},
{"label":"R33", "x":10.25, "y":3},
{"label":"R34", "x":11.25, "y":3},
{"label":"R35", "x":12.25, "y":3},
{"label":"R36", "x":13.25, "y":3, "w":2.75},
{"label":"L40", "x":0, "y":4, "w":1.5},
{"label":"L42", "x":2.5, "y":4, "w":1.5},
{"label":"L43", "x":4, "y":4, "w":2.75},
{"label":"L44", "x":6.75, "y":4},
{"label":"R43", "x":8.75, "y":4},
{"label":"R44", "x":9.75, "y":4, "w":2.25},
{"label":"R45", "x":12, "y":4, "w":1.5},
{"label":"R47", "x":14.5, "y":4, "w":1.5}
]
}
}
}
}

View file

@ -24,9 +24,6 @@ extern keymap_config_t keymap_config;
// entirely and just use numbers.
#define _BASE 0
#define _______ KC_TRNS
#define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_ansi_default(
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, \

View file

@ -25,9 +25,6 @@ extern keymap_config_t keymap_config;
#define _BASE 0
#define _FN 1
#define _______ KC_TRNS
#define XXXXXXX KC_NO
#define FN MO(_FN)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

View file

@ -14,8 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PROTO_H
#define PROTO_H
#pragma once
#include "qc60.h"
@ -26,10 +25,10 @@
/* Split Backspace
* {R07, XXX, R05, R04, R03, R02, R01, R00}
*
*
* Split Right Shift
* {R37, R36, R35, R34, R33, R32, R31, XXX}
*
*
* Split Left Shift
* {L30, L31, L32, L33, L34, L35, L36, XXX}
*
@ -101,14 +100,14 @@
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, \
L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R17, R27, \
L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
L30, L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
L40, L41, L42, L43, L44, R43, R44, R42, R45, R46, R47 \
) \
{ \
{L00, L01, L02, L03, L04, L05, L06, XXX}, \
{L10, L11, L12, L13, L14, L15, XXX, XXX}, \
{L20, L21, L22, L23, L24, L25, XXX, XXX}, \
{XXX, L31, L32, L33, L34, L35, L36, XXX}, \
{L30, L31, L32, L33, L34, L35, L36, XXX}, \
{L40, L41, L42, L43, L44, XXX, XXX, XXX}, \
{R07, XXX, R05, R04, R03, R02, R01, R00}, \
{R17, R16, R15, R14, R13, R12, R11, R10}, \
@ -118,17 +117,17 @@
}
#define LAYOUT_iso_alt( \
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, \
L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R27, \
L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
L40, L41, L42, L43, L44, R43, R44, R45, R46, R47 \
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R07, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, \
L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, R17, R27, \
L30, L31, L32, L33, L34, L35, L36, R31, R32, R33, R34, R35, R36, \
L40, L41, L42, L43, L44, R43, R44, R45, R46, R47 \
) \
{ \
{L00, L01, L02, L03, L04, L05, L06, XXX}, \
{L10, L11, L12, L13, L14, L15, XXX, XXX}, \
{L20, L21, L22, L23, L24, L25, XXX, XXX}, \
{XXX, L31, L32, L33, L34, L35, L36, XXX}, \
{L30, L31, L32, L33, L34, L35, L36, XXX}, \
{L40, L41, L42, L43, L44, XXX, XXX, XXX}, \
{R07, XXX, R05, R04, R03, R02, R01, R00}, \
{R17, R16, R15, R14, R13, R12, R11, R10}, \
@ -196,6 +195,3 @@
{XXX, R36, R35, R34, R33, R32, R31, XXX}, \
{R47, XXX, R45, R44, R43, XXX, XXX, XXX}, \
}
#endif

View file

@ -0,0 +1,108 @@
{
"keyboard_name": "handwired/reddot",
"url": "",
"maintainer": "qmk",
"width": 20.5,
"height": 5,
"layouts": {
"LAYOUT": {
"layout": [
{"label":"k00 (Esc)", "x":0, "y":0},
{"label":"k01 (F1)", "x":1, "y":0},
{"label":"k02 (F2)", "x":2, "y":0},
{"label":"k03 (F3)", "x":3, "y":0},
{"label":"k04 (F4)", "x":4, "y":0},
{"label":"k05 (F5)", "x":5, "y":0},
{"label":"k06 (Tab)", "x":6, "y":0, "w":2},
{"label":"k07 (Caps Lock)", "x":8, "y":0},
{"label":"k08 (F6)", "x":9, "y":0},
{"label":"k09 (F7)", "x":10, "y":0},
{"label":"k0A (F8)", "x":11, "y":0},
{"label":"k0B (F9)", "x":12, "y":0},
{"label":"k0C (F10)", "x":13, "y":0},
{"label":"k0D (F11)", "x":14, "y":0},
{"label":"k0E (F12)", "x":15, "y":0},
{"label":"k10 (Function)", "x":16.5, "y":0},
{"label":"k11 (Keypad /)", "x":17.5, "y":0},
{"label":"k12 (Keypad *)", "x":18.5, "y":0},
{"label":"k13 (Keypad -)", "x":19.5, "y":0},
{"label":"k20 (Left Alt)", "x":0, "y":1},
{"label":"k21 (1 / FR Ampersand)", "x":1, "y":1},
{"label":"k22 (2 / FR É)", "x":2, "y":1},
{"label":"k23 (3 / FR Quote)", "x":3, "y":1},
{"label":"k24 (4 / FR Apostrophe)", "x":4, "y":1},
{"label":"k25 (5 / FR Left Parenthesis)", "x":5, "y":1},
{"label":"k26 (Backspace)", "x":6, "y":1, "w":2},
{"label":"k27 (Delete)", "x":8, "y":1},
{"label":"k28 (6 / FR Minus)", "x":9, "y":1},
{"label":"k29 (7 / FR È)", "x":10, "y":1},
{"label":"k2A (8 / FR Underscore)", "x":11, "y":1},
{"label":"k2B (9 / FR Ç)", "x":12, "y":1},
{"label":"k2C (0 / FR À)", "x":13, "y":1},
{"label":"k2D (Minus / FR Right Parenthesis)", "x":14, "y":1},
{"label":"k2E (Equals / FR Equals)", "x":15, "y":1},
{"label":"k30 (Insert)", "x":16.5, "y":1},
{"label":"k31 (Home)", "x":17.5, "y":1},
{"label":"k32 (Page Up)", "x":18.5, "y":1},
{"label":"k40 (GUI)", "x":0, "y":2},
{"label":"k41 (Q / FR A)", "x":1, "y":2},
{"label":"k42 (W / FR Z)", "x":2, "y":2},
{"label":"k43 (E)", "x":3, "y":2},
{"label":"k44 (R)", "x":4, "y":2},
{"label":"k45 (T)", "x":5, "y":2},
{"label":"k46 (Shift)", "x":6, "y":2, "h":2},
{"label":"k66 (Enter)", "x":7, "y":2, "h":2},
{"label":"k47 (Enter)", "x":8, "y":2, "h":2},
{"label":"k48 (Y)", "x":9, "y":2},
{"label":"k49 (U)", "x":10, "y":2},
{"label":"k4A (I)", "x":11, "y":2},
{"label":"k4B (O)", "x":12, "y":2},
{"label":"k4C (P)", "x":13, "y":2},
{"label":"k4D (Left Bracket / FR Circumflex)", "x":14, "y":2},
{"label":"k4E (Right Bracket / FR Dollar)", "x":15, "y":2},
{"label":"k50 (Delete)", "x":16.5, "y":2},
{"label":"k51 (End)", "x":17.5, "y":2},
{"label":"k52 (Page Down)", "x":18.5, "y":2},
{"label":"k53 (Keypad +)", "x":19.5, "y":1, "h":2},
{"label":"k60 (Ctrl)", "x":0, "y":3},
{"label":"k61 (A / FR Q)", "x":1, "y":3},
{"label":"k62 (S)", "x":2, "y":3},
{"label":"k63 (D)", "x":3, "y":3},
{"label":"k64 (F)", "x":4, "y":3},
{"label":"k65 (G)", "x":5, "y":3},
{"label":"k68 (H)", "x":9, "y":3},
{"label":"k69 (J)", "x":10, "y":3},
{"label":"k6A (K)", "x":11, "y":3},
{"label":"k6B (L)", "x":12, "y":3},
{"label":"k6C (Semicolon / FR M)", "x":13, "y":3},
{"label":"k6D (Quote / FR Ù)", "x":14, "y":3},
{"label":"k6E (ISO Hash / FR Asterisk)", "x":15, "y":3},
{"label":"k70 (Keypad 1)", "x":16.5, "y":3},
{"label":"k71 (Up)", "x":17.5, "y":3},
{"label":"k72 (Keypad 3)", "x":18.5, "y":3},
{"label":"k80 (ISO Backslash / FR Less Than)", "x":0, "y":4},
{"label":"k81 (Z / FR W)", "x":1, "y":4},
{"label":"k82 (X)", "x":2, "y":4},
{"label":"k83 (C)", "x":3, "y":4},
{"label":"k84 (V)", "x":4, "y":4},
{"label":"k85 (B)", "x":5, "y":4},
{"label":"k86 (Space)", "x":6, "y":4, "w":2},
{"label":"k88 (Space)", "x":8, "y":4, "w":2},
{"label":"k89 (N)", "x":10, "y":4},
{"label":"k8A (M / FR Comma)", "x":11, "y":4},
{"label":"k8B (Comma / FR Semicolon)", "x":12, "y":4},
{"label":"k8C (Period / Colon)", "x":13, "y":4},
{"label":"k8D (Slash / FR Exclaim)", "x":14, "y":4},
{"label":"k8E (Right Alt / FR AltGr)", "x":15, "y":4},
{"label":"k90 (Left)", "x":16.5, "y":4},
{"label":"k91 (Down)", "x":17.5, "y":4},
{"label":"k92 (Right)", "x":18.5, "y":4},
{"label":"k93 (Keypad Enter)", "x":19.5, "y":3, "h":2}
]
}
}
}

41
keyboards/handwired/reddot/keymaps/default/keymap.c Executable file → Normal file
View file

@ -1,29 +1,22 @@
#include "reddot.h"
#include "../../../../../quantum/keymap_extras/keymap_french.h"
#include QMK_KEYBOARD_H
#include "keymap_french.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\
FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
[0] = LAYOUT(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, TG(1), KC_PSLS, KC_PAST, KC_PMNS, \
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPC, KC_DEL, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INS, KC_HOME, KC_PGUP, \
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DEL, KC_END, KC_PGDN, KC_PPLS, \
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_P1, KC_UP, KC_P3, \
FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_SPC, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RGHT, KC_PENT \
),
[1] = LAYOUT(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSLS, KC_PAST, KC_PMNS, \
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPC, KC_DEL, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9, \
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_PPLS, \
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3, \
FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_SPC, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RGHT, KC_PENT \
),
[1] = KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\
FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
};
const uint16_t PROGMEM fn_actions[] = {
ACTION_LAYER_TOGGLE(1),
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
return MACRO_NONE;
};

View file

@ -1,24 +1,14 @@
## RedDot Specific Info ##
# RedDot
An ortholinear compact fullsize keyboard configured for French AZERTY layout.
## Quantum MK Firmware
- [Layout](http://www.keyboard-layout-editor.com/##@_plate:true%3B&@_sm=cherry&sb=cherry&st=MX1A-L1xx%3B&=Esc&=F1&=F2&=F3&=F4&=F5&_w:2%3B&=Tab&=Caps%20Lock&=F6&=F7&=F8&=F9&=F10&=F11&=F12&_x:0.5%3B&=Fn&=%2F%2F&=*&=-%3B&@=Alt&=1%0A%2F&&=2%0A%C3%A9%0A%0A~&=3%0A%22%0A%0A%23&=4%0A'%0A%0A%7B&=5%0A(%0A%0A%5B&_w:2%3B&=Back&=Del&=6%0A-%0A%0A%7C&=7%0A%C3%A8%0A%0A%60&=8%0A%2F_%0A%0A%5C&=9%0A%C3%A7%0A%0A%5E&=0%0A%C3%A0%0A%0A%2F@&=%C2%B0%0A)%0A%0A%5D&=+%0A%2F=%0A%0A%7D&_x:0.5%3B&=Insert&=Home&=Page%20Up&_h:2%3B&=+%3B&@=Win&=A&=Z&=E&=R&=T&_h:2%3B&=Shift&_h:2%3B&=Enter&_h:2%3B&=Enter&=Y&=U&=I&=O&=P&=%C2%A8%0A%5E&=%C2%A3%0A$&_x:0.5%3B&=Delete&=End&=Page%20Down%3B&@=Ctrl&=Q&=S&=D&=F&=G&_x:3%3B&=H&=J&=K&=L&=M&=%25%0A%C3%B9&=%C2%B5%0A*&_x:0.5%3B&=1%0AEnd&=Up&=3%0APgDn&_h:2%3B&=Enter%3B&@=%3E%0A%3C&=W&=X&=C&=V&=B&_w:2%3B&=Space&_w:2%3B&=Space&=N&=%3F%0A,&=.%0A%2F%3B&=%2F%2F%0A%2F:&=%C2%A7%0A!&=Alt%20Gr&_x:0.5%3B&=Left&=Down&=Right)
For the full Quantum feature list, see [the parent README.md](/readme.md).
Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
Hardware Supported: RedDot handwired
## Building
Make example for this keyboard (after setting up your build environment):
Download or clone the whole firmware and navigate to the keyboard/reddot folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
make handwired/reddot:default
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
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).

View file

@ -1,20 +1,17 @@
#ifndef REDDOT_H
#define REDDOT_H
#pragma once
#include "quantum.h"
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53, \
k60, k61, k62, k63, k64, k65, k66, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, \
k80, k81, k82, k83, k84, k85, k86, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93\
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, \
k40, k41, k42, k43, k44, k45, k46, k66, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53, \
k60, k61, k62, k63, k64, k65, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, \
k80, k81, k82, k83, k84, k85, k86, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, KC_NO }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53 }, \
{ k60, k61, k62, k63, k64, k65, k66, KC_NO, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86, KC_NO, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 } \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k10, k11, k12, k13 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k30, k31, k32, KC_NO }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k50, k51, k52, k53 }, \
{ k60, k61, k62, k63, k64, k65, k66, KC_NO, k68, k69, k6A, k6B, k6C, k6D, k6E, k70, k71, k72, KC_NO }, \
{ k80, k81, k82, k83, k84, k85, k86, KC_NO, k88, k89, k8A, k8B, k8C, k8D, k8E, k90, k91, k92, k93 } \
}
#endif

View file

@ -0,0 +1,95 @@
{
"keyboard_name": "handwired/retro_refit",
"url": "",
"maintainer": "qmk",
"width": 15.5,
"height": 6.5,
"layouts": {
"LAYOUT": {
"key_count": 81,
"layout": [
{"label":"Esc", "x":0, "y":0},
{"label":"F1", "x":1, "y":0},
{"label":"F2", "x":2, "y":0},
{"label":"F3", "x":3, "y":0},
{"label":"F4", "x":4, "y":0},
{"label":"F5", "x":5, "y":0},
{"label":"F6", "x":6, "y":0},
{"label":"F7", "x":7, "y":0},
{"label":"F8", "x":8, "y":0},
{"label":"F9", "x":9, "y":0},
{"label":"F10", "x":10, "y":0},
{"label":"Num Lock", "x":11.5, "y":0},
{"label":"Scroll Lock", "x":12.5, "y":0},
{"label":"Print Screen", "x":13.5, "y":0},
{"label":"Pause", "x":14.5, "y":0},
{"label":"`", "x":0, "y":1.5},
{"label":"1", "x":1, "y":1.5},
{"label":"2", "x":2, "y":1.5},
{"label":"3", "x":3, "y":1.5},
{"label":"4", "x":4, "y":1.5},
{"label":"5", "x":5, "y":1.5},
{"label":"6", "x":6, "y":1.5},
{"label":"7", "x":7, "y":1.5},
{"label":"8", "x":8, "y":1.5},
{"label":"9", "x":9, "y":1.5},
{"label":"0", "x":10, "y":1.5},
{"label":"-", "x":11, "y":1.5},
{"label":"=", "x":12, "y":1.5},
{"label":"Backspace", "x":13, "y":1.5, "w":1.5},
{"label":"Home", "x":14.5, "y":1.5},
{"label":"Tab", "x":0, "y":2.5, "w":1.5},
{"label":"Q", "x":1.5, "y":2.5},
{"label":"W", "x":2.5, "y":2.5},
{"label":"E", "x":3.5, "y":2.5},
{"label":"R", "x":4.5, "y":2.5},
{"label":"T", "x":5.5, "y":2.5},
{"label":"Y", "x":6.5, "y":2.5},
{"label":"U", "x":7.5, "y":2.5},
{"label":"I", "x":8.5, "y":2.5},
{"label":"O", "x":9.5, "y":2.5},
{"label":"P", "x":10.5, "y":2.5},
{"label":"[", "x":11.5, "y":2.5},
{"label":"]", "x":12.5, "y":2.5},
{"label":"Page Up", "x":14.5, "y":2.5},
{"label":"Ctrl", "x":0, "y":3.5, "w":1.75},
{"label":"A", "x":1.75, "y":3.5},
{"label":"S", "x":2.75, "y":3.5},
{"label":"D", "x":3.75, "y":3.5},
{"label":"F", "x":4.75, "y":3.5},
{"label":"G", "x":5.75, "y":3.5},
{"label":"H", "x":6.75, "y":3.5},
{"label":"J", "x":7.75, "y":3.5},
{"label":"K", "x":8.75, "y":3.5},
{"label":"L", "x":9.75, "y":3.5},
{"label":";", "x":10.75, "y":3.5},
{"label":"'", "x":11.75, "y":3.5},
{"label":"Enter", "x":12.75, "y":3.5, "w":1.75},
{"label":"Page Down", "x":14.5, "y":3.5},
{"label":"Shift", "x":0, "y":4.5, "w":2.25},
{"label":"Z", "x":2.25, "y":4.5},
{"label":"X", "x":3.25, "y":4.5},
{"label":"C", "x":4.25, "y":4.5},
{"label":"V", "x":5.25, "y":4.5},
{"label":"B", "x":6.25, "y":4.5},
{"label":"N", "x":7.25, "y":4.5},
{"label":"M", "x":8.25, "y":4.5},
{"label":",", "x":9.25, "y":4.5},
{"label":".", "x":10.25, "y":4.5},
{"label":"/", "x":11.25, "y":4.5},
{"label":"Shift", "x":12.25, "y":4.5, "w":1.25},
{"label":"Up", "x":13.5, "y":4.5},
{"label":"End", "x":14.5, "y":4.5},
{"label":"Alt", "x":0, "y":5.5, "w":1.25},
{"label":"Caps Lock", "x":1.25, "y":5.5, "w":1.25},
{"label":"\\", "x":2.5, "y":5.5},
{"label":"Space", "x":3.5, "y":5.5, "w":7},
{"label":"Insert", "x":10.5, "y":5.5},
{"label":"Delete", "x":11.5, "y":5.5},
{"label":"Left", "x":12.5, "y":5.5},
{"label":"Down", "x":13.5, "y":5.5},
{"label":"Right", "x":14.5, "y":5.5}
]
}
}
}

View file

@ -1,31 +1,12 @@
#include "retro_refit.h"
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] =
KEYMAP( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, NLCK, SLCK, PSCR, PAUS, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, HOME, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, PGUP, \
BSLS, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, PGDN, \
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, END, \
LCTL, LGUI, LALT, SPC, INS, DEL, LEFT, DOWN, RGHT),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
[0] = LAYOUT( \
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK, KC_SLCK, KC_PSCR, 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_HOME, \
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_PGUP, \
KC_BSLS, 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_PGDN, \
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_END, \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_INS, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT \
),
};

View file

@ -1,60 +1,42 @@
retro_refit keyboard firmware
======================
## Keyboard Info
# retro_refit
The retro refit keyboard used a Teensy to replace the original controller on a 386 "laptop".
http://imgur.com/a/08Fyj
[Image Gallery](https://imgur.com/a/08Fyj)
This keyboard uses a KEYMAP macro that is a great example of using a non-standard row-column matrix. The keyboard in question had 11 rows and 8 columns, but the rows were not all horizontal, and the columns were not all vertical. For example, row 2 contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and"Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", "Left Alt", "Up Arrow", and "Down Arrow".
This keyboard uses a LAYOUT macro that is a great example of using a non-standard row-column matrix. The keyboard in question had 11 rows and 8 columns, but the rows were not all horizontal, and the columns were not all vertical. For example, row 2 contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and"Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B", "Left Alt", "Up Arrow", and "Down Arrow".
The macro makes programming the keys easier and in a more straight-forward manner because it realigns the keys into a 6x15 sensible keyboard layout instead of the obtuse 11x8 matrix. Each Kxy corrisponds to a key in row x column y.
The macro makes programming the keys easier and in a more straight-forward manner because it realigns the keys into a 6x15 sensible keyboard layout instead of the obtuse 11x8 matrix. Each Kxy corresponds to a key in row x column y.
```
#define KEYMAP( \
K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
K10, K06, K25, K07, K86, K85, K95, K90, K93 \
#define LAYOUT( \
K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
K10, K06, K25, K07, K86, K85, K95, K90, K93 \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, }, \
{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, }, \
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, }, \
{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K85, KC_##K86, KC_##K87, }, \
{ KC_##K90, KC_##K91, KC_NO, KC_##K93, KC_##K94, KC_##K95, KC_NO, KC_##K97, }, \
{ KC_##KA0, KC_##KA1, KC_##KA2, KC_##KA3, KC_##KA4, KC_##KA5, KC_##KA6, KC_##KA7, } \
{ K00, K01, K02, K03, K04, K05, K06, K07 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37 }, \
{ K40, K41, K42, K43, K44, K45, K46, K47 }, \
{ K50, K51, K52, K53, K54, K55, K56, K57 }, \
{ K60, K61, K62, K63, K64, K65, K66, K67 }, \
{ K70, K71, K72, K73, K74, K75, K76, K77 }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K85, K86, K87 }, \
{ K90, K91, KC_NO, K93, K94, K95, KC_NO, K97 }, \
{ KA0, KA1, KA2, KA3, KA4, KA5, KA6, KA7 } \
}
```
## Quantum MK Firmware
Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
Hardware Supported: Leading Edge D3 386 keyboard, Teensy
For the full Quantum feature list, see [the parent readme.md](/readme.md).
Make example for this keyboard (after setting up your build environment):
## Building
make handwired/retro_refit:default
Download or clone the whole firmware and navigate to the keyboards/retro_refit folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make default`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
```
$ make [default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
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).

View file

@ -1,38 +1,35 @@
#ifndef RETRO_REFIT_H
#define RETRO_REFIT_H
#pragma once
#include "quantum.h"
// This macro is an example of using a non-standard row-column matrix. The
// keyboard in question had 11 rows and 8 columns, but the rows were not all
// horizontal, and the columns were not all vertical. For example, row 2
// This macro is an example of using a non-standard row-column matrix. The
// keyboard in question had 11 rows and 8 columns, but the rows were not all
// horizontal, and the columns were not all vertical. For example, row 2
// contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and
// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B",
// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B",
// "Left Alt", "Up Arrow", and "Down Arrow".
//
// The macro makes programming the keys easier and in a more straight-forward
// manner because it realigns the keys into a 6x15 sensible keyboard layout
// manner because it realigns the keys into a 6x15 sensible keyboard layout
// instead of the obtuse 11x8 matrix.
#define KEYMAP( \
K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
K10, K06, K25, K07, K86, K85, K95, K90, K93 \
#define LAYOUT( \
K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
K10, K06, K25, K07, K86, K85, K95, K90, K93 \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, }, \
{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, }, \
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, }, \
{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K85, KC_##K86, KC_##K87, }, \
{ KC_##K90, KC_##K91, KC_NO, KC_##K93, KC_##K94, KC_##K95, KC_NO, KC_##K97, }, \
{ KC_##KA0, KC_##KA1, KC_##KA2, KC_##KA3, KC_##KA4, KC_##KA5, KC_##KA6, KC_##KA7, } \
{ K00, K01, K02, K03, K04, K05, K06, K07 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27 }, \
{ K30, K31, K32, K33, K34, K35, K36, K37 }, \
{ K40, K41, K42, K43, K44, K45, K46, K47 }, \
{ K50, K51, K52, K53, K54, K55, K56, K57 }, \
{ K60, K61, K62, K63, K64, K65, K66, K67 }, \
{ K70, K71, K72, K73, K74, K75, K76, K77 }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K85, K86, K87 }, \
{ K90, K91, KC_NO, K93, K94, K95, KC_NO, K97 }, \
{ KA0, KA1, KA2, KA3, KA4, KA5, KA6, KA7 } \
}
#endif

View file

@ -0,0 +1,27 @@
# rs60: Handwired Slim Preonic Clone
I wanted a preonic layout but with a very low profile. As Jack is still working on the Preonic PCB for Kailh Choc switches, I figured I could try to handwire one myself. It's my first custom keyboard, so I had a lot to learn.
First I designed the case in fusion 360. I wanted to build it using acrylic, constrained myself to standard acrylic sheet thickness.
![](https://imgur.com/NscS7Rd.jpg)
You can download the model [here](https://a360.co/2OqiKLm).
To test my design I 3D printed the parts.
![](https://imgur.com/MSF7zLS.jpg)
The result was encouraging, so I decided to build a prototype out of the printed plates using Kailh Choc brown switches. I tried to make the handwiring job as flat as possible so it can fit in my design.
![](https://i.imgur.com/67yZx0V.jpg)
![](https://i.imgur.com/ft72Cgj.jpg)
I designed switch plate and the middle plates so that they would be glued together. The middle plate has inserts to attach the bottom plate using m8 screws.
![](https://i.imgur.com/GstTohI.jpg)
The end result is not too bad, but there is a few things I would do differently. Gluing 3D printed plates wasn't a good idea. The switch layer is so thin, that it bends when all the switches are slotted. As a result, the keyboard is not entirely flat. I will replace the bottom plate by a metal one so I get more weight and rigidity.
Even with acrylic, I think I will have the same issue. I might switch to screws + bolts that go all the way through.

View file

@ -0,0 +1,47 @@
/*
Copyright 2018 QMK Contributors
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
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x4260
#define DEVICE_VER 0x0001
#define MANUFACTURER rs
#define PRODUCT rs60
#define DESCRIPTION Preonic clone based on pro micro
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 12
/* key matrix pins */
#define MATRIX_ROW_PINS { B5, B6, B4, B2, E6 }
#define MATRIX_COL_PINS { C6, D4, D0, D1, D2, D3, F4, F5, F6, F7, B1, B3}
#define UNUSED_PINS { }
#define QMK_ESC_OUTPUT C6
#define QMK_ESC_INPUT B4
#define QMK_LED B0
// #define QMK_SPEAKER C6
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* key combination for command */
#define IS_COMMAND() ( \
false \
)

View file

@ -0,0 +1,207 @@
/* Copyright 2015-2017 Jack Humbert
*
* 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
enum layers {
_QWERTY,
_COLEMAK,
_DVORAK,
_LOWER,
_RAISE,
_ADJUST
};
enum keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
DVORAK,
LOWER,
RAISE,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QWERTY] = LAYOUT( \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
_______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
/* Colemak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | R | S | T | D | H | N | E | I | O | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_COLEMAK] = LAYOUT( \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL, \
KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
_______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
/* Dvorak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | O | E | U | I | D | H | T | N | S | / |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_DVORAK] = LAYOUT( \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT, \
_______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = LAYOUT( \
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RAISE] = LAYOUT( \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Reset| | | | | | | | | | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = LAYOUT( \
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
_______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL, \
_______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case COLEMAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_COLEMAK);
}
return false;
break;
case DVORAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_DVORAK);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
return false;
break;
}
return true;
};

View file

@ -0,0 +1 @@
# The default Preonic layout - largely based on the Planck's

View file

@ -0,0 +1,18 @@
/*
Copyright 2018 QMK Community
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 "rs60.h"

View file

@ -0,0 +1,36 @@
/*
Copyright 2018 QMK Community
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 "quantum.h"
#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
) \
{ \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \
}
#define LAYOUT_ortho_5x12 LAYOUT

View file

@ -0,0 +1,61 @@
# MCU name
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)
# Bootloader
BOOTLOADER = qmk-dfu
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
LAYOUTS = ortho_5x12
# Boot Section Size in *bytes*
#OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
CONSOLE_ENABLE = yes # 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 - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Custom backlighting code is used, so this should not be enabled
AUDIO_ENABLE = no # This can be enabled if a speaker is connected to the expansion port. Not compatible with RGBLIGHT below
RGBLIGHT_ENABLE = no # This can be enabled if a ws2812 strip is connected to the expansion port.

View file

@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/terminus_mini: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 [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.

View file

@ -2,14 +2,14 @@
"keyboard_name": "Tradestation",
"url": "",
"maintainer": "Flehrad",
"bootloader": "",
"width": 4.3,
"height": 4.5,
"width": 4.375,
"height": 4.375,
"layouts": {
"LAYOUT_tradestation": {
"layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25, "w":2}, {"x":2.25, "y":2.25, "w":2}, {"x":0, "y":3.5, "w":2}, {"x":2.25, "y":3.5, "w":2}]
"layout": [{"x":0, "y":0},{"x":1.125, "y":0},{"x":2.25, "y":0},{"x":3.375, "y":0},{"x":0, "y":1.1},{"x":1.125, "y":1.1},{"x":2.25, "y":1.1},{"x":3.375, "y":1.1},{"x":0, "y":2.25, "w":2},{"x":2.25, "y":2.25, "w":2},{"x":0, "y":3.5, "w":2},{"x":2.25, "y":3.5, "w":2}]
},
"LAYOUT_ortho_4x4": {
"layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2.25, "y":2.25}, {"x":3.25, "y":2.25}, {"x":0, "y":3.5}, {"x":1, "y":3.5}, {"x":2.25, "y":3.5}, {"x":3.25, "y":3.5}]
"LAYOUT_ortho_4x4": {
"layout": [{"x":0, "y":0},{"x":1.125, "y":0},{"x":2.25, "y":0},{"x":3.375, "y":0},{"x":0, "y":1.1},{"x":1.125, "y":1.1},{"x":2.25, "y":1.1},{"x":3.375, "y":1.1},{"x":0, "y":2.25},{"x":1.125, "y":2.25},{"x":2.25, "y":2.25},{"x":3.375, "y":2.25},{"x":0, "y":3.5},{"x":1.125, "y":3.5},{"x":2.25, "y":3.5},{"x":3.375, "y":3.5}]
}
}
}

View file

@ -1,25 +1,27 @@
# Tradestation
QMK for Tradestation Macropad
This macropad was layout designed by Didier Luximon
[Image Gallery](https://imgur.com/a/yxQJXMT)
A 4x4 ortholinear macropad, with options for 2U keys on the bottom half. Can be built as single PCB with custom case, or as two-PCB style with standoffs. Requires a Pro Micro.
This PCB supports an overall 4x4 matrix with unique spacing.
* Top two rows are 1U keys with 1/8U spacing
* Bottom two rows are available with 4x2 1U as clusters of 2x1U or as 2x2 2U, spaced with 1/4U
For QMK Configurator, the info.json is utilised.
- For 2U keys , the first 1u row/column key assignment is the same as the 2u position.
If you like this simple PCB and want to make a donation, you can do so at [paypal.me/theboardpodcast](https://paypal.me/theboardpodcast).
Build requires a pro micro.
- [The Board Podcast on YouTube](https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw)
- [The Board Podcast on Libsyn](http://theboard.libsyn.com/)
- [The Board Podcast on Patreon](https://www.patreon.com/theboardpodcast)
Can be built as single PCB with custom case, or as two PCB style with standoffs.
Designed by Didier Luximon.
If you like this simple PCB and want to make a donation, you can at https://paypal.me/theboardpodcast
Keyboard Maintainer: [flehrad](https://github.com/flehrad)
Hardware Supported: Tradestation PCB, Pro Micro
Check out our:
Make example for this keyboard (after setting up your build environment):
YouTube (https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw)
make tradestation:default
Podcast (www.libsyn.com/theboardpodcast)
Patreon (www.patreon.com/theboardpodcast)
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).

View file

@ -62,4 +62,5 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https:/
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
AUDIO_ENABLE = no
RGBLIGHT_ENABLE = no
LAYOUTS = ortho_4x4
LAYOUTS = ortho_4x4

View file

@ -3,25 +3,25 @@
#include "quantum.h"
#define LAYOUT_ortho_4x4( \
K00, K01, K02, K03, \
K10, K11, K12, K13, \
K20, K21, K22, K23, \
K30, K31, K32, K33 \
K00, K01, K02, K03, \
K10, K11, K12, K13, \
K20, K21, K22, K23, \
K30, K31, K32, K33 \
) { \
{ K00, K01, K02, K03 }, \
{ K10, K11, K12, K13 }, \
{ K20, K21, K22, K23 }, \
{ K30, K31, K32, K33 } \
{ K00, K01, K02, K03 }, \
{ K10, K11, K12, K13 }, \
{ K20, K21, K22, K23 }, \
{ K30, K31, K32, K33 } \
}
#define LAYOUT_tradestation( \
K00, K01, K02, K03, \
K10, K11, K12, K13, \
K20, K22, \
K30, K32 \
K00, K01, K02, K03, \
K10, K11, K12, K13, \
K20, K22, \
K30, K32 \
) { \
{ K00, K01, K02, K03 }, \
{ K10, K11, K12, K13 }, \
{ K20, KC_NO, K22, KC_NO }, \
{ K30, KC_NO, K32, KC_NO } \
{ K00, K01, K02, K03 }, \
{ K10, K11, K12, K13 }, \
{ K20, KC_NO, K22, KC_NO }, \
{ K30, KC_NO, K32, KC_NO } \
}

View file

@ -157,11 +157,8 @@ Right hand nav keys work pretty well chorded with the Right hand Hi Key
const uint16_t PROGMEM fn_actions[] = {
[_QW] = ACTION_LAYER_ON(_QW,ON_RELEASE), // return to QWERTY layer
[_LW] = ACTION_LAYER_TAP_TOGGLE(_LW), // Turn on LW when holding, or tap 3 times to switch
[_HI] = ACTION_LAYER_TAP_TOGGLE(_HI), // Turn on LW when holding, or tap 3 times to switch
[_NAV] = ACTION_LAYER_TOGGLE(_NAV),
[_FKEYS] = ACTION_LAYER_TOGGLE(_FKEYS),
[_LWOUT] = ACTION_LAYER_OFF(_LW,ON_RELEASE),
[_HIOUT] = ACTION_LAYER_OFF(_HI,ON_RELEASE),
// Functions
[RGBLED_TOGGLE] = ACTION_FUNCTION(RGBLED_TOGGLE),

View file

@ -59,10 +59,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
const uint16_t PROGMEM fn_actions[] = {
};
void numlock_led_on(void) {
PORTF |= (1<<7);
}

View file

@ -32,6 +32,3 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View file

@ -8,6 +8,3 @@ MOUSEKEY_ENABLE = no
EXTRAFLAGS = -flto
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

View file

@ -0,0 +1,63 @@
#include <string.h>
#include "config.h"
#include "matrix.h"
#include "timer.h"
#include "quantum.h"
#ifndef DEBOUNCING_DELAY
# define DEBOUNCING_DELAY 5
#endif
//Debouncing counters
typedef uint8_t debounce_counter_t;
#define DEBOUNCE_COUNTER_MODULO 250
#define DEBOUNCE_COUNTER_INACTIVE 251
static debounce_counter_t *debounce_counters;
void debounce_init(uint8_t num_rows)
{
debounce_counters = malloc(num_rows*MATRIX_COLS);
memset(debounce_counters, DEBOUNCE_COUNTER_INACTIVE, num_rows*MATRIX_COLS);
}
void update_debounce_counters(uint8_t num_rows, uint8_t current_time)
{
for (uint8_t row = 0; row < num_rows; row++)
{
for (uint8_t col = 0; col < MATRIX_COLS; col++)
{
if (debounce_counters[row*MATRIX_COLS + col] != DEBOUNCE_COUNTER_INACTIVE)
{
if (TIMER_DIFF(current_time, debounce_counters[row*MATRIX_COLS + col], DEBOUNCE_COUNTER_MODULO) >= DEBOUNCING_DELAY) {
debounce_counters[row*MATRIX_COLS + col] = DEBOUNCE_COUNTER_INACTIVE;
}
}
}
}
}
void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time)
{
for (uint8_t row = 0; row < num_rows; row++)
{
matrix_row_t delta = raw[row] ^ cooked[row];
for (uint8_t col = 0; col < MATRIX_COLS; col++)
{
if (debounce_counters[row*MATRIX_COLS + col] == DEBOUNCE_COUNTER_INACTIVE && (delta & (1<<col)))
{
debounce_counters[row*MATRIX_COLS + col] = current_time;
cooked[row] ^= (1 << col);
}
}
}
}
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed)
{
uint8_t current_time = timer_read() % DEBOUNCE_COUNTER_MODULO;
update_debounce_counters(num_rows, current_time);
transfer_matrix_values(raw, cooked, num_rows, current_time);
}

View file

@ -1,4 +1,5 @@
SRC += matrix_scanrate.c matrix.c
#SRC += matrix_scanrate.c matrix.c
SRC += debounce.c
# MCU name
MCU = atmega32u4
@ -37,7 +38,7 @@ F_USB = $(F_CPU)
# 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
# different sizes, comment this out, and the correct address will be loaded
# automatically (+60). See bootloader.mk for all options.
BOOTLOADER = caterina
@ -59,14 +60,15 @@ MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SPLIT_KEYBOARD = yes # Use shared split_common code
SUBPROJECT_rev1 = yes
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
CUSTOM_MATRIX = yes
CUSTOM_MATRIX = no
CUSTOM_DEBOUNCE = yes
LAYOUTS = split60