Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial Commit for alice clone pcb #9792

Merged
merged 66 commits into from
Sep 3, 2020
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
296681f
Initial Commit for alice clone pcb
mujimanic Jul 23, 2020
72518bf
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Jul 24, 2020
028baa6
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Jul 24, 2020
3d17978
Update keyboards/sneakbox/aliceclone/kb.c
SneakboxKB Jul 24, 2020
9398fce
Rename kb.h to aliceclone.h
SneakboxKB Jul 24, 2020
1e0340c
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Jul 24, 2020
5a78d59
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Jul 24, 2020
aa31713
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Jul 24, 2020
452e6b9
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Jul 24, 2020
c0feeb4
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Jul 24, 2020
c352f93
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Jul 24, 2020
cea7cc3
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Jul 24, 2020
cb595f9
Update keyboards/sneakbox/aliceclone/rules.mk
SneakboxKB Jul 24, 2020
19a4b76
Update keymap.c
SneakboxKB Jul 24, 2020
06fcc9b
Rename kb.c to aliceclone.c
SneakboxKB Jul 24, 2020
ea019f9
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Jul 25, 2020
9246300
Update keyboards/sneakbox/aliceclone/aliceclone.h
SneakboxKB Jul 25, 2020
9fea6f7
Update keyboards/sneakbox/aliceclone/aliceclone.h
SneakboxKB Jul 25, 2020
ee1c28a
Update keyboards/sneakbox/aliceclone/aliceclone.h
SneakboxKB Jul 25, 2020
c33bf09
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Jul 25, 2020
80602f0
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Jul 25, 2020
5cdcc0b
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Jul 25, 2020
425b9b5
Info.json now reflects QMK configurator metadata
SneakboxKB Jul 25, 2020
d61adef
Changed typo ) to } at end of line 9.
SneakboxKB Jul 25, 2020
7473530
Update keymap.c
SneakboxKB Jul 26, 2020
508196a
Update keymap.c
SneakboxKB Jul 26, 2020
a41bf93
Update keymap.c
SneakboxKB Jul 26, 2020
c2ca6af
Update keymap.c
SneakboxKB Jul 26, 2020
526b3c4
Update info.json
SneakboxKB Jul 27, 2020
9ec9033
Update keymap.c
SneakboxKB Jul 27, 2020
a3faf00
Adjusted formatting for key layout for readability
SneakboxKB Jul 27, 2020
1cf5047
Added GPLv2 License header
SneakboxKB Aug 5, 2020
da35225
Added GPLv2 license header
SneakboxKB Aug 5, 2020
e03b0fe
Update aliceclone.c
SneakboxKB Aug 5, 2020
5a2e1b8
Updated the LAYOUT map
SneakboxKB Aug 5, 2020
e64e915
GPLv2 license header added
SneakboxKB Aug 5, 2020
e8d00fa
Update keyboards/sneakbox/aliceclone/config.h
SneakboxKB Aug 5, 2020
5f69018
GPLv2 License Header added
SneakboxKB Aug 5, 2020
04769f7
Updated License Header, Added keymap layers
SneakboxKB Aug 5, 2020
9535147
Added extra layers, corrected layer references
SneakboxKB Aug 5, 2020
b068077
Updated formatting for keymap.c LAYOUT
mujimanic Aug 5, 2020
b5e33b8
Update keyboards/sneakbox/aliceclone/aliceclone.h
SneakboxKB Aug 15, 2020
af58cd4
Update keyboards/sneakbox/aliceclone/info.json
SneakboxKB Aug 15, 2020
0e24c25
Update keyboards/sneakbox/aliceclone/info.json
SneakboxKB Aug 15, 2020
7027a70
Merge branch 'master' of https://github.com/SneakboxKB/qmk_firmware
mujimanic Aug 15, 2020
73b2b21
Update keyboards/sneakbox/aliceclone/info.json
SneakboxKB Aug 15, 2020
cc167f3
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Aug 15, 2020
713c74d
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Aug 15, 2020
bf7daf1
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Aug 15, 2020
fea3abe
Update keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
SneakboxKB Aug 15, 2020
1e1b5d8
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Aug 15, 2020
4343a30
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Aug 15, 2020
10c6593
Update keymap.c
SneakboxKB Aug 15, 2020
bf9d3eb
Update keymap.c
SneakboxKB Aug 15, 2020
c537997
syntax in enum layer_names
SneakboxKB Aug 17, 2020
2e01fe9
Update aliceclone.h
mujimanic Aug 17, 2020
3f41997
Update keymap.c
SneakboxKB Aug 18, 2020
6c25a8a
Update keymap.c
SneakboxKB Aug 18, 2020
b8f98ac
Update keyboards/sneakbox/aliceclone/readme.md
SneakboxKB Sep 1, 2020
d6bf6ef
Update keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
SneakboxKB Sep 1, 2020
b73915e
Update keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
SneakboxKB Sep 1, 2020
188490c
Update keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
SneakboxKB Sep 1, 2020
079de65
Update keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
SneakboxKB Sep 1, 2020
e22c5d8
Update keyboards/sneakbox/aliceclone/aliceclone.h
SneakboxKB Sep 1, 2020
dbd66c6
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Sep 1, 2020
08a405a
Update keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
SneakboxKB Sep 1, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions keyboards/sneakbox/aliceclone/aliceclone.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include "aliceclone.h"
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved

void keyboard_pre_init_kb() {
setPinOutput(D7);
setPinOutput(D6);
setPinOutput(D4);

keyboard_pre_init_user();
}

bool led_update_kb(led_t led_state) {
bool res = led_update_user(led_state);
if(res) {
writePin(D7, led_state.num_lock);
writePin(D6, led_state.caps_lock);
writePin(D4, led_state.scroll_lock);
}
return res;
}
27 changes: 27 additions & 0 deletions keyboards/sneakbox/aliceclone/aliceclone.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved

#include "quantum.h"

#define LAYOUT( \
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
K000, K001, K002, K003, K004, K005, K006, \
K010, K011, K012, K013, K014, K015, K016, K017, \
K020, K021, K022, K023, K024, K025, K026, \
K030, K031, K032, K033, K034, K035, K036, K037, \
K040, K041, K042, K043, K044, K045, K046, \
K050, K051, K052, K053, K054, K055, K056, \
K060, K061, K062, K063, K064, K065, K066, \
K070, K071, K072, K073, K074, K075, K076, K077, \
K081, K083, K085, K086, \
K091, K093, K097 \
) { \
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved
{ K000, K001, K002, K003, K004, K005, K006, KC_NO }, \
{ K010, K011, K012, K013, K014, K015, K016, K017 }, \
{ K020, K021, K022, K023, K024, K025, K026, KC_NO }, \
{ K030, K031, K032, K033, K034, K035, K036, K037 }, \
{ K040, K041, K042, K043, K044, K045, K046, KC_NO }, \
{ K050, K051, K052, K053, K054, K055, K056, KC_NO }, \
{ K060, K061, K062, K063, K064, K065, K066, KC_NO }, \
{ K070, K071, K072, K073, K074, K075, K076, K077 }, \
{ KC_NO, K081, KC_NO, K083, KC_NO, K085, K086, KC_NO }, \
{ KC_NO, K091, KC_NO, K093, KC_NO, KC_NO, KC_NO, K097 } \
}
54 changes: 54 additions & 0 deletions keyboards/sneakbox/aliceclone/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#pragma once
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID 0x5342
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER Sneakbox
#define PRODUCT AliceClone

/*Bootmagic boot button, set to topmost, leftmost key */
#define BOOTMAGIC_LITE_ROW 2
#define BOOTMAGIC_LITE_COLUMN 0

/* encoder */
/* #define NUMBER_OF_ENCODERS 1 */
#define ENCODERS_PAD_A { D3 }
#define ENCODERS_PAD_B { D2 }
#define ENCODER_RESOLUTION 1


/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 8

/* key matrix pins */
#define MATRIX_ROW_PINS { F1, E6, F4, B1, F5, B2, F6, B3, F7, B7 }
#define MATRIX_COL_PINS { F0, D0, C7, C6, B6, B5, B4, D1 }
#define UNUSED_PINS

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 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

/* prevent stuck modifiers */
#define PREVENT_STUCK_MODIFIERS

SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved

#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
17 changes: 17 additions & 0 deletions keyboards/sneakbox/aliceclone/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved
"keyboard_name": "Alice Clone",
"url": "https://sneakbox.design",
"maintainer": "mujimanic",
"width": 17.75,
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
"height": 5,
"layouts": {
"LAYOUT": {
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
"layout": [{"x":0, "y":0},{"x":1.25, "y":0},{"x":2.25, "y":0},{"x":3.25, "y":0},{"x":4.25, "y":0},{"x":5.25, "y":0},{"x":6.25, "y":0},{"x":7.25, "y":0},{"x":10, "y":0},{"x":11, "y":0},{"x":12, "y":0},{"x":13, "y":0},{"x":14, "y":0},{"x":15, "y":0},{"x":16, "y":0},{"x":17, "y":0},
{"x":0, "y":1},{"x":1.25, "y":1, "w":1.5},{"x":2.75, "y":1},{"x":3.75, "y":1},{"x":4.75, "y":1},{"x":5.75, "y":1},{"x":6.75, "y":1},{"x":7.75, "y":1},{"x":10.5, "y":1},{"x":11.5, "y":1},{"x":12.5, "y":1},{"x":13.5, "y":1},{"x":14.5, "y":1},{"x":15.5, "y":1},{"x":16.5, "y":1, "w":1.5},
{"x":0, "y":2},{"x":1.204987, "y":2.108189, "w":1.75},{"x":2.95260, "y":2.108294},{"x":4.141575, "y":2.015223, "r":12},{"x":5.119685, "y":2.223097, "r":12},{"x":6.096430, "y":2.430709, "r":12},{"x":7.072283, "y":2.638373, "r":12},{"x":9.167822, "y":2.845774, "r":-12},{"x":10.14593, "y":2.637848, "r":-12},{"x":11.12220, "y":2.430289, "r":-12},{"x":12.09848, "y":2.223150, "r":-12},{"x":13.26373, "y":2.108241},{"x":14.26194, "y":2.108346},{"x":15.25843, "y":2.108346, "w":2.25},
{"x":1.25, "y":3, "w":2.25},{"x":3.5, "y":3},{"x":4.5, "y":3},{"x":5.5, "y":3},{"x":6.5, "y":3},{"x":7.5, "y":3},{"x":9.25, "y":3},{"x":10.25, "y":3},{"x":11.25, "y":3},{"x":12.25, "y":3},{"x":13.25, "y":3},{"x":14.25, "y":3},{"x":15.25, "y":3, "w":1.75},{"x":17, "y":3},
{"x":1.25, "y":4, "w":1.5},{"x":4, "y":4, "w":1.5},{"x":5.5, "y":4, "w":2.25},{"x":7.75, "y":4},{"x":9.75, "y":4, "w":2.75},{"x":12.5, "y":4, "w":1.5},{"x":16.5, "y":4, "w":1.5}
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
]
}
}
}
46 changes: 46 additions & 0 deletions keyboards/sneakbox/aliceclone/keymaps/default/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include QMK_KEYBOARD_H
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved

// Defines names for use in layer keycodes and the keymap
enum layer_names {
_BASE,
_FN
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[_BASE] = LAYOUT(
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_BSPC,
KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_PGUP, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LGUI,
KC_LCTL, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_SPC, KC_RALT, KC_RCTL),

[_FN] = LAYOUT(
KC_TRNS, 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_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, 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_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RESET, 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_LEFT, KC_RGHT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};

void encoder_update_user(uint8_t index, bool clockwise)
{
if (index == 0)
{ /* First encoder */
drashna marked this conversation as resolved.
Show resolved Hide resolved
if (clockwise) {
tap_code(KC_DOWN);
}
else {
tap_code(KC_UP);
}
}
else if (index == 1)
{ /* Second encoder */
if (clockwise) {
tap_code(KC_DOWN);
}
else {
tap_code(KC_UP);
}
}
}
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
46 changes: 46 additions & 0 deletions keyboards/sneakbox/aliceclone/keymaps/via/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include QMK_KEYBOARD_H
noroadsleft marked this conversation as resolved.
Show resolved Hide resolved

// Defines names for use in layer keycodes and the keymap
enum layer_names {
_BASE,
_FN
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[_BASE] = LAYOUT(
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_BSPC,
KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_PGUP, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LGUI,
KC_LCTL, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_SPC, KC_RALT, KC_RCTL),

[_FN] = LAYOUT(
KC_TRNS, 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_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, 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_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
RESET, 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_LEFT, KC_RGHT,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};

void encoder_update_user(uint8_t index, bool clockwise)
{
if (index == 0)
{ /* First encoder */
if (clockwise) {
tap_code(KC_DOWN);
}
else {
tap_code(KC_UP);
}
}
else if (index == 1)
{ /* Second encoder */
if (clockwise) {
tap_code(KC_DOWN);
}
else {
tap_code(KC_UP);
}
}
}
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
1 change: 1 addition & 0 deletions keyboards/sneakbox/aliceclone/keymaps/via/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
VIA_ENABLE = yes
15 changes: 15 additions & 0 deletions keyboards/sneakbox/aliceclone/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Sneakbox Alice Clone PCB

![Sneakbox Alice Clone PCB](https://imgur.com/a/wcQgpJ7)
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved

An Alice-compatible PCB with hotswap, and pushbutton rotary encoder socket placed at the top left key position. Firmware covers all USB-connector variants of the Sneakbox Alice Clone PCB (Top USB-C, Bottom USB-C)

* Keyboard Maintainer: mujimanic
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved
* Hardware Supported: Any Alice-layout case.
* Hardware Availability: Retail
SneakboxKB marked this conversation as resolved.
Show resolved Hide resolved

Make example for this keyboard (after setting up your build environment):

make sneakbox/aliceclone: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).
23 changes: 23 additions & 0 deletions keyboards/sneakbox/aliceclone/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# MCU name
MCU = atmega32u4

# Bootloader selection
BOOTLOADER = atmel-dfu

# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # 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
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output
ENCODER_ENABLE = yes