Compare commits

..

35 Commits

Author SHA1 Message Date
Joel Challis
2dd47a3bf4 avoid 'Entering|Leaving directory' messages (#9061) 2020-05-14 23:17:17 +01:00
Conor Fischer
887c1c4e0e Fix bad key labels in ascii art (#9094) 2020-05-14 15:56:52 +10:00
Ryan
f66850bfd0 Improve stock bootloader list (#9067)
* Improve stock bootloader list

* Switch version numbers on USB64/128 bootloaders

* Unix line endings for PS2AVRGB bootloader

* Update PS2AVRGB bootloader to 1.0.1

* Also mention bootloader rule

* Didn't need to change the links
2020-05-13 19:32:43 -07:00
yiancar
632285c982 V-USB Interface reorder (#9090) 2020-05-14 10:24:18 +10:00
Zsolt Parragi
805f5cb72b One shot support for swap hands (#8590)
This commits add the SH_OS keycode, which works similarly to one shot
layers:
* while pressed, the keyboard is swapped
* if no keys were pressed while it was pressed, the next key press is
swapped

SH_OS also supports chaining with one shot layers:
OSL(x) + SH_OS + key interprets the key press on the oneshot layer.

The ONESHOT_TIMEOUT setting used by one shot keys and layers is also
used by oneshot swap hands. In the above chaining scenario the timeout
of the oneshot layer is reset when swap hands is activated.

Resolves #2682
2020-05-14 07:36:55 +10:00
Joshua Diamond
a8a8bf0ff3 Allow expanding from 8 to 32 RGB Lighting Layers (#8941)
* Allow 16 lighting layers

* Require #define RGBLIGHT_LAYERS_16 to enable 16 layers

* Override RGBLIGHT_MAX_LAYERS to set maximum number of lighting layers

* Enforce lower bound on RGBLIGHT_MAX_LAYERS

Co-Authored-By: Takeshi ISHII <2170248+mtei@users.noreply.github.com>

* Fix an error in the check for valid RGBLIGHT_MAX_LAYERS

* Don't use bitfield / PACKED, as it causes bloat

* Update documentation re: up to 32 lighting layers

* Run cformat

* Add note about increasing FW size in docs/config_options.md

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Remove no-longer-valid comment

* Add doc note that split sync will be slower

Co-authored-by: Takeshi ISHII <2170248+mtei@users.noreply.github.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-05-13 21:39:05 +01:00
Adrian
fadd3cb461 added murcielago keyboard (#8920)
* Squashed pull request for murcielago

* removed rotation prior to creating info.json
2020-05-13 21:29:11 +01:00
bottilabo
a41f973f75 optimize source code for size. reduce compiled binary size 292 bytes (#8428)
* optimize source code for size. reduce compiled binary size 292 bytes

* more size optimization
2020-05-14 06:22:27 +10:00
James Young
7abbc95cd6 Fix incorrect key sizes in Configurator (#9073)
* fix key size: exclusive/e6v2/le_bmc

* fix key size: exclusive/e6v2/oe_bmc

* fix key sizes: flx/lodestone

* fix key size: handwired/prime_exl

* fix key sizes: massdrop/ctrl
2020-05-13 20:00:37 +01:00
Hund
30a6f231bf [Keyboard] Added support for Aves 65 (#8880)
* First commit.

* Apply suggestions from code review

Co-Authored-By: Drashna Jaelre <drashna@live.com>
Co-Authored-By: Ryan <fauxpark@gmail.com>

* Update keyboards/aves65/rules.mk

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/aves65/aves65.h

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/aves65/keymaps/default/keymap.c

Co-Authored-By: Joel Challis <git@zvecr.com>

* Update keyboards/aves65/rules.mk

Co-Authored-By: Joel Challis <git@zvecr.com>

* Changes.

* Changes

* Changes

* Update keyboards/aves65/rules.mk

Co-authored-by: Joel Challis <git@zvecr.com>

Co-authored-by: Hund <hund@ubuntu.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2020-05-13 19:43:28 +01:00
Ryan
44ff14f290 Update Neo2 keymap (#9063) 2020-05-13 19:34:55 +01:00
Ryan
741c7d5eec Update Canadian Multilingual keymap and add sendstring LUT (#8786) 2020-05-13 19:34:31 +01:00
eniigmakeyboards
f3c30e80cc Updated rules.mk to allow for audio control in VIA (#9087) 2020-05-13 19:20:39 +01:00
floookay
d846660e00 fixed typo for clear lcd screen function in hd44780 docs (#9086)
* fixed typo for clear lcd screen function

brought to attention by #9085

* fixed typo for clear lcd screen function (ja docs)
2020-05-13 19:06:41 +01:00
Xyverz
774384ce31 Added defines for RAISE and LOWER (#9083)
I like being able to use layers. This fixes my screw-up from my last
code overhaul.
2020-05-13 10:59:47 +10:00
Alex Ong
361ac2f32a Optimization for scanning less layers. (#8311)
* Optimization for scanning less layers.

* Rename NUM_LAYERS to MAX_LAYER.
2020-05-11 01:04:38 +01:00
pabile
d15a60d2d3 [Keyboard] Add P40, P20 and P18 Keyboards by pabile (#8759)
* Add files via upload

* removed

* Add files via upload

* Rename pabile40.c to p40.c

* Rename pabile40.h to p40.h

* Add files via upload

* Update p40.c

* Update p40.h

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Updated readme file

* Updated readme file

* Add files via upload

* modified:   keyboards/pabile/p18/config.h
	modified:   keyboards/pabile/p18/keymaps/default/keymap.c
	modified:   keyboards/pabile/p18/p18.h
	modified:   keyboards/pabile/p18/rules.mk
	modified:   keyboards/pabile/p40/config.h
	modified:   keyboards/pabile/p40/keymaps/default/keymap.c

* config update

* Delete README.md.save

* Delete keymap.c.save

* Delete keymaps.c

* modified:   keyboards/pabile/p18/keymaps/default/keymap.c

* Update p18.h

* testing layout config

* Create info.json

* Create info.json

* Create readme.md

* Update readme.md

* Updated description

* Updated description

* Update config.h

updated vendor ID to 0000

* Update keymap.c

removed unnecessary comments

* Update keyboards/pabile/p18/p18.h

* Update keyboards/pabile/p18/p18.h

* Update p18.h

removed unnecessary comments

* Update keyboards/pabile/p18/rules.mk

* Update keyboards/pabile/p18/rules.mk

* Update config.h

updated vendor id and removed unnecessary comments

* Update keyboards/pabile/p40/info.json

* Update keyboards/pabile/p40/keymaps/default/keymap.c

* Update keyboards/pabile/p40/p40.h

* Update keyboards/pabile/p40/p40.h

* Update keyboards/pabile/p40/p40.h

* Update keyboards/pabile/p40/rules.mk

* Update keyboards/pabile/p40/rules.mk

* Added p20 macropad

* Update README.md

* Updated VID and PID

* Updated VID and PID

* Update rules.mk

* Update config.h

* Update config.h

* Update config.h

* Update keymap.c

* Replaced blank keys with KC_NO

* Update keyboards/pabile/p18/keymaps/default/keymap.c

* Update keyboards/pabile/p18/p18.h

* Update keyboards/pabile/p18/rules.mk

* Update keyboards/pabile/p20/keymaps/default/keymap.c

* Update keymap.c

* Update keymap.c

* Update keyboards/pabile/p20/rules.mk

* Update keyboards/pabile/p40/info.json

* Update keyboards/pabile/p20/p20.h

* Updated product ID

* Updated product ID

* Update keyboards/pabile/p20/config.h

* Update keyboards/pabile/p20/p20.h

* Update keyboards/pabile/p20/p20.h

* Update keyboards/pabile/p20/keymaps/default/keymap.c

* Update keyboards/pabile/p18/readme.md

* Update keyboards/pabile/p20/README.md

* Update keyboards/pabile/p20/rules.mk

* Update keyboards/pabile/p20/rules.mk

* Update keyboards/pabile/p20/rules.mk

* Update keyboards/pabile/p20/rules.mk

* Update keyboards/pabile/p40/README.md

* Update keyboards/pabile/p40/rules.mk

* Update keyboards/pabile/p40/rules.mk

* Update keyboards/pabile/p18/rules.mk

* Update keyboards/pabile/p18/rules.mk

* Update keyboards/pabile/p40/config.h

* Update keyboards/pabile/p40/config.h

* Update keyboards/pabile/p18/readme.md

* Changed to lowercase filename

* Rename README.md to readme.md

* Update keyboards/pabile/p18/rules.mk
2020-05-09 21:46:17 -07:00
Chuck Lauer Vose
73992c68d5 Add one-handed Viterbi layout for gaming (#8963)
* Add one-handed Viterbi layout for gaming

* fixes for pr feedback

* Update keyboards/keebio/viterbi/keymaps/vosechu/config.h

Co-authored-by: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-05-10 04:53:32 +01:00
Brian Mock
8ca4ed9a98 Fix off by one error with oled_write_raw_P (#9045) 2020-05-10 04:14:07 +01:00
Zach White
640d12d070 Improve security of avrdude by eliminating the use of well-known names. (#9026)
* Improve security by eliminating the use of well-known names.

* Add an additional $ so the shell expands $TMP1 and $TMP2

Co-authored-by: Joel Challis <git@zvecr.com>

Co-authored-by: Joel Challis <git@zvecr.com>
2020-05-10 04:08:13 +01:00
Xyverz
3beda5c16e [Keymap] Added MACLOCK macro (#9037)
* Added MACLOCK macro

Added my MACLOCK macro to my Atreus keymap.

* Updated comments & readme

Documented where in the layout I added the MACLOCK macro.
2020-05-09 19:21:32 -07:00
TheFourthCow
fb7fc54923 [Keymap] added shifted symbols support (#9059)
* added shifted symbols to default keymap
2020-05-09 19:06:44 -07:00
Nick Blyumberg
179c868059 [Keymap] Add nblyumberg 1upkeyboards super16 keymap (#8902)
* Updated with my super16 version for my keypad

* Added my folder to super16

* Set max LED brightness to 50%

* Added custom keycodes for enter/shift+enter and copy/paste on one key

* Fixed the boot up layer color

* Renamed folder

* Revert changes to root super16 files

* Update keymap config.h and rules.mk files

* Restore deleted 15game keymap files

* Corrected the hold keycode for CCCV

* Removed unnecessary comments

* Update keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c

Co-Authored-By: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/1upkeyboards/super16/keymaps/nblyumberg/config.h

Co-Authored-By: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c

Co-Authored-By: ridingqwerty <george.g.koenig@gmail.com>

* Rewriting the layer color functionality

* Revisions

* Fixed the layer switching

* Fixed the default layer color problem

* Added a function suggested by Drashna but it won't compile

* Cleaned up the code for PR

* Removed unnecessary define for layer colors

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>
2020-05-09 22:52:58 +01:00
James Young
7b11dcce10 Docs: fix links in feature_hd44780.md (#9053)
The referenced site was moved.
2020-05-09 22:47:11 +01:00
1m38
e2fa05c6d2 [Keymap] Add Chidori OLED-enabled sample keymap (#8446)
* create chidori/oled_sample keymap

* Implement OLED enabled keymap

* Update readme.md

* Update keyboards/chidori/keymaps/oled_sample/keymap.c

* Update keyboards/chidori/keymaps/oled_sample/keymap.c

* delete chidori:oled_sample/config.h

* use oled_write_ln_P to print layer state

* delete unnecessary include

* merge nested switches in oled_write_layer_state()
2020-05-09 10:48:17 -07:00
mechlovin
4c4009c0fd [Keyboard] add adelais PCB (#8945)
* add adelais PCB

* clean up

* merger

* update

* Update readme.md

* Update config.h

* update

* update

* move keymap folder

* Update info.json

* Update info.json

* Update info.json

Co-authored-by: vuhopkep <boy9x0@gmail.com>
2020-05-09 02:38:19 -07:00
QMK Bot
e7860d673b format code according to conventions [skip ci] 2020-05-09 09:31:49 +00:00
Joshua Diamond
2fe7e221ec New RGB Lighting effect: Twinkle (#8887)
* Add twinkle RGB Lighting effect

* 2nd twinkle algo - double-buffering

* Further refinement: Per-LED twinkle

* Add documentation for Twinkle RBG Lighting mode

* Bias twinkle saturation closer to the set value

* Fix whitespace
2020-05-09 01:56:16 -07:00
Joshua Diamond
e0f548085c Add ability to blink lighting layer for a specified duration (#8760)
* Implement momentarily blink of lighting layers

* Refactor spidey3 userspace to use rgb layer blink

* Remove un-necessary line from example in documentation

* Revert "Refactor spidey3 userspace to use rgb layer blink"

This reverts commit 831649bb68.

* Adds a missing bit of documentation about lighting layer blink

* Update docs/feature_rgblight.md per suggestions

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update docs/feature_rgblight.md per suggestions

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update docs/feature_rgblight.md per suggestions

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* cformat, as suggested

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-05-09 01:38:33 -07:00
Konstantin Đorđević
94fc32f431 Fix bug in UC_RMOD, add shift and audio support for UC_MOD/UC_RMOD(#8674)
* Invert UC_MOD/UC_RMOD direction when Shift is held

Also use MOD_MASK_SHIFT in process_rgb.c

* Allow audio to be played for UC_MOD, UC_RMOD keycodes as well

* Fix signedness bug in reverse input mode cycling

* Misc formatting in process_unicode_common.c

* Address clang-format issues

* Make decode_utf8 helper function file-local (static)
2020-05-09 01:22:02 -07:00
Andrew Dunai
1f7bbf279c [Keyboard] Added D48 keyboard (#8548)
* [Keyboard] Added D48 keyboard.

* Updated README.

* Cleanups.

* Moved d48 to handwired/

* Added link to build process album.

* Coding conventions cleanups.

* Added DS1307 RTC!

* Minor cleanups.

* Apply suggestions from code review

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Minor refactoring.

* Readme fix.

* Moved leftover keymap-specific code from keyboard space into keymap.

* Added encoder button pins to extra matrix row.

* Updated README, updated pinout & cleaned up the glcdfont

* Apply suggestions from code review

Co-Authored-By: Drashna Jaelre <drashna@live.com>

* Update config.h

* Apply suggestions from code review

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Added default keymap. Refactored existing keymap.

* Update keyboards/handwired/d48/README.md

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Apply suggestions from code review

Co-Authored-By: Joel Challis <git@zvecr.com>

* Minor alignment fix.

* Update keyboards/handwired/d48/glcdfont_d48.c

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Changes as per PR.

* Apply suggestions from code review

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-05-08 23:59:50 -07:00
milestogo
803610a284 [Keymap] initial user directory for milestogo + babblepaste (#7698)
* initial user directory

* fix missing endif in vi mode

* fix includes per drashna and a few typos. I have not tested the userspace keymap, it is just there to help keep the user space and keymap in sync

* move babblepaste docs to md format

* clean up block quotes

* TIL clang-format - miles2go userspace
2020-05-08 23:15:26 -07:00
OsciX
cd0edbb1fb [Keyboard] Shambles TKL (#8500)
* Add support for the Shambles TKL

* Fix Shambles files

* Add files via upload

* Fix Shambles again

* Delete shambles.h.h

* Delete shambles.c.c

* Add files via upload

* Delete Makefile

* Apply suggestions from code review

* Fix default layout to work with review

* Apply suggestions from code review

* Add info files

* Update readme.md

* Update keyboards/shambles/readme.md
2020-05-08 17:08:19 -07:00
Eriq M. Adams
6919772fb9 Add TENKI keyboard (#9029)
* Add TENKI keyboard

Add TENKI keyboard, default keymap and via keymap

* Minor Update Readme.md

Change description of hardware supported

* change layout name

change layout name from ortho_20 to ortho_5x4

* Fix invalid format in info.json

Fix invalid format in info.json

* Fix invalid format

* Fix formatting

Fix formatting tenki.h

* Fix formatting in keymap.c

Fix formatting in keymap.c

* Add new line at EOF info.json

Add new line at EOF

* Fix formatting

* Fix formatting

* Update rules.mk

Fix Formatting
2020-05-08 23:57:11 +01:00
tominabox1
fedd8e81d1 Add Le Chiffre keyboard (#8995)
* Initial

* update json, added basic oled config, updated matrix to correct rotary location

* disable oled by default

* Tuned oled for release

* Completed OLED function implementation
Correct spelling error in readme

* Fixed image in readme

* Should not be in this branch

* Incorporating recommended changes by zvecr

* Update keyboards/le_chiffre/info.json

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

* Update keyboards/le_chiffre/readme.md

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>

Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-05-08 23:54:55 +01:00
174 changed files with 8378 additions and 964 deletions

View File

@@ -29,6 +29,9 @@ $(info QMK Firmware $(QMK_VERSION))
endif
endif
# avoid 'Entering|Leaving directory' messages
MAKEFLAGS += --no-print-directory
ON_ERROR := error_occurred=1
BREAK_ON_ERRORS = no

View File

@@ -191,7 +191,12 @@ If you define these options you will enable the associated feature, which may in
* `#define RGBLIGHT_ANIMATIONS`
* run RGB animations
* `#define RGBLIGHT_LAYERS`
* Lets you define [lighting layers](feature_rgblight.md) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
* Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
* `#define RGBLIGHT_MAX_LAYERS`
* Defaults to 8. Can be expanded up to 32 if more [lighting layers](feature_rgblight.md?id=lighting-layers) are needed.
* Note: Increasing the maximum will increase the firmware size and slow sync on split keyboards.
* `#define RGBLIGHT_LAYER_BLINK`
* Adds ability to [blink](feature_rgblight.md?id=lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action).
* `#define RGBLED_NUM 12`
* number of LEDs
* `#define RGBLIGHT_SPLIT`

View File

@@ -1,6 +1,6 @@
# HD44780 LCD Displays
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
You can enable support for HD44780 Displays by setting the `HD44780_ENABLE` flag in your keyboards `rules.mk` to yes.
@@ -50,8 +50,8 @@ LCD_DISP_ON_CURSOR_BLINK : display on, cursor on flashing
````
This is best done in your keyboards `matrix_init_kb` or your keymaps `matrix_init_user`.
It is advised to clear the display before use.
To do so call `lcd_clrsrc()`.
To do so call `lcd_clrscr()`.
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)

View File

@@ -94,6 +94,7 @@ if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a n
|`RGBLIGHT_MODE_STATIC_GRADIENT`| 0,1,..,9 |Static gradient |
|`RGBLIGHT_MODE_RGB_TEST` | *None* |RGB Test |
|`RGBLIGHT_MODE_ALTERNATING` | *None* |Alternating |
|`RGBLIGHT_MODE_TWINKLE` | 0,1,2,3,4,5 |Twinkle |
Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration.
@@ -103,8 +104,8 @@ Note: For versions older than 0.6.117, The mode numbers were written directly. I
Use these defines to add or remove animations from the firmware. When you are running low on flash space, it can be helpful to disable animations you are not using.
|Define |Default |Description |
|------------------------------------|-------------|-------------------------------------------------------------------------------------|
|Define |Default |Description |
|------------------------------------|-------------|-------------------------------------------------------------------------|
|`RGBLIGHT_ANIMATIONS` |*Not defined*|Enable all additional animation modes. |
|`RGBLIGHT_EFFECT_ALTERNATING` |*Not defined*|Enable alternating animation mode. |
|`RGBLIGHT_EFFECT_BREATHING` |*Not defined*|Enable breathing animation mode. |
@@ -115,6 +116,7 @@ Use these defines to add or remove animations from the firmware. When you are ru
|`RGBLIGHT_EFFECT_RGB_TEST` |*Not defined*|Enable RGB test animation mode. |
|`RGBLIGHT_EFFECT_SNAKE` |*Not defined*|Enable snake animation mode. |
|`RGBLIGHT_EFFECT_STATIC_GRADIENT` |*Not defined*|Enable static gradient mode. |
|`RGBLIGHT_EFFECT_TWINKLE` |*Not defined*|Enable twinkle animation mode. |
### Effect and Animation Settings
@@ -131,6 +133,8 @@ The following options are used to tweak the various animations:
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
### Example Usage to Reduce Memory Footprint
1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
@@ -168,6 +172,9 @@ const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
// How long (in milliseconds) to wait between animation steps for each of the "Knight" animations
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
// How long (in milliseconds) to wait between animation steps for each of the "Twinkle" animations
const uint8_t RGBLED_TWINKLE_INTERVALS[] PROGMEM = {50, 25, 10};
// These control which hues are selected for each of the "Static gradient" modes
const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
```
@@ -177,6 +184,10 @@ const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
### Defining Lighting Layers :id=defining-lighting-layers
By default, 8 layers are possible. This can be expanded to as many as 32 by overriding the definition of `RGBLIGHT_MAX_LAYERS` in `config.h` (e.g. `#define RGBLIGHT_MAX_LAYERS 32`). Please note, if you use a split keyboard, you will need to flash both sides of the split after changing this. Also, increasing the maximum will increase the firmware size, and will slow sync on split keyboards.
To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently:
```c
@@ -211,8 +222,12 @@ void keyboard_post_init_user(void) {
rgblight_layers = my_rgb_layers;
}
```
Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
Finally, we enable and disable the lighting layers whenever the state of the keyboard changes:
### Enabling and disabling lighting layers :id=enabling-lighting-layers
Everything above just configured the definition of each lighting layer.
We can now enable and disable the lighting layers whenever the state of the keyboard changes:
```c
layer_state_t layer_state_set_user(layer_state_t state) {
@@ -228,7 +243,40 @@ bool led_update_user(led_t led_state) {
}
```
Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
### Lighting layer blink :id=lighting-layer-blink
By including `#define RGBLIGHT_LAYER_BLINK` in your `config.h` file you can turn a lighting
layer on for a specified duration. Once the specified number of milliseconds has elapsed
the layer will be turned off. This is useful, e.g., if you want to acknowledge some
action (e.g. toggling some setting):
```c
const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} );
const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} );
const rgblight_segment_t* const PROGMEM _rgb_layers[] =
RGBLIGHT_LAYERS_LIST( _yes_layer, _no_layer );
void keyboard_post_init_user(void) {
rgblight_layers = _rgb_layers;
}
// Note we user post_process_record_user because we want the state
// after the flag has been flipped...
void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case DEBUG:
rgblight_blink_layer(debug_enable ? 0 : 1, 500);
break;
case NK_TOGG:
case NK_ON:
case NK_OFF:
rgblight_blink_layer(keymap_config.nkro ? 0 : 1, 500);
break;
}
}
```
## Functions

View File

@@ -28,3 +28,4 @@ Note that the array indices are reversed same as the matrix and the values are o
|`SH_MOFF` |Momentarily turns off swap. |
|`SH_TG` |Toggles swap on and off with every key press. |
|`SH_TT` |Toggles with a tap; momentary when held. |
|`SH_OS` |One shot swap hands: toggles while pressed or until next key press. |

View File

@@ -115,12 +115,18 @@ The simplest and quickest way to get things back to normal is to flash only a bo
You can find the stock bootloaders in the [`util/` folder](https://github.com/qmk/qmk_firmware/tree/master/util). Be sure to flash the correct bootloader for your chip:
* [`atmega32u4`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32u4_1_0_0.hex) - Most keyboards, Planck Rev 1-5, Preonic Rev 1-2
* [`Pro Micro`](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro16.hex) - The default bootloader for Pro Micro controllers
* [`at90usb1286`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb128x_1_0_1.hex) - Planck Light Rev 1
* [`atmega32a`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32a_1_0_0.hex) - jj40, and other V-USB/ps2avrGB keyboards
* **Atmel DFU**
* [ATmega16U4](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega16u4_1.0.1.hex)
* [ATmega32U4](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32u4_1.0.0.hex)
* [AT90USB64](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb64_1.0.0.hex)
* [AT90USB128](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb128_1.0.1.hex)
* **Caterina**
* [Pro Micro (5V/16MHz)](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro16.hex)
* [Pro Micro (3.3V/8MHz)](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro8.hex)
* **BootloadHID (PS2AVRGB)**
* [ATmega32A](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex)
If you're not sure what your board uses, look in the `rules.mk` file for the keyboard in QMK. The `MCU =` line will have the value you need. It may differ between different versions of the board.
If you're not sure what your board uses, look in the `rules.mk` file for the keyboard in QMK. The `MCU` and `BOOTLOADER` lines will have the value you need. It may differ between different versions of the board.
### Production Techniques

View File

@@ -55,7 +55,7 @@ LCD_DISP_ON_CURSOR_BLINK : ディスプレイオン、点滅カーソル
````
これはキーボードの `matrix_init_kb` またはキーマップの `matrix_init_user` で行うのが最適です。
使用前にディスプレイをクリアすることをお勧めします。
そのためには、`lcd_clrsrc()` を呼びます。
そのためには、`lcd_clrscr()` を呼びます。
ディスプレイに何かを表示するには、最初に `lcd_gotoxy(column, line)` を呼びます。最初の行の先頭に移動するには、`lcd_gotoxy(0, 0)` を呼び出し、その後 `lcd_puts("example string")` を使って文字列を出力します。

View File

@@ -531,6 +531,7 @@ See also: [Swap Hands](feature_swap_hands.md)
|`SH_MOFF` |Momentarily turns off swap. |
|`SH_TG` |Toggles swap on and off with every key press. |
|`SH_TT` |Toggles with a tap; momentary when held. |
|`SH_OS` |One shot swap hands: toggle while pressed or until next key press. |
## Unicode Support :id=unicode-support

View File

@@ -479,7 +479,7 @@ void oled_write_ln_P(const char *data, bool invert) {
void oled_write_raw_P(const char *data, uint16_t size) {
if (size > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE;
for (uint16_t i = 0; i < size; i++) {
uint8_t c = pgm_read_byte(++data);
uint8_t c = pgm_read_byte(data++);
if (oled_buffer[i] == c) continue;
oled_buffer[i] = c;
oled_dirty |= (1 << (i / OLED_BLOCK_SIZE));

View File

@@ -0,0 +1,13 @@
#pragma once
// Time out one shot layers after 3 seconds
#define ONESHOT_TIMEOUT 3000
#define RGBLED_NUM 16
// Undef and redefine default brightness to half of 255
#undef RGBLIGHT_LIMIT_VAL
#define RGBLIGHT_LIMIT_VAL 128
#define TAPPING_TERM 200

View File

@@ -0,0 +1,127 @@
#include QMK_KEYBOARD_H
uint16_t copy_paste_timer;
uint16_t enter_timer;
extern rgblight_config_t rgblight_config;
// Define custom keycodes
enum my_keycodes {
KC_CCCV = SAFE_RANGE,
KC_2ENTER
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//Layer 0 - Base Layer (F13 to F24, and One Shot Layer 1,2,3,4)
[0] = LAYOUT_ortho_4x4(
KC_F13, KC_F14, KC_F15, KC_F16,
KC_F17, KC_CCCV, KC_F19, KC_F20,
KC_F21, KC_F22, KC_F23, KC_2ENTER,
OSL(1), OSL(2), OSL(3), TG(4) //Transparent to let you go between layers
),
[1] = LAYOUT_ortho_4x4(
LALT(KC_F13), LALT(KC_F14), LALT(KC_F15), LALT(KC_F16),
LALT(KC_F17), LALT(KC_F18), LALT(KC_F19), LALT(KC_F20),
LALT(KC_F21), LALT(KC_F22), LALT(KC_F23), LALT(KC_F24),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
),
//Layer 2 - Shift + Function Key Layer
[2] = LAYOUT_ortho_4x4(
LSFT(KC_F13), LSFT(KC_F14), LSFT(KC_F15), LSFT(KC_F16),
LSFT(KC_F17), LSFT(KC_F18), LSFT(KC_F19), LSFT(KC_F20),
LSFT(KC_F21), LSFT(KC_F22), LSFT(KC_F23), LSFT(KC_F24),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
),
//Layer 3 - Control + Function Key
[3] = LAYOUT_ortho_4x4(
LCTL(KC_F13), LCTL(KC_F14), LCTL(KC_F15), LCTL(KC_F16),
LCTL(KC_F17), LCTL(KC_F18), LCTL(KC_F19), LCTL(KC_F20),
LCTL(KC_F21), LCTL(KC_F22), LCTL(KC_F23), LCTL(KC_F24),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
),
//Layer 4 - Keyboard Lights. Programming and Special Functions
[4] = LAYOUT_ortho_4x4(
KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLU,
RGB_TOG, RGB_MOD, RGB_RMOD, KC_MUTE,
TO(0), RESET, EEP_RST, KC_VOLD,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_CCCV: // One key copy/paste
if (record->event.pressed) {
copy_paste_timer = timer_read();
} else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
tap_code16(LCTL(KC_C));
} else { // Tap, paste
tap_code16(LCTL(KC_V));
}
} return true;
case KC_2ENTER:
if (record->event.pressed) {
enter_timer = timer_read();
} else {
if (timer_elapsed(enter_timer) > TAPPING_TERM) { // Hold, shift+enter
tap_code16(LSFT(KC_ENTER));
} else { // Tap, enter
tap_code16(KC_F24);
}
}
return true;
default:
return true;
}
}
void keyboard_post_init_user(void) {
//Enable the LED layers
layer_state_set_user(layer_state);
}
layer_state_t layer_state_set_user(layer_state_t state) {
rgblight_sethsv_noeeprom(HSV_WHITE);
switch(get_highest_layer(state)) {
case 1:
// Green
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_GREEN);
break;
case 2:
// Red
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_RED);
break;
case 3:
// Blue
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom(HSV_BLUE);
break;
case 4:
// Orange
rgblight_enable_noeeprom();
// rgblight_sethsv_noeeprom(HSV_PURPLE);
rgblight_sethsv_noeeprom(HSV_ORANGE);
break;
default:
// White
//Read RGB Light State
rgblight_config.raw = eeconfig_read_rgblight();
//If enabled, set white
if (rgblight_config.enable) {
rgblight_sethsv_noeeprom(HSV_WHITE);
} else { //Otherwise go back to disabled
rgblight_disable_noeeprom();
}
break;
}
return state;
}

View File

@@ -0,0 +1,6 @@
# Nick B's Super16 keymap
A modification of the default keymap to include layer indicators with RGB
* Added a time out of 3 seconds to 1 shot layers
* Reduced brightness to half to reduce power draw
* Added a one key copy/paste keycode

View File

@@ -0,0 +1,2 @@
RGB_MATRIX_ENABLE = no
RGBLIGHT_ENABLE = yes

View File

@@ -4,8 +4,6 @@
#include QMK_KEYBOARD_H
extern keymap_config_t keymap_config;
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
@@ -41,6 +39,7 @@ enum planck_keycodes {
#define ADJUST MO(_ADJUST)
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
#define MACLOCK LGUI(LCTL(KC_Q))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Dvorak Layer
@@ -119,13 +118,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|------+------+------+------+------| || |------+------+------+------+------|
| ~ | | | | Del |------'`------| Ins | | | | |
| ~ | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'*/
[_LOWER] = LAYOUT(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
KC_CAPS, _______, KC_UP, _______, KC_HOME, KC_PGUP, _______, KC_PLUS, KC_LCBR, KC_RCBR,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______,
KC_TILD, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______
KC_TILD, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, MACLOCK
),
/* RAISE Layer
@@ -136,13 +135,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|------+------+------+------+------| || |------+------+------+------+------|
| ` | | | | Del |------'`------| Ins | | | | |
| ` | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'*/
[_RAISE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 ,
KC_CAPS, _______, KC_UP, _______, KC_HOME, KC_PGUP, _______, KC_EQL, KC_LBRC, KC_RBRC,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, _______,
KC_GRV, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______
KC_GRV, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, MACLOCK
),
/* ADJUST Layer
@@ -190,4 +189,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return false;
}
return true;
}
}

View File

@@ -77,7 +77,7 @@ Control.
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|------+------+------+------+------| || |------+------+------+------+------|
| ~ | | | | Del |------'`------| Ins | | | | |
| ~ | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'
@@ -90,7 +90,7 @@ Control.
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|------+------+------+------+------| || |------+------+------+------+------|
| ` | | | | Del |------'`------| Ins | | | | |
| ` | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'
### Layer 6: ADJUST layer

View File

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

19
keyboards/aves65/aves65.h Normal file
View File

@@ -0,0 +1,19 @@
#pragma once
#include "quantum.h"
// readability
#define ___ KC_NO
#define LAYOUT_65_iso_blocker( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
k40, k41, k42, k46, k4a, k4b, k4c, k4d, k4e \
) \
{ \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, ___, k1e }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
{ k40, k41, k42, ___, ___, ___, k46, ___, ___, ___, k4a, k4b, k4c, k4d, k4e } \
}

61
keyboards/aves65/config.h Normal file
View File

@@ -0,0 +1,61 @@
/*
Copyright 2019 I/O Keyboards <hello@iokeyboards.eu>
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 0x9991
#define PRODUCT_ID 0x9038
#define DEVICE_VER 0x0001
#define MANUFACTURER I/O Keyboards
#define PRODUCT Aves65
#define DESCRIPTION A 65% keyboard with underglow.
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
// ROWS: Top to bottom, COLS: Left to right
#define MATRIX_ROW_PINS {D4,D6,D7,B4,E6}
#define MATRIX_COL_PINS {D0,D1,D2,D3,D5,B5,F0,F1,F4,F5,F6,F7,C7,C6,B6}
#define UNUSED_PINS {B7,B1,B2,B3}
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* 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
/* Backlight configuration
*/
#define RGB_DI_PIN B0
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 9
#define QMK_ESC_OUTPUT D0 // usually COL
#define QMK_ESC_INPUT D4 // usually ROW

View File

@@ -0,0 +1,85 @@
{
"keyboard_name": "Aves65",
"url": "",
"maintainer": "Hund",
"width": 16,
"height": 5,
"layouts": {
"LAYOUT_65_iso_blocker": {
"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":"k07", "x":7, "y":0},
{"label":"k08", "x":8, "y":0},
{"label":"k09", "x":9, "y":0},
{"label":"k0a", "x":10, "y":0},
{"label":"k0b", "x":11, "y":0},
{"label":"k0c", "x":12, "y":0},
{"label":"k0d", "x":13, "y":0, "w":2},
{"label":"k0e", "x":15, "y":0},
{"label":"k10", "x":0, "y":1, "w":1.5},
{"label":"k11", "x":1.5, "y":1},
{"label":"k12", "x":2.5, "y":1},
{"label":"k13", "x":3.5, "y":1},
{"label":"k14", "x":4.5, "y":1},
{"label":"k15", "x":5.5, "y":1},
{"label":"k16", "x":6.5, "y":1},
{"label":"k17", "x":7.5, "y":1},
{"label":"k18", "x":8.5, "y":1},
{"label":"k19", "x":9.5, "y":1},
{"label":"k1a", "x":10.5, "y":1},
{"label":"k1b", "x":11.5, "y":1},
{"label":"k1c", "x":12.5, "y":1},
{"label":"k1e", "x":15, "y":1},
{"label":"k20", "x":0, "y":2, "w":1.75},
{"label":"k21", "x":1.75, "y":2},
{"label":"k22", "x":2.75, "y":2},
{"label":"k23", "x":3.75, "y":2},
{"label":"k24", "x":4.75, "y":2},
{"label":"k25", "x":5.75, "y":2},
{"label":"k26", "x":6.75, "y":2},
{"label":"k27", "x":7.75, "y":2},
{"label":"k28", "x":8.75, "y":2},
{"label":"k29", "x":9.75, "y":2},
{"label":"k2a", "x":10.75, "y":2},
{"label":"k2b", "x":11.75, "y":2},
{"label":"k2c", "x":12.75, "y":2},
{"label":"k2d", "x":13.75, "y":1, "w":1.25, "h":2},
{"label":"k2e", "x":15, "y":2},
{"label":"k30", "x":0, "y":3, "w":1.25},
{"label":"k31", "x":1.25, "y":3},
{"label":"k32", "x":2.25, "y":3},
{"label":"k33", "x":3.25, "y":3},
{"label":"k34", "x":4.25, "y":3},
{"label":"k35", "x":5.25, "y":3},
{"label":"k36", "x":6.25, "y":3},
{"label":"k37", "x":7.25, "y":3},
{"label":"k38", "x":8.25, "y":3},
{"label":"k39", "x":9.25, "y":3},
{"label":"k3a", "x":10.25, "y":3},
{"label":"k3b", "x":11.25, "y":3},
{"label":"k3c", "x":12.25, "y":3, "w":1.75},
{"label":"k3d", "x":14, "y":3},
{"label":"k3e", "x":15, "y":3},
{"label":"k40", "x":0, "y":4, "w":1.25},
{"label":"k41", "x":1.25, "y":4, "w":1.25},
{"label":"k42", "x":2.5, "y":4, "w":1.25},
{"label":"k46", "x":3.75, "y":4, "w":6.25},
{"label":"k4a", "x":10, "y":4, "w":1.25},
{"label":"k4b", "x":11.25, "y":4, "w":1.25},
{"label":"k4c", "x":13, "y":4},
{"label":"k4d", "x":14, "y":4},
{"label":"k4e", "x":15, "y":4}
]
}
}
}

View File

@@ -0,0 +1,18 @@
#include QMK_KEYBOARD_H
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _MA 0
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MA] = LAYOUT_65_iso_blocker(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_PGUP,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT)
};

View File

@@ -0,0 +1,15 @@
# Aves65
![Aves65](https://i.imgur.com/H7x8an7l.jpg)
A 65% hotswap keyboard with RGB underglow.
* Keyboard Maintainer: [Hund](https://github.com/Hund)
* Hardware Supported: Aves65
* Hardware Availability: none (yet)
Make example for this keyboard (after setting up your build environment):
make aves65: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).

34
keyboards/aves65/rules.mk Normal file
View File

@@ -0,0 +1,34 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = qmk-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 = yes # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support
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
LAYOUTS = 65_iso_blocker

View File

@@ -0,0 +1,217 @@
/* Copyright 2019 ENDO Katsuhiro <ka2hiro@kagizaraya.jp>
* Copyright 2020 Masaya Uno
*
* 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
#include "board.h"
enum layer_number {
_QWERTY,
_COLEMAK,
_DVORAK,
_LOWER,
_RAISE,
_ADJUST,
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
QWERTY = SAFE_RANGE,
COLEMAK,
DVORAK,
};
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
#define ADJUST MO(_ADJUST)
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------. ,-----------------------------------------.
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
* `-----------------------------------------' `-----------------------------------------'
*/
[_QWERTY] = LAYOUT(
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_LCTL, 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,
ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
/* Colemak
* ,-----------------------------------------. ,-----------------------------------------.
* | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
* `-----------------------------------------' `-----------------------------------------'
*/
[_COLEMAK] = LAYOUT(
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
KC_LCTL, 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,
ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
/* Dvorak
* ,-----------------------------------------. ,-----------------------------------------.
* | Tab | ' | , | . | P | Y | | F | G | C | R | L | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
* `-----------------------------------------' `-----------------------------------------'
*/
[_DVORAK] = LAYOUT(
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
KC_LCTL, 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,
ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
/* Lower
* ,-----------------------------------------. ,-----------------------------------------.
* | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | - | _ | + | { | } | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | | | | Home | End | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | | | 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_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
/* Raise
* ,-----------------------------------------. ,-----------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | | | 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_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_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
/* Adjust (Lower + Raise)
* ,-----------------------------------------. ,-----------------------------------------.
* | | Reset| | | | | | |Qwerty|Colemk|Dvorak| | Ins |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Caps | | | | | Mac | | Win | - | = |Print |ScLock|Pause |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | | | | | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | KANA | | Home |PageDn|PageUp| End |
* `-----------------------------------------' `-----------------------------------------'
*/
[_ADJUST] = LAYOUT(
_______, RESET, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS,
KC_CAPS, _______, _______, _______, _______, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
)
};
// clang-format on
layer_state_t layer_state_set_user(layer_state_t state) {
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
}
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;
case COLEMAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_COLEMAK);
}
return false;
case DVORAK:
if (record->event.pressed) {
set_single_persistent_default_layer(_DVORAK);
}
return false;
}
return true;
}
bool led_update_user(led_t led_state) {
board_set_led_by_index(0, LED_YELLOW, led_state.caps_lock);
board_set_led_by_index(1, LED_YELLOW, led_state.scroll_lock);
return false;
}
#ifdef OLED_DRIVER_ENABLE
void oled_write_layer_state(void) {
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state | default_layer_state)) {
case _QWERTY:
oled_write_ln_P(PSTR("Qwerty"), false);
break;
case _COLEMAK:
oled_write_ln_P(PSTR("Colemak"), false);
break;
case _DVORAK:
oled_write_ln_P(PSTR("Dvorak"), false);
break;
case _LOWER:
oled_write_ln_P(PSTR("Lower"), false);
break;
case _RAISE:
oled_write_ln_P(PSTR("Raise"), false);
break;
case _ADJUST:
oled_write_ln_P(PSTR("Adjust"), false);
break;
default:
oled_write_ln_P(PSTR("Undef"), false);
break;
}
}
void oled_task_user(void) {
// If you want to change the display of OLED, you need to change here
oled_write_layer_state();
}
#endif

View File

@@ -0,0 +1 @@
# An OLED enabled keymap based on the default keymap for chidori

View File

@@ -0,0 +1,2 @@
# Enable SSD1306 OLED
OLED_DRIVER_ENABLE = yes

View File

@@ -15,6 +15,14 @@
extern const unsigned char font[] PROGMEM;
#ifndef OLED_BLANK_CHAR
#define OLED_BLANK_CHAR ' '
#endif
#ifndef OLED_BITS_FILTER
#define OLED_BITS_FILTER
#endif
// Set this to 1 to help diagnose early startup problems
// when testing power-on with ble. Turn it off otherwise,
// as the latency of printing most of the debug info messes
@@ -26,8 +34,11 @@ extern const unsigned char font[] PROGMEM;
//#define BatteryUpdateInterval 10000 /* milliseconds */
// 'last_flush' is declared as uint16_t,
// so this must be less than 65535
// so this must be less than 65535
#ifndef ScreenOffInterval
#define ScreenOffInterval 60000 /* milliseconds */
#endif
#if DEBUG_TO_SCREEN
static uint8_t displaying;
#endif
@@ -61,38 +72,32 @@ done:
return res;
}
// Write 2-byte command sequence.
// Returns true on success
static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) {
if (!_send_cmd1(cmd)) {
return false;
}
return _send_cmd1(opr);
}
// Write 3-byte command sequence.
// Returns true on success
static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
if (!_send_cmd1(cmd)) {
return false;
}
if (!_send_cmd1(opr1)) {
return false;
}
return _send_cmd1(opr2);
}
#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;}
#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;}
#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;}
#define send_cmds(c) if (!_send_cmds(c,sizeof(c))) {goto done;}
#define cmd1(X) X
#define cmd2(X,Y) X,Y
#define cmd3(X,Y,Z) X,Y,Z
static bool _send_cmds(const uint8_t* p,uint8_t sz) {
for(uint8_t i=sz;i;i--) {
send_cmd1( pgm_read_byte(p++) );
}
return true;
done:
return false;
}
#define SEND_CMDS(...) {static const uint8_t _cmds[] PROGMEM = { __VA_ARGS__,0 };send_cmds(_cmds);}
static void clear_display(void) {
matrix_clear(&display);
// Clear all of the display bits (there can be random noise
// in the RAM on startup)
send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1);
send_cmd3(ColumnAddr, 0, DisplayWidth - 1);
SEND_CMDS(
cmd3(PageAddr, 0, (DisplayHeight / 8) - 1),
cmd3(ColumnAddr, 0, DisplayWidth - 1)
);
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
@@ -101,8 +106,8 @@ static void clear_display(void) {
// Data mode
goto done;
}
for (uint8_t row = 0; row < MatrixRows; ++row) {
for (uint8_t col = 0; col < DisplayWidth; ++col) {
for (uint8_t row = MatrixRows;row; row--) {
for (uint8_t col = DisplayWidth; col; col--) {
i2c_master_write(0);
}
}
@@ -130,38 +135,47 @@ bool iota_gfx_init(bool rotate) {
bool success = false;
i2c_master_init();
send_cmd1(DisplayOff);
send_cmd2(SetDisplayClockDiv, 0x80);
send_cmd2(SetMultiPlex, DisplayHeight - 1);
send_cmd2(SetDisplayOffset, 0);
send_cmd1(SetStartLine | 0x0);
send_cmd2(SetChargePump, 0x14 /* Enable */);
send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
SEND_CMDS(
cmd1(DisplayOff),
cmd2(SetDisplayClockDiv, 0x80),
cmd2(SetMultiPlex, DisplayHeight - 1),
cmd2(SetDisplayOffset, 0),
cmd1(SetStartLine | 0x0),
cmd2(SetChargePump, 0x14 /* Enable */),
cmd2(SetMemoryMode, 0 /* horizontal addressing */)
);
if(rotate){
// the following Flip the display orientation 180 degrees
send_cmd1(SegRemap);
send_cmd1(ComScanInc);
SEND_CMDS(
cmd1(SegRemap),
cmd1(ComScanInc)
);
}else{
// Flips the display orientation 0 degrees
send_cmd1(SegRemap | 0x1);
send_cmd1(ComScanDec);
SEND_CMDS(
cmd1(SegRemap | 0x1),
cmd1(ComScanDec)
);
}
send_cmd2(SetComPins, 0x2);
send_cmd2(SetContrast, 0x8f);
send_cmd2(SetPreCharge, 0xf1);
send_cmd2(SetVComDetect, 0x40);
send_cmd1(DisplayAllOnResume);
send_cmd1(NormalDisplay);
send_cmd1(DeActivateScroll);
send_cmd1(DisplayOn);
send_cmd2(SetContrast, 0); // Dim
SEND_CMDS(
#ifdef SSD1306_128X64
cmd2(SetComPins, 0x12),
#else
cmd2(SetComPins, 0x2),
#endif
cmd2(SetContrast, 0x8f),
cmd2(SetPreCharge, 0xf1),
cmd2(SetVComDetect, 0x40),
cmd1(DisplayAllOnResume),
cmd1(NormalDisplay),
cmd1(DeActivateScroll),
cmd1(DisplayOn),
cmd2(SetContrast, 0) // Dim
);
clear_display();
success = true;
@@ -205,7 +219,7 @@ void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
memmove(&matrix->display[0], &matrix->display[1],
MatrixCols * (MatrixRows - 1));
matrix->cursor = &matrix->display[MatrixRows - 1][0];
memset(matrix->cursor, ' ', MatrixCols);
memset(matrix->cursor, OLED_BLANK_CHAR, MatrixCols);
}
}
@@ -218,7 +232,7 @@ void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols;
while (cursor_col++ < MatrixCols) {
matrix_write_char_inner(matrix, ' ');
matrix_write_char_inner(matrix, OLED_BLANK_CHAR);
}
return;
}
@@ -231,17 +245,15 @@ void iota_gfx_write_char(uint8_t c) {
}
void matrix_write(struct CharacterMatrix *matrix, const char *data) {
const char *end = data + strlen(data);
while (data < end) {
while (*data) {
matrix_write_char(matrix, *data);
++data;
}
}
void matrix_write_ln(struct CharacterMatrix *matrix, const char *data) {
char data_ln[strlen(data)+2];
snprintf(data_ln, sizeof(data_ln), "%s\n", data);
matrix_write(matrix, data_ln);
matrix_write(matrix, data);
matrix_write(matrix, "\n");
}
void iota_gfx_write(const char *data) {
@@ -264,7 +276,7 @@ void iota_gfx_write_P(const char *data) {
}
void matrix_clear(struct CharacterMatrix *matrix) {
memset(matrix->display, ' ', sizeof(matrix->display));
memset(matrix->display, OLED_BLANK_CHAR, sizeof(matrix->display));
matrix->cursor = &matrix->display[0][0];
matrix->dirty = true;
}
@@ -281,8 +293,10 @@ void matrix_render(struct CharacterMatrix *matrix) {
#endif
// Move to the home position
send_cmd3(PageAddr, 0, MatrixRows - 1);
send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
SEND_CMDS(
cmd3(PageAddr, 0, MatrixRows - 1),
cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1)
);
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
@@ -298,7 +312,7 @@ void matrix_render(struct CharacterMatrix *matrix) {
for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) {
uint8_t colBits = pgm_read_byte(glyph + glyphCol);
i2c_master_write(colBits);
i2c_master_write(colBits OLED_BITS_FILTER);
}
// 1 column of space between chars (it's not included in the glyph)
@@ -331,7 +345,7 @@ void iota_gfx_task(void) {
force_dirty = false;
}
if (timer_elapsed(last_flush) > ScreenOffInterval) {
if (ScreenOffInterval !=0 && timer_elapsed(last_flush) > ScreenOffInterval) {
iota_gfx_off();
}
}

View File

@@ -16,7 +16,7 @@ BOOTLOADER = atmel-dfu
#
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = no # Audio control and System control
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

View File

@@ -6,7 +6,7 @@
"height": 5,
"layouts": {
"LAYOUT_all": {
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.26}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_ansi": {
@@ -21,4 +21,4 @@
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"x":11, "y":4, "w":1.5}, {"x":12.5, "y":4}, {"x":13.5, "y":4, "w":1.5}]
}
}
}
}

View File

@@ -6,7 +6,7 @@
"height": 5,
"layouts": {
"LAYOUT_all": {
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.26}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_ansi": {
@@ -21,4 +21,4 @@
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"x":11, "y":4, "w":1.5}, {"x":12.5, "y":4}, {"x":13.5, "y":4, "w":1.5}]
}
}
}
}

View File

@@ -68,7 +68,7 @@
{"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
{"label":"K3E (F1,C6)", "x":14, "y":3},
{"label":"K3F (F1,C7)", "x":15, "y":3},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.225},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
{"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
{"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
{"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
@@ -139,7 +139,7 @@
{"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
{"label":"K3E (F1,C6)", "x":14, "y":3},
{"label":"K3F (F1,C7)", "x":15, "y":3},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.225},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
{"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
{"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
{"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
@@ -211,7 +211,7 @@
{"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
{"label":"K3E (F1,C6)", "x":14, "y":3},
{"label":"K3F (F1,C7)", "x":15, "y":3},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.225},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
{"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
{"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
{"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
@@ -283,7 +283,7 @@
{"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
{"label":"K3E (F1,C6)", "x":14, "y":3},
{"label":"K3F (F1,C7)", "x":15, "y":3},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.225},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
{"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
{"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
{"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
@@ -356,7 +356,7 @@
{"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
{"label":"K3E (F1,C6)", "x":14, "y":3},
{"label":"K3F (F1,C7)", "x":15, "y":3},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.225},
{"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
{"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
{"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
{"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},

View File

@@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT(
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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_UNDS, KC_PLUS,
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_LBRC, KC_RBRC,
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLU, KC_VOLD, KC_MNXT),
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, KC_PLUS,
KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_LBRC, KC_RBRC,
RESET, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT),
};

View File

@@ -0,0 +1,87 @@
# D48
![Proton C based handwired 40% keyboard](https://i.imgur.com/2wCYuno.jpg)
A Proton C based handwired 48 key keyboard with 2 rotary encoders, I2C OLED, WS2812 strip, buzzer & clock!
- Keyboard Maintainer: Andrew Dunai
- Hardware Supported: Proton C handwired
Make example for this keyboard (after setting up your build environment):
make handwired/d48:default
## Details
- Proton C based handwired keyboard
- 2x custom 1.25mm stainless steel plates
- Kailh Choc White (clicky)
- 2x rotary encoders
- 0.91" 128x32 I<sup>2</sup>C OLED
- Small buzzer mounted inside (still waiting for the AST1109MLTRQ boys)
- WS2812 strip (14 LEDs)
- DS1307 I<sup>2</sup>C module real-time clock
Build process: [album](https://imgur.com/gallery/zZZGdDw)
## Pinout
![D48 pinout](https://imgur.com/QoStCvD.jpg)
## Challenges
I'm very happy with the result, but at some point Proton C was driving me nuts.
I did a lot of trial and error during assembly & programming.
There were a lot of *yet* undocumented caveats,
so I'll outline them here so that you guys can avoid the same issues I had.
## Matrix & encoders
Although this is a 48-key board with a 12-col & 4-row matrix, I've decided to add an extra row above the first one
to make my matrix 12x5 and wire encoders' push buttons as 2 extra keys, thus making it a total of 50 (12x4 + 2 encoders).
I used 2 columns (9 & 12) for those buttons.
So, a first row actually has 2 buttons on columns 9 & 12 (because encoders are located near those columns).
Encoders' push buttons are also configured via QMK's keymap.
Check out the `d48.h` & `config.h` for pins used & keymap macro definition.
## I<sup>2</sup>C/OLED
Most of the stuff worked out of the box, except me choosing the right pins for my OLED.
On the Proton C pinout, there are 3 labels for I<sup>2</sup>C and for some reason
there are 2 pairs of SDA/SCL for I<sup>2</sup>C<sup>1</sup> channel: `B8`/`B9` (rear left side) and `B6`/`B7` (rear right side).
I'm not sure if this is a mistake or if I was doing something wrong. So initially I picked `B8`/`B9`
which were not working. When I switched to B6/B7, things worked like a charm.
Later I used B9 for matrix row. No issues so far.
Oh, and by the way, while using `B8`/`B9`, keyboard was sometimes *swallowing* quick keypresses.
I believe this was due to I(2)C timeouts (because incorrect pins were used for OLED).
## Buzzer
It turns out once you switch on `AUDIO_ENABLE`, you cannot use A4 & A5 because they interfere with the buzzer.
My guess is that buzzer uses DAC channels (not sure why both).
I couldn't find this in documentation. Honestly, Proton C has almost zero documentation and this was
the biggest challenge. Anyway, apart from almost going crazy from those challenges, I really liked it!
## RGB
I used pin `A15` for my WS28128 RGB strip.
## D1307 real-time clock
Connecting DS1307 RTC was a piece of cake: same I<sup>2</sup> pins as OLED (SDA/SCL), GND to GND and power to Proton C VUSB pin (5v).
## Other issues
- `B5` could not be used for matrix.
- `TAP_CODE_DELAY` had to be increased to 10 to fix `tap_code(KC_VOLU/KC_VOLD)` calls being swallowed in encoder callback.
- Be extremely attentive about the pinout: keep in mind that **the official Proton C pinout displays the rear of the board, not the front.** Being used to front pinouts, I ended up soldering entire matrix to the wrong side, so I had to desolder every wire and connect it to the opposite side.
## Conclusion
I had a lot of fun. The layout was inspired by the Planck THK. Feel free to ask any questions!

View File

@@ -0,0 +1,77 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Andrew Dunai
#define PRODUCT D48
/* Key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 12
/* Key matrix pins */
#define MATRIX_ROW_PINS { B8, B9, B1, B2, B4 }
#define MATRIX_COL_PINS { A2, B0, A7, A8, A13, A14, B12, B11, B10, B15, B14, B13 }
#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
/* RGB Underglow */
#ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN A15
#define RGBLED_NUM 14
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
#define RGBLIGHT_ANIMATIONS
#endif
/* Audio */
#ifdef AUDIO_ENABLE
#define STARTUP_SONG_DOOM SONG(E1M1_DOOM)
#define STARTUP_SONG SONG( \
Q__NOTE(_E6), \
Q__NOTE(_A6), \
H__NOTE(_E7), \
Q__NOTE(_E6), \
Q__NOTE(_E7) \
)
#endif
/* Encoders */
#define ENCODERS_PAD_A { B3, A0 }
#define ENCODERS_PAD_B { A6, A1 }
/* #define ENCODER_RESOLUTION 4 */
/* OLED */
#define OLED_FONT_H "glcdfont_d48.c"
#define OLED_TIMEOUT 0
// #define OLED_SCROLL_TIMEOUT 1000
/* Taps (encoder tap_code) */
#define TAP_CODE_DELAY 10
/* I2C */
//#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2
//#define PAL_MODE_STM32_ALTERNATE_OPENDRAIN (PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN)
/* DS1307 */
#define DS1307_ADDR (0x68 << 1)

View File

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

View File

@@ -0,0 +1,19 @@
#pragma once
#include "quantum.h"
#define ___ KC_NO
#define LAYOUT( \
K08, 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 \
) { \
{ ___, ___, ___, ___, ___, ___, ___, ___, K08, ___, ___, 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 } \
}

View File

@@ -0,0 +1,21 @@
#include "ds1307.h"
#include "i2c_master.h"
void ds1307_set_time(uint8_t h, uint8_t m, uint8_t s) {
uint8_t data[] = {
((s % 10) | ((s / 10) << 4)) & 0x7F,
((m % 10) | ((m / 10) << 4)) & 0x7F,
((h % 10) | ((h / 10) << 4)) & 0x3F,
0, 0, 0, 0, 0
}; // 24-hour mode
i2c_writeReg(DS1307_ADDR, 0, data, 8, 100);
}
void ds1307_get_time(uint8_t *h, uint8_t *m, uint8_t *s) {
uint8_t data[3];
i2c_readReg(DS1307_ADDR, 0, data, 3, 100);
i2c_stop();
*s = (data[0] & 0b1111) + ((data[0] & 0b1110000) >> 4) * 10;
*m = (data[1] & 0b1111) + ((data[1] & 0b1110000) >> 4) * 10;
*h = (data[2] & 0b1111) + ((data[2] & 0b0110000) >> 4) * 10;
}

View File

@@ -0,0 +1,6 @@
#pragma once
#include <stdint.h>
void ds1307_set_time(uint8_t h, uint8_t m, uint8_t s);
void ds1307_get_time(uint8_t *h, uint8_t *m, uint8_t *s);

View File

@@ -0,0 +1,231 @@
#include "progmem.h"
// Helidox 8x6 font with QMK Firmware Logo
// Online editor: http://teripom.x0.com/
static const unsigned char font[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0x70, 0x78, 0x3C,
0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x0F,
0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xFC, 0xFE, 0xFE, 0x3F,
0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x9F,
0xFF, 0xFE, 0xFE, 0xFC, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3E, 0x22, 0x22, 0x00, 0x02, 0x3E,
0x02, 0x00, 0x3E, 0x20, 0x20, 0x00,
0x00, 0x3C, 0x0A, 0x3C, 0x00, 0x3E,
0x20, 0x20, 0x02, 0x3E, 0x02, 0x00,
0x00, 0x1C, 0x22, 0x32, 0x00, 0x1E,
0x20, 0x20, 0x1E, 0x00, 0x3E, 0x00,
0x00, 0x2C, 0x2A, 0x1A, 0x00, 0x3E,
0x0A, 0x02, 0x00, 0x02, 0x3E, 0x02,
0x00, 0x00, 0x08, 0x08, 0x08, 0x08,
0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF,
0xFF, 0xE7, 0xE0, 0xE0, 0xE7, 0xFF,
0xFF, 0xFF, 0xF8, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C,
0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x7E,
0xFF, 0xE7, 0xE7, 0x81, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
0x0F, 0x0F, 0x2F, 0x2F, 0x0F, 0x0F,
0xF0, 0xF0, 0xF2, 0xF2, 0xF0, 0xF0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x22, 0x22, 0x00, 0xFF,
0x0F, 0x0F, 0x2F, 0x2F, 0x0F, 0xFF,
0xF0, 0xF0, 0xF2, 0xF2, 0xF0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF0, 0xFE, 0xFF, 0xFF, 0x0F, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x0F, 0xFF, 0xFF, 0xFE, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0,
0xF8, 0x7F, 0x7F, 0x1F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF,
0xF9, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8,
0xFC, 0x7F, 0x7F, 0x3F, 0x0F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
0xFF, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
};

View File

@@ -0,0 +1,340 @@
#include QMK_KEYBOARD_H
#include "taphold.h"
#include "seq.h"
#include "ds1307.h"
#include "lightmode.h"
#include <stdio.h>
/* Note: don't forget there's some more code in qmk_firmware/users/anderson dir */
#define _MAIN 0
#define _ALPHA 1
#define _BETA 2
enum custom_keycodes {
KC_MAIN = SAFE_RANGE,
KC_ALPHA,
KC_BETA,
#ifdef LIGHTMODE_ENABLE
KC_LIGHT_MODE,
#endif
KC_SEQ,
KC_SET_TIME,
};
#ifdef LIGHTMODE_ENABLE
#endif
/* TapHold is my own implementation of the `LT` macro. It's processed in `process_record_user()`. */
#define TAPHOLD_CONFIG_SIZE 3
taphold_t taphold_config[TAPHOLD_CONFIG_SIZE] = {
{.key=KC_ALPHA, .mode=TAPHOLD_LAYER, .shortAction=KC_ESC, .longAction=_ALPHA},
{.key=KC_BETA, .mode=TAPHOLD_LAYER, .shortAction=KC_EQL, .longAction=_BETA},
{.key=KC_RCTRL, .mode=TAPHOLD_MOD, .shortAction=KC_MINS, .longAction=KC_LCTRL},
};
uint16_t taphold_config_size = TAPHOLD_CONFIG_SIZE;
uint32_t taphold_timeout = 90;
/* Seq is implementation of unicode macros similar to UCIS, but with unicode strings. */
#define SEQ_CONFIG_SIZE 3
seq_t seq_config[SEQ_CONFIG_SIZE] = {
{.sequence="temp", .result="42°C"},
{.sequence="table", .result="┳━━┳"},
{.sequence="shrug", .result="¯\\_(ツ)_/¯"}
};
uint16_t seq_config_size = SEQ_CONFIG_SIZE;
/* Colors */
uint32_t layer_colors[3] = {
[_MAIN] = 0xFF0010,
[_ALPHA] = 0x4020FF,
[_BETA] = 0x20FF00,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Main layer
│MUTE │ │L_MOD│
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ TAB ┃ Q │ W │ E │ R │ T ┃ Y │ U │ I │ O │ P ┃ BSP ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃𝛼/ESC┃ A │ S │ D │ F │ G ┃ H │ J │ K │ L │ ; ┃ RET ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃SHIFT┃ Z │ X │ C │ V │ B ┃ N │ M │ , │ . │ / ┃CTL/-┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃LCTRL┃ │ │ ALT │ GUI │SPACE┃SPACE│ 𝛽/= │ ' │ │ ┃ \ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_MAIN] = LAYOUT( \
KC_MUTE, LCTL(KC_D),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
KC_ALPHA,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,\
KC_LCTRL,_______, _______, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_BETA, KC_QUOT, _______, _______, KC_BSLS \
),
/* Alpha layer (𝛼)
│ │ │ │
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ ┃PREV │PLAY │NEXT │ │NUMLK┃ - │ ^^^ │ ^ │ vvv │ ~ ┃ DEL ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │VOL -│VOL +│ │CPSLK┃HOME │ <-- │ v │ --> │ ` ┃ \ ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │SCRLK┃ END │ = │ [ │ ] │ ( ┃ ) ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_ALPHA] = LAYOUT( \
_______, _______, \
_______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_NLCK, KC_MINS, KC_PGUP, KC_UP, KC_PGDN, KC_TILD, KC_DEL, \
_______, _______, KC_VOLD, KC_VOLU, _______, KC_CAPS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_GRV, KC_BSLS, \
_______, _______, _______, _______, _______, KC_SLCK, KC_END, KC_EQL, KC_LBRC, KC_RBRC, KC_LPRN ,KC_RPRN, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
),
/* Beta layer (𝛽)
│ │ │ │
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ RGB ┃ 1 │ 2 │ 3 │ 4 │ 5 ┃ 6 │ 7 │ 8 │ 9 │ 0 ┃ F12 ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃L_MOD┃ F1 │ F2 │ F3 │ F4 │ F5 ┃ F6 │ F7 │ F8 │ F9 │ F10 ┃ F11 ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃RESET│DEBUG│ │ │TIME ┃SLEEP│ SEQ │ { │ } │PTSCR┃ ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_BETA] = LAYOUT( \
_______, _______, \
RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
#ifdef LIGHTMODE_ENABLE
KC_LIGHT_MODE,
#else
_______,
#endif
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
_______, RESET, DEBUG, _______, _______, KC_SET_TIME,KC_SLEP,KC_SEQ,KC_LCBR, KC_RCBR, KC_PSCR, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
)
};
static bool alpha_pressed = false;
static bool beta_pressed = false;
static bool ctrl_pressed = false;
static bool alt_pressed = false;
static bool shift_pressed = false;
static bool gui_pressed = false;
static bool is_in_seq = false;
void keyboard_post_init_user(void) {
/* debug_enable = true; */
/* debug_matrix = true; */
}
void eeconfig_init_user(void) {
set_unicode_input_mode(UC_LNX);
}
void matrix_init_user(void) {
#ifdef LIGHTMODE_ENABLE
set_light_mode(SMOOTHLED, layer_colors[_MAIN]);
#endif
}
static uint32_t last_update = 0;
static uint8_t hours, minutes, seconds;
void matrix_scan_user(void) {
uint32_t now = timer_read32();
if (now - last_update > 500) {
ds1307_get_time(&hours, &minutes, &seconds);
last_update = now;
}
}
static bool is_in_set_time = false;
static char new_time[6];
static uint8_t new_time_index = 0;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (keycode == KC_SEQ && record->event.pressed) {
seq_start();
layer_off(_BETA);
is_in_seq = true;
return false;
} else if (is_in_seq) {
if (record->event.pressed) {
if (!seq_feed(keycode)) {
is_in_seq = false;
}
}
return false;
}
if (keycode == KC_SET_TIME && record->event.pressed) {
is_in_set_time = true;
new_time_index = 0;
} else if (is_in_set_time) {
if (!record->event.pressed && keycode >= KC_1 && keycode <= KC_0) {
new_time[new_time_index++] = (keycode == KC_0) ? 0 : keycode - KC_1 + 1;
if (new_time_index == 6) {
is_in_set_time = false;
ds1307_set_time(
(new_time[0]) * 10 + (new_time[1]),
(new_time[2]) * 10 + (new_time[3]),
(new_time[4]) * 10 + (new_time[5])
);
for (int i = 0; i < 6; i++) {
tap_code(KC_BSPACE);
}
}
}
}
if (keycode == KC_LCTRL || keycode == KC_RCTRL) {
ctrl_pressed = record->event.pressed;
} else if (keycode == KC_LALT) {
alt_pressed = record->event.pressed;
} else if (keycode == KC_LSFT) {
shift_pressed = record->event.pressed;
} else if (keycode == KC_LGUI) {
gui_pressed = record->event.pressed;
} else if (keycode == KC_ALPHA) {
alpha_pressed = record->event.pressed;
} else if (keycode == KC_BETA) {
beta_pressed = record->event.pressed;
}
if (keycode == RESET) {
rgblight_setrgb(255, 255, 0);
}
#ifdef LIGHTMODE_ENABLE
if (record->event.pressed && keycode == KC_LIGHT_MODE) {
next_light_mode(layer_colors[_MAIN]);
}
#endif
if (keycode == KC_LCTRL) {
/* Some Overlay1_Enable fuckery! */
(record->event.pressed ? register_code : unregister_code)(KC_LCTRL);
return false;
}
return taphold_process(keycode, record);
}
layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef LIGHTMODE_ENABLE
uint8_t layer = get_highest_layer(state);
update_light_mode(layer_colors[layer]);
#endif
return state;
}
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (!alpha_pressed) {
tap_code(clockwise ? KC_VOLD : KC_VOLU);
} else {
tap_code(clockwise ? KC_MPRV : KC_MNXT);
}
} else if (index == 1) {
if (!alpha_pressed) {
tap_code(clockwise ? KC_UP : KC_DOWN);
} else {
tap_code(clockwise ? KC_PGUP : KC_PGDN);
}
}
}
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_0;
}
void oled_task_user(void) {
/* Host Keyboard Layer Status */
uint8_t current_layer = get_highest_layer(layer_state);
/* Layer */
static const char PROGMEM icons[4][3][6] = {
{
{ 0x80, 0x81, 0x82, 0x83, 0x84, 0 },
{ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0 },
{ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0 }
},
{
{ 0x85, 0x86, 0x87, 0x88, 0x89, 0 },
{ 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0 },
{ 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0 }
},
{
{ 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0 },
{ 0xaa, 0xab, 0xac, 0xad, 0xae, 0 },
{ 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0 }
},
{
{ 0x8f, 0x90, 0x91, 0x92, 0x93, 0 },
{ 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0 },
{ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0 }
}
};
uint8_t icon_index = current_layer == _MAIN ? 3 : current_layer == _ALPHA ? 1 : 2;
for (int i = 0; i < 3; i++) {
oled_set_cursor(0, i + 1);
oled_write_P(icons[icon_index][i], false);
}
/* Time */
oled_set_cursor(6, 0);
// oled_write_P(PSTR("-D48 Custom-\n"), false);
char buf[16];
sprintf(
buf,
"%02d:%02d:%02d", hours, minutes, seconds
);
oled_write(buf, false);
/* Modifiers */
static const char PROGMEM mods[][2] = {
{0x94, 0x95}, // CTL
{0x96, 0x97}, // ALT
{0x98, 0x99}, // GUI
{0x9a, 0x9b}, // SFT
/* {0x9c, 0x9d}, // EMPTY */
};
char mod_data[13] = "\x9c\x9d\x9c\x9d\x9c\x9d\x9c\x9d \x07\x07\x07\0";
if (ctrl_pressed) strncpy(mod_data, mods[0], 2);
if (alt_pressed) strncpy(mod_data + 2, mods[1], 2);
if (gui_pressed) strncpy(mod_data + 4, mods[2], 2);
if (shift_pressed) strncpy(mod_data + 6, mods[3], 2);
led_t led_usb_state = host_keyboard_led_state();
if (led_usb_state.num_lock) mod_data[9] = 'N';
if (led_usb_state.caps_lock) mod_data[10] = 'C';
if (led_usb_state.scroll_lock) mod_data[11] = 'S';
oled_set_cursor(6, 1);
oled_write(mod_data, false);
/* Matrix */
static const char PROGMEM matrix_chars[] = {
0xb4, // None
0xb5, // Upper
0xb6, // Lower
0xb7 // Both
};
for (uint8_t row = 1; row < MATRIX_ROWS; row += 2) {
// Skip first row because it's used by the encoders.
uint16_t bits1 = matrix_get_row(row);
uint16_t bits2 = matrix_get_row(row + 1);
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
uint8_t matrix_char = matrix_chars[((bits1 & (1 << col)) ? 1 : 0) | ((bits2 & (1 << col)) ? 2 : 0)];
oled_set_cursor(6 + col, 2 + (row - 1) / 2);
oled_write_char(matrix_char, false);
}
}
}
#endif

View File

@@ -0,0 +1,44 @@
#include "lightmode.h"
#ifdef LIGHTMODE_ENABLE
/* Light modes switcher */
uint8_t light_mode = SMOOTHLED;
void set_light_mode(light_mode_t value, uint32_t color) {
light_mode = value;
if (light_mode == SMOOTHLED) {
smoothled_set(color);
} else {
dmc12_start(color, true);
}
}
void process_light_mode(void) {
if (light_mode == SMOOTHLED) {
smoothled_process();
} else {
dmc12_process();
}
}
void update_light_mode(uint32_t color) {
if (light_mode == SMOOTHLED) {
smoothled_set(color);
} else {
dmc12_start(color, false);
}
}
void next_light_mode(uint32_t color) {
light_mode = (light_mode + 1) % LIGHT_MODE_SIZE;
set_light_mode(light_mode, color);
}
void matrix_scan_kb(void) {
process_light_mode();
matrix_scan_user();
}
#endif

View File

@@ -0,0 +1,12 @@
#include "smoothled.h"
#include "dmc12.h"
#include "quantum.h"
/* Light modes */
enum light_mode_enum { SMOOTHLED, DMC12, LIGHT_MODE_SIZE };
typedef enum light_mode_enum light_mode_t;
void set_light_mode(light_mode_t value, uint32_t color);
void process_light_mode(void);
void update_light_mode(uint32_t color);
void next_light_mode(uint32_t color);

View File

@@ -0,0 +1,2 @@
OPT_DEFS += -DLIGHTMODE_ENABLE
SRC += smoothled.c dmc12.c seq.c lightmode.c

View File

@@ -0,0 +1,285 @@
#include QMK_KEYBOARD_H
#include <string.h>
#include <stdio.h>
#include "taphold.h"
#include "ds1307.h"
/* Note: don't forget there's some more code in qmk_firmware/users/anderson dir */
#define _MAIN 0
#define _ALPHA 1
#define _BETA 2
enum custom_keycodes {
KC_MAIN = SAFE_RANGE,
KC_ALPHA,
KC_BETA,
KC_SET_TIME,
};
/* TapHold is my own implementation of the `LT` macro. It's processed in `process_record_user()`. */
#define TAPHOLD_CONFIG_SIZE 3
taphold_t taphold_config[TAPHOLD_CONFIG_SIZE] = {
{.key=KC_ALPHA, .mode=TAPHOLD_LAYER, .shortAction=KC_ESC, .longAction=_ALPHA},
{.key=KC_BETA, .mode=TAPHOLD_LAYER, .shortAction=KC_EQL, .longAction=_BETA},
{.key=KC_RCTRL, .mode=TAPHOLD_MOD, .shortAction=KC_MINS, .longAction=KC_LCTRL},
};
uint16_t taphold_config_size = TAPHOLD_CONFIG_SIZE;
uint32_t taphold_timeout = 90;
/* Colors */
uint32_t layer_colors[3] = {
[_MAIN] = 0xFF0010,
[_ALPHA] = 0x4020FF,
[_BETA] = 0x20FF00,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Main layer
│MUTE │ │L_MOD│
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ TAB ┃ Q │ W │ E │ R │ T ┃ Y │ U │ I │ O │ P ┃ BSP ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃𝛼/ESC┃ A │ S │ D │ F │ G ┃ H │ J │ K │ L │ ; ┃ RET ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃SHIFT┃ Z │ X │ C │ V │ B ┃ N │ M │ , │ . │ / ┃CTL/-┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃LCTRL┃ │ │ ALT │ GUI │SPACE┃SPACE│ 𝛽/= │ ' │ │ ┃ \ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_MAIN] = LAYOUT( \
KC_MUTE, _______, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
KC_ALPHA,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,\
KC_LCTRL,_______, _______, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_BETA, KC_QUOT, _______, _______, KC_BSLS \
),
/* Alpha layer (𝛼)
│ │ │ │
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ ┃PREV │PLAY │NEXT │ │NUMLK┃ - │ ^^^ │ ^ │ vvv │ ~ ┃ DEL ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │VOL -│VOL +│ │CPSLK┃HOME │ <-- │ v │ --> │ ` ┃ \ ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │SCRLK┃ END │ = │ [ │ ] │ ( ┃ ) ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_ALPHA] = LAYOUT( \
_______, _______, \
_______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_NLCK, KC_MINS, KC_PGUP, KC_UP, KC_PGDN, KC_TILD, KC_DEL, \
_______, _______, KC_VOLD, KC_VOLU, _______, KC_CAPS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_GRV, KC_BSLS, \
_______, _______, _______, _______, _______, KC_SLCK, KC_END, KC_EQL, KC_LBRC, KC_RBRC, KC_LPRN ,KC_RPRN, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
),
/* Beta layer (𝛽)
│ │ │ │
┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
┃ RGB ┃ 1 │ 2 │ 3 │ 4 │ 5 ┃ 6 │ 7 │ 8 │ 9 │ 0 ┃ F12 ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃L_MOD┃ F1 │ F2 │ F3 │ F4 │ F5 ┃ F6 │ F7 │ F8 │ F9 │ F10 ┃ F11 ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃RESET│DEBUG│ │ │TIME ┃SLEEP│ │ { │ } │PTSCR┃ ┃
┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
*/
[_BETA] = LAYOUT( \
_______, _______, \
RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
_______, RESET, DEBUG, _______, _______, KC_SET_TIME,KC_SLEP,_______,KC_LCBR,KC_RCBR, KC_PSCR, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
)
};
static bool alpha_pressed = false;
static bool beta_pressed = false;
static bool ctrl_pressed = false;
static bool alt_pressed = false;
static bool shift_pressed = false;
static bool gui_pressed = false;
void keyboard_post_init_user(void) {
/* debug_enable = true; */
/* debug_matrix = true; */
}
void eeconfig_init_user(void) {
set_unicode_input_mode(UC_LNX);
}
static uint32_t last_update = 0;
static uint8_t hours, minutes, seconds;
void matrix_scan_user(void) {
uint32_t now = timer_read32();
if (now - last_update > 500) {
ds1307_get_time(&hours, &minutes, &seconds);
last_update = now;
}
}
static bool is_in_set_time = false;
static char new_time[6];
static uint8_t new_time_index = 0;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (keycode == KC_SET_TIME && record->event.pressed) {
is_in_set_time = true;
new_time_index = 0;
} else if (is_in_set_time) {
if (!record->event.pressed && keycode >= KC_1 && keycode <= KC_0) {
new_time[new_time_index++] = (keycode == KC_0) ? 0 : keycode - KC_1 + 1;
if (new_time_index == 6) {
is_in_set_time = false;
ds1307_set_time(
(new_time[0]) * 10 + (new_time[1]),
(new_time[2]) * 10 + (new_time[3]),
(new_time[4]) * 10 + (new_time[5])
);
for (int i = 0; i < 6; i++) {
tap_code(KC_BSPACE);
}
}
}
}
if (keycode == KC_LCTRL || keycode == KC_RCTRL) {
ctrl_pressed = record->event.pressed;
} else if (keycode == KC_LALT) {
alt_pressed = record->event.pressed;
} else if (keycode == KC_LSFT) {
shift_pressed = record->event.pressed;
} else if (keycode == KC_LGUI) {
gui_pressed = record->event.pressed;
} else if (keycode == KC_ALPHA) {
alpha_pressed = record->event.pressed;
} else if (keycode == KC_BETA) {
beta_pressed = record->event.pressed;
}
if (keycode == RESET) {
rgblight_setrgb(255, 255, 0);
}
if (keycode == KC_LCTRL) {
/* Some Overlay1_Enable fuckery! */
(record->event.pressed ? register_code : unregister_code)(KC_LCTRL);
return false;
}
return taphold_process(keycode, record);
}
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (!alpha_pressed) {
tap_code(clockwise ? KC_VOLD : KC_VOLU);
} else {
tap_code(clockwise ? KC_MPRV : KC_MNXT);
}
} else if (index == 1) {
if (!alpha_pressed) {
tap_code(clockwise ? KC_UP : KC_DOWN);
} else {
tap_code(clockwise ? KC_PGUP : KC_PGDN);
}
}
}
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_0;
}
void oled_task_user(void) {
/* Host Keyboard Layer Status */
uint8_t current_layer = get_highest_layer(layer_state);
/* Layer */
static const char PROGMEM icons[4][3][6] = {
{
{ 0x80, 0x81, 0x82, 0x83, 0x84, 0 },
{ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0 },
{ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0 }
},
{
{ 0x85, 0x86, 0x87, 0x88, 0x89, 0 },
{ 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0 },
{ 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0 }
},
{
{ 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0 },
{ 0xaa, 0xab, 0xac, 0xad, 0xae, 0 },
{ 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0 }
},
{
{ 0x8f, 0x90, 0x91, 0x92, 0x93, 0 },
{ 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0 },
{ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0 }
}
};
uint8_t icon_index = current_layer == _MAIN ? 3 : current_layer == _ALPHA ? 1 : 2;
for (int i = 0; i < 3; i++) {
oled_set_cursor(0, i + 1);
oled_write_P(icons[icon_index][i], false);
}
/* Time */
oled_set_cursor(6, 0);
// oled_write_P(PSTR("-D48 Custom-\n"), false);
char buf[16];
sprintf(
buf,
"%02d:%02d:%02d", hours, minutes, seconds
);
oled_write(buf, false);
/* Modifiers */
static const char PROGMEM mods[][2] = {
{0x94, 0x95}, // CTL
{0x96, 0x97}, // ALT
{0x98, 0x99}, // GUI
{0x9a, 0x9b}, // SFT
/* {0x9c, 0x9d}, // EMPTY */
};
char mod_data[13] = "\x9c\x9d\x9c\x9d\x9c\x9d\x9c\x9d \x07\x07\x07\0";
if (ctrl_pressed) strncpy(mod_data, mods[0], 2);
if (alt_pressed) strncpy(mod_data + 2, mods[1], 2);
if (gui_pressed) strncpy(mod_data + 4, mods[2], 2);
if (shift_pressed) strncpy(mod_data + 6, mods[3], 2);
led_t led_usb_state = host_keyboard_led_state();
if (led_usb_state.num_lock) mod_data[9] = 'N';
if (led_usb_state.caps_lock) mod_data[10] = 'C';
if (led_usb_state.scroll_lock) mod_data[11] = 'S';
oled_set_cursor(6, 1);
oled_write(mod_data, false);
/* Matrix */
static const char PROGMEM matrix_chars[] = {
0xb4, // None
0xb5, // Upper
0xb6, // Lower
0xb7 // Both
};
for (uint8_t row = 1; row < MATRIX_ROWS; row += 2) {
// Skip first row because it's used by the encoders.
uint16_t bits1 = matrix_get_row(row);
uint16_t bits2 = matrix_get_row(row + 1);
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
uint8_t matrix_char = matrix_chars[((bits1 & (1 << col)) ? 1 : 0) | ((bits2 & (1 << col)) ? 2 : 0)];
oled_set_cursor(6 + col, 2 + (row - 1) / 2);
oled_write_char(matrix_char, false);
}
}
}
#endif

View File

@@ -0,0 +1,22 @@
# MCU name
MCU = STM32F303
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
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 = yes
USE_I2C = no
RGBLIGHT_ENABLE = yes
ENCODER_ENABLE = yes
OLED_DRIVER_ENABLE = yes
UNICODE_ENABLE = yes
SRC += ds1307.c taphold.c

View File

@@ -0,0 +1,29 @@
#include "taphold.h"
bool taphold_process(uint16_t keycode, keyrecord_t *record) {
for (int i = 0; i < taphold_config_size; i++) {
taphold_t *config = &taphold_config[i];
if (config->key == keycode && record->event.pressed) {
if (config->mode == TAPHOLD_LAYER) {
layer_on(config->longAction);
} else {
register_code(config->longAction);
}
config->time = timer_read32();
config->keypos = record->event.key;
return false;
} else if (KEYEQ(record->event.key, config->keypos) && !record->event.pressed) {
if (config->mode == TAPHOLD_LAYER) {
layer_off(config->longAction);
} else {
unregister_code(config->longAction);
}
if (timer_elapsed32(config->time) < taphold_timeout) {
tap_code(config->shortAction);
}
config->keypos.row = 255;
return false;
}
}
return true;
}

View File

@@ -0,0 +1,25 @@
#include "quantum.h"
typedef enum taphold_mode_t {
TAPHOLD_LAYER,
TAPHOLD_MOD
} taphold_mode_t;
typedef struct taphold_t {
uint16_t key;
uint32_t time;
taphold_mode_t mode;
uint16_t shortAction;
uint16_t longAction;
keypos_t keypos;
// We store key pos to properly release the key
// even when a different layer is active and the key has a different action now
} taphold_t;
extern taphold_t taphold_config[];
extern uint16_t taphold_config_size;
// Dual keys tap/hold timeout.
// If key is tapped for less than this value, send key in addition to primary action after completing the action.
extern uint32_t taphold_timeout;
bool taphold_process(uint16_t keycode, keyrecord_t *record);

View File

@@ -6,7 +6,7 @@
"height": 6,
"layouts": {
"LAYOUT": {
"layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.26,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}]
"layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.25,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}]
}
}
}

View File

@@ -0,0 +1,41 @@
/*
Copyright 2017 Chuck Lauer Vose <vosechu@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#undef RGBLED_NUM
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 3
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_SLEEP // Put the keyboard to sleep when USB goes dark
#define LAYOUT_ortho_half_5x7( \
L00, L01, L02, L03, L04, L05, L06, \
L10, L11, L12, L13, L14, L15, L16, \
L20, L21, L22, L23, L24, L25, L26, \
L30, L31, L32, L33, L34, L35, L36, \
L40, L41, L42, L43, L44, L45, L46 \
) \
LAYOUT_ortho_5x14( \
L00, L01, L02, L03, L04, L05, L06, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
L10, L11, L12, L13, L14, L15, L16, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
L20, L21, L22, L23, L24, L25, L26, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
L30, L31, L32, L33, L34, L35, L36, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
L40, L41, L42, L43, L44, L45, L46, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO \
)

View File

@@ -0,0 +1,91 @@
#include QMK_KEYBOARD_H
#include "vosechu.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_ortho_half_5x7( // Base layer
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_9 ,
ALT_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , TT(TT1) ,
CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , TT(TT2) ,
KC_F13 , KC_Z , KC_X , KC_C , KC_V , KC_B , TT(TT3) ,
KC_MEH , CTL_GRV , ALT_TAB , KC_LALT , MO(LWR) , LFT_BK , SFT_SPC
),
[LWR] = LAYOUT_ortho_half_5x7( // EVE layer
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
A(KC_LEFT), KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F9 ,
SFT_SPC , A(KC_F1), A(KC_F2), A(KC_F3), A(KC_F4), _______ , _______ ,
A(KC_RGHT), C(KC_F1), C(KC_F2), C(KC_F3), C(KC_F4), _______ , _______ ,
_______ , RESET , _______ , _______ , _LAYER_ , KC_DEL , KC_ENT
),
[LFT] = LAYOUT_ortho_half_5x7( // Media
_______ , KC_F10 , KC_F11 , KC_F12 , KC_PSCR , KC_SLCK , KC_PAUS ,
_______ , KC_F7 , KC_F8 , KC_F9 , KC_INS , KC_HOME , KC_PGUP ,
RGB_TOG , KC_F4 , KC_F5 , KC_F6 , KC_DEL , KC_END , KC_PGDN ,
_______ , KC_F1 , KC_F2 , KC_F3 , KC_VOLU , KC_VOLD , KC_MUTE ,
_______ , _______ , _______ , _______ , PSWD , _LAYER_ , PSWD_ALT
),
[TT1] = LAYOUT_ortho_half_5x7( // Override WASD with arrows
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , KC_UP , _______ , _______ , _______ , _______ ,
_______ , KC_LEFT , KC_DOWN , KC_RGHT , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______
),
[TT2] = LAYOUT_ortho_half_5x7( // Browser layer
C(KC_W) , C(KC_1) , C(KC_T) , C(KC_9) , _______ , _______ , _______ ,
WBWSRBK , WTABLFT , KC_UP , WTABRGT , WBWSRFW , _______ , _______ ,
KC_ESC , KC_LEFT , KC_DOWN , KC_RGHT , C(KC_R) , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , TT(T23X),
_______ , _______ , _______ , _______ , _______ , _______ , _______
),
[TT3] = LAYOUT_ortho_half_5x7( // OS X override layer
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , _______ , _______ , _______ , TT(T23X),
_______ , _______ , _______ , _______ , _______ , _______ , _______ ,
_______ , _______ , _______ , KC_LGUI , _______ , _______ , _______
),
[T23X] = LAYOUT_ortho_half_5x7( // Browser layer
G(KC_W) , G(KC_1) , G(KC_T) , G(KC_9) , _______ , SLACKTB , _______ ,
BWSR_BK , TAB_LFT , KC_UP , TAB_RGT , BWSR_FW , SLACKUP , _______ ,
KC_ESC , KC_LEFT , KC_DOWN , KC_RGHT , G(KC_R) , SLACKDN , _______ ,
_______ , _______ , KC_Q , KC_J , KC_K , _______ , _______ ,
_______ , _______ , _______ , KC_LGUI , _______ , _______ , _______
),
// [_EMPTY] = LAYOUT(
// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
// _______ , _______ , _______ , _______ , _______ , _______ , _______
// ),
};
void keyboard_post_init_user(void) {
// Call the post init code.
rgblight_enable_noeeprom(); // enables Rgb, without saving settings
rgblight_mode_noeeprom(0);
rgblight_sethsv_noeeprom(0, 0, 0);
}
layer_state_t layer_state_set_user(layer_state_t state) {
switch (get_highest_layer(state)) {
case TT1:
rgblight_sethsv_noeeprom(HSV_BLUE);
break;
case TT2:
rgblight_sethsv_noeeprom(HSV_PURPLE);
break;
case T23X:
rgblight_sethsv_noeeprom(HSV_GOLD);
break;
case TT3:
rgblight_sethsv_noeeprom(HSV_GREEN);
break;
default: // for any other layers, or the default layer
rgblight_sethsv_noeeprom(0, 0, 0);
break;
}
return state;
}

View File

@@ -0,0 +1 @@
RGBLIGHT_ENABLE = yes

View File

@@ -0,0 +1,46 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xD645
#define DEVICE_VER 0x0001
#define MANUFACTURER tominabox1
#define PRODUCT Le Chiffre
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 10
/*
* 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 { B3, D4, F1, C6 }
#define MATRIX_COL_PINS { F4, F5, B0, B2, B1, B4, D7, C7, D2, F7 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
/* Define encoder pads */
#define ENCODERS_PAD_A { D5 }
#define ENCODERS_PAD_B { D3 }
/* #define RGB_DI_PIN F0
#define RGBLED_NUM 1 */

View File

@@ -0,0 +1,15 @@
{
"keyboard_name": "le_chiffre",
"url": "",
"maintainer": "tominabox1",
"width": 11,
"height": 4,
"layouts": {
"LAYOUT": {
"layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Rotary", "x":5, "y":0, "w":1}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0},
{"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"H", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1},
{"label":";", "x":10, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":"<", "x":8, "y":2}, {"label":">", "x":9, "y":2}, {"label":"?", "x":10, "y":2},
{"label":"", "x":1.75, "y":3, "w":1.25}, {"label":"", "x":3, "y":3, "w":2}, {"label":"", "x":6, "y":3, "w":2}, {"label":"", "x":8, "y":3, "w":1.25}]
}
}
}

View File

@@ -0,0 +1,142 @@
#include QMK_KEYBOARD_H
enum layers{
_BASE,
_NUM_SYM,
_NAV
};
#define KC_NUM_SPC LT(_NUM_SYM, KC_SPC)
#define KC_GA LGUI_T(KC_A)
#define KC_AS LALT_T(KC_S)
#define KC_CD LCTL_T(KC_D)
#define KC_SF LSFT_T(KC_F)
#define KC_SJ RSFT_T(KC_J)
#define KC_CK RCTL_T(KC_K)
#define KC_AL RALT_T(KC_L)
#define KC_GSCLN RGUI_T(KC_SCLN)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MPLY, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_GA, KC_AS, KC_CD, KC_SF, KC_G, KC_H, KC_SJ, KC_CK, KC_AL, KC_GSCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
KC_LCTL, KC_ENT, KC_NUM_SPC, MO(_NAV)
),
[_NUM_SYM] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EQUAL, KC_MINS,
KC_BSLS,KC_LCBR, KC_LBRC, KC_LPRN, KC_UNDS, KC_RPRN, KC_RBRC, KC_RCBR, KC_DOT, KC_GRV,
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS
),
[_NAV] = LAYOUT(
RESET, _______, AG_NORM, AG_SWAP, DEBUG, KC_TRNS, KC_GRV, KC_PGDN, KC_UP, KC_PGUP, KC_SCLN,
RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_MINS, KC_RO, KC_COMM, KC_DOT, KC_BSLS,
KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS
),
};
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (clockwise) {
tap_code(KC_MNXT);
} else {
tap_code(KC_MPRV);
}
}
}
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_90; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
static const char PROGMEM base_logo[] = {
// 'base', 32x128px
0x00, 0x00, 0x80, 0x7c, 0x02, 0x01, 0x01, 0x80, 0x00, 0xe0, 0x50, 0x28, 0x98, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x40, 0x41, 0x41, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0x40, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x39, 0x27, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x13, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfc,
0x22, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x60, 0x1f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x90, 0x7e, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40,
0x30, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0xe4, 0x1c, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x54, 0x4a, 0x26, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
static const char PROGMEM base_caps_logo[] = {
// 'caps', 32x128px
0x00, 0x00, 0x80, 0x7c, 0x02, 0x01, 0x01, 0x80, 0x00, 0xe0, 0x50, 0x28, 0x98, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x40, 0x41, 0x41, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0x40, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x39, 0x27, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x13, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfc,
0x22, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x60, 0x1f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x90, 0x7e, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40,
0x30, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0xe4, 0x1c, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x54, 0x4a, 0x26, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x10, 0x10, 0x30, 0x00, 0x00, 0x80,
0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x1e, 0x11, 0x09, 0x08,
0x1e, 0x11, 0x81, 0x7d, 0x13, 0x11, 0x08, 0x17, 0x11, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00
};
switch (get_highest_layer(layer_state)) {
case _BASE:
if (host_keyboard_led_state().caps_lock) {
oled_write_raw_P(base_caps_logo, sizeof(base_caps_logo));
} else {
oled_write_raw_P(base_logo, sizeof(base_logo));
}
break;
default:
oled_write_raw_P(base_logo, sizeof(base_logo));
}
}
#endif

View File

@@ -0,0 +1 @@
# Default Le Chiffre Keymap

View File

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

View File

@@ -0,0 +1,18 @@
#pragma once
#include "quantum.h"
#define XXX KC_NO
#define LAYOUT( \
K00, K01, K02, K03, K04, K38, K05, K06, K07, K08, K09, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
K32, K34, K35, K37 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09 }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19 }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29 }, \
{ XXX, XXX, K32, XXX, K34, K35, XXX, K37, K38, XXX } \
}

View File

@@ -0,0 +1,15 @@
# Le Chiffre
![Le Chiffre](https://i.imgur.com/X1WsUmdl.png)
Le Chiffre (ironically, "the number" in French is a 30% keyboard designed by tominabox1. The purpose of the board is to provide a platform for MX and Choc ergo in one package for when ones wrists need a break. The board supports an RGB LED strip with DI on port F0. The board is also fitted with support for run-of-the-mill .91" OLED and EC11 rotary encoder.
* Keyboard Maintainer: [TJ Campie](https://github.com/tominabox1)
* Hardware Supported: Le Chiffre (source not available at this time)
* Hardware Availability: Bring your own case.
Make example for this keyboard (after setting up your build environment):
make le_chiffre: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,22 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = atmel-dfu
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
TAP_DANCE_ENABLE = no
ENCODER_ENABLE = yes
OLED_DRIVER_ENABLE = no

View File

@@ -83,9 +83,9 @@
{"label":"FORWARD SLASH", "x":11.25, "y":4.5},
{"label":"RIGHT SHIFT", "x":12.25, "y":4.5, "w":2.75},
{"label":"UP ARROW", "x":16.5, "y":4.5},
{"label":"LEFT CTRL", "x":0.005, "y":5.5, "w":1.24},
{"label":"LEFT WIN", "x":1.255, "y":5.5, "w":1.24},
{"label":"LEFT ALT", "x":2.505, "y":5.5, "w":1.24},
{"label":"LEFT CTRL", "x":0.005, "y":5.5, "w":1.25},
{"label":"LEFT WIN", "x":1.255, "y":5.5, "w":1.25},
{"label":"LEFT ALT", "x":2.505, "y":5.5, "w":1.25},
{"label":"SPACEBAR", "x":3.75, "y":5.5, "w":6.25},
{"label":"RIGHT ALT", "x":10, "y":5.5, "w":1.25},
{"label":"FN", "x":11.25, "y":5.5, "w":1.25},

View File

@@ -0,0 +1,69 @@
/* Copyright 2020 Team Mechlovin'
*
* 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 "adelais.h"
#ifdef RGB_MATRIX_ENABLE
led_config_t g_led_config = { {
//Key Matrix to LED Index
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16},
{18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0},
{33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, NO_LED, 45, 17},
{46, NO_LED, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 58, 60, 32},
{61, NO_LED, 62, NO_LED, 63, NO_LED, 64, NO_LED, 65, NO_LED, 66, NO_LED, NO_LED, 57, 67}
}, {
//LED Index to Physical Positon
{0,0}, { 17, 0}, { 34, 0 }, { 51, 0 }, { 69, 0}, { 86, 0}, {100, 0}, {103, 0}, { 120, 0}, { 138, 0}, { 155, 0}, { 172, 0}, { 189, 0}, {207, 0}, {215, 0}, {223, 0}, {224, 0},
{0,16}, { 17, 16}, { 34,16 }, { 51,16 }, { 69,16}, { 86,16}, {103,16}, { 120,16}, { 138,16}, { 155,16}, { 172,16}, { 189,16}, {207, 16}, {215, 16}, {224,16},
{0,32}, { 17, 32}, { 34,32 }, { 51,32 }, { 69,32}, { 86,32}, {103,32}, { 120,32}, { 138,32}, { 155,32}, { 172,32}, { 189,32}, {207, 32}, {224,32},
{ 17, 48}, { 34,48 }, { 51,48 }, { 69,48}, { 86,48}, {103,48}, { 120,48}, { 138,48}, { 155,48}, { 172,48}, { 189,48}, {207, 48}, {215, 48}, {224,48}, {224,48},
{ 17, 64}, { 51,64 }, { 86,64}, { 103,64}, { 138,64}, { 172,64}, {224, 64},
{100,0}, { 69,0}, { 24, 0}, { 0,3}, { 0,16}, { 0,32}, { 0,51}, { 15,64 }, { 34,64}, { 69,64}, { 103,64}, {110,64}, { 120,64}, { 155,64}, { 189,64}, { 192,64}, { 224,58}, { 224,32}, { 224,16}, { 224,0}, { 207,0}, { 172,0}, { 138,0},
}, {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
} };
#endif
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
led_init_ports();
}
void led_init_ports(void) {
setPinOutput(B2);
writePinLow(B2);
setPinOutput(C15);
writePinLow(C15);
setPinOutput(B9);
writePinLow(B9);
}
bool led_update_kb(led_t led_state) {
if(led_update_user(led_state)) {
writePin(B2, led_state.caps_lock);
writePin(B9, led_state.scroll_lock);
writePin(C12, led_state.num_lock);
}
return true;
}

View File

@@ -0,0 +1,33 @@
/* Copyright 2020 Team Mechlovin
*
* 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_all( \
K1E, K00, K01, K02, K03, K04, K05, K06, K07,K08,K09, K0A, K0B, K0C, K0D, K0E,\
K2E, K10, K11, K12, K13, K14, K15, K16,K17,K18, K19, K1A, K1B, K1C, K1D,\
K3E, K20, K21, K22, K23, K24, K25, K26,K27,K28, K29, K2A, K2B, K2D,\
K30, K32, K33, K34, K35, K36, K37,K38,K39, K3A, K3B, K3D, K3C, K4D,\
K40, K42, K44, K46, K48, K4A, K4E \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, K2E }, \
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
{ K40, KC_NO, K42, KC_NO, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, KC_NO, KC_NO, K4D, K4E }, \
}

View File

@@ -0,0 +1,46 @@
/*
Copyright 2020 Team Mechlovin
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 0x4D4C // "ML"
#define DEVICE_VER 0x0001
#define MANUFACTURER Team.Mechlovin
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
/*
* 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 { B1, A0, C13, A1, A2}
#define MATRIX_COL_PINS { A10, A9, A8, B15, B14, B13, B12, B11, B10, B8, B4, B5, B3, C14, A15 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW

View File

@@ -0,0 +1,81 @@
{
"keyboard_name": "Adelais",
"url": "",
"maintainer": "Team Mechlovin'",
"width": 18.5,
"height": 5,
"layouts": {
"LAYOUT_all": {
"key_count": 66,
"layout": [
{"label":"K1E", "x":0, "y":0},
{"label":"K00", "x":1.5, "y":0},
{"label":"K01", "x":2.5, "y":0},
{"label":"K02", "x":3.5, "y":0},
{"label":"K03", "x":4.5, "y":0},
{"label":"K04", "x":5.5, "y":0},
{"label":"K05", "x":6.5, "y":0},
{"label":"K06", "x":7.5, "y":0},
{"label":"K07", "x":10.5, "y":0},
{"label":"K08", "x":11.5, "y":0},
{"label":"K09", "x":12.5, "y":0},
{"label":"K0A", "x":13.5, "y":0},
{"label":"K0B", "x":14.5, "y":0},
{"label":"K0C", "x":15.5, "y":0},
{"label":"K0D", "x":16.5, "y":0},
{"label":"K0E", "x":17.5, "y":0},
{"label":"K2E", "x":0, "y":1},
{"label":"K10", "x":1.5, "y":1, "w":1.5},
{"label":"K11", "x":3, "y":1},
{"label":"K12", "x":4, "y":1},
{"label":"K13", "x":5, "y":1},
{"label":"K14", "x":6, "y":1},
{"label":"K15", "x":7, "y":1},
{"label":"K16", "x":10, "y":1},
{"label":"K17", "x":11, "y":1},
{"label":"K18", "x":12, "y":1},
{"label":"K19", "x":13, "y":1},
{"label":"K1A", "x":14, "y":1},
{"label":"K1B", "x":15, "y":1},
{"label":"K1C", "x":16, "y":1},
{"label":"K1D", "x":17, "y":1, "w":1.5},
{"label":"K3E", "x":0, "y":2},
{"label":"K20", "x":1.5, "y":2, "w":1.75},
{"label":"K21", "x":3.25, "y":2},
{"label":"K22", "x":4.25, "y":2},
{"label":"K23", "x":5.25, "y":2},
{"label":"K24", "x":6.25, "y":2},
{"label":"K25", "x":7.25, "y":2},
{"label":"K26", "x":10.25, "y":2},
{"label":"K27", "x":11.25, "y":2},
{"label":"K28", "x":12.25, "y":2},
{"label":"K29", "x":13.25, "y":2},
{"label":"K2A", "x":14.25, "y":2},
{"label":"K2B", "x":15.25, "y":2},
{"label":"K2D", "x":16.25, "y":2, "w":2.25},
{"label":"K30", "x":1.5, "y":3, "w":2.25},
{"label":"K32", "x":3.75, "y":3},
{"label":"K33", "x":4.75, "y":3},
{"label":"K34", "x":5.75, "y":3},
{"label":"K35", "x":6.75, "y":3},
{"label":"K36", "x":7.75, "y":3},
{"label":"K37", "x":9.75, "y":3},
{"label":"K38", "x":10.75, "y":3},
{"label":"K39", "x":11.75, "y":3},
{"label":"K3A", "x":12.75, "y":3},
{"label":"K3B", "x":13.75, "y":3},
{"label":"K4D", "x":14.75, "y":3},
{"label":"K3C", "x":15.75, "y":3, "w":1.75},
{"label":"K3D", "x":17.5, "y":3},
{"label":"K40", "x":1.5, "y":4, "w":1.5},
{"label":"K42", "x":4.5, "y":4, "w":1.25},
{"label":"K44", "x":5.75, "y":4, "w":2.25},
{"label":"K46", "x":8, "y":4, "w":1.25},
{"label":"K48", "x":9.75, "y":4, "w":2.75},
{"label":"K4A", "x":12.5, "y":4, "w":1.25},
{"label":"K4E", "x":17, "y":4, "w":1.5}
]
}
}
,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
}

View File

@@ -0,0 +1,32 @@
/* Copyright 2020 Team Mechlovin
*
* 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_SPC, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_SPC, 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_SLSH,
KC_SPC, 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_BSLS, MO(1), KC_RSFT, KC_UP,
KC_LCTL, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL ),
[0] = LAYOUT_all(
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, 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, 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 ),
};

View File

@@ -0,0 +1 @@
# The default keymap for adelais

View File

@@ -0,0 +1,44 @@
/* Copyright 2020 Team Mechlovin
*
* 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
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_SPC, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_SPC, 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_SLSH,
KC_SPC, 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_BSLS, MO(1), KC_RSFT, KC_UP,
KC_LCTL, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL ),
[1] = LAYOUT_all(
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, 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, 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 ),
[2] = LAYOUT_all(
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, 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, 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 ),
[3] = LAYOUT_all(
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, 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, 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 ),
};

View File

@@ -0,0 +1 @@
# The VIA keymap for adelais

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,18 @@
# Adelais / Adelais En Ciel
![adelais](https://i.imgur.com/6U1IfZe.png)
Compatible with TGR Alice and all clone variants.
`standard_led` (Adelais) comes with backlight and RGB underglow LEDs pre-soldered.
`rgb_led` (Adelais En Ciel) comes with per-key RGB LEDs pre-soldered.
* Keyboard Maintainer: [Team Mechlovin'](https://github.com/mechlovin)
* Hardware Supported: Adelais, Adelais En Ciel
* Hardware Availability: [Reddit GB](https://www.reddit.com/r/mechmarket/comments/fr7smq/gb_team_mechlovin_adelais_tgr_alice_clones/)
Make example for this keyboard (after setting up your build environment):
make mechlovin/adelais/standard_led:default
make mechlovin/adelais/rgb_led: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,16 @@
#pragma once
#define PRODUCT_ID 0xAEC1
#define PRODUCT Adelais En Ciel
#define DESCRIPTION Team.Mechlovin Adelais En Ciel
#define RGB_DI_PIN A7
#define DRIVER_LED_TOTAL 91
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 220 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_PINWHEEL // Sets the default mode, if none has been set

View File

@@ -0,0 +1 @@
RGB_MATRIX_ENABLE = WS2812

View File

@@ -0,0 +1,23 @@
# MCU name
MCU = STM32F303
# 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
MIDI_ENABLE = no # MIDI support
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
DEFAULT_FOLDER = mechlovin/adelais/standard_led

View File

@@ -0,0 +1,15 @@
#pragma once
#define PRODUCT_ID 0xAD01
#define PRODUCT Adelais
#define DESCRIPTION Team.Mechlovin Adelais
#define BACKLIGHT_PIN B0
#define BACKLIGHT_BREATHING
#define BACKLIGHT_PWM_DRIVER PWMD3
#define BACKLIGHT_PWM_CHANNEL 3
#define RGB_DI_PIN A7
#define RGBLED_NUM 23
#define RGBLIGHT_LIMIT_VAL 255
#define RGBLIGHT_ANIMATIONS

View File

@@ -0,0 +1,3 @@
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
BACKLIGHT_DRIVER = pwm
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow

View File

@@ -0,0 +1,12 @@
{
"keyboard_name": "Murciélago",
"url": "",
"maintainer": "elagil",
"width": 16,
"height": 10.025,
"layouts": {
"LAYOUT": {
"layout": [{"label":"0,3", "x":3.5, "y":0.25}, {"label":"6,2", "x":12, "y":0.25}, {"label":"0,2", "x":2.5, "y":0.375}, {"label":"0,4", "x":4.5, "y":0.375}, {"label":"6,1", "x":11, "y":0.375}, {"label":"6,3", "x":13, "y":0.375}, {"label":"0,1", "x":1.5, "y":0.5}, {"label":"0,5", "x":5.5, "y":0.5}, {"label":"6,0", "x":10, "y":0.5}, {"label":"6,4", "x":14, "y":0.5}, {"label":"0,0", "x":0.5, "y":0.675}, {"label":"6,5", "x":15, "y":0.675}, {"label":"1,3", "x":3.5, "y":1.25}, {"label":"7,2", "x":12, "y":1.25}, {"label":"1,2", "x":2.5, "y":1.375}, {"label":"1,4", "x":4.5, "y":1.375}, {"label":"7,1", "x":11, "y":1.375}, {"label":"7,3", "x":13, "y":1.375}, {"label":"1,1", "x":1.5, "y":1.5}, {"label":"1,5", "x":5.5, "y":1.5}, {"label":"7,0", "x":10, "y":1.5}, {"label":"7,4", "x":14, "y":1.5}, {"label":"1,0", "x":0.5, "y":1.675}, {"label":"7,5", "x":15, "y":1.675}, {"label":"2,3", "x":3.5, "y":2.25}, {"label":"8,2", "x":12, "y":2.25}, {"label":"2,2", "x":2.5, "y":2.375}, {"label":"2,4", "x":4.5, "y":2.375}, {"label":"8,1", "x":11, "y":2.375}, {"label":"8,3", "x":13, "y":2.375}, {"label":"2,1", "x":1.5, "y":2.5}, {"label":"2,5", "x":5.5, "y":2.5}, {"label":"8,0", "x":10, "y":2.5}, {"label":"8,4", "x":14, "y":2.5}, {"label":"2,0", "x":0.5, "y":2.675}, {"label":"8,5", "x":15, "y":2.675}, {"label":"3,3", "x":3.5, "y":3.25}, {"label":"9,2", "x":12, "y":3.25}, {"label":"3,2", "x":2.5, "y":3.375}, {"label":"3,4", "x":4.5, "y":3.375}, {"label":"9,1", "x":11, "y":3.375}, {"label":"9,3", "x":13, "y":3.375}, {"label":"3,1", "x":1.5, "y":3.5}, {"label":"3,5", "x":5.5, "y":3.5}, {"label":"5,5", "x":6.5, "y":3.5}, {"label":"11,0", "x":9, "y":3.5}, {"label":"9,0", "x":10, "y":3.5}, {"label":"9,4", "x":14, "y":3.5}, {"label":"3,0", "x":0.5, "y":3.675}, {"label":"9,5", "x":15, "y":3.675}, {"label":"4,2", "x":3.2, "y":4.3}, {"label":"10,3", "x":12.3, "y":4.3}, {"label":"4,3", "x":4.2, "y":4.4}, {"label":"10,2", "x":11.3, "y":4.4}, {"label":"4,1", "x":2.2, "y":4.5}, {"label":"4,5", "x":6.3, "y":4.5, "h":1.5}, {"label":"10,0", "x":9.2, "y":4.5, "h":1.5}, {"label":"10,4", "x":13.3, "y":4.5}, {"label":"4,4", "x":5.2, "y":4.6}, {"label":"10,1", "x":10.3, "y":4.6}]
}
}
}

View File

@@ -0,0 +1,17 @@
/* Copyright 2020 elagil
*
* 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 "murcielago.h"

View File

@@ -0,0 +1,49 @@
/* Copyright 2020 elagil
*
* 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 is 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.k
*/
#define LAYOUT( \
L00, L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, R06, \
L10, L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, R16, \
L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, \
L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \
L41, L42, L43, L44, L45, R41, R42, R43, R44, R45 \
) { \
{ L00, L01, L02, L03, L04, L05 },\
{ L10, L11, L12, L13, L14, L15 },\
{ L20, L21, L22, L23, L24, L25 },\
{ L30, L31, L32, L33, L34, L35 },\
{ KC_NO, L41, L42, L43, L44, L45 },\
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, L36 },\
{ R01, R02, R03, R04, R05, R06 },\
{ R11, R12, R13, R14, R15, R16 },\
{ R21, R22, R23, R24, R25, R26 },\
{ R31, R32, R33, R34, R35, R36 },\
{ R41, R42, R43, R44, R45, KC_NO },\
{ R30, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
}

View File

@@ -0,0 +1,12 @@
# Murciélago (the bat)
The Murciélago is a split ortholinear keyboard with 60 keys in a 6x4 layout + 6 thumb keys (per side). At the upper thumb positions, rotary encoders can be used instead of switches. A single-color backlight may be used as a layer indicator.
* Keyboard Maintainer: [elagil](https://github.com/elagil)
* Hardware Supported: [murcielago](https://github.com/elagil/murcielago)
Make example for this keyboard (after setting up your build environment):
make murcielago/rev1: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,97 @@
/*
Copyright 2020 elagil
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 0x6166 // af
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0002
#define MANUFACTURER elagil
#define PRODUCT Murciélago
#define DESCRIPTION A custom keyboard with 60 keys
/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 6
/* split options, use EEPROM for side detection */
#define EE_HANDS
#define SPLIT_USB_DETECT
/*
* 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 { B4, D5, B3, B2, B1, B0 }
#define MATRIX_COL_PINS { C6, B6, B5, D7, D6, D4 }
#define MATRIX_ROW_PINS_RIGHT { B3, B7, D4, B6, C6, C7 }
#define MATRIX_COL_PINS_RIGHT { D6, D7, D3, B2, B1, B0 }
#define ENCODERS_PAD_A { F0 }
#define ENCODERS_PAD_B { F1 }
#define ENCODERS_PAD_A_RIGHT { F6 }
#define ENCODERS_PAD_B_RIGHT { F7 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#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 E6
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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
/*
* 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
/* disable these deprecated features by default */
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
// #define BOOTMAGIC_LITE_COLUMN 0

View File

@@ -0,0 +1,130 @@
#include QMK_KEYBOARD_H
enum layers {
BASE,
_RAISE,
_LOWER,
_POWER
};
#define PRE_WRD LCTL(KC_LEFT) // jump to next word
#define NXT_WRD LCTL(KC_RGHT) // jump to previous word
#define NXT_WDL LCTL(KC_DEL) // delete next word
#define PRE_WDL LCTL(KC_BSPC) // delete previous word
#define KC_EURO ALGR(KC_5)
#define LA_CAP MT(MOD_LALT, KC_CAPS) // Left alt on hold, caps lock on tap
#define RA_ENT MT(MOD_RALT, KC_ENT) // Right alt on hold, enter on tap
#define RAISE MO(_RAISE) // Raise layer access
#define LOWER MO(_LOWER) // Lower layer access
#define POWER MO(_POWER) // Power layer access (raise and lower)
/*
* This default keymap is aimed at users of the US international layout
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* BASE
* ,-----------------------------------------. ,-----------------------------------------.
* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | [{ | Q | W | E | R | T | | Y | U | I | O | P | }] |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Del | A | S | D | F | G | | H | J | K | L | ;: | '" |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | Sft | Z | X | C | V | B | GEsc | | Tab | N | M | ,< | .> | /? | Sft |
* `------------------------------------------------' `------------------------------------------------'
* | LA/CL| LGUI |LOWER | Back | Ctrl | |RA/Ent|Space |RAISE | RGUI | Play |
* `----------------------------------' `----------------------------------'
*/
[BASE] = LAYOUT( /* qwerty */
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_LBRC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
KC_DEL, 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_GESC, KC_TAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
LA_CAP, KC_LGUI, LOWER, KC_BSPC, KC_LCTL, RA_ENT, KC_SPC, RAISE, KC_RGUI, KC_MPLY
),
/* RAISE
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | ! | @ | # | $ | % | | |PRE W | UP |NXT W | | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | ( | [ | { | < | | | LEFT | DOWN |RIGHT | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | ~ | = | + | \ | | | | | |DEL PW| Ins |DEL NW| | |
* `------------------------------------------------' `------------------------------------------------'
* | | |POWER | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_RAISE] = LAYOUT( /* raise layer */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_F12,
_______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX,
_______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______,
_______, _______, POWER, _______, _______, _______, _______, _______, _______, _______
),
/* LOWER
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | |PRE W | UP |NXT W | | | ^ | & | * | € | ? | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | LEFT | DOWN |RIGHT | | | > | } | ] | ) | | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | |DEL PW| Ins |DEL NW| | | | | | / | - | _ | ` | |
* `------------------------------------------------' `------------------------------------------------'
* | | | | | | | | |POWER | | |
* `----------------------------------' `----------------------------------'
*/
[_LOWER] = LAYOUT( /* lower layer */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
_______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
_______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
_______, _______, _______, _______, _______, _______, _______, POWER, _______, _______
),
/* POWER
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | ! | @ | # | $ | % | | ^ | & | * | € | ? | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | ( | [ | { | < | | > | } | ] | ) | | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | ~ | = | + | \ | | | | | | / | - | _ | ` | |
* `------------------------------------------------' `------------------------------------------------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_POWER] = LAYOUT( /* lower and raise combined */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
_______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
_______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
void encoder_update_user(uint8_t index, bool clockwise) {
switch (get_highest_layer(layer_state)) {
case _RAISE:
if (index == 0 || index == 1) { /* Left or right encoder */
// Next/previous track
clockwise ? tap_code(KC_MNXT) : tap_code(KC_MPRV);
}
break;
default:
if (index == 0 || index == 1) { /* Left or right encoder */
// Volume up or down
clockwise ? tap_code(KC_VOLU) : tap_code(KC_VOLD);
}
break;
}
}

View File

@@ -0,0 +1,130 @@
#include QMK_KEYBOARD_H
enum layers {
BASE,
_RAISE,
_LOWER,
_POWER
};
#define PRE_WRD LCTL(KC_LEFT) // jump to next word
#define NXT_WRD LCTL(KC_RGHT) // jump to previous word
#define NXT_WDL LCTL(KC_DEL) // delete next word
#define PRE_WDL LCTL(KC_BSPC) // delete previous word
#define KC_EURO ALGR(KC_5)
#define LA_CAP MT(MOD_LALT, KC_CAPS) // Left alt on hold, caps lock on tap
#define RA_ENT MT(MOD_RALT, KC_ENT) // Right alt on hold, enter on tap
#define RAISE MO(_RAISE) // Raise layer access
#define LOWER MO(_LOWER) // Lower layer access
#define POWER MO(_POWER) // Power layer access (raise and lower)
/*
* This default keymap is aimed at users of the US international layout
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* BASE
* ,-----------------------------------------. ,-----------------------------------------.
* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | [{ | Q | W | E | R | T | | Y | U | I | O | P | }] |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Del | A | S | D | F | G | | H | J | K | L | ;: | '" |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | Sft | Z | X | C | V | B | GEsc | | Tab | N | M | ,< | .> | /? | Sft |
* `------------------------------------------------' `------------------------------------------------'
* | LA/CL| LGUI |LOWER | Back | Ctrl | |RA/Ent|Space |RAISE | RGUI | Play |
* `----------------------------------' `----------------------------------'
*/
[BASE] = LAYOUT( /* qwerty */
KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_LBRC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
KC_DEL, 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_GESC, KC_TAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
LA_CAP, KC_LGUI, LOWER, KC_BSPC, KC_LCTL, RA_ENT, KC_SPC, RAISE, KC_RGUI, KC_MPLY
),
/* RAISE
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | ! | @ | # | $ | % | | |PRE W | UP |NXT W | | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | ( | [ | { | < | | | LEFT | DOWN |RIGHT | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | ~ | = | + | \ | | | | | |DEL PW| Ins |DEL NW| | |
* `------------------------------------------------' `------------------------------------------------'
* | | |POWER | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_RAISE] = LAYOUT( /* raise layer */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_F12,
_______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX,
_______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______,
_______, _______, POWER, _______, _______, _______, _______, _______, _______, _______
),
/* LOWER
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | |PRE W | UP |NXT W | | | ^ | & | * | € | ? | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | LEFT | DOWN |RIGHT | | | > | } | ] | ) | | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | |DEL PW| Ins |DEL NW| | | | | | / | - | _ | ` | |
* `------------------------------------------------' `------------------------------------------------'
* | | | | | | | | |POWER | | |
* `----------------------------------' `----------------------------------'
*/
[_LOWER] = LAYOUT( /* lower layer */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
_______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
_______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
_______, _______, _______, _______, _______, _______, _______, POWER, _______, _______
),
/* POWER
* ,-----------------------------------------. ,-----------------------------------------.
* | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | ! | @ | # | $ | % | | ^ | & | * | € | ? | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | ( | [ | { | < | | > | } | ] | ) | | | |
* |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
* | | ~ | = | + | \ | | | | | | / | - | _ | ` | |
* `------------------------------------------------' `------------------------------------------------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_POWER] = LAYOUT( /* lower and raise combined */
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
_______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
_______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
void encoder_update_user(uint8_t index, bool clockwise) {
switch (get_highest_layer(layer_state)) {
case _RAISE:
if (index == 0 || index == 1) { /* Left or right encoder */
// Next/previous track
clockwise ? tap_code(KC_MNXT) : tap_code(KC_MPRV);
}
break;
default:
if (index == 0 || index == 1) { /* Left or right encoder */
// Volume up or down
clockwise ? tap_code(KC_VOLU) : tap_code(KC_VOLD);
}
break;
}
}

View File

@@ -0,0 +1 @@
VIA_ENABLE = yes

View File

@@ -0,0 +1,34 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = atmel-dfu
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # 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
MIDI_ENABLE = no # MIDI support
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
SPLIT_KEYBOARD = yes # Enable split keyboard mode
ENCODER_ENABLE = yes

View File

@@ -0,0 +1 @@
DEFAULT_FOLDER = murcielago/rev1

View File

@@ -0,0 +1,27 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x6666
#define PRODUCT_ID 0x6668
#define DEVICE_VER 0x0001
#define MANUFACTURER Pabile
#define PRODUCT P18 Macro Pad
#define DESCRIPTION An 18-key DIY macropad kit
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 5
/* pin-out for PROMICRO */
#define MATRIX_ROW_PINS { D1, D0, D4, C6 }
#define MATRIX_COL_PINS { D2, D7, E6, B4, B5 }
#define UNUSED_PINS
/* Encoder position for PROMICRO */
#define ENCODERS_PAD_A { B6, F6 }
#define ENCODERS_PAD_B { F4, F5 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

View File

@@ -0,0 +1,31 @@
{
"keyboard_name": "Pabile 18",
"url": "https://pabileonline.blogspot.com/",
"maintainer": "Pabile",
"width": 5.25,
"height": 4,
"layouts": {
"LAYOUT": {
"layout": [
{"x":1.25, "y":0},
{"x":2.25, "y":0},
{"x":3.25, "y":0},
{"x":4.25, "y":0},
{"x":1.25, "y":1},
{"x":2.25, "y":1},
{"x":3.25, "y":1},
{"x":4.25, "y":1},
{"x":0, "y":2},
{"x":1.25, "y":2},
{"x":2.25, "y":2},
{"x":3.25, "y":2},
{"x":4.25, "y":2},
{"x":0, "y":3},
{"x":1.25, "y":3},
{"x":2.25, "y":3},
{"x":3.25, "y":3},
{"x":4.25, "y":3}
]
}
}
}

View File

@@ -0,0 +1,27 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_MUTE, KC_P1, KC_P2, KC_P3, KC_TAB,
KC_ESC, KC_DEL, KC_P0, KC_PDOT, KC_PENT
)
};
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder below the controller */
if (clockwise) {
tap_code(KC_VOLD); /*volume down*/
} else {
tap_code(KC_VOLU); /*volume up*/
}
} else if (index == 1) { /* Second encoder */
if (clockwise) {
tap_code(KC_WH_U); /*mouse wheel up*/
} else {
tap_code(KC_WH_D); /*mouse wheel down*/
}
}
}

View File

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

View File

@@ -0,0 +1,16 @@
#pragma once
#include "quantum.h"
#define LAYOUT( \
k01, k02, k03, k04, \
k11, k12, k13, k14, \
k20, k21, k22, k23, k24, \
k30, k31, k32, k33, k34 \
) \
{ \
{KC_NO, k04, k03, k02, k01}, \
{KC_NO, k14, k13, k12, k11}, \
{k20, k24, k23, k22, k21}, \
{k30, k34, k33, k32, k31} \
}

View File

@@ -0,0 +1,15 @@
# P18
![render](https://i.imgur.com/CPtGiSL.png)
A 18-key DIY Hotswap Macropad that accepts both Pro Micro and Adafruit Feather 32u4 Bluefruit LE.
* Keyboard Maintainer: [pabile](https://github.com/pabile)
* Hardware Supported: Pabile P18 PCB with Pro Micro or Adafruit Feather 32u4 Bluefruit LE
* Hardware Availability: [Info at pabileonline.blogspot.com](https://pabileonline.blogspot.com/search/label/pabile18)
Make example for this keyboard (after setting up your build environment):
make pabile/p18: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,35 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # 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
MIDI_ENABLE = no # MIDI support
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
UNICODE_ENABLE = yes # Unicode
IOS_DEVICE_ENABLE = no # connect to IOS Device
ENCODER_ENABLE = yes

View File

@@ -0,0 +1,26 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x6666
#define PRODUCT_ID 0x6667
#define DEVICE_VER 0x0001
#define MANUFACTURER Pabile
#define PRODUCT P20
#define DESCRIPTION 5x4 Macropad
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 4
/* pin-out */
#define MATRIX_ROW_PINS { B3, B4, B5, D7, E6 }
#define MATRIX_COL_PINS { D0, B2, D4, B6 }
#define UNUSED_PINS
#define ENCODERS_PAD_A { F5, F7 }
#define ENCODERS_PAD_B { F6, B1 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

View File

@@ -0,0 +1,38 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_5x4(
KC_PSLS, KC_PMNS, KC_PAST, KC_MPLY,
KC_P7, KC_P8, KC_P9, KC_PMNS,
KC_P4, KC_P5, KC_P6, KC_PPLS,
KC_P1, KC_P2, KC_P3, KC_TAB,
LT(2,KC_P0), KC_PCMM, KC_PDOT, LT(1,KC_PENT)),
[1] = LAYOUT_ortho_5x4(
KC_NLCK, KC_UNDS, KC_NO, KC_NO,
KC_AMPR, KC_ASTR, KC_LPRN, KC_EQL,
KC_DLR, KC_PERC, KC_CIRC, KC_NO,
KC_EXLM, KC_AT, KC_HASH, KC_NO,
KC_RPRN, KC_NO, KC_PSLS, KC_NO),
[2] = LAYOUT_ortho_5x4(
KC_NLCK, KC_NO, KC_NO, KC_NO,
KC_BTN1, KC_MS_U, KC_BTN2, KC_NO,
KC_MS_L, KC_MS_D, KC_MS_R, KC_TAB,
KC_WH_U, KC_NO, KC_WH_D, KC_NO,
KC_NO, KC_NO, KC_DEL, KC_ESC)
};
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { /* First encoder */
if (clockwise) {
tap_code(KC_WH_U); /*mouse wheel up*/
} else {
tap_code(KC_WH_D); /*mouse wheel down */
}
} else if (index == 1) { /* Second encoder */
if (clockwise) {
tap_code(KC_VOLD); /*volume down*/
} else {
tap_code(KC_VOLU); /*volume up*/
}
}
}

View File

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

View File

@@ -0,0 +1,18 @@
#pragma once
#include "quantum.h"
#define LAYOUT_ortho_5x4( \
k00, k01, k02, k03, \
k10, k11, k12, k13, \
k20, k21, k22, k23, \
k30, k31, k32, k33, \
k40, k41, k42, k43 \
) \
{ \
{k00, k01, k02, k03}, \
{k10, k11, k12, k13}, \
{k20, k21, k22, k23}, \
{k30, k31, k32, k33}, \
{k40, k41, k42, k43} \
}

View File

@@ -0,0 +1,16 @@
# P20
![Linear grid](https://github.com/pabile/Pabile20/blob/master/_bak/layout-grid.jpg)
![Numeric pad](https://github.com/pabile/Pabile20/blob/master/_bak/layout-numpad.jpg)
A 5x4 grid keyboard with 2 rotary encoders.
* Keyboard Maintainer: [pabile](https://github.com/pabile)
* Hardware Supported: Pabile P20 PCB, Pro Micro
* Hardware Availability: [Info at pabileonline.blogspot.com](https://pabileonline.blogspot.com/search/label/pabile20)
Make example for this keyboard (after setting up your build environment):
make pabile/p20: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,37 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
# Teensy halfkay
# Pro Micro caterina
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # 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
MIDI_ENABLE = no # MIDI support
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
UNICODE_ENABLE = yes # Unicode
IOS_DEVICE_ENABLE = no # connect to IOS Device
ENCODER_ENABLE = yes
LAYOUTS = ortho_5x4

View File

@@ -0,0 +1,29 @@
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x6666
#define PRODUCT_ID 0x6666
#define DEVICE_VER 0x0001
#define MANUFACTURER Pabile
#define PRODUCT P40 Keyboard
#define DESCRIPTION 4x10 staggered keyboard
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 10
/* pin-out
for PCB ver0.01 452019 */
#define MATRIX_ROW_PINS { F6, B3, B2, B6 }
#define MATRIX_COL_PINS { F4, F5, B5, B4, E6, D7, C6, D4, D0, D1 }
/*
for pro micro facing back of pcb
#define MATRIX_ROW_PINS { D4, E6, B4, B5 }
#define MATRIX_COL_PINS { D1, D0, B6, B2, B3, B1, F7, F6, F5, F4 }
*/
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

View File

@@ -0,0 +1,52 @@
{
"keyboard_name": "Pabile 40",
"url": "https://pabileonline.blogspot.com/",
"maintainer": "Pabile",
"width": 10.75,
"height": 4,
"layouts": {
"LAYOUT_ortho_4x10": {
"layout": [
{"x":0, "y":0},
{"x":1, "y":0},
{"x":2, "y":0},
{"x":3, "y":0},
{"x":4, "y":0},
{"x":5, "y":0},
{"x":6, "y":0},
{"x":7, "y":0},
{"x":8, "y":0},
{"x":9, "y":0},
{"x":0.25, "y":1},
{"x":1.25, "y":1},
{"x":2.25, "y":1},
{"x":3.25, "y":1},
{"x":4.25, "y":1},
{"x":5.25, "y":1},
{"x":6.25, "y":1},
{"x":7.25, "y":1},
{"x":8.25, "y":1},
{"x":9.25, "y":1},
{"x":0.5, "y":2},
{"x":1.5, "y":2},
{"x":2.5, "y":2},
{"x":3.5, "y":2},
{"x":4.5, "y":2},
{"x":5.5, "y":2},
{"x":6.5, "y":2},
{"x":7.5, "y":2},
{"x":8.5, "y":2},
{"x":9.5, "y":2},
{"x":0.75, "y":3},
{"x":1.75, "y":3},
{"x":2.75, "y":3},
{"x":3.75, "y":3},
{"x":4.75, "y":3},
{"x":5.75, "y":3},
{"x":6.75, "y":3},
{"x":7.75, "y":3},
{"x":8.75, "y":3},
{"x":9.75, "y":3}]
}
}
}

View File

@@ -0,0 +1,29 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_ortho_4x10(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3,KC_MINS),
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(4,KC_SLSH),
KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, LT(2,KC_BSPC), LT(1,KC_SPC), KC_ENT, KC_APP, KC_DEL, KC_ESC),
[1] = LAYOUT_ortho_4x10(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_TAB, KC_NO, KC_NO, KC_GRV, KC_LBRC, KC_RBRC, KC_BSLS, KC_SCLN, KC_QUOT, KC_MINS,
KC_NO, KC_NO, KC_NO, KC_NO, KC_EQL, KC_MINS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[2] = LAYOUT_ortho_4x10(
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
KC_TAB, KC_F11, KC_F12, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_CAPS, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NLCK, KC_NO, KC_VOLD, KC_VOLU, KC_MUTE,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[3] = LAYOUT_ortho_4x10(
KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_INS, KC_PGUP, KC_UP, KC_PGDN, KC_DEL,
KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
[4] = LAYOUT_ortho_4x10(
KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_DEL,
KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO)
};

Some files were not shown because too many files have changed in this diff Show More