Compare commits

...

125 Commits

Author SHA1 Message Date
Geoffrey BOTIN
2ffac90c99 Fix typo causing redefined error in keymap_french_osx (#10962)
Co-authored-by: gbotin <geoffrey.botin@gmail.com>
2020-11-17 09:27:09 +11:00
Takeshi ISHII
e6a13e0b1c [Keymap] clean up helix:five_rows keymap (#10866)
* Makes the OLED driver used by the helix:five_rows keymap switchable.

* use TOP/drivers/oled/oled_driver.c
  `make HELIX=stdole helix:five_rows`
* use helix/local_drivers/ssd1306.c
  `make HELIX=oled helix:five_rows`

* Separated the OLED related code from keymap.c and moved it to oled_display.c.

* scan rate without OLED
  * make HELIX=verbose,dispoff,scan helix/rev2:five_rows
    use Helix original code
    text   data    bss    dec    hex   filename
    18880    58    235  19173   4ae5   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 1590

  * make HELIX=verbose,dispoff,scan,sc helix/rev2:five_rows
    use split_common code
    text   data    bss    dec    hex   filename
    18554    40    231  18825   4989   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 1202

* scan rate with helix/local_drivers/ssd1306.c
  * make HELIX=verbose,dispoff,scan,oled helix/rev2:five_rows
    use Helix original code
    text   data    bss    dec    hex   filename
    24048   196    342  24586   600a   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 739

  * make HELIX=verbose,dispoff,scan,sc,oled helix/rev2:five_rows
    use split_common code
    text   data    bss    dec    hex   filename
    23750   176    338  24264   5ec8   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 642

* scan rate with drivers/oled/oled_driver.c
  * make HELIX=verbose,dispoff,scan,stdole helix/rev2:five_rows
    use Helix original code
    text   data    bss    dec    hex   filename
    24590   210    798  25598   63fe   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 293

  * make HELIX=verbose,dispoff,scan,sc,stdole helix/rev2:five_rows
    use split_common code
    text   data    bss    dec    hex   filename
    24290   190    794  25274   62ba   .build/helix_rev2_five_rows.elf
    matrix scan frequency: 277

* clean up helix/rev2/keymaps/five_rows/keymap.c

* update five_rows/oled_display.c

* update helix/rev2/keymaps/five_rows/keymap.c: remove LAYOUT_kc()

* Ported the keymap from helix/rev2:five_rows to helix/rev3_5rows:five_rows.

* update five_rows/oled_display.c

* add License comment
2020-11-17 07:26:44 +09:00
Cole Helbling
aaea5e24b6 [Keyboard] YMDK NP21: correct numpad layout matrix (#10874)
I noticed that my KC_PPLS and KC_PENT keys weren't actually doing
anything. By looking at the ortho_6x4 layout, I guessed that maybe the
pins were incorrect and guessed the proper ones. Now, my numpad is fully
functional.
2020-11-16 13:45:45 -08:00
Erovia
b337ba798e CLI: Udev related fixes and improvements (#10736) 2020-11-16 21:09:32 +00:00
Joel Challis
94e94ffb5b Recommend use of LED Indicator config (#10895)
* Recommend use of LED Indicator config

* Recommend use of LED Indicator config - update link

* Update quantum/template/ps2avrgb/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-16 14:16:42 +11:00
jvbroek
cfc9a358c5 [Keyboard] Add "Uno" (#10579)
* Add all files

* Update keyboards/uno/config.h

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

* Update keyboards/uno/config.h

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

* Update keyboards/uno/rules.mk

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

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

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

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

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

* Update keyboards/uno/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/uno/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update readme.md

Co-authored-by: Joshua Broekhuijsen <j.broekhuijsen@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-16 00:43:20 +00:00
Ikta
e4236278b5 [Keyboard] added Pill60 to handwired/pill60 (#10798)
* added to handwired pill60

* Update keyboards/handwired/pill60/config.h and all other PR suggested changes

Deleted DESCRIPTION

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

Update keyboards/handwired/pill60/readme.md

Smaller image in readme

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

Update keyboards/handwired/pill60/info.json

Deleted key_count

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/keymaps/default/keymap.c

Deleted backslash on keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/pill60.h

Deleted led.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/blackpill_f401/rules.mk

Update stm32f401 rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/blackpill_f411/rules.mk

Update stm32f411 rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/bluepill/rules.mk

Update bluepill rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

Update keyboards/handwired/pill60/rules.mk

Added comment on rules.mk to help ]

Co-authored-by: Ryan <fauxpark@gmail.com>

deleted bootloader_defs.h

added GPL2 + compatible license header

updated keymap readme

updated those that don't need common_config.h and deleted some unnecessary spaces in f411/rules.mk

updated default folder in rules.mk

* fix and simplify build files according to onekey example

* Added GPL2+ Compatible license header
2020-11-15 11:40:55 -08:00
Takeshi ISHII
81a17f4270 [Keyboard] add Symmetric70 keyboard prototype (#10780)
* proto_symmetric70 作成中

74hc157 無しで 片手動作は、右と左でそれぞれうごいた。

* add 74HC157 support

* add keymaps/default_mac

* update proto_symmetric70/keymaps/default_mac/readme.md

* update 74HC157 support

* add keyboards/handwired/proto_symmetric70/matrix.c.patch

* update keyboards/handwired/proto_symmetric70/readme.md

* rename proto_symmetric70 to symmetric70_proto

* Update keyboards/handwired/symmetric70_proto/config.h

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

* Update keyboards/handwired/symmetric70_proto/symmetric70_proto.c

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

* Update keyboards/handwired/symmetric70_proto/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* update readme.md

* update keyboards/handwired/symmetric70_proto/config.h

* remove keyboards/handwired/symmetric70_proto/matrix.c.patch

* Update keyboards/handwired/symmetric70_proto/matrix.c

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

* Update keyboards/handwired/symmetric70_proto/matrix.c

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

* use KC_NO, _______

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-15 11:31:23 -08:00
Nathan Friend
bb9fbd66e9 [Keymap] Add nfriend's ErgoDox EZ keymap (#10545) 2020-11-15 10:57:34 -08:00
Naoki Katahira
5edce6ba26 [Keyboard] Add Lily58 via keymap (#10178)
* Add Lily58 VIA keymap

* Update keyboards/lily58/keymaps/via/keymap.c

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

* Update keyboards/lily58/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/lily58/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/lily58/keymaps/via/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* update via keymap

* fix keymap.c

* add licence to keymap.c

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-15 09:36:05 -08:00
Philip (Han) Suh
91b44016f9 ZTBoards Updated keymap and updated info.json (#10926)
* Updated information on info.json and hopefully de-cluttered branch

* Updated default encoder settings

* Updated info.json for after to be in the proper order

* Fixed maintainer name
2020-11-14 22:17:16 -08:00
Josh Hinnebusch
45e16fd543 [Keyboard] h660s by hineybush (#10221)
* add h660s

* add via support to h660s

* update readme

* Update keyboards/hineybush/h660s/keymaps/via/readme.md

* Update keyboards/hineybush/h660s/keymaps/via/keymap.c

* Update keyboards/hineybush/h660s/keymaps/via/keymap.c

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/keymaps/default/keymap.c

* Update keyboards/hineybush/h660s/keymaps/default/keymap.c

* Update keyboards/hineybush/h660s/keymaps/via/keymap.c

* Update keyboards/hineybush/h660s/keymaps/via/keymap.c

* Update keyboards/hineybush/h660s/readme.md

* Update keyboards/hineybush/h660s/readme.md

* Update keyboards/hineybush/h660s/keymaps/default/keymap.c

* Update keyboards/hineybush/h660s/keymaps/default/keymap.c

* Update keyboards/hineybush/h660s/info.json

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h

* Update keyboards/hineybush/h660s/h660s.h
2020-11-14 19:23:58 -08:00
Lukas Alexandre
a7afaa36a1 [Keyboard] Time 80 TKL by Fox Lab (#10851)
* Porting Time 80 TKL

* Update keyboards/foxlab/key65/hotswap/readme.md

* Update keyboards/foxlab/time80/rules.mk

* Update keyboards/foxlab/time80/config.h

* Update keyboards/foxlab/time80/readme.md

* Update keyboards/foxlab/time80/readme.md

* Update keyboards/foxlab/time80/config.h

* Use LAYOUT_all

* Fixing placement of shortcuts
2020-11-14 14:33:51 -08:00
gooberpsycho
d7c1b890f1 [Keyboard] Southpaw66 by rpiguy9907 (#10782)
* added Keyboard Southpaw66

* Housekeeping, shorten urls

* Housekeeping

* Row matrix pins were flipped, fixed

* housekeeping, extraneous punctuation

* bug-fixing

* bug-fixing

* Layout macro fixed

* Layout macro fixed again

* Update and rename Southpaw66,c to southpaw66.c

* Rename Southpaw66.h to southpaw66.h

* Update config.h

* Update info.json

* Change Southpaw66 to southpaw66

made change to case in all instances in code except where critical, such as in url's.

* Rename parent folder from Southpaw66 to southpaw66

* Rename parent folder from Southpaw66 to southpaw66

* Update info.json

* Update keyboards/rpiguy9907/Southpaw66/readme.md

updated image url to point to lower resolution image.

* Update config.h

re-capitalized Southpaw66 in product name.

* Rename Southpaw66 parent folder to southpaw66

* Rename parent folder from Southpaw66 to southpaw66

* rename parent folder from Southpaw66 to southpaw66

* rename parent folder from Southpaw66 to southpaw66

* Rename parent folder from Southpaw66 to southpaw66

* rename parent folder from Southpaw66 to southpaw66

* rename parent folder from Southpaw66 to southpaw66

* Update keyboards/rpiguy9907/southpaw66/readme.md

* Update keyboards/rpiguy9907/southpaw66/config.h
2020-11-13 22:23:22 -08:00
Sergey Vlasov
0dee334bce handwired/onekey/blackpill_f401: Fix I2C pin config mismatch (#10322)
By default the `i2c_master` driver for ChibiOS uses the B6 pin for
`I2C1_SCL` and the B7 pin for `I2C1_SDA`.  However, the ChibiOS board
file used for the F401 Blackpill board (`ST_STM32F401C_DISCOVERY`)
configures B6 as `I2C1_SCL` and B9 as `I2C1_SDA`, and if that
configuration is left unchanged, enabling the `i2c_master` driver
results in having two pins (B7 and B9) configured as `I2C1_SDA` at the
same time, which does not work properly (experimental results show that
the B9 pin still works as `I2C1_SDA` in that case, and the B7 pin does
not work).

Configure the B9 pin as an input with pull-up in `board_init()`, so that
the B7 pin can be configured as `I2C1_SDA` by the I2C driver.
2020-11-12 20:00:35 +11:00
KemoNine
a422309354 Bring up Qvex Lynepad (#10826) 2020-11-12 09:24:00 +11:00
Zach White
683ba8b8d4 Improve the QMK Lint workflow (#10909)
* properly set the exit_code

* handle the case where exit_code is greater than 255
2020-11-10 15:21:59 +00:00
Joel Challis
aae3b35c0f CI: Add docs build and deploy workflow (#7448)
* Add docs build and deploy workflow

* Remove old travis docs workflow

* update to cli command

* Tidy up for review

* formatting

* Update to pass style checks

* Update lib/python/qmk/cli/docs.py

Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>

* Review comments - build->generate, use of verbose

* Add docs

* Update to match recent actions

* Run within base_container

* Convert cli to generate-docs

* Convert cli to generate-docs - restore old file

* Convert cli to generate-docs

* Update docs

Co-authored-by: skullydazed <skullydazed@users.noreply.github.com>
2020-11-10 07:00:40 -08:00
Legonut
abf1902ff5 [Keyboard] RGBKB Pan (#9587)
* Add new keyboard Pan

Encoder switches still need work

* New keyboard Pan

Should be complete

* Split MCU selection into 2 revision folders

* [rgbkb/pan] Make requested changes for PR

Additionally, set DEFAULT_FOLDER to rev1, and default rev1
 to atmega32a (as all shipped kits include an atmega32a)

* Apply suggestions from code review

* Fix default keymap typo

* add usb max power define

* Commit suggested changes

* Update keyboards/rgbkb/pan/config.h

* Apply suggestions from code review

Small copyright updates

* Apply suggestions from code review
2020-11-09 22:22:22 -08:00
Ole Westendorff
aa90cf1da8 XD68: add 65_ansi_split_bs layout (#10835)
* XD68: add 65_ansi_split_bs layuout

* change number of keys in info.json

* Apply suggestions from code review
2020-11-09 21:26:16 -08:00
yfuku
7595f53856 refactor SPLIT_KEYBOARD, OLED_DRIVER_ENABLE (#10405) 2020-11-10 16:07:12 +11:00
chent7
8af767cb1d [Keyboard] Crazy Keyboard 68 (#10693)
* Entry and readme for crazy keyboard 68

* Defined layout in keyboard.h

* Basic setup done

* Working config, keymaps, rgb confirmed. Caps lock led untested

* Update readme.md

Image links

* Update config.h

* Update crazy_keyboard_68.c

#include "quantum.h"

* Match PR

* Update keyboards/crazy_keyboard_68/crazy_keyboard_68.c

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

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

* Update keyboards/crazy_keyboard_68/info.json

* Update keyboards/crazy_keyboard_68/crazy_keyboard_68.h

* Update keyboards/crazy_keyboard_68/rules.mk

* Update keyboards/crazy_keyboard_68/rules.mk

* Update keyboards/crazy_keyboard_68/config.h
2020-11-09 21:06:55 -08:00
rupa
a9f65b760a userspace and keymap changes for rupa (#10489)
* userspace and keymap changes for rupa

* remove layout wrappers and blocker rows from wrappers

handle this in keymaps for now
2020-11-10 16:04:46 +11:00
Garret G
53f11668a3 [Keyboard] kingly_keys/ave (#10042)
* Add configurator support for "The Ave." keyboard

* Update readme.md

* update misc nomenclature

* add punctuation

* fix miss-placed "0"

* update README.md

* del. duplicate "F11" in visual layout information

* Split PCB configurations into subfolders

* update layer template to new matrix title

* rm primary <keyboard>.c / <keyboard>.h files

* add new end line to both .h subfolder fiels

* Apply suggestions from code review

* tested update to RGB code

* update rgb code

* Apply suggestions from code review

* Apply suggestions from code review

* Apply suggestions from code review

* Update rules.mk

* Update rules.mk

* Delete rules.mk

* Delete rules.mk

* Update rules.mk

* Update config.h

* Update config.h

* Update keymap.c

* Update ortho.c

* Update ortho.h

* Update config.h

* Update keymap.c

* Update staggered.c

* Update staggered.h

* Apply suggestions from code review

* Update config.h

* Update keymap.c

* move and duplicate rules.mk file

* Update keyboards/kingly_keys/ave/readme.md

* Update config.h

* Update keyboards/kingly_keys/ave/config.h
2020-11-09 21:03:12 -08:00
elijahblake81
2ef68a84b6 Added color wheel that have QMK HSV values. (#8997)
I've converted the 360 color wheel to the 255 color wheel for QMK HSV values.
2020-11-10 15:57:43 +11:00
Mikkel Jeppesen
489bee0ee4 [Docs] redirect from /tutorial to /newbs (#10718)
* Added redirect from /tutorial to /newbs

* Fixed indentation

* Changed title of tutorial page
2020-11-09 20:33:15 -08:00
Nate Stein
ed8d1d1ae7 Add VIA Keymap for Worldspawn Gothic70. (#10617)
* Add VIA Keymap for Worldspawn Gothic70.

* Prevent LEDs from turning on at startup.

* Add license header to keymap.

* Fix Keymap Formatting.
2020-11-09 16:30:31 -08:00
Yan-Fa Li
f38a3b7408 [Keymap] little foot (#7305)
* Personal keymap

 - fix quoting in description

fix issue with userspace disabling audio

wip

Update keyboards/kingly_keys/little_foot/keymaps/yanfali/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/kingly_keys/little_foot/config.h

Co-authored-by: Nick Brassel <nick@tzarc.org>

Co-authored-by: Yan-Fa Li <yanfa.li@fireeye.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2020-11-10 09:44:22 +11:00
Chris Merrill
16fe4b8b77 Update massdrop/alt and arm_atsam/led_matrix to fix #10813 (#10818)
* Update massdrop/alt keyboard to fix Caps Lock LED flickering.

* Fix Caps-lock LED during underglow-only for massdrop/ctrl

* Update keyboards/massdrop/ctrl/keymaps/default/keymap.c
2020-11-09 13:33:40 -08:00
Jordan Egstad
84ca67f158 [Keymap] idobo:egstad (#10783)
* feat: new keymapping for idobo

* fix: added licenses. converted int to uint8_t where applicable

* fix: addressed zvecr stylistic enhancements

* fix: replaced rgblight_sethsv with rgblight_sethsv_noeeprom
2020-11-09 11:54:15 -08:00
SeungheonOh
cb80b59e93 Adding few Korean translated files (#5895)
* Korean Translation

Korean Translation

* Korean translation

* more Korean translations
2020-11-10 06:11:04 +11:00
yiancar
95bbd799a4 [Keyboard] Keebwerk MEGA Initial commit (#10777)
* Initial commit

- Add Keebwerk Mega pcb
- Update wilba rgb code

* Update keyboards/keebwerk/mega/ansi/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/keymaps/via/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/keymaps/default/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/ansi.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/ansi.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/ansi.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebwerk/mega/ansi/ansi.c

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-09 10:39:25 -08:00
Joel Challis
1ff5ee255f Indicator LEDs as config (#10816)
* First pass

* Add config options to docs

* Update some wording

* Slight tidy up of backlight caps logic

* Init pin to correct state

* Move init location

* Reverse default state
2020-11-08 22:31:16 +00:00
kb-elmo
9cd3ffa5ba add missing physical layout options and VIA support for Sesame (#10471)
* add missing physical layout options and VIA support for Sesame

* Apply suggestions from code review

* make split rshift standard again
2020-11-08 01:07:53 -08:00
Drashna Jaelre
ff7f70314e [Keyboard] Fix unused variables in mschwingen modelm (#10811)
Specifically, the lgreen variable isn't used, and avr-gcc 8.x complains about this. To prevent it from being an issue, just set all of these led variables to be unused.
2020-11-07 21:35:21 -08:00
TJ
db829c9453 Add big spacebar defaults to Underscore33 (#10731)
* add big spacebar default

* add rev1 big space

* add big spacebar default

* add rev1 big space

* Fixed copyright statements
Removed unused RGBRST keycode and bootmagic swaps
2020-11-07 20:04:32 -08:00
Zach White
bd1c048a76 Add qmk info -l to show the layouts too (#10882) 2020-11-07 19:36:47 +00:00
Zach White
4d33d72975 New command: qmk lint (#10761)
* Basic qmk lint command

* check for keymap readme

* change the workflow from qmk info to qmk lint

* add a strict mode

* parsing -> parse

* document qmk lint

* small info logging cleanup

* Apply suggestions from code review

Co-authored-by: Ryan <fauxpark@gmail.com>

* honor --strict in more places

* change the job name to lint

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-07 09:56:08 -08:00
Joe Wasson
7ce5402417 Updates to Talljoe's Keymaps (#10115)
* Minor Tweak

* Refactor spacebar defines.

* Add TMO50 layout

* Rename Atreus keymap.

* Refactor Atreus for readability.

* Eliminate tapdance quote and tweak maltroff.

* Factor out tapdance.

* Add some fancy combos and keys.

* Remove combos for now because they cause pain.

* WIP visualizer

* Alternate method for reset

* WIP2 visualizer

* Layer text tweak.

* Add made-up layout Nortron as a combination of Norman and Maltron.

* Add backspace.

* Add Talljoe keymap to Prime E.

* Fix double-colon so it doesn't press enter if shift is released early.

* Use new make command.

* Bring some modern standards into code and add licenses.

* Remove QMK_KEYBOARD_CONFIG_H and fixup QMK_KEYBOARD_H.

* Move from `biton32` to `get_highest_layer`.

* Remove PREVENT_STUCK_MODIFIERS

* Update keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h
2020-11-06 17:16:22 -08:00
Jonathan Rascher
b5ebdf1b3a [Keymap] bcat keymaps and userspace (#10705)
Add Eco keymap, factor Crkbd keymap to community layout, other minor tweaks

* Remove outdated Crkbd Ctrl key positioning info

* Add Left Alt key to Lily58 keymap

* Lily58 no longer overrides default TAPPING_TERM

* Refactor Crkbd keymap to use new community layout

* Fix underglow animations for Crkbd w/ Split Common

* Add initial Eco keymap

* Update outdated reference to Crkbd layout

* Add keymap links to userspace readme

* Add copyright notices to files changed in this PR
2020-11-05 22:41:06 -08:00
yulei
d7c90d805f add dp60 indicator mode (#8801)
* add dp60 indicator mode

* update according to #7720

* added license header and move the ws2812 codes to a seperate c file

* fixed conflict with master
2020-11-05 21:36:04 -08:00
kaylanm
5f2c434954 E85 backlight & LED indicator updates (#10678)
* Enable in-switch backlight on e85 for VIA keymaps.

Update LED indicator code for e85 hotswap/soldered PCBs.
2020-11-05 20:58:00 -08:00
X-Bows Tech
f2eb080aa2 Add support for 4 IS31FL3731 devices (#10860)
This is a simple change.Support for IS31FL3731 has been changed from 2 to 4.
2020-11-05 19:58:46 +00:00
Brandon Schlack
f12dcb0659 [Keymap] add brandonschlack userspace and keymaps (#10411) 2020-11-04 21:55:03 -08:00
Endemoniada
262a607334 [Keymap] add ai03/polaris:mekberg (#10508)
* Add keymap for Polaris

* Change back to KC_NUBS for <> key

* Add GPL header from default files

* Change to new way of flashing in readme
2020-11-04 13:49:49 -08:00
Ryan
7ef98e7f61 CLI: Add qmk clean (#10785) 2020-11-04 19:18:47 +00:00
katawajojo
d46fa2274c Adds support for XD84 Pro (#9750)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: katawajojo <vibri@localhost>
Co-authored-by: katawajojo <katawajojo@vibri.local>
2020-11-04 11:39:12 +11:00
Ryan
e024147ce5 Freyr refactor (#10833) 2020-11-04 10:39:11 +11:00
Ryan
c60cafae41 KC60 refactor (#10834) 2020-11-02 16:55:22 -08:00
Drashna Jaelre
38162af5a7 [Keyboard] Fixes for PloopyCo mouse and readmes (#10841) 2020-11-03 00:17:05 +00:00
kaylanm
e680af98d2 Enable extrakeys, mousekeys for all VIA keymaps. (#10740) 2020-11-02 21:23:05 +00:00
Reibl János Dániel
4ba0cb7ebc Add OLED support for Riblee F411 (#10778)
* Add OLED support for Riblee F422

* Fix typo
2020-11-02 21:20:22 +00:00
yiancar
4b839db384 NK65 eeprom compatibility with 128KB and 256KB (#10804)
* NK65 define hack for 128kb 256kb versions of F303

* Updated to chibios define
2020-11-03 06:09:48 +11:00
ai03
e041ec1655 Add support for Noxary Vulcan (#10822)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: ai03 <sarcaphx510@gmail.com>
2020-11-03 00:45:02 +11:00
Frothy
75201c73a0 Enable media keys support for Canoe VIA keymap (#10829) 2020-11-03 00:35:38 +11:00
Ryan
8e71d3d053 Phantom refactor (#10805) 2020-11-02 20:23:54 +11:00
Ryan
e69da2db2c qmk info: Add --ascii flag (#10793)
* `qmk info`: Add `--ascii` flag

* Fix typo

* Force ASCII for Windows/MSYS2

* Make it gooder

* Remove redundant windows check

* ...And this too

* Make pytest work on Windows
2020-11-02 00:41:01 -08:00
Rich Saunders
dc40f00aaf [Keymap] Corrected the dvorak layout for kinesis advantage (#10808) 2020-11-01 17:25:50 -08:00
Xelus22
c1481629fd [Keyboard] Fix keyboard matrix scan rate with F072 (#10226)
* fix matrix scan rate

* Update trinityxttkl.c

* Update rev2.c
2020-11-01 16:44:38 -08:00
James Young
83eecdce22 [Keyboard] nullbitsco/nibble Configurator rework (#10814)
* nullbitsco/nibble: rework LAYOUT_all

... and update via keymap accordingly.

* compress info.json LAYOUT_all tree

Only changes the white space.

* rebuild info.json LAYOUT_all tree

Note: this commit makes the visual layout the ANSI layout with a split left Shift, instead of being the same as the ISO layout.

* unify code styles

Make logically-unchanged code blocks similar in appearance to logically-changed blocks.

* correct LAYOUT_iso key sequence

Move ISO Enter's object to its proper place.
2020-11-01 12:42:50 -08:00
MechMerlin
780b7722fb [Keyboard] VIA Support: Exent 65% (#10797)
* exent VIA support

* minor cleanups

* Update keyboards/exent/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/exent/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 11:50:23 -08:00
KnoblesseOblige
86ac56cd7f [Keyboard] Add keebsforall/freebird60 (#10774)
* Added ad/freebird60.

* Moved freebird60 keyboard. Added VIA keymap.

* Updated `keebsforall/freebird60` README to include image.

* Update keyboards/keebsforall/freebird60/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keebsforall/freebird60/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 11:13:34 -08:00
Ole Westendorff
c1e69bcef0 add 65_ansi_split_bs to default community layouts (#10770)
* add 65_ansi_split_bs to default community layouts

* Update layouts/default/65_ansi_split_bs/layout.json

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 11:09:32 -08:00
Brandon Claveria
78019c3e21 [Keyboard] add bebol keyboard (#10763)
* add bebol keyboard

* Change PID

* Update keyboards/handwired/swiftrax/bebol/rules.mk

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

Co-authored-by: Swiftrax <swiftrax@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-11-01 10:57:30 -08:00
Keys of Kings
76bc235508 [Keyboard] Add keysofkings folder and twokey keyboard (#10754)
* Add keysofkings folder and twokey keyboard

* Update readme.md

* Update readme.md

* Update config.h

* Update config.h

* Update keymap.c

* Update twokey.c

* Update twokey.h

* Update keyboards/keysofkings/twokey/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keysofkings/twokey/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keysofkings/twokey/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keysofkings/twokey/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/keysofkings/twokey/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update info.json

* Update keymap.c

* Update keyboards/keysofkings/twokey/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 10:53:17 -08:00
Xyverz
fed9c97ddb [Keymap] Added layout for my Keyboardio Atreus (#10726)
* Adding Evan Travers' Keyboardio Atreus branch.

Initial commit of my KeyboardIO Atreus layout.
This is a direct copy of my default Atreus layout, with blank spaces
for the two additional keys.

* Added MACLOCK macro to keymap.c

* Updates to Keyboardio Atreus keymap and readme.

* Adding arrows to bottom row of RAISE and LOWER layers

* bringing the rest of the master branch to my working branch.

* Changes to my KeyboardIO Atreus keymap & readme

* Changes to keymap.

* Adding Evan Travers' Keyboardio Atreus branch.

Initial commit of my KeyboardIO Atreus layout.
This is a direct copy of my default Atreus layout, with blank spaces
for the two additional keys.

* Added MACLOCK macro to keymap.c

* Updates to Keyboardio Atreus keymap and readme.

* Adding arrows to bottom row of RAISE and LOWER layers

* bringing the rest of the master branch to my working branch.

* Changes to my KeyboardIO Atreus keymap & readme

* Changes to keymap.

* Added GPL2+ compatible license header.

Co-authored-by: Ian Sterling <503326@MC02YT9K9LVCF.tld>
2020-11-01 10:50:12 -08:00
Seth
9f0dbc21a3 [Keyboard] beta support for the Rocketboard-16 macro/num pad (#10688)
* Firmware initial commit, still has a few bugs - mainly rotary encoders do not work and needs cleaning up

* Fixed the volume control issue and limited the RGB brightness (can be really bright), added the ability to switch LED mode with left encoder click, and added via support (untested)

* Remove define that should go in config.h

* Removed define that should be in config.h

* Removed LTO_ENABLE as suggested - has issues on ARM

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

* Added the correct define for OLED screen size

* Applied suggested change to remove description

Co-authored-by: Ryan <fauxpark@gmail.com>

* Made suggested change to remove backslashes

Co-authored-by: Ryan <fauxpark@gmail.com>

* Suggested change made to rgblight

Co-authored-by: Ryan <fauxpark@gmail.com>

* Suggested change made to rgblight

Co-authored-by: Ryan <fauxpark@gmail.com>

* Suggested change made to remove backslashes

Co-authored-by: Ryan <fauxpark@gmail.com>

* Suggested change made to rgblight

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/rocketboard_16/rocketboard_16.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Added suggested comments

Co-authored-by: Ryan <fauxpark@gmail.com>

* Made suggested changes to rules file

Co-authored-by: Ryan <fauxpark@gmail.com>

* Added suggested change to rgblight

Co-authored-by: Ryan <fauxpark@gmail.com>

* Added info.json for QMK configurator

* Update readme.md

* This change makes the firmware work... through magic... seriously, no idea - but it works!

* Updated dimming step, OLED functionality, and rules for formatting

- Changed the dimming step size for smoother dimming with the reduced range
- Added lots of OLED functionality - QMK logo and title at top, num/caps/scroll lock status, and backlight brightness level
- Updated the rules.mk file to comply more closely with the formatting guidelines

* Fixed tab issues

Co-authored-by: Ryan <fauxpark@gmail.com>

* Updated to use bootmagic lite with the key that usually turns rgb on/off

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 10:46:00 -08:00
MelGeek
c731432765 [Keyboard] Fix IIC stall bug (#10700)
* Add Z70Ultra which is a Hotsawp RGB 65% keyboard

* Update keyboards/melgeek/z70ultra/z70ultra.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/rev1/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update readme.md

* Update info.json

update the name of layout to consistent the keyboard.

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/z70ultra.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Add Z70Ultra

* Support Z70Ultra
  [Modified] info.json to support two different layouts
  [Add]      rules.mk to support default folder

* Update keyboards/melgeek/z70ultra/rev1/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/z70ultra/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* remove excessive arguments from LAYOUT_split_space

* Update keyboards/melgeek/z70ultra/info.json

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

* Update keyboards/melgeek/z70ultra/info.json

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

* Update keyboards/melgeek/z70ultra/keymaps/default/keymap.c

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

* Update keyboards/melgeek/z70ultra/z70ultra.h

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

* Update keyboards/melgeek/z70ultra/z70ultra.h

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

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

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

* Update keyboards/melgeek/z70ultra/keymaps/default/keymap.c

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

* Update keyboards/melgeek/z70ultra/rev1/rules.mk

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

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

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

* Update keyboards/melgeek/z70ultra/keymaps/default/keymap.c

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

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

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

* Update keyboards/melgeek/z70ultra/keymaps/via/keymap.c

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

* Use macro replace with the literal for CS & SW

* Update keyboards/melgeek/z70ultra/z70ultra.c

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

* [Keyboard]  Support MJ61 which is a 60% ANSI STD Hotswap RGB keyboard

* Update keyboards/melgeek/mj61/mj61.c

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

* Update keyboards/melgeek/mj61/mj61.c

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

* [Keyboard] MJ61 Add license header for files and the link for readme

* Update keyboards/melgeek/mj61/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/mj61/rev1/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/mj61/rev1/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/mj61/mj61.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/melgeek/mj61/mj61.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Add GPL for files

* Update keymaps/default/keymap.c

* Update keymaps/via/keymap.c

* Update keyboards/melgeek/z70ultra/z70ultra.c

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

* Update keyboards/melgeek/z70ultra/z70ultra.c

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

* [Fixed] remove this code cause it's useless.

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-11-01 10:38:08 -08:00
nopunin10did
f450bdbb41 [Keyboard] Add The Railroad (rev 0) (#10474)
* Add The Railroad keyboard, rev 0

* Update keyboards/nopunin10did/railroad/config.h

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/config.h

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update config.h

* Update keyboards/nopunin10did/railroad/rules.mk

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/config.h

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/nopunin10did/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/nopunin10did/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/nopunin10did/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/default/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/default/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/rules.mk

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update rules.mk

* Update config.h

* Update keymap.c

* Update keyboards/nopunin10did/railroad/railroad.h

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update railroad.h

* Update keyboards/nopunin10did/railroad/railroad.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/keymaps/default/keymap.c

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>

* Update keyboards/nopunin10did/railroad/rules.mk

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

* Update keyboards/nopunin10did/railroad/config.h

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

* Update keyboards/nopunin10did/railroad/readme.md

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

* Updates from peer review to correct render

* Update keyboards/nopunin10did/railroad/info.json

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

* Update keyboards/nopunin10did/railroad/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/nopunin10did/railroad/info.json

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

* Relocate most files inside rev0

Co-authored-by: ridingqwerty <george.g.koenig@gmail.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 10:21:09 -08:00
Brandon Claveria
4fa1924bd7 add beegboy keyboard (#10762)
* add layout macro

* add beegboy keymaps

* fix matrix pins

* Change PID

* Update keyboards/handwired/swiftrax/beegboy/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Swiftrax <swiftrax@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-11-01 00:13:06 +00:00
Joel Challis
7b33897b97 protect against those who develop with their fork on master (#10815) 2020-10-31 22:50:53 +00:00
Ryan
d705918f50 Efreet refactor (#10806) 2020-11-01 06:56:08 +11:00
Drashna Jaelre
a3f1defcd4 [Keyboard] Fix function references IDB 60 (#10810)
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Thorben <34752364+itspngu@users.noreply.github.com>
2020-10-31 23:15:26 +11:00
Ryan
fb579aae49 Fix implicit declaration of function 'get_host_led_state' (#10803) 2020-10-30 13:29:19 +00:00
Ryan
67654e4a82 DK60 refactor (#10791) 2020-10-31 00:14:13 +11:00
Ryan
952a4c8312 Hnah108 refactor (#10787)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2020-10-30 22:06:47 +11:00
Ryan
b9ea10a80d YMD75 rev3: fix swapped backslash and enter (#10801) 2020-10-30 01:32:24 -07:00
Jay Greco
4e72224aa3 [Keyboard] Adding info.json files for NIBBLE 65% keyboard (#10769) 2020-10-29 01:29:31 -07:00
Leon Anavi
1bfec6ddd9 [Keymap] Add KiCad keymap for ANAVI Macro Pad 8 (#10766)
KiCad is a cross platform, free and open source electronics design
automation (EDA) suite. It was used to create ANAVI Macro Pad 8.

This keymap contains 2 layers for KiCad hotkeys and a 3rd layer
for controlling the backlighting and the underlighting.

- Layer for KiCad Schematic hotkeys:
  m - to move selected component
  r - to rotate selected component
  w - to wire components
  v - to edit component value
  F1 - zoom in
  F2 - zoom out
  F4 - zoom center

- Layer for KiCad PCB layout hotkets:
  m - to move selected component
  r - to rotate selected component
  x - to route a new track
  v - to add a via
  F1 - zoom in
  F2 - zoom out
  F4 - zoom center

Signed-off-by: Leon Anavi <leon@anavi.org>
2020-10-29 01:28:13 -07:00
Benjamin Grosse
db9204c7e1 [Keymap] add an autoclicker to my plaid keymap (#10743) 2020-10-29 01:26:15 -07:00
Drashna Jaelre
27b8046867 [Keymap] Add OBS keymap for ANAVI Macro Pad 8 (#10742)
OBS keymap for ANAVI Macro Pad 8 with the following shortcuts:

- Shortcuts useful for switching scenes on the 1st row:
  Hold Left Control, Shift, Alt and GUI and press F9
  Hold Left Control, Shift, Alt and GUI and press F10
  Hold Left Control, Shift, Alt and GUI and press F11
  Hold Left Control, Shift, Alt and GUI and press F12
- Center to screen: Ctrl+D
- Fit to screen: Ctrl+F
- Move source to top of sources list: Ctrl+Home

Signed-off-by: Leon Anavi <leon@anavi.org>
2020-10-29 01:22:34 -07:00
AlisGraveNil
359aff6c49 Roadster Edit (#10784) 2020-10-29 19:22:26 +11:00
Harshit Goel
36f4f1e9b8 [Keyboard] Redox via support added (#10710)
* add via config for Redox OG

* Fix name typo

* clean up via file and move to via pull

* fix typo in readme, align config.h properly
2020-10-29 01:16:51 -07:00
Alby Barber
f487b726cd [Keyboard] Adding Little Alby the Arduino Keyboard (#10713)
* Adding little Alby keyboard

* Adding readme and expanding programs

* Updating readme

* adding spirit guide

* changes based on review

* Updating config name and readme

* Update keyboards/littlealby/mute/rules.mk

Update tabbing

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/littlealby/mute/rules.mk

Remove other boards

Co-authored-by: Ryan <fauxpark@gmail.com>

* Changes based on review

* Update keyboards/littlealby/mute/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/littlealby/mute/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/littlealby/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/littlealby/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/littlealby/mute/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Adding unique vendor and Product IDs

* Update keyboards/littlealby/mute/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* 0x4D55 = MU

* Adding default map

Co-authored-by: Alby Barber <albybarber@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-29 01:15:38 -07:00
Ryan
5cecc1ea1e Add brightness level API to OLED driver (#10772)
* Add brightness level API to OLED driver

* Set default brightness to 255
2020-10-29 00:12:50 -07:00
bintobean
b9ed9d33d3 [Keyboard] Add via keymap to E6.5 (#10771)
* Added basic via keymap

* Added via keymaps and changed config Product and Vendor ID

* Update keyboards/exclusive/e65/keymaps/via/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/exclusive/e65/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Refactored via/keymap.c to use LAYOUT_all

* Refactored e65.h to remove nested matrix layouts

* Previous commit missed LAYOUT_65_ansi_blocker. Fixed

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-29 00:00:38 -07:00
kaylanm
2ac0927fd7 [Keyboard] Add via keymap for percent booster (#10768) 2020-10-28 23:53:27 -07:00
James Young
9dad914841 xelus/kangaroo: fix info.json layout macro reference (#10765) 2020-10-28 23:20:45 -07:00
Adrian
50481ce7ed [Keyboard] Added polilla keyboard (squashed) (#10686) 2020-10-28 22:35:37 -07:00
Cameron Moon
74a2edd903 docs(massdrop alt/ctrl): update link to loader releases (#10781)
* docs(massdrop alt): update link to loader releases

Update the link to the Massdrop Loader releases page to point to the releases index rather than release 0.0.1

* docs(massdrop ctrl): update link to loader releases
2020-10-29 14:35:11 +11:00
James Young
805e13a6d0 [Keyboard] KBDfans Bella Soldered tidy-up (#10753)
* KBDfans Bella Soldered: add readme

* add image to readme

* tidy-up Configurator layout data

Key positioning was not true to the assembled board.

* reduce readme redundancy
2020-10-28 18:45:10 -07:00
Yasha Mostofi
fcd55e2f04 [Keyboard] Add Via support for TG4x (#10571)
* Update vendor ID

* New default layout with RESET mapped

* Add Via keymap

* Update README

* Update keyboards/tg4x/keymaps/via/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/tg4x/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Delete config.h

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

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-28 18:04:47 -07:00
Angel Rojas
8685409784 GEN ONE Eclipse_65 keyboard addition (#10669)
* Add files via upload

* Add files via upload

* Add files via upload

* Update config.h

* Update rules.mk

* Update config.h

* Update config.h

* Update config.h

* Update config.h

* Add files via upload

* Removing duplicate files

* Resolve VID and PID collisions as requested

Taken the 0xFEED for vendor ID as suggested in vendor documentation and an available PID

* add a GPL2+ compatible license header as requested

Added the GPL2+ header to keymap.c file

* Update keyboards/genone/eclipse_65/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/eclipse_65.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/keymaps/default/keymap.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/genone/eclipse_65/eclipse_65.h

Co-authored-by: Ryan <fauxpark@gmail.com>

* Corrected items on rules.mk as suggested 

Thanks for the comment
I removed suggested items, corrected some spacing issues, and added suggested items.

* Deleted genone_main.c file

Thanks for the comment.
Deleted genone_main.c file as requested

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-28 15:45:36 -07:00
Ryan
1d85fe176a VN66 refactor (#10776) 2020-10-29 06:14:11 +11:00
Ryan
a42e3ba2cb Stella refactor (#10775) 2020-10-29 06:13:52 +11:00
Guillaume Gérard
c745cbb77a [Keymap] greatwizard userspace and ortho 4x12 and 5x12 keymaps (#9584) 2020-10-28 10:20:06 -07:00
Zach White
6b1ae7e6aa add rsync to the api update process 2020-10-27 10:48:55 -07:00
stanrc85
a602ef75fb [Keyboard] Add Projectkb/alice/rev2 LAYOUT_alice support (#10697)
* my alice community layout

* add LAYOUT_alice support to projectkb/alice/rev2

* add addition BSPC key to default layout

* add define to support LAYOUT_default
2020-10-27 10:35:38 -07:00
Reibl János Dániel
1ba93875ba [Keyboard] Add handwired F411 (#10504)
Co-authored-by: Janos Daniel Reibl <janos.daniel.reibl@protonmail.com>
2020-10-28 01:39:51 +11:00
Drashna Jaelre
33074bcbad [Keyboard] Bug fixes and improvements to PloopyCo devices (#10573)
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-27 17:09:11 +11:00
Ryan
555b1640b2 Add layout: 65_iso_blocker_split_bs (#10733)
* Add layout: 65_iso_blocker_split_bs

* Add layout to readme
2020-10-26 16:56:34 -07:00
Sergey Vlasov
f149c07d68 Fix KEYBOARD_SHARED_EP incompatibility with VIA (#9930)
The `KEYBOARD_SHARED_EP=yes` option was breaking the VIA support,
because the raw HID interface number in this case was 0 instead of 1,
and the VIA app depends on the exact interface number for raw HID.
Change the interface ordering to put the shared interface before the raw
HID interface if `KEYBOARD_SHARED_EP` is enabled, so that the raw HID
interface can keep its number.
2020-10-27 10:40:59 +11:00
Ryan
2c92ee1f56 Allow modified keycodes in Unicode input (#10658) 2020-10-27 06:14:56 +11:00
Zach White
0c42f91f4c Generate api data on each push (#10609)
* add new qmk generate-api command, to generate a complete set of API data.

* Generate api data and push it to the keyboard repo

* fix typo

* Apply suggestions from code review

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

* fixup api workflow

* remove file-changes-action

* use a more mainstream github action

* fix yaml error

* Apply suggestions from code review

Co-authored-by: Erovia <Erovia@users.noreply.github.com>

* more uniform date handling

* make flake8 happy

* Update lib/python/qmk/decorators.py

Co-authored-by: Erovia <Erovia@users.noreply.github.com>

Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Erovia <Erovia@users.noreply.github.com>
2020-10-25 14:48:44 -07:00
James Young
8ef82c466e manta60: update Configurator layout data (#10756) 2020-10-25 18:07:02 +00:00
Erovia
ad86894ae7 Rename keyboard-level readmes to lower-case (#10759)
This is the recommendation in the [PR
Checklist](https://docs.qmk.fm/#/pr_checklist?id=keyboard-prs) and it
will make working with them easier in the CLI/API/etc.
2020-10-25 15:23:42 +00:00
Filip Paryż
af455a8368 [Keyboard] Freoduo - handwired split ortho keyboard. (#10724)
* Freoduo v1 - with fixes from @fauxpark and rebased to master branch of QMK.

* One more suggested fix from @fauxpark

* Fixes after @drashna review.
2020-10-24 16:54:38 -07:00
James Young
ac37a94e49 emajesty/eiri: fix info.json key sequence (#10751)
* emajesty/eiri: info.json debug linting

* fix info.json key sequence
2020-10-25 00:07:30 +01:00
Blake
24ae9232e2 draytronics/scarlet: add website and key labels to info.json (#10747)
* Correctly name keyboard in info.json

* Added website and layout key labels to info.json
2020-10-24 12:28:34 -07:00
AlisGraveNil
14cb662280 [keyboard] Add Roadster support (#10698)
* Roadster

* Update keyboards/clawsome/roadster/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/clawsome/roadster/config.h

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-24 19:17:07 +01:00
James Young
3d183ed7a0 draytronics/scarlet: fix info.json data (#10746) 2020-10-24 13:09:28 +01:00
James Young
4e30f4d102 doodboard/duckboard: fix info.json data (#10745) 2020-10-24 13:07:10 +01:00
Leon Anavi
329eb4b8df [Keymap] Add OBS keymap for ANAVI Macro Pad 8
OBS keymap for ANAVI Macro Pad 8 with the following shortcuts:

- Shortcuts useful for switching scenes on the 1st row:
  Hold Left Control, Shift, Alt and GUI and press F9
  Hold Left Control, Shift, Alt and GUI and press F10
  Hold Left Control, Shift, Alt and GUI and press F11
  Hold Left Control, Shift, Alt and GUI and press F12
- Center to screen: Ctrl+D
- Fit to screen: Ctrl+F
- Move source to top of sources list: Ctrl+Home

Signed-off-by: Leon Anavi <leon@anavi.org>
2020-10-24 10:00:47 +03:00
Joel Challis
bf92957ff2 Add additional auto labeler rules (#10704)
* Auto label all the things

* Makefiles are core changes

* Add label to submodule changes
2020-10-24 01:29:17 +01:00
stanrc85
33bd17a68a [Keymap] my alice community layout (#10696) 2020-10-23 17:11:52 -07:00
Benjamin Grosse
7daad08a91 [Keymap] plaid keymap with custm LED animation (#10701) 2020-10-23 17:10:45 -07:00
Anne Demey
d689f76110 [Keyboard] Add Terrazzo Keyboard (#10408)
* Ciao Terrazzo!

* Keymap updates

* Adding info json
Cleaning up keymap files
Readme updates with template

* Coding style updates

* Removing vscode files

* PR feedback updates

* biton32 -> get_highest_layer update
Adding license headers
2020-10-23 15:14:17 -07:00
Alabahuy
5d2deaca06 [Keyboard] add via support and fix info.json for rartlice (#10690)
* Update info.json

* Create keymap.c

* Create config.h

* Create rules.mk

* Update keymap.c

* Update keymap.c
2020-10-23 14:58:54 -07:00
Fidel Coria
8e7517aebc [Keyboard] Add pteron44 keyboard (#10708)
* Add pteron44

* Apply suggestions from code review

Co-authored-by: Ryan <fauxpark@gmail.com>

* Apply suggestions from code review part 2

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-23 14:31:24 -07:00
null-ll
b5f425b275 [Keyboard] add Basketweave keyboard (#10729)
* add basketweave keyboard

* Fixed missing key in info.json layout

* Update keyboards/basketweave/rules.mk

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update keyboards/basketweave/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-23 14:18:55 -07:00
kb-elmo
47ce1a9ed0 [Keyboard] make Canoe Gen2 indicator configurable (#10722) 2020-10-23 14:12:03 -07:00
Leon Anavi
85f344db49 [Keymap] Add Zoom keymap for ANAVI Macro Pad 8 (#10715)
Zoom keymap for ANAVI Macro Pad 8 with the following shortcuts:

* Alt+V: Start/stop video
* Alt+A: Mute/unmute my audio
* Alt+M: Mute/unmute audio for everyone except the host
* Alt+S: Start/stop screen sharing
* Alt+R: Start/stop local recording
* Alt+P: Pause/resume recording
* Alt+C: Start/stop cloud recording
* Switch to 2nd layout to control backlighting and underlighting

Signed-off-by: Leon Anavi <leon@anavi.org>
2020-10-23 14:11:17 -07:00
coarse
225af5d161 [Keyboard] Add Cordillera PCB (#10711)
* Add initial Cordillera config

* Update readme

* Update info.json layouts

* Update preview image

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

* Remove extra rules

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update bootmagic rule

Co-authored-by: Ryan <fauxpark@gmail.com>

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2020-10-23 14:10:04 -07:00
Ryan
870cc37365 Fix two qmk info complaints (#10737)
* Fix two `qmk info` complaints

* Oops
2020-10-23 21:03:06 +01:00
Drashna Jaelre
9093f877a2 [Keyboard] Fix Moonlander indicator LEDs during sleep (#10683) 2020-10-23 20:13:14 +11:00
929 changed files with 43660 additions and 9386 deletions

12
.github/labeler.yml vendored
View File

@@ -5,12 +5,22 @@ core:
- tests/**/*
- util/**/*
- platforms/**/*
- Makefile
- '*.mk'
dependencies:
- any:
- 'lib/**/*'
- '!lib/python/**/*'
keyboard:
- any: ['keyboards/**/*', '!keyboards/**/keymaps/**/*']
- any:
- 'keyboards/**/*'
- '!keyboards/**/keymaps/**/*'
keymap:
- users/**/*
- layouts/**/*
- keyboards/**/keymaps/**/*
via:
- keyboards/**/keymaps/via/*
cli:
- bin/qmk
- requirements.txt

42
.github/workflows/api.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Update API Data
on:
push:
branches:
- master
paths:
- 'keyboards/**'
- 'layouts/community/**'
jobs:
api_data:
runs-on: ubuntu-latest
container: qmkfm/base_container
# protect against those who develop with their fork on master
if: github.repository == 'qmk/qmk_firmware'
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 1
persist-credentials: false
- name: Generate API Data
run: qmk generate-api
- name: Install rsync
run: |
apt-get update && apt-get install -y rsync
- name: Upload API Data
uses: JamesIves/github-pages-deploy-action@3.7.1
with:
ACCESS_TOKEN: ${{ secrets.API_TOKEN_GITHUB }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH: main
FOLDER: api_data/v1
CLEAN: true
GIT_CONFIG_EMAIL: hello@qmk.fm
REPOSITORY_NAME: qmk/qmk_keyboards
TARGET_FOLDER: v1

43
.github/workflows/docs.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Generate Docs
on:
push:
branches:
- master
paths:
- 'tmk_core/**'
- 'quantum/**'
- 'platforms/**'
- 'docs/**'
- '.github/workflows/docs.yml'
jobs:
generate:
runs-on: ubuntu-latest
container: qmkfm/base_container
# protect against those who develop with their fork on master
if: github.repository == 'qmk/qmk_firmware'
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 1
- name: Install dependencies
run: |
apt-get update && apt-get install -y rsync nodejs npm doxygen
npm install -g moxygen
- name: Build docs
run: |
qmk --verbose generate-docs
- name: Deploy
uses: JamesIves/github-pages-deploy-action@3.7.1
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master
BRANCH: gh-pages
FOLDER: .build/docs
GIT_CONFIG_EMAIL: hello@qmk.fm

View File

@@ -6,7 +6,7 @@ on:
- 'keyboards/**'
jobs:
info:
lint:
runs-on: ubuntu-latest
container: qmkfm/base_container
@@ -27,7 +27,7 @@ jobs:
echo ${{ github.event.pull_request.base.sha }}
echo '${{ steps.file_changes.outputs.files}}'
- name: Run qmk info
- name: Run qmk lint
shell: 'bash {0}'
run: |
QMK_CHANGES=$(echo -e '${{ steps.file_changes.outputs.files}}')
@@ -45,10 +45,11 @@ jobs:
if [[ $KEYMAP_ONLY -gt 0 ]]; then
echo "linting ${KB}"
# TODO: info info always returns 0 - right now the only way to know failure is to inspect log lines
qmk info -l -kb ${KB} 2>&1 | tee /tmp/$$
!(grep -cq ☒ /tmp/$$)
: $((exit_code = $exit_code + $?))
qmk lint --keyboard ${KB} && qmk info -l --keyboard ${KB}
exit_code=$(($exit_code + $?))
fi
done
if [[ $exit_code -gt 255 ]]; then
exit 255
fi
exit $exit_code

1
.gitignore vendored
View File

@@ -16,6 +16,7 @@
*.swp
tags
*~
api_data/v1
build/
.build/
*.bak

View File

@@ -18,21 +18,16 @@ addons:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-7
packages:
- pandoc
- diffutils
- dos2unix
- doxygen
- clang-format-7
- libstdc++-7-dev
install:
- npm install -g moxygen
script:
- git fetch --depth=50 origin $TRAVIS_BRANCH:$TRAVIS_BRANCH
- git rev-parse --short HEAD
- git diff --name-only HEAD $TRAVIS_BRANCH
- bash util/travis_test.sh
- bash util/travis_build.sh
- bash util/travis_docs.sh
after_script:
bash util/travis_compiled_push.sh
notifications:

1
api_data/_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman

5
api_data/readme.md Normal file
View File

@@ -0,0 +1,5 @@
# QMK Keyboard Metadata
This directory contains machine parsable data about keyboards supported by QMK. The latest version is always available online at <https://keyboards.qmk.fm>.
Do not edit anything here by hand. It is generated with the `qmk generate-api` command.

View File

@@ -17,6 +17,7 @@ SERIAL_PATH := $(QUANTUM_PATH)/serial_link
QUANTUM_SRC += \
$(QUANTUM_DIR)/quantum.c \
$(QUANTUM_DIR)/led.c \
$(QUANTUM_DIR)/keymap_common.c \
$(QUANTUM_DIR)/keycode_config.c

View File

@@ -105,6 +105,7 @@
* [Encoders](feature_encoders.md)
* [Haptic Feedback](feature_haptic_feedback.md)
* [Joystick](feature_joystick.md)
* [LED Indicators](feature_led_indicators.md)
* [Proton C Conversion](proton_c_conversion.md)
* [PS/2 Mouse](feature_ps2_mouse.md)
* [Split Keyboard](feature_split_keyboard.md)

View File

@@ -178,6 +178,24 @@ Creates a keymap.json from a keymap.c.
qmk c2json [--no-cpp] [-o OUTPUT] filename
```
## `qmk lint`
Checks over a keyboard and/or keymap and highlights common errors, problems, and anti-patterns.
**Usage**:
```
qmk lint [-km KEYMAP] [-kb KEYBOARD] [--strict]
```
This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
**Examples**:
Do a basic lint check:
qmk lint -kb rominronin/katana60/rev2
## `qmk list-keyboards`
This command lists all the keyboards currently defined in `qmk_firmware`
@@ -212,6 +230,16 @@ This command is directory aware. It will automatically fill in KEYBOARD and/or K
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
```
## `qmk clean`
This command cleans up the `.build` folder. If `--all` is passed, any .hex or .bin files present in the `qmk_firmware` directory will also be deleted.
**Usage**:
```
qmk clean [-a]
```
---
# Developer Commands
@@ -258,6 +286,16 @@ This command starts a local HTTP server which you can use for browsing or improv
qmk docs [-p PORT]
```
## `qmk generate-docs`
This command allows you to generate QMK documentation locally. It can be uses for general browsing or improving the docs. External tools such as [serve](https://www.npmjs.com/package/serve) can be used to browse the generated files.
**Usage**:
```
qmk generate-docs
```
## `qmk kle2json`
This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
@@ -299,4 +337,3 @@ This command runs the python test suite. If you make changes to python code you
```
qmk pytest
```

View File

@@ -88,108 +88,6 @@ keyrecord_t record {
}
```
# LED Control
QMK provides methods to read 5 of the LEDs defined in the HID spec:
* Num Lock
* Caps Lock
* Scroll Lock
* Compose
* Kana
There are two ways to get the lock LED state:
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
* by calling `led_t host_keyboard_led_state()`
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
* `uint8_t host_keyboard_leds()`
## `led_update_user()`
This function will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
By convention, return `true` from `led_update_user()` to get the `led_update_kb()` hook to run its code, and
return `false` when you would prefer not to run the code in `led_update_kb()`.
Some examples include:
- overriding the LEDs to use them for something else like layer indication
- return `false` because you do not want the `_kb()` function to run, as it would override your layer behavior.
- play a sound when an LED turns on or off.
- return `true` because you want the `_kb` function to run, and this is in addition to the default LED behavior.
?> Because the `led_set_*` functions return `void` instead of `bool`, they do not allow for overriding the keyboard LED control, and thus it's recommended to use `led_update_*` instead.
### Example `led_update_kb()` Implementation
```c
bool led_update_kb(led_t led_state) {
bool res = led_update_user(led_state);
if(res) {
// writePin sets the pin high for 1 and low for 0.
// In this example the pins are inverted, setting
// it low/0 turns it on, and high/1 turns the LED off.
// This behavior depends on whether the LED is between the pin
// and VCC or the pin and GND.
writePin(B0, !led_state.num_lock);
writePin(B1, !led_state.caps_lock);
writePin(B2, !led_state.scroll_lock);
writePin(B3, !led_state.compose);
writePin(B4, !led_state.kana);
}
return res;
}
```
### Example `led_update_user()` Implementation
This incomplete example would play a sound if Caps Lock is turned on or off. It returns `true`, because you also want the LEDs to maintain their state.
```c
#ifdef AUDIO_ENABLE
float caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
float caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
#endif
bool led_update_user(led_t led_state) {
#ifdef AUDIO_ENABLE
static uint8_t caps_state = 0;
if (caps_state != led_state.caps_lock) {
led_state.caps_lock ? PLAY_SONG(caps_on) : PLAY_SONG(caps_off);
caps_state = led_state.caps_lock;
}
#endif
return true;
}
```
### `led_update_*` Function Documentation
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
* Keymap: `bool led_update_user(led_t led_state)`
## `host_keyboard_led_state()`
Call this function to get the last received LED state as a `led_t`. This is useful for reading the LED state outside `led_update_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
## Setting Physical LED State
Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
### Ergodox Boards
The Ergodox implementations provide `ergodox_right_led_1`/`2`/`3_on`/`off()` to turn individual LEDs on or off, as well as `ergodox_right_led_on`/`off(uint8_t led)` to turn them on or off by their index.
In addition, it is possible to specify the brightness level of all LEDs with `ergodox_led_all_set(uint8_t n)`; of individual LEDs with `ergodox_right_led_1`/`2`/`3_set(uint8_t n)`; or by index with `ergodox_right_led_set(uint8_t led, uint8_t n)`.
Ergodox boards also define `LED_BRIGHTNESS_LO` for the lowest brightness and `LED_BRIGHTNESS_HI` for the highest brightness (which is the default).
# Keyboard Initialization Code
There are several steps in the keyboard initialization process. Depending on what you want to do, it will influence which function you should use.

View File

@@ -0,0 +1,116 @@
# LED Indicators
QMK provides methods to read 5 of the LEDs defined in the HID spec:
* Num Lock
* Caps Lock
* Scroll Lock
* Compose
* Kana
There are three ways to get the lock LED state:
* by specifying configuration options within `config.h`
* by implementing `bool led_update_kb(led_t led_state)` or `_user(led_t led_state)`; or
* by calling `led_t host_keyboard_led_state()`
!> `host_keyboard_led_state()` may already reflect a new value before `led_update_user()` is called.
Two more deprecated functions exist that provide the LED state as a `uint8_t`:
* `uint8_t led_set_kb(uint8_t usb_led)` and `_user(uint8_t usb_led)`
* `uint8_t host_keyboard_leds()`
## Configuration Options
To configure the indicators, `#define` these in your `config.h`:
|Define |Default |Description |
|---------------------|-------------|-------------------------------------------|
|`LED_NUM_LOCK_PIN` |*Not defined*|The pin that controls the `Num Lock` LED |
|`LED_CAPS_LOCK_PIN` |*Not defined*|The pin that controls the `Caps Lock` LED |
|`LED_SCROLL_LOCK_PIN`|*Not defined*|The pin that controls the `Scroll Lock` LED|
|`LED_COMPOSE_PIN` |*Not defined*|The pin that controls the `Compose` LED |
|`LED_KANA_PIN` |*Not defined*|The pin that controls the `Kana` LED |
|`LED_PIN_ON_STATE` |`1` |The state of the indicator pins when the LED is "on" - `1` for high, `0` for low|
Unless you are designing your own keyboard, you generally should not need to change the above config options.
## `led_update_*()`
When the configuration options do not provide enough flexibility, the API hooks provided allow custom control of the LED behavior. These functions will be called when the state of one of those 5 LEDs changes. It receives the LED state as a struct parameter.
By convention, return `true` from `led_update_user()` to get the `led_update_kb()` hook to run its code, and
return `false` when you would prefer not to run the code in `led_update_kb()`.
Some examples include:
- overriding the LEDs to use them for something else like layer indication
- return `false` because you do not want the `_kb()` function to run, as it would override your layer behavior.
- play a sound when an LED turns on or off.
- return `true` because you want the `_kb` function to run, and this is in addition to the default LED behavior.
?> Because the `led_set_*` functions return `void` instead of `bool`, they do not allow for overriding the keyboard LED control, and thus it's recommended to use `led_update_*` instead.
### Example `led_update_kb()` Implementation
```c
bool led_update_kb(led_t led_state) {
bool res = led_update_user(led_state);
if(res) {
// writePin sets the pin high for 1 and low for 0.
// In this example the pins are inverted, setting
// it low/0 turns it on, and high/1 turns the LED off.
// This behavior depends on whether the LED is between the pin
// and VCC or the pin and GND.
writePin(B0, !led_state.num_lock);
writePin(B1, !led_state.caps_lock);
writePin(B2, !led_state.scroll_lock);
writePin(B3, !led_state.compose);
writePin(B4, !led_state.kana);
}
return res;
}
```
### Example `led_update_user()` Implementation
This incomplete example would play a sound if Caps Lock is turned on or off. It returns `true`, because you also want the LEDs to maintain their state.
```c
#ifdef AUDIO_ENABLE
float caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
float caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
#endif
bool led_update_user(led_t led_state) {
#ifdef AUDIO_ENABLE
static uint8_t caps_state = 0;
if (caps_state != led_state.caps_lock) {
led_state.caps_lock ? PLAY_SONG(caps_on) : PLAY_SONG(caps_off);
caps_state = led_state.caps_lock;
}
#endif
return true;
}
```
### `led_update_*` Function Documentation
* Keyboard/Revision: `bool led_update_kb(led_t led_state)`
* Keymap: `bool led_update_user(led_t led_state)`
## `host_keyboard_led_state()`
Call this function to get the last received LED state as a `led_t`. This is useful for reading the LED state outside `led_update_*`, e.g. in [`matrix_scan_user()`](#matrix-scanning-code).
## Setting Physical LED State
Some keyboard implementations provide convenience methods for setting the state of the physical LEDs.
### Ergodox Boards
The Ergodox implementations provide `ergodox_right_led_1`/`2`/`3_on`/`off()` to turn individual LEDs on or off, as well as `ergodox_right_led_on`/`off(uint8_t led)` to turn them on or off by their index.
In addition, it is possible to specify the brightness level of all LEDs with `ergodox_led_all_set(uint8_t n)`; of individual LEDs with `ergodox_right_led_1`/`2`/`3_set(uint8_t n)`; or by index with `ergodox_right_led_set(uint8_t led, uint8_t n)`.
Ergodox boards also define `LED_BRIGHTNESS_LO` for the lowest brightness and `LED_BRIGHTNESS_HI` for the highest brightness (which is the default).

View File

@@ -140,8 +140,8 @@ void oled_task_user(void) {
|---------------------------|-----------------|--------------------------------------------------------------------------------------------------------------------------|
|`OLED_DISPLAY_ADDRESS` |`0x3C` |The i2c address of the OLED Display |
|`OLED_FONT_H` |`"glcdfont.c"` |The font code file to use for custom fonts |
|`OLED_FONT_START` |`0` |The starting characer index for custom fonts |
|`OLED_FONT_END` |`223` |The ending characer index for custom fonts |
|`OLED_FONT_START` |`0` |The starting character index for custom fonts |
|`OLED_FONT_END` |`223` |The ending character index for custom fonts |
|`OLED_FONT_WIDTH` |`6` |The font width |
|`OLED_FONT_HEIGHT` |`8` |The font height (untested) |
|`OLED_TIMEOUT` |`60000` |Turns off the OLED screen after 60000ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable. |
@@ -149,6 +149,7 @@ void oled_task_user(void) {
|`OLED_SCROLL_TIMEOUT_RIGHT`|*Not defined* |Scroll timeout direction is right when defined, left when undefined. |
|`OLED_IC` |`OLED_IC_SSD1306`|Set to `OLED_IC_SH1106` if you're using the SH1106 OLED controller. |
|`OLED_COLUMN_OFFSET` |`0` |(SH1106 only.) Shift output to the right this many pixels.<br />Useful for 128x64 displays centered on a 132x64 SH1106 IC.|
|`OLED_BRIGHTNESS` |`255` |The default brightness level of the OLED, from 0 to 255. |
## 128x64 & Custom sized OLED Displays
@@ -304,6 +305,12 @@ bool oled_off(void);
// not
bool is_oled_on(void);
// Sets the brightness level of the display
uint8_t oled_set_brightness(uint8_t level);
// Gets the current brightness level of the display
uint8_t oled_get_brightness(void);
// Basically it's oled_render, but with timeout management and oled_task_user calling!
void oled_task(void);

View File

@@ -41,6 +41,8 @@ Changing the **Hue** cycles around the circle.<br>
Changing the **Saturation** moves between the inner and outer sections of the wheel, affecting the intensity of the color.<br>
Changing the **Value** sets the overall brightness.<br>
![QMK Color Wheel with HSV Values](https://i.imgur.com/vkYVo66.jpg)
## Keycodes
|Key |Aliases |Description |

View File

@@ -3,6 +3,25 @@
Since starting, QMK has grown by leaps and bounds thanks to people like you who contribute to creating and maintaining our community keyboards. As we've grown we've discovered some patterns that work well, and ask that you conform to them to make it easier for other people to benefit from your hard work.
## Use QMK Lint
We have provided a tool, `qmk lint`, which will let you check over your keyboard for problems. We suggest using it frequently while working on your keyboard and keymap.
Example passing check:
```
$ qmk lint -kb rominronin/katana60/rev2
Ψ Lint check passed!
```
Example failing check:
```
$ qmk lint -kb clueboard/66/rev3
☒ Missing keyboards/clueboard/66/rev3/readme.md
☒ Lint check failed!
```
## Naming Your Keyboard/Project
All keyboard names are in lower case, consisting only of letters, numbers, and underscore (`_`). Names may not begin with an underscore. Forward slash (`/`) is used as a sub-folder separation character.

View File

@@ -46,6 +46,7 @@
'/unicode': '/feature_unicode',
'/python_development': '/cli_development',
'/getting_started_build_tools':'/newbs_getting_started',
'/tutorial':'/newbs',
},
basePath: '/',
name: 'QMK Firmware',

33
docs/ko-kr/README.md Normal file
View File

@@ -0,0 +1,33 @@
# Quantum Mechanical Keyboard Firmware
[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
[![Docs Status](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
[![GitHub contributors](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
[![GitHub forks](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
## QMK Firmware 란?
QMK(*Quantum Mechanical Keyboard 양자 기계식 키보드*)란 QMK 컴워어, QMK 툴박스, qmk.fm 를 관리하고 있는 오픈소스 커뮤니티 입니다. QMK펌웨어는 [tmk\_keyboard](http://github.com/tmk/tmk_keyboard)를 바탕으로 만들어진 키보드펌웨어이며, Atmel AVR컨트롤러와 [OLKB 제품군](http://olkb.com) [ErgoDox EZ](http://www.ergodox-ez.com), 그리고 [Clueboard 제품군](http://clueboard.co/) 이용할때 매우 편리합니다. 또한 QMK는 ChibiOS를 사용하여 ARM기반의 컨트롤러로도 사용할수 있습니다. 마지막으로 QMK는 커스텀회로와 핸드와이어드 키보드을 작동시키는데에도 사용가능합니다.
## 설치하기
만약 당신이 QMK에 키보드, 키맵, 또는 새로운 기능을 추가하고싶다면, 가장쉬운 방법은 Github를 통해 [저장소(REPO)를 추가하고]((https://github.com/qmk/qmk_firmware#fork-destination-box)) 로컬에서 변화 또는 수정하고, [PULL REQUEST](https://github.com/qmk/qmk_firmware/pulls)을 통해 업로드 할수 있습니다.
또다른 방법으로는, 직접 파일들 로컬로 다운로드 하거나([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), git (`git@github.com:qmk/qmk_firmware.git`), https (`https://github.com/qmk/qmk_firmware.git`)을 통해 클론을 만들수 있습니다.
## 컴파일
먼저 컴파일을 하기전 AVR 이나 ARM [개발환경](getting_started_build_tools.md)을 구축해야 합니다. 모든준비가 끝났다면 `make`를 다음과 같이 키보드와 키맵을 선택하여 컴파일 할 수 있습니다.
make planck/rev4:default
이 커맨드는 `rev4`버전의 `planck``default`키맵으로 컴파일 할것입니다. 다만 모든 키보드는 파일, 수정본 또는 세부프로젝트를 가지고있지 않음으로 수정본 부분을 생략될수 있습니다.
make preonic:default
## 커스터마이징
QMK는 사용할 수 있는 매우 다양한 [기능](features.md)과 체계화된 [참고자료](http://docs.qmk.fm)들이 있습니다. 그중 대부분은 [키맵](keymap.md)을 수정하거나 [키코드](keycodes.md)를 변경하는데에 특화되어 있습니다.

View File

@@ -0,0 +1,156 @@
# 컴파일 도구 설치
이 페이지는 QMK 컴파일 환경을 설치하는 방법을 설명합니다. 이 페이지는 AVR 프로세서들(예를 들면 atmega32u4와 비슷한)을 위한 가이드를 제공합니다
<!-- FIXME: We should have ARM instructions somewhere. -->
**노트:** 만약 당신이 처음 시작한다면 [입문자를 위한 가이드](newbs.md)페이지를 확인하세요.
계속하기전에 당신의 서브모듈(외부라이브러리)이 최신인지 `make git-submodule`을 사용하여 확인하세요.
## 리눅스
당신이 항상 최신 파일을 가지고 있는지는 `sudo util/qmk_install.sh`을 이용하여 간단히 확인할 수 있습니다. 이 명령어는 당신이 필요한 모든 속성물(dependencies)를 설치할 것입니다. **이 명령어는 `apt-get upgrade`를 사용합니다**
또한 당신의 직접 필요한 것들을 설치할 수도 있습니다. 하지만 이 자료는 항상 최신의 자료을 가지고 있지 않습니다.
현재로써 필요한 것은 다음과 같습니다. 하지만 당신이 하는 작업에 따라 당신은 다음 패키지를 다 쓰지 않을 수도 있습니다. 또한 환경에 따라 모든 다음 패키지는 다른이름으로 존재하거나, 없을 수도 있습니다.
```
build-essential
gcc
unzip
wget
zip
gcc-avr
binutils-avr
avr-libc
dfu-programmer
dfu-util
gcc-arm-none-eabi
binutils-arm-none-eabi
libnewlib-arm-none-eabi
git
```
당신이 사용하는 패키지 매니져에서 이러한 방법으로 설치하십시요.
데비안 / 우분투 예시:
sudo apt-get update
sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
페도라 / 레드햇 예시:
sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
아치 / 맨자로(Manjaro) 예시:
pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git dfu-programmer dfu-util
## 닉스 (NIX)
만약 당신이 [NixOS](https://nixos.org/)를 사용중이거나 NIX를 리눅스 또는 맥에서 사용중이라면 `nix-shell`를 root 디렉토리에서 사용하여 컴파일 환경의 구축할 수 있습니다.
기본적으로 다음 커맨드는 AVR과 ARM 컴파일러를 설치할것입니다. 만약 필요 없다면 `avr` 또는 `arm`을 인수에서 해제할 수 있습니다.
nix-shell --arg arm false
## 맥
당신이 홈브루([homebrew](http://brew.sh/))를 사용한다면, 다음을 입력하세요.
brew tap osx-cross/avr
brew tap PX4/homebrew-px4
brew update
brew install avr-gcc@7
brew link --force avr-gcc@7
brew install dfu-programmer
brew install dfu-util
brew install gcc-arm-none-eabi
brew install avrdude
이 방법을 가장 추천합니다. 만약 홈브루가 없다면 커맨드라인 환경에서 매우 편한 [Homebrew](http://brew.sh/)를 다운받는 것을 추천합니다. 참고로 `avr-gcc@7`를 설치하는 중 `make``make install`는 대개 20분 넘게 걸리고 CPU 사용량이 높아집니다.
## msys2를 사용하는 윈도우 (추천)
윈도우 비스타 부터 최신버젼까지 가장추천되는 환경은 [msys2](http://www.msys2.org)를 이용하는 것입니다. (윈도우 7과 윈도우 10에서 모두 테스트되었음)
* 이 사이트에 있는 설명을 이용해 msys2를 설치하세요: http://www.msys2.org
* ``MSYS2 MingGW 64-bit`` 를 여세요
* QMK폴더로 이동하세요. c드라이브 루트에 있는경우:
* `$ cd /c/qmk_firmware`
* `util/qmk_install.sh`을 실행시키고 나오는데요 따라하세요
### 크리에이터 업데이트
만약 당신의 윈도우 10이 크리에이터 업데이트 버전 또는 더 높은 버전이라면 바로 컴파일과 프로그램 업로드(flashing)를 할 수 있습니다. 크리에이터 업데이트 전 버전이라면 컴파일만 가능합니다. 만약 당신이 잘 모르겠거나 업데이트된 버전이 아니라면 [이 링크](https://support.microsoft.com/en-us/instantanswers/d4efb316-79f0-1aa1-9ef3-dcada78f3fa0/get-the-windows-10-creators-update)를 확인해 보십시오.
### 리눅스용 윈도우 하위 시스템 사용 (Windows10 Subsystem for Linux)
크리에이터 업데이트에 추가로 만약 당신이 리눅스용 윈도우 하위 시스템이 필요하다면 이 링크에서 다운받으십시오: [설명](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/)
만약 당신이 이미 리눅스용 윈도우 하위 시스템을 Anniversary업데이트를 통해 받았다면 이 링크에서 16.04LTS로 업데이트 하는것을 추천합니다. 왜냐하면 업데이트 없이는 일부키보드가 14.04LTS에 포함되있는 도구들로 컴파일되지 않을수 있기때문입니다 : [WSL 업데이트](https://betanews.com/2017/04/14/upgrade-windows-subsystem-for-linux/)
### Git
만약 당신이 이미 파일을 로컬로 복제하였다면 이 섹션을 무시하십시요.
당신은 파일을 기본적인 git을 사용하여 로컬로 복제해야 합니다. **주의, WSL Git을 사용하면 안됩니다** [Git](https://git-scm.com/download/win) 이 링크에서 git을 다운받고 설치하십시오.
그리고 [기본설정](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup), 유저네임과 이메일을 설정하는 것은 만약 당신이 온라인에 기여할 계획이라면 매우 중요합니다.
Git의 설치가 완료되었다면 Git Bash커맨드을 열고 당신의 복제 QMK파일이 있는 위치로 이동하고 `git clone --recurse-submodules https://github.com/qmk/qmk_firmware`를 실행 시키십니오. 이 커맨드는 새로운 `qmk_firmware`폴더를 이미 존재하는 것의 하위 폴더설정으로 생성할 것입니다.
### 도구(Toolchain) 설정
기본적으로 도구설정은 리눅스용 윈도우 하위 시스템이 설치될때 자동으로 설정됩니다. 하지만 수동적으로 하고 싶다면 여기 설명이 있습니다. (If you want to do everything manually, there are no other instructions than the scripts themselves, but you can always open issues and ask for more information. )
1. "Bash On Ubuntu On Windows" 을 실행시키십시오.
2. 당신이 `qmk_firmware`를 복제한 위치로 가십시오. WSL(리눅스용 윈도우 하위 시스템 사용)에서 `/mnt/`로 시작되는 패스를 찾으십시오. 즉 당신은 다음과 같은 형식으로 입력해야 합니다. `cd /mnt/c/path/to/qmk_firmware` (Note that the paths start with `/mnt/`in the WSL, so you have to write for example `cd /mnt/c/path/to/qmk_firmware`.)
3. `util/wsl_install.sh`를 실행시키고 화면에 나오는 지시를 따르십니오.
4. Bash command window를 재실행 시키십시오.
5. 이로써 당신은 컴파일과 프로그램 업로드(flashing)을 위한 준비가 모두 끝났습니다.
### 중요한 참고사항
*`util/wsl_install.sh` 명령어를 다시 실행시켜 최신 업데이트를 다운받을 수 있습니다.
* QMK 폴더의 위치는 윈도우 파일시스템을 기반으로 해야 됩니다. WSL는 외부실행파일를 작동 시킬수 없기 때문이죠.
* WSL의 Git은 윈도우용 Git과 **호환되지 않습니다**
* 파일을 수정하는 것은 WSL안과 밖에서 모두 가능합니다 하지만 만약 .makefile 혹은 .sh를 수정한다면 유닉스 라인엔딩(Unix line endings)을 지원하는 에디터를 사용하는지 확인하십이오. 그렇지 않다면 컴파일이 되지않을 수도 있습니다.
## 윈두우 (비스타 혹은 더 최신) (비추천)
이 섹션은 윈도우 비스타 혹은 더 최신버젼을 위한 오래된 설명입니다. [MSYS2](#windows-with-msys2-recommended)를 사용하는 것을 더 추천합니다.
1. WinAVR을 설치하였다면 먼저 삭제하십시오.
2. [MHV AVR Tools](https://infernoembedded.com/sites/default/files/project/MHV_AVR_Tools_20131101.exe)을 설치하십시오. (Disable smatch, but **be sure to leave the option to add the tools to the PATH checked**)
3. 만약 당신이 Infinity을 기반으로 하는 키보드에 프로그램 업로드를(flashing) 할거라면 dfu-util을 설치해야 합니다, [Input Club](https://github.com/kiibohd/controller/wiki/Loading-DFU-Firmware) 를 참고 하십시오.
4. [MinGW](https://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download)를 설치하십시오. 설치중 윈도우화면에서 GUI 추가 설치 옵션을 해재하십니오. **기본 설치 위치를 바꾸지 마십시오.** 이 명령어는 기본위치를 기반으로 하고 있습니다.
5. 레파지토리를 복제하십시오. [이 링크로 압축파일을 받고 앞축해제 하십시오.](https://github.com/qmk/qmk_firmware/archive/master.zip) 윈도우 탐색기에서 다운받은 파일을 여십시오.
6. `\util` 폴더를 여십시오.
7. `1-setup-path-win` .bat파일을 더블클릭해서 실행시키시오. 유저 계정 설정 변경을 허용해야될 수도 있습니다. 스페이스바를 눌러 설치가 성공적으로 완료되었다는 메세지를 닫을 수 있습니다.
8. `2-setup-environment-win` .bat파일에 우클릭해서 '관리자 권한으로 실행'으로 실행시키십시오. 이 작업을 꽤 오래 걸릴 수도 있습니다. 또한 드라이버 설정을 승인해야 될 수도 있습니다. 하지만 이 모든것이 끝나면 당신의 시스템의 설정이 모두 끝났습니다.
만약 이 작업을 하는데에 문제가 있어 도움받고 싶다면 *Win_Check_Output.txt*을 생성하는 것이 도움이 될것입니다. 이 파일은 `Win_Check.bat``\util`폴더에서 실행시켜 생성할 수 있습니다.
## 도커(Docker)
만약 위작업들이 당신에게 좀 어렵게 느껴졌다면 도커(Docker)가 당신을 위한 최선일 수도 있습니다(의역). [Docker CE](https://docs.docker.com/install/#supported-platforms)를 설치한뒤 아래 커맨드를 `qmk_firmware` 디랙토리에서 실행시켜 키보드 또는 키맵을 생성시킵니다.
```bash
util/docker_build.sh keyboard:keymap
# 예: util/docker_build.sh ergodox_ez:steno
```
이 커맨드는 원하는 키보드 또는 키맵을 컴파일하고 `.hex`또는 `.bin`파일을 프로그램 업로드를(flashing) 위해 QMK디랙토리에 생성할것입니다. 만약 `:keymap`이 생략된다면 `default`이 기본을로 사용됩니다. 참고로 여기서 사용되는 인수는 `make` 커맨드를 사용하여 컴파일할때와 동일합니다.
또한 스크립트를 그냥 아무 인수 없이도 사용가능합니다. 그렇게 된다면 프로그램은 하나씩 자동으로 인수입력을 요구 할것입니다. 어쩌면 이방법이 더 쉬울 수도 있습니다.
```bash
util/docker_build.sh
# 인수을 입력받습니다.(아무것도 쓰지 않고 놔두는면 기본값으로 설정됩니다)
```
다음과 같이 `target`를 사용하여 컴파일과 프로그램 업로드(flashing)을 동시에 할수도 있습니다.
```bash
util/docker_build.sh keyboard:keymap:target
# 예: util/docker_build.sh planck/rev6:default:dfu-util
```
만약 당시이 리눅스를 사용한다면 이 커맨드들은 추가 설정 없이 바로 작동할 것입니다. 하지만 위도우 또는 맥 환경에서는 [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/)를 사용하여야 이 커맨드들을 사용가능합니다. Docker Machine설정은 꽤 지루하고 짜증남으로 추천하지 않고 [QMK Toolbox](https://github.com/qmk/qmk_toolbox)를 사용하는 것을 추천합니다.
!> 윈도우에서 독커는 [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)을 활성화 설정하여야 사용가능합니다. 즉, 도커는 Hyper-V를 지원하지 않는 윈도우 7, 윈도우 8, 그리고 **윈도우 10 홈**과 같은 윈도우 버전에서 사용할수 없다는 것을 의미합니다.
## Vagrant
만약 컴웨어를 사용하는데 문제가 있다면 Vagrant라는 이름의 툴을 사용해 볼 수 있습니다. 이 툴은 가상환경을 세팅해줌과 동시에 컴웨어를 사용하는데에 필요한 모든 설정을 해줄 것입니다. OLKB는 가상환경에 파일을 호스팅하지 않습니다. [Vagrant 가이드](getting_started_vagrant.md)에서 더 많은 정보를 확인할 수 있습니다.

View File

@@ -0,0 +1,17 @@
# 도움 받기
QMK에서 도움을 받는 방법은 다양합니다.
**주의, 아래 링크들은 영어로 이루어져 있으며 영어 사용이 가능해야 편리하게 이용할 수 있습니다.**
## 디스코드 실시간 채팅
[QMK 디스코드 서버](https://discord.gg/Uq7gcHh)에서 QMK 개발자들과 실시간으로 대화를 나눌수있습니다. 이 디스코드에는 펌웨어, 툴박스, 하드웨어, 그리고 컨피겨레이터(configurator)에 관한 특별화된 채널이 운영되고 있습니다.
## OLKB 서브레딧
공식 QMK 포럼은 [reddit.com](https://reddit.com) 에 [/r/olkb](https://reddit.com/r/olkb)입니다.
## Github 이슈
[issue on GitHub](https://github.com/qmk/qmk_firmware/issues)에서 문제를 보고 할 수 있습니다. 이 링크는 문제가 오랜 시간을 필요로하거나 디버깅를 요구 할때 매우 유용합니다.

View File

@@ -0,0 +1,67 @@
# QMK와 함께 Github를 사용하는 방법
Github can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
Github는 자주 사용하는 사람이 아니면 좀 여려울수도 있습니다. 이 문서는 Github를 사용하는데 필요한 forking, cloning 그리고 submitting a pull request with QMK를 설명할 것입니다.
?> 이 가이드는 당신이 git커맨드를 사용하는데 익숙하고 git환경을 당신의 시스템이 설치하였다는 전제하에 작성되었습니다.
아래와 같이 [QMK Github 페이지](https://github.com/qmk/qmk_firmware)에서 당신은 "Fork"라고 쓰여있는 버튼을 볼 수 있습니다
![Fork on Github](http://i.imgur.com/8Toomz4.jpg)
만약 당신이 어느기관 소속이고, 무슨 계정을 사용할것인지 골라야 한다면 개인 계정을 사용하는 것을 추천합니다.
"Fork"가 성공적으로 끝났다면 아래 보이는 "Clone or Download"를 눌러야 합니다.
![Download from Github](http://i.imgur.com/N1NYcSz.jpg)
"HTTPS"채크 했는지 확인하고 나와 있는 링크를 복사하세요.
![HTTPS link](http://i.imgur.com/eGO0ohO.jpg)
여기거 부터 커맨드라인을 사용합니다. 커맨드 라인에서 `git clone `을 치고 복사한 링크를 붙여넣은후 실행시키세요.
```
user@computer:~$ git clone https://github.com/whoeveryouare/qmk_firmware.git
Cloning into 'qmk_firmware'...
remote: Counting objects: 46625, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 46625 (delta 0), reused 0 (delta 0), pack-reused 46623
Receiving objects: 100% (46625/46625), 84.47 MiB | 3.14 MiB/s, done.
Resolving deltas: 100% (29362/29362), done.
Checking out files: 100% (2799/2799), done.
```
당신은 이제 모든파일이 로컬시스템이 추가 되었습니다 그리고 이제 키맵을 추가하거나 컴파일, 프로그램 업로드(flashing)를 할 수 있습니다.
모든 추가 변경을 만든 뒤에는 add, commit, and push를 사용하여 당신의 Folk에 추가 할 수 있습니다.
```
user@computer:~$ git add .
user@computer:~$ git commit -m "adding my keymap"
[master cccb1608] adding my keymap
1 file changed, 1 insertion(+)
create mode 100644 keyboards/planck/keymaps/mine/keymap.c
user@computer:~$ git push
Counting objects: 1, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (1/1), 1.64 KiB | 0 bytes/s, done.
Total 1 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
이로써 당신이 만든 모든 변경들이 당신의 Github의 Folk에 추가 되었습니다. (`https://github.com/<whoeveryouare>/qmk_firmware`)에서 확인하고 "New Pull Request"를 눌러 변경사항을 QMK에 업로드할수 있습니다.
![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
이 버튼을 누르면 당신이 만든 모든 변경사항들이 보여질 것입니다. 만약 모든 변경사항이 맘에 든다면 "Create Pull Request"를 눌러 요청을 확정할수 있습니다.
**요청사항이 확정된다고 변경사항이 바로 적용되는 것은 아닙니다.**
![Create Pull Request](http://i.imgur.com/Ojydlaj.jpg)
요청을 한뒤 QMK개발자들은 댓글로 무엇이 변경되었는지 등을 물어 볼수있지만 끝에는 매인 디랙토리로 업로드 될것입니다.
**"Thanks for contributing to QMK :)"**

View File

@@ -1,4 +1,4 @@
# The Complete Newbs Guide To QMK
# The QMK Tutorial
Your computer keyboard has a processor inside of it, similar to the one inside your computer. This processor runs software that is responsible for detecting button presses and informing the computer when keys are pressed. QMK Firmware fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom keymap, you are creating an executable program for your keyboard.

View File

@@ -73,6 +73,7 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- commented-out functions removed too
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](https://docs.qmk.fm/#/custom_quantum_functions?id=keyboard_pre_init_-function-documentation)
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](https://docs.qmk.fm/#/custom_matrix?id=lite)
- prefer LED indicator [Configuration Options](https://docs.qmk.fm/#/feature_led_indicators?id=configuration-options) to custom `led_update_*()` implementations where possible
- `keyboard.h`
- `#include "quantum.h"` appears at the top
- `LAYOUT` macros should use standard definitions if applicable

View File

@@ -107,6 +107,7 @@ OLED_BLOCK_TYPE oled_dirty = 0;
bool oled_initialized = false;
bool oled_active = false;
bool oled_scrolling = false;
uint8_t oled_brightness = OLED_BRIGHTNESS;
uint8_t oled_rotation = 0;
uint8_t oled_rotation_width = 0;
uint8_t oled_scroll_speed = 0; // this holds the speed after being remapped to ssd1306 internal values
@@ -193,7 +194,7 @@ bool oled_init(uint8_t rotation) {
}
}
static const uint8_t PROGMEM display_setup2[] = {I2C_CMD, COM_PINS, OLED_COM_PINS, CONTRAST, 0x8F, PRE_CHARGE_PERIOD, 0xF1, VCOM_DETECT, 0x40, DISPLAY_ALL_ON_RESUME, NORMAL_DISPLAY, DEACTIVATE_SCROLL, DISPLAY_ON};
static const uint8_t PROGMEM display_setup2[] = {I2C_CMD, COM_PINS, OLED_COM_PINS, CONTRAST, OLED_BRIGHTNESS, PRE_CHARGE_PERIOD, 0xF1, VCOM_DETECT, 0x20, DISPLAY_ALL_ON_RESUME, NORMAL_DISPLAY, DEACTIVATE_SCROLL, DISPLAY_ON};
if (I2C_TRANSMIT_P(display_setup2) != I2C_STATUS_SUCCESS) {
print("display_setup2 failed\n");
return false;
@@ -550,6 +551,20 @@ bool oled_off(void) {
bool is_oled_on(void) { return oled_active; }
uint8_t oled_set_brightness(uint8_t level) {
uint8_t set_contrast[] = {I2C_CMD, CONTRAST, level};
if (oled_brightness != level) {
if (I2C_TRANSMIT(set_contrast) != I2C_STATUS_SUCCESS) {
print("set_brightness cmd failed\n");
return oled_brightness;
}
oled_brightness = level;
}
return oled_brightness;
}
uint8_t oled_get_brightness(void) { return oled_brightness; }
// Set the specific 8 lines rows of the screen to scroll.
// 0 is the default for start, and 7 for end, which is the entire
// height of the screen. For 128x32 screens, rows 4-7 are not used.

View File

@@ -141,6 +141,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#if !defined(OLED_FONT_HEIGHT)
# define OLED_FONT_HEIGHT 8
#endif
// Default brightness level
#if !defined(OLED_BRIGHTNESS)
# define OLED_BRIGHTNESS 255
#endif
#if !defined(OLED_TIMEOUT)
# if defined(OLED_DISABLE_TIMEOUT)
@@ -261,6 +265,12 @@ bool oled_off(void);
// not
bool is_oled_on(void);
// Sets the brightness of the display
uint8_t oled_set_brightness(uint8_t level);
// Gets the current brightness of the display
uint8_t oled_get_brightness(void);
// Basically it's oled_render, but with timeout management and oled_task_user calling!
void oled_task(void);

View File

@@ -1,3 +1,4 @@
VIA_ENABLE = yes
LTO_ENABLE = yes
MOUSEKEY_ENABLE = no
CONSOLE_ENABLE = no

View File

@@ -1,2 +1 @@
VIA_ENABLE = yes
MOUSEKEY_ENABLE = no

View File

@@ -1,5 +1,8 @@
#include "rev2.h"
// Tested and verified working on ext65rev2
void matrix_io_delay(void) { __asm__ volatile("nop\nnop\nnop\n"); }
#ifdef OLED_DRIVER_ENABLE
void board_init(void) {
SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;

View File

@@ -0,0 +1,22 @@
/*
Copyright 2019 Ryota Goto
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
// Define some configuration for modtap behavior
// #define TAPPING_TERM 150
#define PERMISSIVE_HOLD

View File

@@ -0,0 +1,97 @@
/* Copyright 2019 Ryota Goto
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
enum layer_names {
_BASE,
_NAV,
_FN
};
#define MY_LOCK C(LCMD(KC_L)) // Mac: Custom lock hotkey in BTT (when Alt/Command have been swapped in macOS)
/*
KBD6x ANSI physical layout
1u == 8chars
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
| | | | | | | | | | | | | | | |
|─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
| 1,5u | | | | | | | | | | | | | 1,5u |
|─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
| 1,75u | | | | | | | | | | | | 1,25u |
|─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
| 2,25u | | | | | | | | | | | 1,75u | |
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
| | 1,25u | | 1,25u | |
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_60_tsangan_hhkb(
// ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
// | | | | | | | | | | | | | | | |
KC_GESC, 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_NUBS, KC_RBRC,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,5u | | | | | | | | | | | | | 1,5u |
LT(_NAV,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_NUHS, KC_BSPC,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,75u | | | | | | | | | | | | 1,25u |
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_ENT,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,25u | | | | | | | | | | | 1,75u | |
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
// └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
// | | 1,25u | | 1,25u | |
XXXXXXX, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, XXXXXXX
// └────────────────────────────────────────────────────────────────────────────────────────────────────┘
),
[_NAV] = LAYOUT_60_tsangan_hhkb(
// ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
// | | | | | | | | | | | | | | | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_BSPC,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,5u | | | | | | | | | | | | | 1,5u |
_______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, _______, _______, KC_DEL,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,75u | | | | | | | | | | | | 1,25u |
_______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,25u | | | | | | | | | | | 1,75u | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
// | | 1,25u | | 1,25u | |
XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX
// └────────────────────────────────────────────────────────────────────────────────────────────────────┘
),
[_FN] = LAYOUT_60_tsangan_hhkb(
// ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
// | | | | | | | | | | | | | | | |
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,5u | | | | | | | | | | | | | 1,5u |
_______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,75u | | | | | | | | | | | | 1,25u |
KC_RCTL, KC_VOLD, KC_VOLU, KC_MUTE, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, MY_LOCK,
// |─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────|
// | 1,25u | | | | | | | | | | | 1,75u | |
_______, BL_TOGG, BL_INC, BL_DEC, BL_STEP, _______, _______, _______, KC_MRWD, KC_MFFD, _______, _______, _______,
// └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
// | | 1,25u | | 1,25u | |
XXXXXXX, _______, _______, KC_MPLY, _______, _______, XXXXXXX
// └────────────────────────────────────────────────────────────────────────────────────────────────────┘
),
};

View File

@@ -0,0 +1,14 @@
# General Information
This is more or less a HHKB base layout, but with completely different Fn layers. I don't use most of the HHKB secondary key positions because, honestly, they make no sense to me at all.
Fn key layer is focused mostly on keyboard firmware features (like RGB) as well as some of the necessary alternate functions. It also hold media controls, F-keys and Reset.
Left Tab-Hold layer is focused on nav cluster functionality, and turns Backspace into Delete (and moves Backspace up into the top right 1u position).
# Build instructions
To simply build the firmware file: `make clean && make ai03/polaris:mekberg`
To build and immediately flash: `make clean && make ai03/polaris:mekberg:flash`

View File

@@ -0,0 +1,2 @@
BACKLIGHT_ENABLE = no # Disable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Disable keyboard RGB underglow

View File

@@ -0,0 +1,117 @@
/* Copyright 2020 Leon Anavi <leon@anavi.org>
*
* 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
#define _SCH 0
#define _PCB 1
#define _FN 2
#define KC_X0 LT(_FN, KC_ESC)
#ifdef RGBLIGHT_ENABLE
// How long (in ms) to wait between animation steps for the rainbow mode
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {60, 30, 15};
// How long (in milliseconds) to wait between animation steps for each of the "Swirling rainbow" animations
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 10, 4};
#endif
/*
* The keymap contains 2 layers for KiCad hotkeys and a 3rd layer
* for controlling the backlighting and the underlighting.
*
* - Layer for KiCad Schematic hotkeys:
* m - to move selected component
* r - to rotate selected component
* w - to wire components
* v - to edit component value
* F1 - zoom in
* F2 - zoom out
* F4 - zoom center
*
* - Layer for KiCad PCB layout hotkets:
* m - to move selected component
* r - to rotate selected component
* x - to route a new track
* v - to add a via
* F1 - zoom in
* F2 - zoom out
* F4 - zoom center
*
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_SCH] = LAYOUT_ortho_2x4(
KC_M, KC_R, KC_W, KC_V,
KC_F1, KC_F2, KC_F4, TO(_PCB)
),
[_PCB] = LAYOUT_ortho_2x4(
KC_M, KC_R, KC_X, KC_V,
KC_F1, KC_F2, KC_F4, TO(_FN)
),
[_FN] = LAYOUT_ortho_2x4(
RGB_TOG, RGB_MOD, RGB_M_R, RGB_M_SN,
BL_TOGG, BL_STEP, BL_BRTG, TO(_SCH)
)
};
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_ln_P(PSTR("ANAVI Macro Pad 8"), false);
oled_write_P(PSTR("Layer: "), false);
switch (get_highest_layer(layer_state)) {
case _SCH:
oled_write_ln_P(PSTR("KiCad Schema"), false);
break;
case _PCB:
oled_write_ln_P(PSTR("KiCad PCB"), false);
break;
case _FN:
oled_write_ln_P(PSTR("FN "), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("N/A"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(PSTR("Num Lock: "), false);
oled_write_ln_P(led_state.num_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Caps Lock: "), false);
oled_write_ln_P(led_state.caps_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Scroll Lock: "), false);
oled_write_ln_P(led_state.scroll_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Backlit: "), false);
oled_write_ln_P(is_backlight_enabled() ? PSTR("On") : PSTR("Off"), false);
#ifdef RGBLIGHT_ENABLE
static char rgbStatusLine1[26] = {0};
snprintf(rgbStatusLine1, sizeof(rgbStatusLine1), "RGB Mode: %d", rgblight_get_mode());
oled_write_ln(rgbStatusLine1, false);
static char rgbStatusLine2[26] = {0};
snprintf(rgbStatusLine2, sizeof(rgbStatusLine2), "h:%d s:%d v:%d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
oled_write_ln(rgbStatusLine2, false);
#endif
}
#endif

View File

@@ -0,0 +1,97 @@
/* Copyright 2020 Leon Anavi <leon@anavi.org>
*
* 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
#define _MAIN 0
#define _FN 1
#define KC_X0 LT(_FN, KC_ESC)
#ifdef RGBLIGHT_ENABLE
// How long (in ms) to wait between animation steps for the rainbow mode
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {60, 30, 15};
// How long (in milliseconds) to wait between animation steps for each of the "Swirling rainbow" animations
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 10, 4};
#endif
/*
* This keymap contains the following shortcuts for OBS:
*
* - Shortcuts useful for switching scenes on the 1st row:
* Hold Left Control, Shift, Alt and GUI and press F9
* Hold Left Control, Shift, Alt and GUI and press F10
* Hold Left Control, Shift, Alt and GUI and press F11
* Hold Left Control, Shift, Alt and GUI and press F12
* - Center to screen: Ctrl+D
* - Fit to screen: Ctrl+F
* - Move source to top of sources list: Ctrl+Home
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = LAYOUT_ortho_2x4(
HYPR(KC_F9), HYPR(KC_F10), HYPR(KC_F11), HYPR(KC_F12),
LCTL(KC_D), LCTL(KC_F), LCTL(KC_HOME), MO(_FN)
),
[_FN] = LAYOUT_ortho_2x4(
RGB_TOG, RGB_MOD, RGB_M_R, RGB_M_SN,
BL_TOGG, BL_STEP, BL_BRTG, _______
)
};
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_ln_P(PSTR("ANAVI Macro Pad 8"), false);
oled_write_P(PSTR("Active layer: "), false);
switch (get_highest_layer(layer_state)) {
case _MAIN:
oled_write_ln_P(PSTR("OBS"), false);
break;
case _FN:
oled_write_ln_P(PSTR("FN"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("N/A"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(PSTR("Num Lock: "), false);
oled_write_ln_P(led_state.num_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Caps Lock: "), false);
oled_write_ln_P(led_state.caps_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Scroll Lock: "), false);
oled_write_ln_P(led_state.scroll_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Backlit: "), false);
oled_write_ln_P(is_backlight_enabled() ? PSTR("On") : PSTR("Off"), false);
#ifdef RGBLIGHT_ENABLE
static char rgbStatusLine1[26] = {0};
snprintf(rgbStatusLine1, sizeof(rgbStatusLine1), "RGB Mode: %d", rgblight_get_mode());
oled_write_ln(rgbStatusLine1, false);
static char rgbStatusLine2[26] = {0};
snprintf(rgbStatusLine2, sizeof(rgbStatusLine2), "h:%d s:%d v:%d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
oled_write_ln(rgbStatusLine2, false);
#endif
}
#endif

View File

@@ -0,0 +1,96 @@
/* Copyright 2020 Leon Anavi <leon@anavi.org>
*
* 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
#define _MAIN 0
#define _FN 1
#define KC_X0 LT(_FN, KC_ESC)
#ifdef RGBLIGHT_ENABLE
// How long (in ms) to wait between animation steps for the rainbow mode
const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {60, 30, 15};
// How long (in milliseconds) to wait between animation steps for each of the "Swirling rainbow" animations
const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {20, 10, 4};
#endif
/*
* The keymap contains the following shortcuts for Zoom meeting:
*
* Alt+V: Start/stop video
* Alt+A: Mute/unmute my audio
* Alt+M: Mute/unmute audio for everyone except the host
* Alt+S: Start/stop screen sharing
* Alt+R: Start/stop local recording
* Alt+P: Pause/resume recording
* Alt+C: Start/stop cloud recording
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_MAIN] = LAYOUT_ortho_2x4(
LALT(KC_V), LALT(KC_A), LALT(KC_M), LALT(KC_S),
LALT(KC_R), LALT(KC_P), LALT(KC_C), MO(_FN)
),
[_FN] = LAYOUT_ortho_2x4(
RGB_TOG, RGB_MOD, RGB_M_R, RGB_M_SN,
BL_TOGG, BL_STEP, BL_BRTG, _______
)
};
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180; // flips the display 180 degrees if offhand
}
void oled_task_user(void) {
// Host Keyboard Layer Status
oled_write_ln_P(PSTR("ANAVI Macro Pad 8"), false);
oled_write_P(PSTR("Active layer: "), false);
switch (get_highest_layer(layer_state)) {
case _MAIN:
oled_write_ln_P(PSTR("Zoom"), false);
break;
case _FN:
oled_write_ln_P(PSTR("FN"), false);
break;
default:
// Or use the write_ln shortcut over adding '\n' to the end of your string
oled_write_ln_P(PSTR("N/A"), false);
}
// Host Keyboard LED Status
led_t led_state = host_keyboard_led_state();
oled_write_P(PSTR("Num Lock: "), false);
oled_write_ln_P(led_state.num_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Caps Lock: "), false);
oled_write_ln_P(led_state.caps_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Scroll Lock: "), false);
oled_write_ln_P(led_state.scroll_lock ? PSTR("On") : PSTR("Off"), false);
oled_write_P(PSTR("Backlit: "), false);
oled_write_ln_P(is_backlight_enabled() ? PSTR("On") : PSTR("Off"), false);
#ifdef RGBLIGHT_ENABLE
static char rgbStatusLine1[26] = {0};
snprintf(rgbStatusLine1, sizeof(rgbStatusLine1), "RGB Mode: %d", rgblight_get_mode());
oled_write_ln(rgbStatusLine1, false);
static char rgbStatusLine2[26] = {0};
snprintf(rgbStatusLine2, sizeof(rgbStatusLine2), "h:%d s:%d v:%d", rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val());
oled_write_ln(rgbStatusLine2, false);
#endif
}
#endif

View File

@@ -1,2 +1 @@
VIA_ENABLE = yes
MOUSEKEY_ENABLE = no

View File

@@ -1,42 +0,0 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include QMK_KEYBOARD_CONFIG_H
#define PREVENT_STUCK_MODIFIERS
#define SPACE_COUNT 2
#define TEMPLATE( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \
) LAYOUT( \
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \
K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \
K10, K41, K42, K30, K44, K1D, K20, K45, K3C, K0D, K2B, K3D \
)
#define TEMPLATE_NUM( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \
) LAYOUT( \
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \
K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \
K10, K41, K42, K30, K44, K1D, K20, K45, K48, K49, K2B, K3D \
)
#define TEMPLATE_RESET LAYOUT( \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
)
#endif

View File

@@ -0,0 +1,53 @@
/* Copyright 2020 Joseph Wasson
*
* 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
#define SPACE_COUNT 3
#define TEMPLATE_TKL( \
KESC, KF01, KF02, KF03, KF04, KF05, KF06, KF07, KF08, KF09, KF10, KF11, KF12, KSCL, KPRS, KADJ, \
KGRV, K_1 , K_2 , K_3 , K_4 , K_5 , K_6 , K_7 , K_8 , K_9 , K_0 , KMIN, KEQL, KBSP, KINS, KHOM, KPUP, \
KTAB, K_Q , K_W , K_E , K_R , K_T , K_Y , K_U , K_I , K_O , K_P , KLBR, KRBR, KBLS, KDEL, KEND, LPDN, \
KCAP, K_A , K_S , K_D , K_F , K_G , K_H , K_J , K_K , K_L , KSMI, KQUO, KENT, \
KLSH, K_Z , K_X , K_C , K_V , K_B , K_N , K_M , KCMA, KDOT, KSLS, KRSH, K_UP, \
KLCT, KLOS, KLAL, KSP3, KSP2, KSP1, KRAL, KROS, KRCT, KPTT, K_LT, K_DN, K_RT \
) LAYOUT( \
K_Q , K_W , K_E , K_R , K_T , K_Y , K_U , K_I , K_O , K_P , \
K_A , K_S , K_D , K_F , K_G , K_H , K_J , K_K , K_L , KSMI, \
K_Z , K_X , K_C , K_V , K_B , K_N , K_M , KCMA, KDOT, KSLS, \
KTAB, KLOS, KLAL, KLSH, KSP3, KSP2, KCAP, KSP1, KRSH, KBLS, KQUO, KADJ \
)
#define TEMPLATE_NUM( \
KGRV, K_1 , K_2 , K_3 , K_4 , K_5 , K_6 , K_7 , K_8 , K_9 , K_0 , KMIN, KEQL, KBSL, KESC, \
KTAB, K_Q , K_W , K_E , K_R , K_T , K_Y , K_U , K_I , K_O , K_P , KLBR, KRBR, KBSP, \
KCAP, K_A , K_S , K_D , K_F , K_G , K_H , K_J , K_K , K_L , KSMI, KQUO, KENT, \
KLSH, K_Z , K_X , K_C , K_V , K_B , K_N , K_M , KCMA, KDOT, KSLS, KRSH, KADJ, \
KLCT, KLOS, KLAL, KSP3, KSP2, KSP1, KRAL, KROS, KRCT, KPTT \
) LAYOUT( \
K_Q , K_W , K_E , K_R , K_T , K_Y , K_U , K_I , K_O , K_P , \
K_A , K_S , K_D , K_F , K_G , K_H , K_J , K_K , K_L , KSMI, \
K_Z , K_X , K_C , K_V , K_B , K_N , K_M , KCMA, KDOT, KSLS, \
KTAB, KLOS, KLAL, KLSH, KSP3, KSP2, KCAP, KSP1, KRAL, KROS, KQUO, KADJ \
)
#define TEMPLATE_RESET LAYOUT( \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
)

View File

@@ -1,4 +1,4 @@
/* Copyright 2019 HnahKB
/* Copyright 2020 null-ll
*
* 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
@@ -14,6 +14,4 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
// place overrides here
#include "basketweave.h"

View File

@@ -0,0 +1,35 @@
/* Copyright 2020 null-ll
*
* 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
#define ____ KC_NO
#include "quantum.h"
#define LAYOUT_default( \
K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \
K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \
K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \
K401, K402, K404, K406, K408, K410, K411, K412, K413, K414 \
) { \
{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \
{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
{ ____, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \
{ ____, K401, K402, ____, K404, ____, K406, ____, K408, ____, K410, K411, K412, K413, K414 } \
}

View File

@@ -0,0 +1,62 @@
/* Copyright 2020 null-ll
*
* 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"
#define VENDOR_ID 0x6B62
#define PRODUCT_ID 0x6869
#define DEVICE_VER 0x0001
#define MANUFACTURER Clackery
#define PRODUCT Basketweave
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
#define MATRIX_ROW_PINS { A6, C6, C7, A7, A5 }
#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, B0, B1, B2, D5, D6, C5, C4, C3, C2, C1 }
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
#define USB_MAX_POWER_CONSUMPTION 100
/* 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
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
// #define GRAVE_ESC_CTRL_OVERRIDE
#define ENCODERS_PAD_A { D7 }
#define ENCODERS_PAD_B { C0 }
#define ENCODER_RESOLUTION 4
#define ENCODER_DIRECTION_FLIP
#define TAP_CODE_DELAY 10
/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0

View File

@@ -0,0 +1,12 @@
{
"keyboard_name": "Basketweave",
"url": "https://github.com/null-ll/basketweave",
"maintainer": "null-ll",
"width": 20,
"height": 5,
"layouts": {
"LAYOUT_default": {
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"~", "x":1.5, "y":0}, {"label":"!", "x":2.5, "y":0}, {"label":"@", "x":3.5, "y":0}, {"label":"#", "x":4.5, "y":0}, {"label":"$", "x":5.5, "y":0}, {"label":"%", "x":6.5, "y":0}, {"label":"^", "x":7.5, "y":0}, {"label":"&", "x":10.5, "y":0}, {"label":"*", "x":11.5, "y":0}, {"label":"(", "x":12.5, "y":0}, {"label":")", "x":13.5, "y":0}, {"label":"_", "x":14.5, "y":0}, {"label":"+", "x":15.5, "y":0}, {"label":"Backspace", "x":16.5, "y":0, "w":2}, {"label":"Mute", "x":19, "y":0.5}, {"label":"Delete", "x":0, "y":1}, {"label":"Tab", "x":1.5, "y":1, "w":1.5}, {"label":"Q", "x":3, "y":1}, {"label":"W", "x":4, "y":1}, {"label":"E", "x":5, "y":1}, {"label":"R", "x":6, "y":1}, {"label":"T", "x":7, "y":1}, {"label":"Y", "x":10, "y":1}, {"label":"U", "x":11, "y":1}, {"label":"I", "x":12, "y":1}, {"label":"O", "x":13, "y":1}, {"label":"P", "x":14, "y":1}, {"label":"{", "x":15, "y":1}, {"label":"}", "x":16, "y":1}, {"label":"|", "x":17, "y":1, "w":1.5}, {"label":"Insert", "x":0, "y":2}, {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75}, {"label":"A", "x":3.25, "y":2}, {"label":"S", "x":4.25, "y":2}, {"label":"D", "x":5.25, "y":2}, {"label":"F", "x":6.25, "y":2}, {"label":"G", "x":7.25, "y":2}, {"label":"H", "x":10.25, "y":2}, {"label":"J", "x":11.25, "y":2}, {"label":"K", "x":12.25, "y":2}, {"label":"L", "x":13.25, "y":2}, {"label":":", "x":14.25, "y":2}, {"label":"\"", "x":15.25, "y":2}, {"label":"Enter", "x":16.25, "y":2, "w":2.25}, {"label":"Shift", "x":1.5, "y":3, "w":2.25}, {"label":"Z", "x":3.75, "y":3}, {"label":"X", "x":4.75, "y":3}, {"label":"C", "x":5.75, "y":3}, {"label":"V", "x":6.75, "y":3}, {"label":"B", "x":7.75, "y":3}, {"label":"B", "x":9.75, "y":3}, {"label":"N", "x":10.75, "y":3}, {"label":"M", "x":11.75, "y":3}, {"label":"<", "x":12.75, "y":3}, {"label":">", "x":13.75, "y":3}, {"label":"?", "x":14.75, "y":3}, {"label":"Shift", "x":15.75, "y":3, "w":1.75}, {"label":"\u2191", "x":17.75, "y":3}, {"label":"Ctrl", "x":1.5, "y":4, "w":1.5}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":2}, {"label":"Fn", "x":8, "y":4, "w":1.25}, {"x":9.75, "y":4, "w":2.75}, {"label":"Alt", "x":12.5, "y":4, "w":1.5}, {"label":"Ctrl", "x":15, "y":4, "w":1.5}, {"label":"\u2190", "x":16.75, "y":4}, {"label":"\u2193", "x":17.75, "y":4}, {"label":"\u2192", "x":18.75, "y":4}]
}
}
}

View File

@@ -0,0 +1,50 @@
/* Copyright 2020 null-ll
*
* 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 "basketweave.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_default( /* base */
KC_GESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
KC_DEL, KC_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_UP,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RIGHT,
KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_MUTE),
[1] = LAYOUT_default( /* fn */
/* esc ` 1 2 3 4 5 6 7 8 9 0 - = bspc */
KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
/* ins tab Q W E R T Y U I O P [ ] \ */
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS,
/* del caps A S D F G H J K L ; ' enter up */
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PGUP,
/* shift Z X C V B B N M , . / shift right */
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_END,
/* ctrl alt space fn space alt ctrl left down rotary */
KC_LCTL, KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, KC_RCTL, KC_HOME, KC_PGDN, KC_MPLY)
};
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
if (clockwise) {
tap_code(KC_VOLU);
} else {
tap_code(KC_VOLD);
}
}
}

View File

@@ -0,0 +1,15 @@
# Basketweave
![Basketweave](https://i.imgur.com/lXhMxQUl.jpg)
A through-hole Alice style keyboard with arrow keys and a rotary encoder
* Keyboard Maintainer: [null-ll](https://github.com/null-ll)
* Hardware Supported: atmega32a
* Hardware Availability: [Clackery](https://clackery.com), [Github](https://github.com/null-ll/basketweave)
Make example for this keyboard (after setting up your build environment):
make basketweave: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,26 @@
# MCU name
MCU = atmega32a
# Processor frequency
F_CPU = 16000000
# Bootloader selection
BOOTLOADER = USBasp
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output
ENCODER_ENABLE = yes

View File

@@ -1,4 +1,4 @@
VIA_ENABLE = yes
LTO_ENABLE = yes
EXTRAKEY_ENABLE = no
CONSOLE_ENABLE = no

View File

@@ -0,0 +1,173 @@
/* Copyright 2020 Brandon Schlack
*
* 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 "brandonschlack.h"
/**
* Layer Names
*
* Layers mostly used for macro keys
*/
#define _REEDER _M1
#define _NAV _M2
#define _MOUSE _M3
/**
* Keycodes & Macros
*/
#define TG_BASE TO(_BASE)
#define TG_REDR TO(_REEDER)
#define TG_NAV TO(_NAV)
#define TG_MOUS TO(_MOUSE)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/**
* Base
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │Esc│││Tab   Q  W  E  R  T  Y  U  I  O  P │{ [│} ]│Bck│
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │PgU│││HyEsc  A  S  D  F  G  H  J  K  L │: ;│" '│ Enter│
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │PgD│││Shift    Z  X  C  V  B  N  M │< ,│> .│? /│Shft│ Fn│
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │End│││││││││││Opt│Cmd                      Cmd│Ctl│││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_BASE] = LAYOUT_default(
KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, \
KC_PGUP, HY_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
KC_PGDN, KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, PLY_FN1, \
KC_END, KC_LOPT, KC_LCMD, SPC_RAI, SPC_RAI, KC_RCMD, KC_RCTL \
),
/**
* Reeder
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │ P │││                                            
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ K │││                                             
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │ J │││                                             
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │ N │││││││││││                                  │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_REEDER] = LAYOUT_default( \
KC_P, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_K, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_J, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_N, _______, _______, _______, _______, _______, _______ \
),
/**
* Nav
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │ → │││     │   │   │   │   │   │   │   │   │   │   │   │   │   │
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ ↑ │││      │   │   │   │   │   │   │   │   │   │   │   │      │
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │ ↓ │││        │   │   │   │   │   │   │   │   │   │   │    │   │
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │ ← │││││││││││   │     │        │          │     │   │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_NAV] = LAYOUT_default( \
KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_DOWN, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_LEFT, _______, _______, _______, _______, _______, _______ \
),
/**
* Mouse
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │WhU│││                                            
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │ ↑ │││      │   │   │   │   │   │   │   │   │   │   │   │      │
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │ ↓ │││        │   │   │   │   │   │   │   │   │   │   │    │   │
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │WhD│││││││││││                                  │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_MOUSE] = LAYOUT_default( \
MC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_DOWN, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
MC_WH_D, _______, _______, _______, _______, _______, _______ \
),
/**
* Lower
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │Nxt│││Del  │BrD│BrU│Msn│LHP│                    │Mut│SlD│
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │VlU│││HyCaps│      │NxW│PvT│Bck│Fwd│NxT│           Play 
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │VlD│││                 │1PX│1Ps│                     
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │Prv│││││││││││                                  │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_LOWER] = LAYOUT_default( \
KC_MNXT, KC_DELT, KC_BRMD, KC_BRMU, MC_MSSN, MC_LHPD, _______, _______, _______, _______, _______, _______, KC_UP, KC_MUTE, MC_SLPD, \
KC_VOLU, HY_CAPS, _______, _______, NXT_WIN, PRV_TAB, MC_BACK, MC_FWRD, NXT_TAB, _______, _______, KC_LEFT, KC_RGHT, KC_MPLY, \
KC_VOLD, _______, XXXXXXX, _______, _______, _______, PX_AFLL, OP_AFLL, _______, _______, _______, _______, KC_DOWN, _______, _______, \
KC_MPRV, _______, _______, _______, _______, _______, _______ \
),
/**
* Raise
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │Hom│││~ `  │! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│   │
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │PgU│││       F1│ F2│ F3│ F4│ F5│ F6│_ -│+ =│   │   │   │      │
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │PgD│││         F7│ F8│ F9│F10│F11│F12│         │| \│    │   │
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │End│││││││││││                                  │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_RAISE] = LAYOUT_default( \
KC_HOME, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, \
KC_PGUP, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, _______, _______, _______, _______, \
KC_PGDN, _______, XXXXXXX, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, KC_BSLS, _______, _______, \
KC_END, _______, _______, _______, _______, _______, _______ \
),
/**
* Adjust
* ┌───┬┬┬─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
* │Bse│││Make       │EEP│RST│                           
* ├───┼┼┼─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
* │Rdr│││                                             
* ├───┼┼┼──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──┬───┤
* │Nav│││                                             
* ├───┼┼┼┬┬┬┬┬┬┬┬┴──┬┴───┴┬──┴───┴─┬─┴───┴───┴┬──┴──┬┴──┬┼┬┬┬┬┼┬┬┬┤
* │Mse│││││││││││                                  │││││││││││
* └───┴┴┴┴┴┴┴┴┴┴┴───┴─────┴────────┴──────────┴─────┴───┴┴┴┴┴┴┴┴┴┴┘
*/
[_ADJUST] = LAYOUT_default( \
TG_BASE, QM_MAKE, _______, _______, EEP_RST, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
TG_REDR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
TG_NAV, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
TG_MOUS, _______, _______, _______, _______, _______, _______ \
),
};
void keyboard_post_init_keymap(void) {
rgblight_disable_noeeprom();
}
layer_state_t layer_state_set_keymap(layer_state_t state) {
return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
}

View File

@@ -1,10 +1 @@
#include "claw44.h"
#include "ssd1306.h"
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
#ifdef SSD1306OLED
return process_record_gfx(keycode,record) && process_record_user(keycode, record);
#else
return process_record_user(keycode, record);
#endif
}

View File

@@ -19,10 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include "config_common.h"
#include <serial_config.h>
#define USE_I2C
#define USE_SERIAL
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION

View File

@@ -1,162 +0,0 @@
#include <util/twi.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/twi.h>
#include <stdbool.h>
#include "i2c.h"
#ifdef USE_I2C
// Limits the amount of we wait for any one i2c transaction.
// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is
// 9 bits, a single transaction will take around 90μs to complete.
//
// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit
// poll loop takes at least 8 clock cycles to execute
#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8
#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE)
volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
static volatile uint8_t slave_buffer_pos;
static volatile bool slave_has_register_set = false;
// Wait for an i2c operation to finish
inline static
void i2c_delay(void) {
uint16_t lim = 0;
while(!(TWCR & (1<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
lim++;
// easier way, but will wait slightly longer
// _delay_us(100);
}
// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK)
void i2c_master_init(void) {
// no prescaler
TWSR = 0;
// Set TWI clock frequency to SCL_CLOCK. Need TWBR>10.
// Check datasheets for more info.
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
}
// Start a transaction with the given i2c slave address. The direction of the
// transfer is set with I2C_READ and I2C_WRITE.
// returns: 0 => success
// 1 => error
uint8_t i2c_master_start(uint8_t address) {
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
i2c_delay();
// check that we started successfully
if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
return 1;
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
i2c_delay();
if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
return 1; // slave did not acknowledge
else
return 0; // success
}
// Finish the i2c transaction.
void i2c_master_stop(void) {
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
uint16_t lim = 0;
while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
lim++;
}
// Write one byte to the i2c slave.
// returns 0 => slave ACK
// 1 => slave NACK
uint8_t i2c_master_write(uint8_t data) {
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
i2c_delay();
// check if the slave acknowledged us
return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
}
// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
// if ack=0 the acknowledge bit is not set.
// returns: byte read from i2c device
uint8_t i2c_master_read(int ack) {
TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
i2c_delay();
return TWDR;
}
void i2c_reset_state(void) {
TWCR = 0;
}
void i2c_slave_init(uint8_t address) {
TWAR = address << 0; // slave i2c address
// TWEN - twi enable
// TWEA - enable address acknowledgement
// TWINT - twi interrupt flag
// TWIE - enable the twi interrupt
TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
}
ISR(TWI_vect);
ISR(TWI_vect) {
uint8_t ack = 1;
switch(TW_STATUS) {
case TW_SR_SLA_ACK:
// this device has been addressed as a slave receiver
slave_has_register_set = false;
break;
case TW_SR_DATA_ACK:
// this device has received data as a slave receiver
// The first byte that we receive in this transaction sets the location
// of the read/write location of the slaves memory that it exposes over
// i2c. After that, bytes will be written at slave_buffer_pos, incrementing
// slave_buffer_pos after each write.
if(!slave_has_register_set) {
slave_buffer_pos = TWDR;
// don't acknowledge the master if this memory loctaion is out of bounds
if ( slave_buffer_pos >= SLAVE_BUFFER_SIZE ) {
ack = 0;
slave_buffer_pos = 0;
}
slave_has_register_set = true;
} else {
i2c_slave_buffer[slave_buffer_pos] = TWDR;
BUFFER_POS_INC();
}
break;
case TW_ST_SLA_ACK:
case TW_ST_DATA_ACK:
// master has addressed this device as a slave transmitter and is
// requesting data.
TWDR = i2c_slave_buffer[slave_buffer_pos];
BUFFER_POS_INC();
break;
case TW_BUS_ERROR: // something went wrong, reset twi state
TWCR = 0;
default:
break;
}
// Reset everything, so we are ready for the next TWI interrupt
TWCR |= (1<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
}
#endif

View File

@@ -1,46 +0,0 @@
#pragma once
#include <stdint.h>
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#define I2C_READ 1
#define I2C_WRITE 0
#define I2C_ACK 1
#define I2C_NACK 0
#define SLAVE_BUFFER_SIZE 0x10
// i2c SCL clock frequency 400kHz
#define SCL_CLOCK 400000L
extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
void i2c_master_init(void);
uint8_t i2c_master_start(uint8_t address);
void i2c_master_stop(void);
uint8_t i2c_master_write(uint8_t data);
uint8_t i2c_master_read(int);
void i2c_reset_state(void);
void i2c_slave_init(uint8_t address);
static inline unsigned char i2c_start_read(unsigned char addr) {
return i2c_master_start((addr << 1) | I2C_READ);
}
static inline unsigned char i2c_start_write(unsigned char addr) {
return i2c_master_start((addr << 1) | I2C_WRITE);
}
// from SSD1306 scrips
extern unsigned char i2c_rep_start(unsigned char addr);
extern void i2c_start_wait(unsigned char addr);
extern unsigned char i2c_readAck(void);
extern unsigned char i2c_readNak(void);
extern unsigned char i2c_read(unsigned char ack);
#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();

View File

@@ -20,16 +20,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
//#define USE_MATRIX_I2C
/* Select hand configuration */
#define MASTER_LEFT
// #define MASTER_RIGHT
// #define EE_HANDS
#define SSD1306OLED
#define USE_SERIAL_PD2
#define TAPPING_TERM 200

View File

@@ -1,168 +1,59 @@
#include QMK_KEYBOARD_H
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#include "split_util.h"
#endif
#ifdef SSD1306OLED
#include "ssd1306.h"
#endif
extern uint8_t is_master;
// 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.
enum custom_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE
};
enum macro_keycodes {
KC_SAMPLEMACRO,
enum layer_number {
_QWERTY = 0,
_RAISE,
_LOWER,
};
#define KC_ KC_TRNS
#define KC_RST RESET
#define KC_L_SPC LT(_LOWER, KC_SPC) // lower
#define KC_R_ENT LT(_RAISE, KC_ENT) // raise
#define KC_G_JA LGUI_T(KC_LANG1) // cmd or win
#define KC_G_EN LGUI_T(KC_LANG2) // cmd or win
#define KC_C_BS LCTL_T(KC_BSPC) // ctrl
#define KC_A_DEL ALT_T(KC_DEL) // alt
#define KC_L_SPC LT(_LOWER, KC_SPC) // lower
#define KC_R_ENT LT(_RAISE, KC_ENT) // raise
#define KC_G_JA LGUI_T(KC_LANG1) // cmd or win
#define KC_G_EN LGUI_T(KC_LANG2) // cmd or win
#define KC_C_BS LCTL_T(KC_BSPC) // ctrl
#define KC_A_DEL ALT_T(KC_DEL) // alt
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT( \
//,--------+--------+---------+--------+---------+--------. ,--------+---------+--------+---------+--------+--------.
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_TAB , 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_RSFT,
//`--------+--------+---------+--------+---------+--------/ \--------+---------+--------+---------+--------+--------'
KC_A_DEL, KC_G_EN, KC_L_SPC, KC_C_BS, KC_C_BS, KC_R_ENT, KC_G_JA, KC_A_DEL
// `----------+--------+---------+--------' `--------+---------+--------+---------'
),
[_QWERTY] = LAYOUT( \
//,--------+--------+---------+--------+---------+--------. ,--------+---------+--------+---------+--------+--------.
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_TAB , 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_RSFT,
//`--------+--------+---------+--------+---------+--------/ \--------+---------+--------+---------+--------+--------'
KC_A_DEL, KC_G_EN, KC_L_SPC, KC_C_BS, KC_C_BS, KC_R_ENT, KC_G_JA, KC_A_DEL
// `----------+--------+---------+--------' `--------+---------+--------+---------'
),
[_RAISE] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
_______, KC_BSLS, KC_CIRC, KC_EXLM, KC_AMPR, KC_PIPE, KC_AT , KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_HASH, KC_DLR , KC_DQT , KC_QUOT, KC_TILD, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_GRV , KC_RPRN,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, _______, _______, _______, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
_______, _______, _______, _______, _______, _______, _______, RESET
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
// \ ^ ! & | @ = + * % -
// ( # $ " ' ~ ← ↓ ↑ → ` )
// { [ ] }
[_RAISE] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
_______, KC_BSLS, KC_CIRC, KC_EXLM, KC_AMPR, KC_PIPE, KC_AT , KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_HASH, KC_DLR , KC_DQT , KC_QUOT, KC_TILD, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_GRV , KC_RPRN,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, _______, _______, _______, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
_______, _______, _______, _______, _______, _______, _______, RESET
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
[_LOWER] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, KC_COMM, KC_DOT , KC_SLSH, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
RESET , _______, _______, _______, _______, _______, _______, _______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
[_LOWER] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, KC_COMM, KC_DOT , KC_SLSH, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
RESET , _______, _______, _______, _______, _______, _______, _______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
};
void matrix_init_user(void) {
//SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
iota_gfx_init(!has_usb()); // turns on the display
#endif
}
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
// When add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
const char *read_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
const char *read_keylog(void);
const char *read_keylogs(void);
// const char *read_mode_icon(bool swap);
// const char *read_host_led_state(void);
// void set_timelog(void);
// const char *read_timelog(void);
void matrix_scan_user(void) {
iota_gfx_task();
}
void matrix_render_user(struct CharacterMatrix *matrix) {
if (is_master) {
// If you want to change the display of OLED, you need to change here
matrix_write_ln(matrix, read_layer_state());
matrix_write_ln(matrix, read_keylog());
matrix_write_ln(matrix, read_keylogs());
//matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
//matrix_write_ln(matrix, read_host_led_state());
//matrix_write_ln(matrix, read_timelog());
} else {
matrix_write(matrix, read_logo());
}
}
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
memcpy(dest->display, source->display, sizeof(dest->display));
dest->dirty = true;
}
}
void iota_gfx_task_user(void) {
struct CharacterMatrix matrix;
matrix_clear(&matrix);
matrix_render_user(&matrix);
matrix_update(&display, &matrix);
}
#endif//SSD1306OLED
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef SSD1306OLED
set_keylog(keycode, record);
#endif
// set_timelog();
}
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
} else {
layer_off(_LOWER);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
} else {
layer_off(_RAISE);
}
return false;
break;
}
return true;
}

View File

@@ -0,0 +1,24 @@
/*
This is the c configuration file for the keymap
Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define MASTER_LEFT
#define OLED_FONT_H "keyboards/claw44/lib/glcdfont.c"

View File

@@ -0,0 +1,137 @@
#include QMK_KEYBOARD_H
#include <stdio.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.
enum layer_number {
_QWERTY = 0,
_RAISE,
_LOWER,
};
#define KC_ KC_TRNS
#define KC_RST RESET
#define KC_L_SPC LT(_LOWER, KC_SPC) // lower
#define KC_R_ENT LT(_RAISE, KC_ENT) // raise
#define KC_G_JA LGUI_T(KC_LANG1) // cmd or win
#define KC_G_EN LGUI_T(KC_LANG2) // cmd or win
#define KC_C_BS LCTL_T(KC_BSPC) // ctrl
#define KC_A_DEL ALT_T(KC_DEL) // alt
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT( \
//,--------+--------+---------+--------+---------+--------. ,--------+---------+--------+---------+--------+--------.
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_MINS,
//|--------+--------+---------+--------+---------+--------| |--------+---------+--------+---------+--------+--------|
KC_TAB , 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_RSFT,
//`--------+--------+---------+--------+---------+--------/ \--------+---------+--------+---------+--------+--------'
KC_A_DEL, KC_G_EN, KC_L_SPC, KC_C_BS, KC_C_BS, KC_R_ENT, KC_G_JA, KC_A_DEL
// `----------+--------+---------+--------' `--------+---------+--------+---------'
),
[_RAISE] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
_______, KC_BSLS, KC_CIRC, KC_EXLM, KC_AMPR, KC_PIPE, KC_AT , KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_HASH, KC_DLR , KC_DQT , KC_QUOT, KC_TILD, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, KC_GRV , KC_RPRN,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, KC_LCBR, KC_LBRC, KC_RBRC, KC_RCBR, _______, _______, _______, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
_______, _______, _______, _______, _______, _______, _______, RESET
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
[_LOWER] = LAYOUT( \
//,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------.
KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, KC_EQL , KC_PLUS, KC_ASTR, KC_PERC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
_______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, _______, KC_COMM, KC_DOT , KC_SLSH, _______,
//`--------+--------+--------+--------+--------+--------/ \--------+--------+--------+--------+--------+--------'
RESET , _______, _______, _______, _______, _______, _______, _______
// `--------+--------+--------+--------' `--------+--------+--------+--------'
),
};
#ifdef OLED_DRIVER_ENABLE
void render_layer_state(void) {
switch (get_highest_layer(layer_state)) {
case _QWERTY:
oled_write_ln_P(PSTR("Layer: Default"), false);
break;
case _RAISE:
oled_write_ln_P(PSTR("Layer: Raise"), false);
break;
case _LOWER:
oled_write_ln_P(PSTR("Layer: Lower"), false);
break;
default:
oled_write_ln_P(PSTR("Layer: Undefined"), false);
}
}
void render_logo(void) {
static const char PROGMEM logo[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0};
oled_write_P(logo, false);
}
char keylog_str[24] = {};
char keylogs_str[21] = {};
int keylogs_str_idx = 0;
const char code_to_name[60] = {' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R', 'E', 'B', 'T', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ';', '\'', ' ', ',', '.', '/', ' ', ' ', ' '};
void set_keylog(uint16_t keycode, keyrecord_t *record) {
char name = ' ';
if (keycode < 60) {
name = code_to_name[keycode];
}
// update keylog
snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c", record->event.key.row, record->event.key.col, keycode, name);
// update keylogs
if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
keylogs_str_idx = 0;
for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
keylogs_str[i] = ' ';
}
}
keylogs_str[keylogs_str_idx] = name;
keylogs_str_idx++;
}
const char *read_keylog(void) { return keylog_str; }
const char *read_keylogs(void) { return keylogs_str; }
void oled_task_user(void) {
if (is_keyboard_master()) {
render_layer_state();
oled_write_ln(read_keylog(), false);
oled_write_ln(read_keylogs(), false);
} else {
render_logo();
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
set_keylog(keycode, record);
}
return true;
}
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (!is_keyboard_master()) return OLED_ROTATION_180;
return rotation;
}
#endif

View File

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

View File

@@ -1,221 +0,0 @@
#include QMK_KEYBOARD_H
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#include "split_util.h"
#endif
#ifdef SSD1306OLED
#include "ssd1306.h"
#endif
extern keymap_config_t keymap_config;
extern uint8_t is_master;
// 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.
enum custom_keycodes {
QWERTY = SAFE_RANGE,
LOWER,
RAISE
};
enum macro_keycodes {
KC_SAMPLEMACRO,
};
// common
#define KC_ KC_TRNS
#define KC_XXXX KC_NO
#define KC_RST RESET
#define KC_VD KC__VOLDOWN
#define KC_VU KC__VOLUP
// layer
#define KC_L_SPC LT(_LOWER, KC_SPC)
#define KC_R_ENT LT(_RAISE, KC_ENT)
// shift_t
#define KC_S_TAB LSFT_T(KC_TAB)
#define KC_S_ESC LSFT_T(KC_ESC)
#define KC_S_JA LSFT_T(KC_LANG1)
#define KC_S_EN LSFT_T(KC_LANG2)
// cmd_t
#define KC_M_F LCMD_T(KC_F)
#define KC_M_D LCMD_T(KC_D)
#define KC_M_J LCMD_T(KC_J)
#define KC_M_K LCMD_T(KC_K)
// ctl_t
#define KC_C_S LCTL_T(KC_S)
#define KC_C_L LCTL_T(KC_L)
#define KC_C_BS LCTL_T(KC_BSPC)
// alt_t
#define KC_A_D ALT_T(KC_D)
#define KC_A_K ALT_T(KC_K)
#define KC_A_Z ALT_T(KC_Z)
#define KC_A_SL ALT_T(KC_SLSH)
#define KC_A_DEL ALT_T(KC_DEL)
// cmd+shift_t
#define KC_MS_Q SCMD_T(KC_Q)
#define KC_MS_A SCMD_T(KC_A)
#define KC_MS_S SCMD_T(KC_S)
#define KC_MS_SC SCMD_T(KC_SCLN)
#define KC_MS_ESC SCMD_T(KC_ESC)
//
#define KC_MR RCMD(KC_R)
#define KC_MF RCMD(KC_F)
#define KC_MW RCMD(KC_W)
#define KC_MX RCMD(KC_X)
#define KC_MC RCMD(KC_C)
#define KC_MV RCMD(KC_V)
#define KC_MTAB RCMD(KC_TAB)
#define KC_MSF RCMD(RSFT(KC_F))
#define KC_MSR RCMD(RSFT(KC_R))
#define KC_MST RCMD(RSFT(KC_T))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// M_ = LCMD_T(
// A_ = ALT_T(
// C_ = LCTL_T(
// MS_ = SMD_T(
// R_ = LT(_RAISE
// L_ = LT(_LOWER
[_QWERTY] = LAYOUT_kc( \
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
ESC , Q , W , E , R , T , Y , U , I , O , P ,MINS,
//|----+----+----+----+----+----| |----+----+----+----+----+----|
S_TAB, A ,C_S , D ,M_F , G , H ,M_J , K ,C_L ,SCLN,S_ESC,
//|----+----+----+----+----+----+ |----+----+----+----+----+----|
, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, ,
//`----+----+----+----+----+----/ \----+----+----+----+----+----'
A_DEL,S_EN,L_SPC,C_BS, C_BS,R_ENT,S_JA,A_DEL
// `----+----+----+----' `----+----+----+----'
),
// \ ^ ! & | @ = + * % -
// ( # $ " ' ~ ← ↓ ↑ → ` )
// { [ ] }
[_RAISE] = LAYOUT_kc( \
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
,BSLS,CIRC,EXLM,AMPR,PIPE, AT ,EQL ,PLUS,ASTR,PERC,MINS,
//|----+----+----+----+----+----| |----+----+----+----+----+----|
LPRN,HASH,DLR ,DQT ,QUOT,TILD, LEFT,DOWN, UP ,RGHT,GRV ,RPRN,
//|----+----+----+----+----+----| |----+----+----+----+----+----|
, , , ,LCBR,LBRC, RBRC,RCBR, , , , ,
//`----+----+----+----+----+----/ \----+----+----+----+----+----'
, ,BSPC, , , , ,RST
// `----+----+----+----' `----+----+----+----'
),
[_LOWER] = LAYOUT_kc( \
//,----+----+----+----+----+----. ,----+----+----+----+----+----.
, , ,MSF ,MSR ,MST , ,EQL ,PLUS,ASTR,PERC,MINS,
//|----+----+----+----+----+----| |----+----+----+----+----+----|
, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , ,
//|----+----+----+----+----+----| |----+----+----+----+----+----|
, , , , , , , ,COMM,DOT ,SLSH, ,
//`----+----+----+--+-+----+----/ \----+----+----+----+----+----'
RST , , , , ,DEL , ,
// `----+----+----+----' `----+----+----+----'
),
};
void matrix_init_user(void) {
//SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
iota_gfx_init(!has_usb()); // turns on the display
#endif
}
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
// When add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
const char *read_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
const char *read_keylog(void);
const char *read_keylogs(void);
// const char *read_mode_icon(bool swap);
// const char *read_host_led_state(void);
// void set_timelog(void);
// const char *read_timelog(void);
void matrix_scan_user(void) {
iota_gfx_task();
}
void matrix_render_user(struct CharacterMatrix *matrix) {
if (is_master) {
// If you want to change the display of OLED, you need to change here
matrix_write_ln(matrix, read_layer_state());
matrix_write_ln(matrix, read_keylog());
matrix_write_ln(matrix, read_keylogs());
//matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
//matrix_write_ln(matrix, read_host_led_state());
//matrix_write_ln(matrix, read_timelog());
} else {
matrix_write(matrix, read_logo());
}
}
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
memcpy(dest->display, source->display, sizeof(dest->display));
dest->dirty = true;
}
}
void iota_gfx_task_user(void) {
struct CharacterMatrix matrix;
matrix_clear(&matrix);
matrix_render_user(&matrix);
matrix_update(&display, &matrix);
}
#endif//SSD1306OLED
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef SSD1306OLED
set_keylog(keycode, record);
#endif
// set_timelog();
}
switch (keycode) {
case QWERTY:
if (record->event.pressed) {
set_single_persistent_default_layer(_QWERTY);
}
return false;
break;
case LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
} else {
layer_off(_LOWER);
}
return false;
break;
case RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
} else {
layer_off(_RAISE);
}
return false;
break;
}
return true;
}

View File

@@ -1,7 +1,17 @@
// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
// See gfxfont.h for newer custom bitmap font info.
#include "progmem.h"
#ifndef FONT5X7_H
#define FONT5X7_H
#ifdef __AVR__
#include <avr/io.h>
#include <avr/pgmspace.h>
#elif defined(ESP8266)
#include <pgmspace.h>
#else
#define PROGMEM
#endif
// Standard ASCII 5x7 font
const unsigned char font[] PROGMEM = {
@@ -230,3 +240,4 @@ const unsigned char font[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
#endif // FONT5X7_H

View File

@@ -1,15 +0,0 @@
#include <stdio.h>
#include "claw44.h"
char host_led_state_str[24];
const char *read_host_led_state(void)
{
uint8_t leds = host_keyboard_leds();
snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
(leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
(leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
(leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- ");
return host_led_state_str;
}

View File

@@ -1,45 +0,0 @@
#include <stdio.h>
#include "claw44.h"
char keylog_str[24] = {};
char keylogs_str[21] = {};
int keylogs_str_idx = 0;
const char code_to_name[60] = {
' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'R', 'E', 'B', 'T', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ';', '\'', ' ', ',', '.', '/', ' ', ' ', ' '};
void set_keylog(uint16_t keycode, keyrecord_t *record) {
char name = ' ';
if (keycode < 60) {
name = code_to_name[keycode];
}
// update keylog
snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
record->event.key.row, record->event.key.col,
keycode, name);
// update keylogs
if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
keylogs_str_idx = 0;
for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
keylogs_str[i] = ' ';
}
}
keylogs_str[keylogs_str_idx] = name;
keylogs_str_idx++;
}
const char *read_keylog(void) {
return keylog_str;
}
const char *read_keylogs(void) {
return keylogs_str;
}

View File

@@ -1,35 +0,0 @@
#include QMK_KEYBOARD_H
#include <stdio.h>
#include "claw44.h"
#define L_BASE 0
#define L_LOWER (1<<_LOWER)
#define L_RAISE (1<<_RAISE)
#define L_ADJUST (1<<_ADJUST)
#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
char layer_state_str[24];
const char *read_layer_state(void) {
switch (layer_state)
{
case L_BASE:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Default");
break;
case L_RAISE:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise");
break;
case L_LOWER:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower");
break;
case L_ADJUST:
case L_ADJUST_TRI:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust");
break;
default:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state);
}
return layer_state_str;
}

View File

@@ -1,11 +0,0 @@
#include "claw44.h"
const char *read_logo(void) {
static char logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
return logo;
}

View File

@@ -1,15 +0,0 @@
#include <stdio.h>
#include "claw44.h"
char mode_icon[24];
const char *read_mode_icon(bool swap) {
static char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}};
if (swap == false) {
snprintf(mode_icon, sizeof(mode_icon), "%s\n%s", logo[0][0], logo[0][1]);
} else {
snprintf(mode_icon, sizeof(mode_icon), "%s\n%s", logo[1][0], logo[1][1]);
}
return mode_icon;
}

View File

@@ -1,15 +0,0 @@
#ifdef RGBLIGHT_ENABLE
#include QMK_KEYBOARD_H
#include <stdio.h>
extern rgblight_config_t rgblight_config;
char rbf_info_str[24];
const char *read_rgb_info(void) {
snprintf(rbf_info_str, sizeof(rbf_info_str), "%s %2d h%3d s%3d v%3d",
rgblight_config.enable ? "on" : "- ", rgblight_config.mode,
rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
return rbf_info_str;
}
#endif

View File

@@ -1,16 +0,0 @@
#include <stdio.h>
#include "claw44.h"
char timelog_str[24] = {};
int last_time = 0;
int elapsed_time = 0;
void set_timelog(void) {
elapsed_time = timer_elapsed(last_time);
last_time = timer_read();
snprintf(timelog_str, sizeof(timelog_str), "lt:%5d, et:%5d", last_time, elapsed_time);
}
const char *read_timelog(void) {
return timelog_str;
}

View File

@@ -19,22 +19,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x3060
#define DEVICE_VER 0x0001
#define MANUFACTURER yfuku
#define PRODUCT claw44
#define DESCRIPTION A split keyboard with 3x6 vertically staggered keys and 4 thumb keys
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x3060
#define DEVICE_VER 0x0001
#define MANUFACTURER yfuku
#define PRODUCT claw44
#define DESCRIPTION A split keyboard with 3x6 vertically staggered keys and 4 thumb keys
/* key matrix size */
// Rows are doubled-up
#define MATRIX_ROWS 8
#define MATRIX_COLS 7
#define MATRIX_COLS 6
#define MATRIX_ROW_PINS { D4, C6, D7, E6 }
// wiring of each half
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 }
// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }
#define UNUSED_PINS
#define DIODE_DIRECTION COL2ROW
#define SOFT_SERIAL_PIN D2
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST

View File

@@ -1,358 +0,0 @@
/*
Copyright 2012 Jun Wako <wakojun@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/>.
*/
/*
* scan matrix
*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "split_util.h"
#include "quantum.h"
#ifdef USE_MATRIX_I2C
# include "i2c.h"
#else // USE_SERIAL
# include "split_scomm.h"
#endif
#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif
#define ERROR_DISCONNECT_COUNT 5
static uint8_t debouncing = DEBOUNCE;
static const int ROWS_PER_HAND = MATRIX_ROWS/2;
static uint8_t error_count = 0;
uint8_t is_master = 0 ;
static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
static matrix_row_t read_cols(void);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);
static uint8_t matrix_master_scan(void);
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
inline
uint8_t matrix_rows(void)
{
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void)
{
return MATRIX_COLS;
}
void matrix_init(void)
{
debug_enable = true;
debug_matrix = true;
debug_mouse = true;
// initialize row and col
unselect_rows();
init_cols();
setPinOutput(B0);
setPinOutput(D5);
writePinHigh(B0);
writePinHigh(D5);
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
is_master = has_usb();
matrix_init_quantum();
}
uint8_t _matrix_scan(void)
{
// Right hand is stored after the left in the matirx so, we need to offset it
int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
select_row(i);
_delay_us(30); // without this wait read unstable value.
matrix_row_t cols = read_cols();
if (matrix_debouncing[i+offset] != cols) {
matrix_debouncing[i+offset] = cols;
debouncing = DEBOUNCE;
}
unselect_rows();
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
matrix[i+offset] = matrix_debouncing[i+offset];
}
}
}
return 1;
}
#ifdef USE_MATRIX_I2C
// Get rows from other half over i2c
int i2c_transaction(void) {
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
if (err) goto i2c_error;
// start of matrix stored at 0x00
err = i2c_master_write(0x00);
if (err) goto i2c_error;
// Start read
err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
if (err) goto i2c_error;
if (!err) {
int i;
for (i = 0; i < ROWS_PER_HAND-1; ++i) {
matrix[slaveOffset+i] = i2c_master_read(I2C_ACK);
}
matrix[slaveOffset+i] = i2c_master_read(I2C_NACK);
i2c_master_stop();
} else {
i2c_error: // the cable is disconnceted, or something else went wrong
i2c_reset_state();
return err;
}
return 0;
}
#else // USE_SERIAL
int serial_transaction(int master_changed) {
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
#ifdef SERIAL_USE_MULTI_TRANSACTION
int ret=serial_update_buffers(master_changed);
#else
int ret=serial_update_buffers();
#endif
if (ret ) {
if(ret==2) writePinLow(B0);
return 1;
}
writePinHigh(B0);
memcpy(&matrix[slaveOffset],
(void *)serial_slave_buffer, SERIAL_SLAVE_BUFFER_LENGTH);
return 0;
}
#endif
uint8_t matrix_scan(void)
{
if (is_master) {
matrix_master_scan();
}else{
matrix_slave_scan();
int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
memcpy(&matrix[offset],
(void *)serial_master_buffer, SERIAL_MASTER_BUFFER_LENGTH);
matrix_scan_quantum();
}
return 1;
}
uint8_t matrix_master_scan(void) {
int ret = _matrix_scan();
int mchanged = 1;
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
#ifdef USE_MATRIX_I2C
// for (int i = 0; i < ROWS_PER_HAND; ++i) {
/* i2c_slave_buffer[i] = matrix[offset+i]; */
// i2c_slave_buffer[i] = matrix[offset+i];
// }
#else // USE_SERIAL
#ifdef SERIAL_USE_MULTI_TRANSACTION
mchanged = memcmp((void *)serial_master_buffer,
&matrix[offset], SERIAL_MASTER_BUFFER_LENGTH);
#endif
memcpy((void *)serial_master_buffer,
&matrix[offset], SERIAL_MASTER_BUFFER_LENGTH);
#endif
#ifdef USE_MATRIX_I2C
if( i2c_transaction() ) {
#else // USE_SERIAL
if( serial_transaction(mchanged) ) {
#endif
// turn on the indicator led when halves are disconnected
writePinLow(D5);
error_count++;
if (error_count > ERROR_DISCONNECT_COUNT) {
// reset other half if disconnected
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[slaveOffset+i] = 0;
}
}
} else {
// turn off the indicator led on no error
writePinHigh(D5);
error_count = 0;
}
matrix_scan_quantum();
return ret;
}
void matrix_slave_scan(void) {
_matrix_scan();
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
#ifdef USE_MATRIX_I2C
for (int i = 0; i < ROWS_PER_HAND; ++i) {
/* i2c_slave_buffer[i] = matrix[offset+i]; */
i2c_slave_buffer[i] = matrix[offset+i];
}
#else // USE_SERIAL
#ifdef SERIAL_USE_MULTI_TRANSACTION
int change = 0;
#endif
for (int i = 0; i < ROWS_PER_HAND; ++i) {
#ifdef SERIAL_USE_MULTI_TRANSACTION
if( serial_slave_buffer[i] != matrix[offset+i] )
change = 1;
#endif
serial_slave_buffer[i] = matrix[offset+i];
}
#ifdef SERIAL_USE_MULTI_TRANSACTION
slave_buffer_change_count += change;
#endif
#endif
}
bool matrix_is_modified(void)
{
if (debouncing) return false;
return true;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print("\nr/c 0123456789ABCDEF\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
pbin_reverse16(matrix_get_row(row));
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += bitpop16(matrix[i]);
}
return count;
}
static void init_cols(void)
{
for(int x = 0; x < MATRIX_COLS; x++) {
_SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
_SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
}
}
static matrix_row_t read_cols(void)
{
matrix_row_t result = 0;
for(int x = 0; x < MATRIX_COLS; x++) {
result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
}
return result;
}
static void unselect_rows(void)
{
for(int x = 0; x < ROWS_PER_HAND; x++) {
_SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
_SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
}
}
static void select_row(uint8_t row)
{
_SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
_SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
}

View File

@@ -1,8 +1 @@
#include "claw44.h"
#ifdef SSD1306OLED
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
//led_set_user(usb_led);
}
#endif
#include "rev1.h"

View File

@@ -1,55 +1,33 @@
#pragma once
#include "../claw44.h"
#include "quantum.h"
#ifdef RGBLIGHT_ENABLE
//rgb led driver
#include "ws2812.h"
#endif
#ifdef USE_I2C
#include <stddef.h>
#ifdef __AVR__
#include <avr/io.h>
#include <avr/interrupt.h>
#endif
#endif
#define LAYOUT( \
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, R30, R31, R32, R33 \
) \
{ \
{ L00, L01, L02, L03, L04, L05 }, \
{ L10, L11, L12, L13, L14, L15 }, \
{ L20, L21, L22, L23, L24, L25 }, \
{ KC_NO, KC_NO, L30, L31, L32, L33 }, \
{ R05, R04, R03, R02, R01, R00 }, \
{ R15, R14, R13, R12, R11, R10 }, \
{ R25, R24, R23, R22, R21, R20 }, \
{ KC_NO, KC_NO, R33, R32, R31, R30 } \
}
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, R30, R31, R32, R33 \
) \
{ \
{ L00, L01, L02, L03, L04, L05 }, \
{ L10, L11, L12, L13, L14, L15 }, \
{ L20, L21, L22, L23, L24, L25 }, \
{ KC_NO, KC_NO, L30, L31, L32, L33 }, \
{ R05, R04, R03, R02, R01, R00 }, \
{ R15, R14, R13, R12, R11, R10 }, \
{ R25, R24, R23, R22, R21, R20 }, \
{ KC_NO, KC_NO, R33, R32, R31, R30 } \
}
#define LAYOUT_kc( \
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, R30, R31, R32, R33 \
) \
LAYOUT( \
KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \
KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \
KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \
KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##R30, KC_##R31, KC_##R32, KC_##R33 \
)
enum layer_number {
_QWERTY = 0,
_LOWER,
_RAISE,
_ADJUST,
};
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
L30, L31, L32, L33, R30, R31, R32, R33 \
) \
LAYOUT( \
KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \
KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \
KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \
KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##R30, KC_##R31, KC_##R32, KC_##R33 \
)

View File

@@ -1,7 +1,3 @@
SRC += rev1/matrix.c
SRC += rev1/split_util.c
SRC += rev1/split_scomm.c
# Build Options
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
@@ -10,7 +6,6 @@ CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # 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
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
@@ -20,12 +15,5 @@ SWAP_HANDS_ENABLE = no # Enable one-hand typing
# 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 you want to change the display of OLED, you need to change here
SRC += ./lib/glcdfont.c \
./lib/layer_state_reader.c \
./lib/logo_reader.c \
./lib/keylogger.c \
# ./lib/rgb_state_reader.c \
# ./lib/mode_icon_reader.c \
# ./lib/host_led_state_reader.c \
# ./lib/timelogger.c \
OLED_DRIVER_ENABLE = no # Add OLED displays support
SPLIT_KEYBOARD = yes

View File

@@ -1,4 +0,0 @@
#ifndef SOFT_SERIAL_PIN
#define SOFT_SERIAL_PIN D2
#define SERIAL_USE_MULTI_TRANSACTION
#endif

View File

@@ -1,91 +0,0 @@
#ifdef USE_SERIAL
#ifdef SERIAL_USE_MULTI_TRANSACTION
/* --- USE flexible API (using multi-type transaction function) --- */
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <split_scomm.h>
#include "serial.h"
#ifdef CONSOLE_ENABLE
#include <print.h>
#endif
uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
uint8_t volatile status_com = 0;
uint8_t volatile status1 = 0;
uint8_t slave_buffer_change_count = 0;
uint8_t s_change_old = 0xff;
uint8_t s_change_new = 0xff;
SSTD_t transactions[] = {
#define GET_SLAVE_STATUS 0
/* master buffer not changed, only recive slave_buffer_change_count */
{ (uint8_t *)&status_com,
0, NULL,
sizeof(slave_buffer_change_count), &slave_buffer_change_count,
},
#define PUT_MASTER_GET_SLAVE_STATUS 1
/* master buffer changed need send, and recive slave_buffer_change_count */
{ (uint8_t *)&status_com,
sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
sizeof(slave_buffer_change_count), &slave_buffer_change_count,
},
#define GET_SLAVE_BUFFER 2
/* recive serial_slave_buffer */
{ (uint8_t *)&status1,
0, NULL,
sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
}
};
void serial_master_init(void)
{
soft_serial_initiator_init(transactions, TID_LIMIT(transactions));
}
void serial_slave_init(void)
{
soft_serial_target_init(transactions, TID_LIMIT(transactions));
}
// 0 => no error
// 1 => slave did not respond
// 2 => checksum error
int serial_update_buffers(int master_update)
{
int status, smatstatus;
static int need_retry = 0;
if( s_change_old != s_change_new ) {
smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER);
if( smatstatus == TRANSACTION_END ) {
s_change_old = s_change_new;
#ifdef CONSOLE_ENABLE
uprintf("slave matrix = %b %b %b %b\n",
serial_slave_buffer[0], serial_slave_buffer[1],
serial_slave_buffer[2], serial_slave_buffer[3]);
#endif
}
} else {
// serial_slave_buffer dosen't change
smatstatus = TRANSACTION_END; // dummy status
}
if( !master_update && !need_retry) {
status = soft_serial_transaction(GET_SLAVE_STATUS);
} else {
status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
}
if( status == TRANSACTION_END ) {
s_change_new = slave_buffer_change_count;
need_retry = 0;
} else {
need_retry = 1;
}
return smatstatus;
}
#endif // SERIAL_USE_MULTI_TRANSACTION
#endif /* USE_SERIAL */

View File

@@ -1,24 +0,0 @@
#ifndef SPLIT_COMM_H
#define SPLIT_COMM_H
#ifndef SERIAL_USE_MULTI_TRANSACTION
/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
#include "serial.h"
#else
/* --- USE flexible API (using multi-type transaction function) --- */
// Buffers for master - slave communication
#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
extern uint8_t slave_buffer_change_count;
void serial_master_init(void);
void serial_slave_init(void);
int serial_update_buffers(int master_changed);
#endif
#endif /* SPLIT_COMM_H */

View File

@@ -1,70 +0,0 @@
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include "split_util.h"
#include "matrix.h"
#include "keyboard.h"
#ifdef USE_MATRIX_I2C
# include "i2c.h"
#else
# include "split_scomm.h"
#endif
volatile bool isLeftHand = true;
static void setup_handedness(void) {
#ifdef EE_HANDS
isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
#else
// I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c
#if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
isLeftHand = !has_usb();
#else
isLeftHand = has_usb();
#endif
#endif
}
static void keyboard_master_setup(void) {
#ifdef USE_MATRIX_I2C
i2c_master_init();
#else
serial_master_init();
#endif
}
static void keyboard_slave_setup(void) {
#ifdef USE_MATRIX_I2C
i2c_slave_init(SLAVE_I2C_ADDRESS);
#else
serial_slave_init();
#endif
}
bool has_usb(void) {
USBCON |= (1 << OTGPADE); //enables VBUS pad
_delay_us(5);
return (USBSTA & (1<<VBUS)); //checks state of VBUS
}
void split_keyboard_setup(void) {
setup_handedness();
if (has_usb()) {
keyboard_master_setup();
} else {
keyboard_slave_setup();
}
sei();
}
// this code runs before the usb and keyboard is initialized
void matrix_setup(void) {
split_keyboard_setup();
}

View File

@@ -1,19 +0,0 @@
#ifndef SPLIT_KEYBOARD_UTIL_H
#define SPLIT_KEYBOARD_UTIL_H
#include <stdbool.h>
#include "eeconfig.h"
#define SLAVE_I2C_ADDRESS 0x32
extern volatile bool isLeftHand;
// slave version of matix scan, defined in matrix.c
void matrix_slave_scan(void);
void split_keyboard_setup(void);
bool has_usb(void);
void matrix_master_OLED_init (void);
#endif

View File

@@ -22,7 +22,6 @@ CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # 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
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
@@ -30,12 +29,4 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
CUSTOM_MATRIX = yes
SRC += i2c.c
SRC += serial.c
SRC += ssd1306.c
# if firmware size over limit, try this option
# CFLAGS += -flto
DEFAULT_FOLDER = claw44/rev1

View File

@@ -1,589 +0,0 @@
/*
* WARNING: be careful changing this code, it is very timing dependent
*
* 2018-10-28 checked
* avr-gcc 4.9.2
* avr-gcc 5.4.0
* avr-gcc 7.3.0
*/
#ifndef F_CPU
#define F_CPU 16000000
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stddef.h>
#include <stdbool.h>
#include "serial.h"
#ifdef SOFT_SERIAL_PIN
#ifdef __AVR_ATmega32U4__
// if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial.
#ifdef USE_I2C
#if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1
#error Using ATmega32U4 I2C, so can not use PD0, PD1
#endif
#endif
#if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3
#define SERIAL_PIN_DDR DDRD
#define SERIAL_PIN_PORT PORTD
#define SERIAL_PIN_INPUT PIND
#if SOFT_SERIAL_PIN == D0
#define SERIAL_PIN_MASK _BV(PD0)
#define EIMSK_BIT _BV(INT0)
#define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
#define SERIAL_PIN_INTERRUPT INT0_vect
#elif SOFT_SERIAL_PIN == D1
#define SERIAL_PIN_MASK _BV(PD1)
#define EIMSK_BIT _BV(INT1)
#define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
#define SERIAL_PIN_INTERRUPT INT1_vect
#elif SOFT_SERIAL_PIN == D2
#define SERIAL_PIN_MASK _BV(PD2)
#define EIMSK_BIT _BV(INT2)
#define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
#define SERIAL_PIN_INTERRUPT INT2_vect
#elif SOFT_SERIAL_PIN == D3
#define SERIAL_PIN_MASK _BV(PD3)
#define EIMSK_BIT _BV(INT3)
#define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
#define SERIAL_PIN_INTERRUPT INT3_vect
#endif
#elif SOFT_SERIAL_PIN == E6
#define SERIAL_PIN_DDR DDRE
#define SERIAL_PIN_PORT PORTE
#define SERIAL_PIN_INPUT PINE
#define SERIAL_PIN_MASK _BV(PE6)
#define EIMSK_BIT _BV(INT6)
#define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
#define SERIAL_PIN_INTERRUPT INT6_vect
#else
#error invalid SOFT_SERIAL_PIN value
#endif
#else
#error serial.c now support ATmega32U4 only
#endif
//////////////// for backward compatibility ////////////////////////////////
#ifndef SERIAL_USE_MULTI_TRANSACTION
/* --- USE Simple API (OLD API, compatible with let's split serial.c) */
#if SERIAL_SLAVE_BUFFER_LENGTH > 0
uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
#endif
#if SERIAL_MASTER_BUFFER_LENGTH > 0
uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
#endif
uint8_t volatile status0 = 0;
SSTD_t transactions[] = {
{ (uint8_t *)&status0,
#if SERIAL_MASTER_BUFFER_LENGTH > 0
sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
#else
0, (uint8_t *)NULL,
#endif
#if SERIAL_SLAVE_BUFFER_LENGTH > 0
sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
#else
0, (uint8_t *)NULL,
#endif
}
};
void serial_master_init(void)
{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
void serial_slave_init(void)
{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); }
// 0 => no error
// 1 => slave did not respond
// 2 => checksum error
int serial_update_buffers()
{
int result;
result = soft_serial_transaction();
return result;
}
#endif // end of Simple API (OLD API, compatible with let's split serial.c)
////////////////////////////////////////////////////////////////////////////
#define ALWAYS_INLINE __attribute__((always_inline))
#define NO_INLINE __attribute__((noinline))
#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
// parity check
#define ODD_PARITY 1
#define EVEN_PARITY 0
#define PARITY EVEN_PARITY
#ifdef SERIAL_DELAY
// custom setup in config.h
// #define TID_SEND_ADJUST 2
// #define SERIAL_DELAY 6 // micro sec
// #define READ_WRITE_START_ADJUST 30 // cycles
// #define READ_WRITE_WIDTH_ADJUST 8 // cycles
#else
// ============ Standard setups ============
#ifndef SELECT_SOFT_SERIAL_SPEED
#define SELECT_SOFT_SERIAL_SPEED 1
// 0: about 189kbps
// 1: about 137kbps (default)
// 2: about 75kbps
// 3: about 39kbps
// 4: about 26kbps
// 5: about 20kbps
#endif
#if __GNUC__ < 6
#define TID_SEND_ADJUST 14
#else
#define TID_SEND_ADJUST 2
#endif
#if SELECT_SOFT_SERIAL_SPEED == 0
// Very High speed
#define SERIAL_DELAY 4 // micro sec
#if __GNUC__ < 6
#define READ_WRITE_START_ADJUST 33 // cycles
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_START_ADJUST 34 // cycles
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#elif SELECT_SOFT_SERIAL_SPEED == 1
// High speed
#define SERIAL_DELAY 6 // micro sec
#if __GNUC__ < 6
#define READ_WRITE_START_ADJUST 30 // cycles
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_START_ADJUST 33 // cycles
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#elif SELECT_SOFT_SERIAL_SPEED == 2
// Middle speed
#define SERIAL_DELAY 12 // micro sec
#define READ_WRITE_START_ADJUST 30 // cycles
#if __GNUC__ < 6
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#elif SELECT_SOFT_SERIAL_SPEED == 3
// Low speed
#define SERIAL_DELAY 24 // micro sec
#define READ_WRITE_START_ADJUST 30 // cycles
#if __GNUC__ < 6
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#elif SELECT_SOFT_SERIAL_SPEED == 4
// Very Low speed
#define SERIAL_DELAY 36 // micro sec
#define READ_WRITE_START_ADJUST 30 // cycles
#if __GNUC__ < 6
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#elif SELECT_SOFT_SERIAL_SPEED == 5
// Ultra Low speed
#define SERIAL_DELAY 48 // micro sec
#define READ_WRITE_START_ADJUST 30 // cycles
#if __GNUC__ < 6
#define READ_WRITE_WIDTH_ADJUST 3 // cycles
#else
#define READ_WRITE_WIDTH_ADJUST 7 // cycles
#endif
#else
#error invalid SELECT_SOFT_SERIAL_SPEED value
#endif /* SELECT_SOFT_SERIAL_SPEED */
#endif /* SERIAL_DELAY */
#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
#define SLAVE_INT_WIDTH_US 1
#ifndef SERIAL_USE_MULTI_TRANSACTION
#define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
#else
#define SLAVE_INT_ACK_WIDTH_UNIT 2
#define SLAVE_INT_ACK_WIDTH 4
#endif
static SSTD_t *Transaction_table = NULL;
static uint8_t Transaction_table_size = 0;
inline static void serial_delay(void) ALWAYS_INLINE;
inline static
void serial_delay(void) {
_delay_us(SERIAL_DELAY);
}
inline static void serial_delay_half1(void) ALWAYS_INLINE;
inline static
void serial_delay_half1(void) {
_delay_us(SERIAL_DELAY_HALF1);
}
inline static void serial_delay_half2(void) ALWAYS_INLINE;
inline static
void serial_delay_half2(void) {
_delay_us(SERIAL_DELAY_HALF2);
}
inline static void serial_output(void) ALWAYS_INLINE;
inline static
void serial_output(void) {
SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
}
// make the serial pin an input with pull-up resistor
inline static void serial_input_with_pullup(void) ALWAYS_INLINE;
inline static
void serial_input_with_pullup(void) {
SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
inline static
uint8_t serial_read_pin(void) {
return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
}
inline static void serial_low(void) ALWAYS_INLINE;
inline static
void serial_low(void) {
SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
}
inline static void serial_high(void) ALWAYS_INLINE;
inline static
void serial_high(void) {
SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
}
void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
{
Transaction_table = sstd_table;
Transaction_table_size = (uint8_t)sstd_table_size;
serial_output();
serial_high();
}
void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size)
{
Transaction_table = sstd_table;
Transaction_table_size = (uint8_t)sstd_table_size;
serial_input_with_pullup();
// Enable INT0-INT3,INT6
EIMSK |= EIMSK_BIT;
#if SERIAL_PIN_MASK == _BV(PE6)
// Trigger on falling edge of INT6
EICRB &= EICRx_BIT;
#else
// Trigger on falling edge of INT0-INT3
EICRA &= EICRx_BIT;
#endif
}
// Used by the sender to synchronize timing with the reciver.
static void sync_recv(void) NO_INLINE;
static
void sync_recv(void) {
for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
}
// This shouldn't hang if the target disconnects because the
// serial line will float to high if the target does disconnect.
while (!serial_read_pin());
}
// Used by the reciver to send a synchronization signal to the sender.
static void sync_send(void) NO_INLINE;
static
void sync_send(void) {
serial_low();
serial_delay();
serial_high();
}
// Reads a byte from the serial line
static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE;
static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
uint8_t byte, i, p, pb;
_delay_sub_us(READ_WRITE_START_ADJUST);
for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) {
serial_delay_half1(); // read the middle of pulses
if( serial_read_pin() ) {
byte = (byte << 1) | 1; p ^= 1;
} else {
byte = (byte << 1) | 0; p ^= 0;
}
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
serial_delay_half2();
}
/* recive parity bit */
serial_delay_half1(); // read the middle of pulses
pb = serial_read_pin();
_delay_sub_us(READ_WRITE_WIDTH_ADJUST);
serial_delay_half2();
*pterrcount += (p != pb)? 1 : 0;
return byte;
}
// Sends a byte with MSB ordering
void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE;
void serial_write_chunk(uint8_t data, uint8_t bit) {
uint8_t b, p;
for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) {
if(data & b) {
serial_high(); p ^= 1;
} else {
serial_low(); p ^= 0;
}
serial_delay();
}
/* send parity bit */
if(p & 1) { serial_high(); }
else { serial_low(); }
serial_delay();
serial_low(); // sync_send() / senc_recv() need raise edge
}
static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
static
void serial_send_packet(uint8_t *buffer, uint8_t size) {
for (uint8_t i = 0; i < size; ++i) {
uint8_t data;
data = buffer[i];
sync_send();
serial_write_chunk(data,8);
}
}
static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
static
uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) {
uint8_t pecount = 0;
for (uint8_t i = 0; i < size; ++i) {
uint8_t data;
sync_recv();
data = serial_read_chunk(&pecount, 8);
buffer[i] = data;
}
return pecount == 0;
}
inline static
void change_sender2reciver(void) {
sync_send(); //0
serial_delay_half1(); //1
serial_low(); //2
serial_input_with_pullup(); //2
serial_delay_half1(); //3
}
inline static
void change_reciver2sender(void) {
sync_recv(); //0
serial_delay(); //1
serial_low(); //3
serial_output(); //3
serial_delay_half1(); //4
}
static inline uint8_t nibble_bits_count(uint8_t bits)
{
bits = (bits & 0x5) + (bits >> 1 & 0x5);
bits = (bits & 0x3) + (bits >> 2 & 0x3);
return bits;
}
// interrupt handle to be used by the target device
ISR(SERIAL_PIN_INTERRUPT) {
#ifndef SERIAL_USE_MULTI_TRANSACTION
serial_low();
serial_output();
SSTD_t *trans = Transaction_table;
#else
// recive transaction table index
uint8_t tid, bits;
uint8_t pecount = 0;
sync_recv();
bits = serial_read_chunk(&pecount,7);
tid = bits>>3;
bits = (bits&7) != nibble_bits_count(tid);
if( bits || pecount> 0 || tid > Transaction_table_size ) {
return;
}
serial_delay_half1();
serial_high(); // response step1 low->high
serial_output();
_delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH);
SSTD_t *trans = &Transaction_table[tid];
serial_low(); // response step2 ack high->low
#endif
// target send phase
if( trans->target2initiator_buffer_size > 0 )
serial_send_packet((uint8_t *)trans->target2initiator_buffer,
trans->target2initiator_buffer_size);
// target switch to input
change_sender2reciver();
// target recive phase
if( trans->initiator2target_buffer_size > 0 ) {
if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer,
trans->initiator2target_buffer_size) ) {
*trans->status = TRANSACTION_ACCEPTED;
} else {
*trans->status = TRANSACTION_DATA_ERROR;
}
} else {
*trans->status = TRANSACTION_ACCEPTED;
}
sync_recv(); //weit initiator output to high
}
/////////
// start transaction by initiator
//
// int soft_serial_transaction(int sstd_index)
//
// Returns:
// TRANSACTION_END
// TRANSACTION_NO_RESPONSE
// TRANSACTION_DATA_ERROR
// this code is very time dependent, so we need to disable interrupts
#ifndef SERIAL_USE_MULTI_TRANSACTION
int soft_serial_transaction(void) {
SSTD_t *trans = Transaction_table;
#else
int soft_serial_transaction(int sstd_index) {
if( sstd_index > Transaction_table_size )
return TRANSACTION_TYPE_ERROR;
SSTD_t *trans = &Transaction_table[sstd_index];
#endif
cli();
// signal to the target that we want to start a transaction
serial_output();
serial_low();
_delay_us(SLAVE_INT_WIDTH_US);
#ifndef SERIAL_USE_MULTI_TRANSACTION
// wait for the target response
serial_input_with_pullup();
_delay_us(SLAVE_INT_RESPONSE_TIME);
// check if the target is present
if (serial_read_pin()) {
// target failed to pull the line low, assume not present
serial_output();
serial_high();
*trans->status = TRANSACTION_NO_RESPONSE;
sei();
return TRANSACTION_NO_RESPONSE;
}
#else
// send transaction table index
int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index));
sync_send();
_delay_sub_us(TID_SEND_ADJUST);
serial_write_chunk(tid, 7);
serial_delay_half1();
// wait for the target response (step1 low->high)
serial_input_with_pullup();
while( !serial_read_pin() ) {
_delay_sub_us(2);
}
// check if the target is present (step2 high->low)
for( int i = 0; serial_read_pin(); i++ ) {
if (i > SLAVE_INT_ACK_WIDTH + 1) {
// slave failed to pull the line low, assume not present
serial_output();
serial_high();
*trans->status = TRANSACTION_NO_RESPONSE;
sei();
return TRANSACTION_NO_RESPONSE;
}
_delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT);
}
#endif
// initiator recive phase
// if the target is present syncronize with it
if( trans->target2initiator_buffer_size > 0 ) {
if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer,
trans->target2initiator_buffer_size) ) {
serial_output();
serial_high();
*trans->status = TRANSACTION_DATA_ERROR;
sei();
return TRANSACTION_DATA_ERROR;
}
}
// initiator switch to output
change_reciver2sender();
// initiator send phase
if( trans->initiator2target_buffer_size > 0 ) {
serial_send_packet((uint8_t *)trans->initiator2target_buffer,
trans->initiator2target_buffer_size);
}
// always, release the line when not in use
sync_send();
*trans->status = TRANSACTION_END;
sei();
return TRANSACTION_END;
}
#ifdef SERIAL_USE_MULTI_TRANSACTION
int soft_serial_get_and_clean_status(int sstd_index) {
SSTD_t *trans = &Transaction_table[sstd_index];
cli();
int retval = *trans->status;
*trans->status = 0;;
sei();
return retval;
}
#endif
#endif
// Helix serial.c history
// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc)
// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4)
// (adjusted with avr-gcc 4.9.2)
// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78)
// (adjusted with avr-gcc 4.9.2)
// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae)
// (adjusted with avr-gcc 4.9.2)
// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff)
// (adjusted with avr-gcc 7.3.0)
// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66)
// (adjusted with avr-gcc 5.4.0, 7.3.0)

View File

@@ -1,84 +0,0 @@
#ifndef SOFT_SERIAL_H
#define SOFT_SERIAL_H
#include <stdbool.h>
// /////////////////////////////////////////////////////////////////
// Need Soft Serial defines in config.h
// /////////////////////////////////////////////////////////////////
// ex.
// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
// // 1: about 137kbps (default)
// // 2: about 75kbps
// // 3: about 39kbps
// // 4: about 26kbps
// // 5: about 20kbps
//
// //// USE Simple API (OLD API, compatible with let's split serial.c)
// ex.
// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
// #define SERIAL_MASTER_BUFFER_LENGTH 1
//
// //// USE flexible API (using multi-type transaction function)
// #define SERIAL_USE_MULTI_TRANSACTION
//
// /////////////////////////////////////////////////////////////////
#ifndef SERIAL_USE_MULTI_TRANSACTION
/* --- USE Simple API (OLD API, compatible with let's split serial.c) */
#if SERIAL_SLAVE_BUFFER_LENGTH > 0
extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
#endif
#if SERIAL_MASTER_BUFFER_LENGTH > 0
extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
#endif
void serial_master_init(void);
void serial_slave_init(void);
int serial_update_buffers(void);
#endif // USE Simple API
// Soft Serial Transaction Descriptor
typedef struct _SSTD_t {
uint8_t *status;
uint8_t initiator2target_buffer_size;
uint8_t *initiator2target_buffer;
uint8_t target2initiator_buffer_size;
uint8_t *target2initiator_buffer;
} SSTD_t;
#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t))
// initiator is transaction start side
void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
// target is interrupt accept side
void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
// initiator resullt
#define TRANSACTION_END 0
#define TRANSACTION_NO_RESPONSE 0x1
#define TRANSACTION_DATA_ERROR 0x2
#define TRANSACTION_TYPE_ERROR 0x4
#ifndef SERIAL_USE_MULTI_TRANSACTION
int soft_serial_transaction(void);
#else
int soft_serial_transaction(int sstd_index);
#endif
// target status
// *SSTD_t.status has
// initiator:
// TRANSACTION_END
// or TRANSACTION_NO_RESPONSE
// or TRANSACTION_DATA_ERROR
// target:
// TRANSACTION_DATA_ERROR
// or TRANSACTION_ACCEPTED
#define TRANSACTION_ACCEPTED 0x8
#ifdef SERIAL_USE_MULTI_TRANSACTION
int soft_serial_get_and_clean_status(int sstd_index);
#endif
#endif /* SOFT_SERIAL_H */

View File

@@ -1,345 +0,0 @@
#ifdef SSD1306OLED
#include "ssd1306.h"
#include "i2c.h"
#include <string.h>
#include "print.h"
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#endif
#include "sendchar.h"
#include "timer.h"
struct CharacterMatrix display;
extern const unsigned char font[] PROGMEM;
// 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
// with the matrix scan, causing keys to drop.
#define DEBUG_TO_SCREEN 0
//static uint16_t last_battery_update;
//static uint32_t vbat;
//#define BatteryUpdateInterval 10000 /* milliseconds */
// 'last_flush' is declared as uint16_t,
// so this must be less than 65535
#define ScreenOffInterval 60000 /* milliseconds */
#if DEBUG_TO_SCREEN
static uint8_t displaying;
#endif
static uint16_t last_flush;
static bool force_dirty = true;
// Write command sequence.
// Returns true on success.
static inline bool _send_cmd1(uint8_t cmd) {
bool res = false;
if (i2c_start_write(SSD1306_ADDRESS)) {
xprintf("failed to start write to %d\n", SSD1306_ADDRESS);
goto done;
}
if (i2c_master_write(0x0 /* command byte follows */)) {
print("failed to write control byte\n");
goto done;
}
if (i2c_master_write(cmd)) {
xprintf("failed to write command %d\n", cmd);
goto done;
}
res = true;
done:
i2c_master_stop();
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;}
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);
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
}
if (i2c_master_write(0x40)) {
// Data mode
goto done;
}
for (uint8_t row = 0; row < MatrixRows; ++row) {
for (uint8_t col = 0; col < DisplayWidth; ++col) {
i2c_master_write(0);
}
}
display.dirty = false;
done:
i2c_master_stop();
}
#if DEBUG_TO_SCREEN
#undef sendchar
static int8_t capture_sendchar(uint8_t c) {
sendchar(c);
iota_gfx_write_char(c);
if (!displaying) {
iota_gfx_flush();
}
return 0;
}
#endif
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 */);
if(rotate){
// the following Flip the display orientation 180 degrees
send_cmd1(SegRemap);
send_cmd1(ComScanInc);
}else{
// Flips the display orientation 0 degrees
send_cmd1(SegRemap | 0x1);
send_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
clear_display();
success = true;
iota_gfx_flush();
#if DEBUG_TO_SCREEN
print_set_sendchar(capture_sendchar);
#endif
done:
return success;
}
bool iota_gfx_off(void) {
bool success = false;
send_cmd1(DisplayOff);
success = true;
done:
return success;
}
bool iota_gfx_on(void) {
bool success = false;
send_cmd1(DisplayOn);
success = true;
done:
return success;
}
void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
*matrix->cursor = c;
++matrix->cursor;
if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
// We went off the end; scroll the display upwards by one line
memmove(&matrix->display[0], &matrix->display[1],
MatrixCols * (MatrixRows - 1));
matrix->cursor = &matrix->display[MatrixRows - 1][0];
memset(matrix->cursor, ' ', MatrixCols);
}
}
void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
matrix->dirty = true;
if (c == '\n') {
// Clear to end of line from the cursor and then move to the
// start of the next line
uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols;
while (cursor_col++ < MatrixCols) {
matrix_write_char_inner(matrix, ' ');
}
return;
}
matrix_write_char_inner(matrix, c);
}
void iota_gfx_write_char(uint8_t c) {
matrix_write_char(&display, c);
}
void matrix_write(struct CharacterMatrix *matrix, const char *data) {
const char *end = data + strlen(data);
while (data < end) {
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);
}
void iota_gfx_write(const char *data) {
matrix_write(&display, data);
}
void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
while (true) {
uint8_t c = pgm_read_byte(data);
if (c == 0) {
return;
}
matrix_write_char(matrix, c);
++data;
}
}
void iota_gfx_write_P(const char *data) {
matrix_write_P(&display, data);
}
void matrix_clear(struct CharacterMatrix *matrix) {
memset(matrix->display, ' ', sizeof(matrix->display));
matrix->cursor = &matrix->display[0][0];
matrix->dirty = true;
}
void iota_gfx_clear_screen(void) {
matrix_clear(&display);
}
void matrix_render(struct CharacterMatrix *matrix) {
last_flush = timer_read();
iota_gfx_on();
#if DEBUG_TO_SCREEN
++displaying;
#endif
// Move to the home position
send_cmd3(PageAddr, 0, MatrixRows - 1);
send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
}
if (i2c_master_write(0x40)) {
// Data mode
goto done;
}
for (uint8_t row = 0; row < MatrixRows; ++row) {
for (uint8_t col = 0; col < MatrixCols; ++col) {
const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth);
for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) {
uint8_t colBits = pgm_read_byte(glyph + glyphCol);
i2c_master_write(colBits);
}
// 1 column of space between chars (it's not included in the glyph)
//i2c_master_write(0);
}
}
matrix->dirty = false;
done:
i2c_master_stop();
#if DEBUG_TO_SCREEN
--displaying;
#endif
}
void iota_gfx_flush(void) {
matrix_render(&display);
}
__attribute__ ((weak))
void iota_gfx_task_user(void) {
}
void iota_gfx_task(void) {
iota_gfx_task_user();
if (display.dirty|| force_dirty) {
iota_gfx_flush();
force_dirty = false;
}
/*
if (timer_elapsed(last_flush) > ScreenOffInterval) {
iota_gfx_off();
}
*/
}
bool process_record_gfx(uint16_t keycode, keyrecord_t *record) {
force_dirty = true;
return true;
}
#endif

View File

@@ -1,90 +0,0 @@
#pragma once
#include <stdbool.h>
#include <stdio.h>
#include "action.h"
enum ssd1306_cmds {
DisplayOff = 0xAE,
DisplayOn = 0xAF,
SetContrast = 0x81,
DisplayAllOnResume = 0xA4,
DisplayAllOn = 0xA5,
NormalDisplay = 0xA6,
InvertDisplay = 0xA7,
SetDisplayOffset = 0xD3,
SetComPins = 0xda,
SetVComDetect = 0xdb,
SetDisplayClockDiv = 0xD5,
SetPreCharge = 0xd9,
SetMultiPlex = 0xa8,
SetLowColumn = 0x00,
SetHighColumn = 0x10,
SetStartLine = 0x40,
SetMemoryMode = 0x20,
ColumnAddr = 0x21,
PageAddr = 0x22,
ComScanInc = 0xc0,
ComScanDec = 0xc8,
SegRemap = 0xa0,
SetChargePump = 0x8d,
ExternalVcc = 0x01,
SwitchCapVcc = 0x02,
ActivateScroll = 0x2f,
DeActivateScroll = 0x2e,
SetVerticalScrollArea = 0xa3,
RightHorizontalScroll = 0x26,
LeftHorizontalScroll = 0x27,
VerticalAndRightHorizontalScroll = 0x29,
VerticalAndLeftHorizontalScroll = 0x2a,
};
// Controls the SSD1306 128x32 OLED display via i2c
#ifndef SSD1306_ADDRESS
#define SSD1306_ADDRESS 0x3C
#endif
#define DisplayHeight 32
#define DisplayWidth 128
#define FontHeight 8
#define FontWidth 6
#define MatrixRows (DisplayHeight / FontHeight)
#define MatrixCols (DisplayWidth / FontWidth)
struct CharacterMatrix {
uint8_t display[MatrixRows][MatrixCols];
uint8_t *cursor;
bool dirty;
};
extern struct CharacterMatrix display;
bool iota_gfx_init(bool rotate);
void iota_gfx_task(void);
bool iota_gfx_off(void);
bool iota_gfx_on(void);
void iota_gfx_flush(void);
void iota_gfx_write_char(uint8_t c);
void iota_gfx_write(const char *data);
void iota_gfx_write_P(const char *data);
void iota_gfx_clear_screen(void);
void iota_gfx_task_user(void);
void matrix_clear(struct CharacterMatrix *matrix);
void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c);
void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c);
void matrix_write(struct CharacterMatrix *matrix, const char *data);
void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
bool process_record_gfx(uint16_t keycode, keyrecord_t *record);

View File

@@ -0,0 +1,46 @@
/*
Copyright 2020 AAClawson (AlisGraveNil)
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 0x7767
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
#define MANUFACTURER AlisGraveNil
#define PRODUCT Roadster
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
/*
* 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 { D2, D3, D0, D1 }
#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6 }
#define DIODE_DIRECTION COL2ROW

View File

@@ -0,0 +1,58 @@
{
"keyboard_name": "Roadster",
"url": "www.clawboards.xyz",
"maintainer": "AAClawson (AlisGraveNil)",
"width": 12,
"height": 4,
"layouts": {
"LAYOUT": {
"layout": [
{"label":"K00 (D2,D4)", "x":0, "y":0},
{"label":"K01 (D2,C6)", "x":1, "y":0},
{"label":"K02 (D2,D7)", "x":2, "y":0},
{"label":"K03 (D2,E6)", "x":3, "y":0},
{"label":"K04 (D2,B4)", "x":4, "y":0},
{"label":"K05 (D2,B5)", "x":5, "y":0},
{"label":"K06 (D2,B6)", "x":6, "y":0},
{"label":"K07 (D2,B2)", "x":7, "y":0},
{"label":"K08 (D2,B3)", "x":8, "y":0},
{"label":"K09 (D2,B1)", "x":9, "y":0},
{"label":"K0A (D2,F7)", "x":10, "y":0},
{"label":"K0B (D2,F6)", "x":11, "y":0},
{"label":"K10 (D3,D4)", "x":0, "y":1, "w":1.5},
{"label":"K11 (D3,C6)", "x":1.5, "y":1},
{"label":"K12 (D3,D7)", "x":2.5, "y":1},
{"label":"K13 (D3,E6)", "x":3.5, "y":1},
{"label":"K14 (D3,B4)", "x":4.5, "y":1},
{"label":"K15 (D3,B5)", "x":5.5, "y":1},
{"label":"K16 (D3,B6)", "x":6.5, "y":1},
{"label":"K17 (D3,B2)", "x":7.5, "y":1},
{"label":"K18 (D3,B3)", "x":8.5, "y":1},
{"label":"K19 (D3,B1)", "x":9.5, "y":1},
{"label":"K1B (D3,F6)", "x":10.5, "y":1, "w":1.5},
{"label":"K20 (D0,D4)", "x":0, "y":2},
{"label":"K21 (D0,C6)", "x":1, "y":2},
{"label":"K22 (D0,D7)", "x":2, "y":2},
{"label":"K23 (D0,E6)", "x":3, "y":2},
{"label":"K24 (D0,B4)", "x":4, "y":2},
{"label":"K25 (D0,B5)", "x":5, "y":2},
{"label":"K26 (D0,B6)", "x":6, "y":2},
{"label":"K27 (D0,B2)", "x":7, "y":2},
{"label":"K28 (D0,B3)", "x":8, "y":2},
{"label":"K29 (D0,B1)", "x":9, "y":2},
{"label":"K2A (D0,F7)", "x":10, "y":2},
{"label":"K2B (D0,F6)", "x":11, "y":2},
{"label":"K30 (D1,D4)", "x":0, "y":3},
{"label":"K31 (D1,C6)", "x":1, "y":3},
{"label":"K32 (D1,D7)", "x":2, "y":3},
{"label":"K34 (D1,B4)", "x":3, "y":3, "w":2},
{"label":"K36 (D1,B6)", "x":5, "y":3, "w":2},
{"label":"K38 (D1,B3)", "x":7, "y":3, "w":2},
{"label":"K39 (D1,B1)", "x":9, "y":3},
{"label":"K3A (D1,F7)", "x":10, "y":3},
{"label":"K3B (D1,F6)", "x":11, "y":3}
]
}
}
}

View File

@@ -0,0 +1,27 @@
/* Copyright 2020 AAClawson (AlisGraveNil)
*
* 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(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_UP, KC_LSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT
),
};

View File

@@ -0,0 +1,13 @@
# Roadster
This is a 4x12 keyboard.
* Keyboard Maintainer: [AAClawson](https://github.com/AlisGraveNil)
* Hardware Supported: Roaster; Pro Micro or Elite-C
* Hardware Availability: [Clawsome Boards](https://www.clawboards.xyz/)
Make example for this keyboard (after setting up your build environment):
make clawsome/roadster: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 @@
/* Copyright 2020 AAClawson (AlisGraveNil)
*
* 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 "roadster.h"

View File

@@ -0,0 +1,30 @@
/* Copyright 2020 AAClawson (AlisGraveNil)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "quantum.h"
#define LAYOUT( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1B, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
K30, K31, K32, K34, K36, K38, K39, K3A, K3B \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, K1B }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
{ K30, K31, K32, KC_NO, K34, KC_NO, K36, KC_NO, K38, K39, K3A, K3B }, \
}

View File

@@ -0,0 +1,22 @@
# MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = caterina
# 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 = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output

View File

@@ -0,0 +1,714 @@
/*
ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file rt/templates/chconf.h
* @brief Configuration file template.
* @details A copy of this file must be placed in each project directory, it
* contains the application specific kernel settings.
*
* @addtogroup config
* @details Kernel related settings and hooks.
* @{
*/
#ifndef CHCONF_H
#define CHCONF_H
#define _CHIBIOS_RT_CONF_
#define _CHIBIOS_RT_CONF_VER_6_0_
/*===========================================================================*/
/**
* @name System timers settings
* @{
*/
/*===========================================================================*/
/**
* @brief System time counter resolution.
* @note Allowed values are 16 or 32 bits.
*/
#if !defined(CH_CFG_ST_RESOLUTION)
#define CH_CFG_ST_RESOLUTION 32
#endif
/**
* @brief System tick frequency.
* @details Frequency of the system timer that drives the system ticks. This
* setting also defines the system tick time unit.
*/
#if !defined(CH_CFG_ST_FREQUENCY)
#define CH_CFG_ST_FREQUENCY 10000
#endif
/**
* @brief Time intervals data size.
* @note Allowed values are 16, 32 or 64 bits.
*/
#if !defined(CH_CFG_INTERVALS_SIZE)
#define CH_CFG_INTERVALS_SIZE 32
#endif
/**
* @brief Time types data size.
* @note Allowed values are 16 or 32 bits.
*/
#if !defined(CH_CFG_TIME_TYPES_SIZE)
#define CH_CFG_TIME_TYPES_SIZE 32
#endif
/**
* @brief Time delta constant for the tick-less mode.
* @note If this value is zero then the system uses the classic
* periodic tick. This value represents the minimum number
* of ticks that is safe to specify in a timeout directive.
* The value one is not valid, timeouts are rounded up to
* this value.
*/
#if !defined(CH_CFG_ST_TIMEDELTA)
#define CH_CFG_ST_TIMEDELTA 2
#endif
/** @} */
/*===========================================================================*/
/**
* @name Kernel parameters and options
* @{
*/
/*===========================================================================*/
/**
* @brief Round robin interval.
* @details This constant is the number of system ticks allowed for the
* threads before preemption occurs. Setting this value to zero
* disables the preemption for threads with equal priority and the
* round robin becomes cooperative. Note that higher priority
* threads can still preempt, the kernel is always preemptive.
* @note Disabling the round robin preemption makes the kernel more compact
* and generally faster.
* @note The round robin preemption is not supported in tickless mode and
* must be set to zero in that case.
*/
#if !defined(CH_CFG_TIME_QUANTUM)
#define CH_CFG_TIME_QUANTUM 0
#endif
/**
* @brief Managed RAM size.
* @details Size of the RAM area to be managed by the OS. If set to zero
* then the whole available RAM is used. The core memory is made
* available to the heap allocator and/or can be used directly through
* the simplified core memory allocator.
*
* @note In order to let the OS manage the whole RAM the linker script must
* provide the @p __heap_base__ and @p __heap_end__ symbols.
* @note Requires @p CH_CFG_USE_MEMCORE.
*/
#if !defined(CH_CFG_MEMCORE_SIZE)
#define CH_CFG_MEMCORE_SIZE 0
#endif
/**
* @brief Idle thread automatic spawn suppression.
* @details When this option is activated the function @p chSysInit()
* does not spawn the idle thread. The application @p main()
* function becomes the idle thread and must implement an
* infinite loop.
*/
#if !defined(CH_CFG_NO_IDLE_THREAD)
#define CH_CFG_NO_IDLE_THREAD FALSE
#endif
/** @} */
/*===========================================================================*/
/**
* @name Performance options
* @{
*/
/*===========================================================================*/
/**
* @brief OS optimization.
* @details If enabled then time efficient rather than space efficient code
* is used when two possible implementations exist.
*
* @note This is not related to the compiler optimization options.
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_OPTIMIZE_SPEED)
#define CH_CFG_OPTIMIZE_SPEED FALSE
#endif
/** @} */
/*===========================================================================*/
/**
* @name Subsystem options
* @{
*/
/*===========================================================================*/
/**
* @brief Time Measurement APIs.
* @details If enabled then the time measurement APIs are included in
* the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_TM)
#define CH_CFG_USE_TM FALSE
#endif
/**
* @brief Threads registry APIs.
* @details If enabled then the registry APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_REGISTRY)
#define CH_CFG_USE_REGISTRY TRUE
#endif
/**
* @brief Threads synchronization APIs.
* @details If enabled then the @p chThdWait() function is included in
* the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_WAITEXIT)
#define CH_CFG_USE_WAITEXIT TRUE
#endif
/**
* @brief Semaphores APIs.
* @details If enabled then the Semaphores APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_SEMAPHORES)
#define CH_CFG_USE_SEMAPHORES TRUE
#endif
/**
* @brief Semaphores queuing mode.
* @details If enabled then the threads are enqueued on semaphores by
* priority rather than in FIFO order.
*
* @note The default is @p FALSE. Enable this if you have special
* requirements.
* @note Requires @p CH_CFG_USE_SEMAPHORES.
*/
#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
#endif
/**
* @brief Mutexes APIs.
* @details If enabled then the mutexes APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MUTEXES)
#define CH_CFG_USE_MUTEXES TRUE
#endif
/**
* @brief Enables recursive behavior on mutexes.
* @note Recursive mutexes are heavier and have an increased
* memory footprint.
*
* @note The default is @p FALSE.
* @note Requires @p CH_CFG_USE_MUTEXES.
*/
#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
#endif
/**
* @brief Conditional Variables APIs.
* @details If enabled then the conditional variables APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_MUTEXES.
*/
#if !defined(CH_CFG_USE_CONDVARS)
#define CH_CFG_USE_CONDVARS TRUE
#endif
/**
* @brief Conditional Variables APIs with timeout.
* @details If enabled then the conditional variables APIs with timeout
* specification are included in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_CONDVARS.
*/
#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
#endif
/**
* @brief Events Flags APIs.
* @details If enabled then the event flags APIs are included in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_EVENTS)
#define CH_CFG_USE_EVENTS TRUE
#endif
/**
* @brief Events Flags APIs with timeout.
* @details If enabled then the events APIs with timeout specification
* are included in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_EVENTS.
*/
#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
#endif
/**
* @brief Synchronous Messages APIs.
* @details If enabled then the synchronous messages APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MESSAGES)
#define CH_CFG_USE_MESSAGES TRUE
#endif
/**
* @brief Synchronous Messages queuing mode.
* @details If enabled then messages are served by priority rather than in
* FIFO order.
*
* @note The default is @p FALSE. Enable this if you have special
* requirements.
* @note Requires @p CH_CFG_USE_MESSAGES.
*/
#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
#endif
/**
* @brief Mailboxes APIs.
* @details If enabled then the asynchronous messages (mailboxes) APIs are
* included in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_SEMAPHORES.
*/
#if !defined(CH_CFG_USE_MAILBOXES)
#define CH_CFG_USE_MAILBOXES TRUE
#endif
/**
* @brief Core Memory Manager APIs.
* @details If enabled then the core memory manager APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
#define CH_CFG_USE_MEMCORE FALSE
#endif
/**
* @brief Heap Allocator APIs.
* @details If enabled then the memory heap allocator APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
* @p CH_CFG_USE_SEMAPHORES.
* @note Mutexes are recommended.
*/
#if !defined(CH_CFG_USE_HEAP)
#define CH_CFG_USE_HEAP FALSE
#endif
/**
* @brief Memory Pools Allocator APIs.
* @details If enabled then the memory pools allocator APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMPOOLS)
#define CH_CFG_USE_MEMPOOLS FALSE
#endif
/**
* @brief Objects FIFOs APIs.
* @details If enabled then the objects FIFOs APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_OBJ_FIFOS)
#define CH_CFG_USE_OBJ_FIFOS FALSE
#endif
/**
* @brief Pipes APIs.
* @details If enabled then the pipes APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_PIPES)
#define CH_CFG_USE_PIPES FALSE
#endif
/**
* @brief Dynamic Threads APIs.
* @details If enabled then the dynamic threads creation APIs are included
* in the kernel.
*
* @note The default is @p TRUE.
* @note Requires @p CH_CFG_USE_WAITEXIT.
* @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
*/
#if !defined(CH_CFG_USE_DYNAMIC)
#define CH_CFG_USE_DYNAMIC FALSE
#endif
/** @} */
/*===========================================================================*/
/**
* @name Objects factory options
* @{
*/
/*===========================================================================*/
/**
* @brief Objects Factory APIs.
* @details If enabled then the objects factory APIs are included in the
* kernel.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_CFG_USE_FACTORY)
#define CH_CFG_USE_FACTORY FALSE
#endif
/**
* @brief Maximum length for object names.
* @details If the specified length is zero then the name is stored by
* pointer but this could have unintended side effects.
*/
#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
#endif
/**
* @brief Enables the registry of generic objects.
*/
#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
#endif
/**
* @brief Enables factory for generic buffers.
*/
#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
#endif
/**
* @brief Enables factory for semaphores.
*/
#if !defined(CH_CFG_FACTORY_SEMAPHORES)
#define CH_CFG_FACTORY_SEMAPHORES FALSE
#endif
/**
* @brief Enables factory for mailboxes.
*/
#if !defined(CH_CFG_FACTORY_MAILBOXES)
#define CH_CFG_FACTORY_MAILBOXES FALSE
#endif
/**
* @brief Enables factory for objects FIFOs.
*/
#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
#endif
/**
* @brief Enables factory for Pipes.
*/
#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
#define CH_CFG_FACTORY_PIPES FALSE
#endif
/** @} */
/*===========================================================================*/
/**
* @name Debug options
* @{
*/
/*===========================================================================*/
/**
* @brief Debug option, kernel statistics.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_DBG_STATISTICS)
#define CH_DBG_STATISTICS FALSE
#endif
/**
* @brief Debug option, system state check.
* @details If enabled the correct call protocol for system APIs is checked
* at runtime.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
#define CH_DBG_SYSTEM_STATE_CHECK FALSE
#endif
/**
* @brief Debug option, parameters checks.
* @details If enabled then the checks on the API functions input
* parameters are activated.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_DBG_ENABLE_CHECKS)
#define CH_DBG_ENABLE_CHECKS FALSE
#endif
/**
* @brief Debug option, consistency checks.
* @details If enabled then all the assertions in the kernel code are
* activated. This includes consistency checks inside the kernel,
* runtime anomalies and port-defined checks.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_DBG_ENABLE_ASSERTS)
#define CH_DBG_ENABLE_ASSERTS FALSE
#endif
/**
* @brief Debug option, trace buffer.
* @details If enabled then the trace buffer is activated.
*
* @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
*/
#if !defined(CH_DBG_TRACE_MASK)
#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
#endif
/**
* @brief Trace buffer entries.
* @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
* different from @p CH_DBG_TRACE_MASK_DISABLED.
*/
#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
#define CH_DBG_TRACE_BUFFER_SIZE 128
#endif
/**
* @brief Debug option, stack checks.
* @details If enabled then a runtime stack check is performed.
*
* @note The default is @p FALSE.
* @note The stack check is performed in a architecture/port dependent way.
* It may not be implemented or some ports.
* @note The default failure mode is to halt the system with the global
* @p panic_msg variable set to @p NULL.
*/
#if !defined(CH_DBG_ENABLE_STACK_CHECK)
#define CH_DBG_ENABLE_STACK_CHECK FALSE
#endif
/**
* @brief Debug option, stacks initialization.
* @details If enabled then the threads working area is filled with a byte
* value when a thread is created. This can be useful for the
* runtime measurement of the used stack.
*
* @note The default is @p FALSE.
*/
#if !defined(CH_DBG_FILL_THREADS)
#define CH_DBG_FILL_THREADS FALSE
#endif
/**
* @brief Debug option, threads profiling.
* @details If enabled then a field is added to the @p thread_t structure that
* counts the system ticks occurred while executing the thread.
*
* @note The default is @p FALSE.
* @note This debug option is not currently compatible with the
* tickless mode.
*/
#if !defined(CH_DBG_THREADS_PROFILING)
#define CH_DBG_THREADS_PROFILING FALSE
#endif
/** @} */
/*===========================================================================*/
/**
* @name Kernel hooks
* @{
*/
/*===========================================================================*/
/**
* @brief System structure extension.
* @details User fields added to the end of the @p ch_system_t structure.
*/
#define CH_CFG_SYSTEM_EXTRA_FIELDS \
/* Add threads custom fields here.*/
/**
* @brief System initialization hook.
* @details User initialization code added to the @p chSysInit() function
* just before interrupts are enabled globally.
*/
#define CH_CFG_SYSTEM_INIT_HOOK() { \
/* Add threads initialization code here.*/ \
}
/**
* @brief Threads descriptor structure extension.
* @details User fields added to the end of the @p thread_t structure.
*/
#define CH_CFG_THREAD_EXTRA_FIELDS \
/* Add threads custom fields here.*/
/**
* @brief Threads initialization hook.
* @details User initialization code added to the @p _thread_init() function.
*
* @note It is invoked from within @p _thread_init() and implicitly from all
* the threads creation APIs.
*/
#define CH_CFG_THREAD_INIT_HOOK(tp) { \
/* Add threads initialization code here.*/ \
}
/**
* @brief Threads finalization hook.
* @details User finalization code added to the @p chThdExit() API.
*/
#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
/* Add threads finalization code here.*/ \
}
/**
* @brief Context switch hook.
* @details This hook is invoked just before switching between threads.
*/
#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
/* Context switch code here.*/ \
}
/**
* @brief ISR enter hook.
*/
#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
/* IRQ prologue code here.*/ \
}
/**
* @brief ISR exit hook.
*/
#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
/* IRQ epilogue code here.*/ \
}
/**
* @brief Idle thread enter hook.
* @note This hook is invoked within a critical zone, no OS functions
* should be invoked from here.
* @note This macro can be used to activate a power saving mode.
*/
#define CH_CFG_IDLE_ENTER_HOOK() { \
/* Idle-enter code here.*/ \
}
/**
* @brief Idle thread leave hook.
* @note This hook is invoked within a critical zone, no OS functions
* should be invoked from here.
* @note This macro can be used to deactivate a power saving mode.
*/
#define CH_CFG_IDLE_LEAVE_HOOK() { \
/* Idle-leave code here.*/ \
}
/**
* @brief Idle Loop hook.
* @details This hook is continuously invoked by the idle thread loop.
*/
#define CH_CFG_IDLE_LOOP_HOOK() { \
/* Idle loop code here.*/ \
}
/**
* @brief System tick event hook.
* @details This hook is invoked in the system tick handler immediately
* after processing the virtual timers queue.
*/
#define CH_CFG_SYSTEM_TICK_HOOK() { \
/* System tick event code here.*/ \
}
/**
* @brief System halt hook.
* @details This hook is invoked in case to a system halting error before
* the system is halted.
*/
#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
/* System halt code here.*/ \
}
/**
* @brief Trace hook.
* @details This hook is invoked each time a new record is written in the
* trace buffer.
*/
#define CH_CFG_TRACE_HOOK(tep) { \
/* Trace code here.*/ \
}
/** @} */
/*===========================================================================*/
/* Port-specific settings (override port settings defaulted in chcore.h). */
/*===========================================================================*/
#endif /* CHCONF_H */
/** @} */

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