From 5594cc01946d1c8130ff684d3b77a8ae0c6585ad Mon Sep 17 00:00:00 2001 From: phga Date: Fri, 27 Jun 2025 20:53:56 +0200 Subject: [PATCH] feat: qmk configs --- qmk/README.md | 0 qmk/convert.py | 95 +++ qmk/etc/rev1/snappy_rev1.json | 273 +++++++ qmk/etc/rev1/snappy_rev1.kb_raw | 22 + qmk/etc/rev1/snappy_rev1.png | Bin 0 -> 26154 bytes qmk/etc/rev1/snappy_rev1_info.json | 327 ++++++++ .../snappy_rev1_via_keyboard_definition.json | 275 +++++++ qmk/etc/rev2/snappy_rev2.json | 266 +++++++ qmk/etc/rev2/snappy_rev2.kb_raw | 22 + qmk/etc/rev2/snappy_rev2.png | Bin 0 -> 26200 bytes qmk/etc/rev2/snappy_rev2_info.json | 331 ++++++++ .../snappy_rev2_via_keyboard_definition.json | 276 +++++++ qmk/etc/rev3/flash_nuke.uf2 | Bin 0 -> 25600 bytes .../snappy_rev3_via_keyboard_definition.json | 276 +++++++ qmk/snappy/README.md | 56 ++ qmk/snappy/config.h | 4 + qmk/snappy/readme.md | 43 ++ qmk/snappy/rev1/README.md | 3 + qmk/snappy/rev1/config.h | 72 ++ qmk/snappy/rev1/info.json | 333 ++++++++ qmk/snappy/rev1/keymaps/default/config.h | 6 + qmk/snappy/rev1/keymaps/default/keymap.c | 241 ++++++ qmk/snappy/rev1/keymaps/default/readme.md | 1 + qmk/snappy/rev1/keymaps/qwertz/config.h | 6 + qmk/snappy/rev1/keymaps/qwertz/keymap.c | 214 ++++++ qmk/snappy/rev1/keymaps/qwertz/readme.md | 1 + qmk/snappy/rev1/keymaps/tima/config.h | 10 + qmk/snappy/rev1/keymaps/tima/keymap.c | 199 +++++ qmk/snappy/rev1/keymaps/tima/readme.md | 1 + qmk/snappy/rev1/keymaps/tima/rules.mk | 3 + qmk/snappy/rev1/rev1.c | 4 + qmk/snappy/rev1/rev1.h | 38 + qmk/snappy/rev1/rules.mk | 17 + qmk/snappy/rev2/config.h | 68 ++ qmk/snappy/rev2/info.json | 337 +++++++++ qmk/snappy/rev2/keymaps/default/config.h | 4 + qmk/snappy/rev2/keymaps/default/keymap.c | 222 ++++++ qmk/snappy/rev2/keymaps/default/readme.md | 1 + qmk/snappy/rev2/keymaps/qwertz/config.h | 4 + qmk/snappy/rev2/keymaps/qwertz/keymap.c | 181 +++++ qmk/snappy/rev2/keymaps/qwertz/readme.md | 1 + qmk/snappy/rev2/rev2.c | 4 + qmk/snappy/rev2/rev2.h | 38 + qmk/snappy/rev2/rules.mk | 22 + qmk/snappy/rev3/config.h | 9 + qmk/snappy/rev3/info.json | 711 ++++++++++++++++++ qmk/snappy/rev3/keymaps/default/config.h | 4 + qmk/snappy/rev3/keymaps/default/keymap.c | 222 ++++++ qmk/snappy/rev3/keymaps/default/readme.md | 1 + qmk/snappy/rev3/rev3.c | 4 + qmk/snappy/rev3/rev3.h | 6 + qmk/snappy/rev3/rules.mk | 8 + qmk/snappy/rev3_5/config.h | 49 ++ qmk/snappy/rev3_5/info.json | 337 +++++++++ qmk/snappy/rev3_5/keymaps/default/config.h | 4 + qmk/snappy/rev3_5/keymaps/default/keymap.c | 222 ++++++ qmk/snappy/rev3_5/keymaps/default/readme.md | 1 + qmk/snappy/rev3_5/keymaps/default/rules.mk | 2 + qmk/snappy/rev3_5/keymaps/maza/config.h | 4 + qmk/snappy/rev3_5/keymaps/maza/keymap.c | 181 +++++ qmk/snappy/rev3_5/keymaps/maza/readme.md | 1 + qmk/snappy/rev3_5/keymaps/qwertz/config.h | 4 + qmk/snappy/rev3_5/keymaps/qwertz/keymap.c | 181 +++++ qmk/snappy/rev3_5/keymaps/qwertz/readme.md | 1 + qmk/snappy/rev3_5/keymaps/tima/config.h | 4 + qmk/snappy/rev3_5/keymaps/tima/keymap.c | 183 +++++ qmk/snappy/rev3_5/keymaps/tima/readme.md | 1 + qmk/snappy/rev3_5/keymaps/tima/rules.mk | 3 + qmk/snappy/rev3_5/rev3_5.c | 4 + qmk/snappy/rev3_5/rev3_5.h | 38 + qmk/snappy/rev3_5/rules.mk | 15 + qmk/snappy/rules.mk | 3 + qmk/snappy/snappy.c | 4 + qmk/snappy/snappy.h | 16 + 74 files changed, 6520 insertions(+) create mode 100644 qmk/README.md create mode 100644 qmk/convert.py create mode 100644 qmk/etc/rev1/snappy_rev1.json create mode 100644 qmk/etc/rev1/snappy_rev1.kb_raw create mode 100644 qmk/etc/rev1/snappy_rev1.png create mode 100644 qmk/etc/rev1/snappy_rev1_info.json create mode 100644 qmk/etc/rev1/snappy_rev1_via_keyboard_definition.json create mode 100644 qmk/etc/rev2/snappy_rev2.json create mode 100644 qmk/etc/rev2/snappy_rev2.kb_raw create mode 100644 qmk/etc/rev2/snappy_rev2.png create mode 100644 qmk/etc/rev2/snappy_rev2_info.json create mode 100644 qmk/etc/rev2/snappy_rev2_via_keyboard_definition.json create mode 100644 qmk/etc/rev3/flash_nuke.uf2 create mode 100644 qmk/etc/rev3/snappy_rev3_via_keyboard_definition.json create mode 100644 qmk/snappy/README.md create mode 100644 qmk/snappy/config.h create mode 100644 qmk/snappy/readme.md create mode 100644 qmk/snappy/rev1/README.md create mode 100644 qmk/snappy/rev1/config.h create mode 100644 qmk/snappy/rev1/info.json create mode 100644 qmk/snappy/rev1/keymaps/default/config.h create mode 100644 qmk/snappy/rev1/keymaps/default/keymap.c create mode 100644 qmk/snappy/rev1/keymaps/default/readme.md create mode 100644 qmk/snappy/rev1/keymaps/qwertz/config.h create mode 100644 qmk/snappy/rev1/keymaps/qwertz/keymap.c create mode 100644 qmk/snappy/rev1/keymaps/qwertz/readme.md create mode 100644 qmk/snappy/rev1/keymaps/tima/config.h create mode 100644 qmk/snappy/rev1/keymaps/tima/keymap.c create mode 100644 qmk/snappy/rev1/keymaps/tima/readme.md create mode 100644 qmk/snappy/rev1/keymaps/tima/rules.mk create mode 100644 qmk/snappy/rev1/rev1.c create mode 100644 qmk/snappy/rev1/rev1.h create mode 100644 qmk/snappy/rev1/rules.mk create mode 100644 qmk/snappy/rev2/config.h create mode 100644 qmk/snappy/rev2/info.json create mode 100644 qmk/snappy/rev2/keymaps/default/config.h create mode 100644 qmk/snappy/rev2/keymaps/default/keymap.c create mode 100644 qmk/snappy/rev2/keymaps/default/readme.md create mode 100644 qmk/snappy/rev2/keymaps/qwertz/config.h create mode 100644 qmk/snappy/rev2/keymaps/qwertz/keymap.c create mode 100644 qmk/snappy/rev2/keymaps/qwertz/readme.md create mode 100644 qmk/snappy/rev2/rev2.c create mode 100644 qmk/snappy/rev2/rev2.h create mode 100644 qmk/snappy/rev2/rules.mk create mode 100644 qmk/snappy/rev3/config.h create mode 100644 qmk/snappy/rev3/info.json create mode 100644 qmk/snappy/rev3/keymaps/default/config.h create mode 100644 qmk/snappy/rev3/keymaps/default/keymap.c create mode 100644 qmk/snappy/rev3/keymaps/default/readme.md create mode 100644 qmk/snappy/rev3/rev3.c create mode 100644 qmk/snappy/rev3/rev3.h create mode 100644 qmk/snappy/rev3/rules.mk create mode 100644 qmk/snappy/rev3_5/config.h create mode 100644 qmk/snappy/rev3_5/info.json create mode 100644 qmk/snappy/rev3_5/keymaps/default/config.h create mode 100644 qmk/snappy/rev3_5/keymaps/default/keymap.c create mode 100644 qmk/snappy/rev3_5/keymaps/default/readme.md create mode 100644 qmk/snappy/rev3_5/keymaps/default/rules.mk create mode 100644 qmk/snappy/rev3_5/keymaps/maza/config.h create mode 100644 qmk/snappy/rev3_5/keymaps/maza/keymap.c create mode 100644 qmk/snappy/rev3_5/keymaps/maza/readme.md create mode 100644 qmk/snappy/rev3_5/keymaps/qwertz/config.h create mode 100644 qmk/snappy/rev3_5/keymaps/qwertz/keymap.c create mode 100644 qmk/snappy/rev3_5/keymaps/qwertz/readme.md create mode 100644 qmk/snappy/rev3_5/keymaps/tima/config.h create mode 100644 qmk/snappy/rev3_5/keymaps/tima/keymap.c create mode 100644 qmk/snappy/rev3_5/keymaps/tima/readme.md create mode 100644 qmk/snappy/rev3_5/keymaps/tima/rules.mk create mode 100644 qmk/snappy/rev3_5/rev3_5.c create mode 100644 qmk/snappy/rev3_5/rev3_5.h create mode 100644 qmk/snappy/rev3_5/rules.mk create mode 100644 qmk/snappy/rules.mk create mode 100644 qmk/snappy/snappy.c create mode 100644 qmk/snappy/snappy.h diff --git a/qmk/README.md b/qmk/README.md new file mode 100644 index 0000000..e69de29 diff --git a/qmk/convert.py b/qmk/convert.py new file mode 100644 index 0000000..646c028 --- /dev/null +++ b/qmk/convert.py @@ -0,0 +1,95 @@ +import json +layout = [ + {"matrix": [0, 3], "x": 3, "y": 0}, + {"matrix": [0, 10], "x": 11, "y": 0}, + {"matrix": [0, 2], "x": 2, "y": 0.125}, + {"matrix": [0, 4], "x": 4, "y": 0.125}, + {"matrix": [0, 5], "x": 5, "y": 0.125}, + {"matrix": [0, 6], "x": 6, "y": 0.125}, + {"matrix": [0, 7], "x": 8, "y": 0.125}, + {"matrix": [0, 8], "x": 9, "y": 0.125}, + {"matrix": [0, 9], "x": 10, "y": 0.125}, + {"matrix": [0, 11], "x": 12, "y": 0.125}, + {"matrix": [1, 3], "x": 3, "y": 1}, + {"matrix": [1, 10], "x": 11, "y": 1}, + {"matrix": [1, 2], "x": 2, "y": 1.125}, + {"matrix": [1, 4], "x": 4, "y": 1.125}, + {"matrix": [1, 5], "x": 5, "y": 1.125}, + {"matrix": [1, 6], "x": 6, "y": 1.125}, + {"matrix": [1, 7], "x": 8, "y": 1.125}, + {"matrix": [1, 8], "x": 9, "y": 1.125}, + {"matrix": [1, 9], "x": 10, "y": 1.125}, + {"matrix": [1, 11], "x": 12, "y": 1.125}, + {"matrix": [1, 0], "x": 0, "y": 1.375}, + {"matrix": [1, 1], "x": 1, "y": 1.375}, + {"matrix": [1, 12], "x": 13, "y": 1.375}, + {"matrix": [1, 13], "x": 14, "y": 1.375}, + {"matrix": [2, 3], "x": 3, "y": 2}, + {"matrix": [2, 10], "x": 11, "y": 2}, + {"matrix": [2, 2], "x": 2, "y": 2.125}, + {"matrix": [2, 4], "x": 4, "y": 2.125}, + {"matrix": [2, 5], "x": 5, "y": 2.125}, + {"matrix": [2, 6], "x": 6, "y": 2.125}, + {"matrix": [2, 7], "x": 8, "y": 2.125}, + {"matrix": [2, 8], "x": 9, "y": 2.125}, + {"matrix": [2, 9], "x": 10, "y": 2.125}, + {"matrix": [2, 11], "x": 12, "y": 2.125}, + {"matrix": [2, 0], "x": 0, "y": 2.375}, + {"matrix": [2, 1], "x": 1, "y": 2.375}, + {"matrix": [2, 12], "x": 13, "y": 2.375}, + {"matrix": [2, 13], "x": 14, "y": 2.375}, + {"matrix": [3, 3], "x": 3, "y": 3}, + {"matrix": [3, 10], "x": 11, "y": 3}, + {"matrix": [3, 2], "x": 2, "y": 3.125}, + {"matrix": [3, 4], "x": 4, "y": 3.125}, + {"matrix": [3, 5], "x": 5, "y": 3.125}, + {"matrix": [3, 6], "x": 6, "y": 3.125}, + {"matrix": [3, 7], "x": 8, "y": 3.125}, + {"matrix": [3, 8], "x": 9, "y": 3.125}, + {"matrix": [3, 9], "x": 10, "y": 3.125}, + {"matrix": [3, 11], "x": 12, "y": 3.125}, + {"matrix": [3, 0], "x": 0, "y": 3.375}, + {"matrix": [3, 1], "x": 1, "y": 3.375}, + {"matrix": [3, 12], "x": 13, "y": 3.375}, + {"matrix": [3, 13], "x": 14, "y": 3.375}, + {"matrix": [4, 3], "x": 3, "y": 4}, + {"matrix": [4, 10], "x": 11, "y": 4}, + {"matrix": [4, 2], "x": 2, "y": 4.125}, + {"matrix": [4, 4], "x": 4, "y": 4.125}, + {"matrix": [4, 5], "x": 5, "y": 4.125}, + {"matrix": [4, 6], "x": 6, "y": 4.125}, + {"matrix": [4, 7], "x": 8, "y": 4.125}, + {"matrix": [4, 8], "x": 9, "y": 4.125}, + {"matrix": [4, 9], "x": 10, "y": 4.125}, + {"matrix": [4, 11], "x": 12, "y": 4.125}, + {"matrix": [4, 0], "x": 0, "y": 4.375}, + {"matrix": [4, 1], "x": 1, "y": 4.375}, + {"matrix": [4, 12], "x": 13, "y": 4.375}, + {"matrix": [4, 13], "x": 14, "y": 4.375}, + {"matrix": [5, 3], "x": 3, "y": 5}, + {"matrix": [5, 10], "x": 11, "y": 5}, + {"matrix": [5, 2], "x": 2, "y": 5.125}, + {"matrix": [5, 4], "x": 4, "y": 5.125}, + {"matrix": [5, 5], "x": 5, "y": 5.125}, + {"matrix": [5, 6], "x": 6, "y": 5.125}, + {"matrix": [5, 7], "x": 8, "y": 5.125}, + {"matrix": [5, 8], "x": 9, "y": 5.125}, + {"matrix": [5, 9], "x": 10, "y": 5.125}, + {"matrix": [5, 11], "x": 12, "y": 5.125}, + {"matrix": [5, 0], "x": 0, "y": 5.375}, + {"matrix": [5, 1], "x": 1, "y": 5.375}, + {"matrix": [5, 12], "x": 13, "y": 5.375}, + {"matrix": [5, 13], "x": 14, "y": 5.375}, +] + + +new_layout = [] +for x in layout: + m = x["matrix"] + if m[1] > 6: + m[0] += 6 + m[1] -= 7 + x["matrix"] = m + new_layout.append(x) + +print(json.dumps(new_layout)) diff --git a/qmk/etc/rev1/snappy_rev1.json b/qmk/etc/rev1/snappy_rev1.json new file mode 100644 index 0000000..6ebb528 --- /dev/null +++ b/qmk/etc/rev1/snappy_rev1.json @@ -0,0 +1,273 @@ +[ + { + "name": "Snappy", + "author": "Philip Gaber ", + "notes": "Handwired keyboard to test this layout idea.", + "switchMount": "cherry", + "switchBrand": "gateron", + "plate": true + }, + [ + { + "x": 3, + "a": 7 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + { + "x": 2 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.125, + "x": 3 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.75 + }, + "", + "", + { + "x": 11 + }, + "", + "" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.75 + }, + "", + "", + { + "x": 11 + }, + "", + "" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.75 + }, + "", + "", + { + "x": 11 + }, + "", + "" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.75 + }, + "", + "", + { + "x": 11 + }, + "", + "" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "", + { + "x": 7 + }, + "" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "", + "", + "", + { + "x": 1 + }, + "" + ], + [ + { + "y": -0.75 + }, + "", + "", + { + "x": 11 + }, + "", + "" + ] +] \ No newline at end of file diff --git a/qmk/etc/rev1/snappy_rev1.kb_raw b/qmk/etc/rev1/snappy_rev1.kb_raw new file mode 100644 index 0000000..5ce617d --- /dev/null +++ b/qmk/etc/rev1/snappy_rev1.kb_raw @@ -0,0 +1,22 @@ +[{x:3,a:7},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","",{x:2},"","","",{x:1},""], + +[{y:-0.125,x:3},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","","",{x:1},"","","",{x:1},""], +[{y:-0.75},"","",{x:11},"",""], + +[{y:-0.375,x:3},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","","",{x:1},"","","",{x:1},""], +[{y:-0.75},"","",{x:11},"",""], + +[{y:-0.375,x:3},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","","",{x:1},"","","",{x:1},""], +[{y:-0.75},"","",{x:11},"",""], + +[{y:-0.375,x:3},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","","",{x:1},"","","",{x:1},""], +[{y:-0.75},"","",{x:11},"",""], + +[{y:-0.375,x:3},"",{x:7},""], +[{y:-0.875,x:2},"",{x:1},"","","",{x:1},"","","",{x:1},""], +[{y:-0.75},"","",{x:11},"",""] diff --git a/qmk/etc/rev1/snappy_rev1.png b/qmk/etc/rev1/snappy_rev1.png new file mode 100644 index 0000000000000000000000000000000000000000..54856f08f0818b545db96fc38592d87038b395dc GIT binary patch literal 26154 zcmeFZc{r5q|2J-5V=P7XEm4+{y^OJwC{>L$YQ~VKjCcvL(qHp-}d%k}YH3g;4f= zXU38t^qfQY=W~CS@ALZ|$8-FS-#<_P+;<&Z=XGA!`#i7rYdgdAuW8ZIu+tC`5z%R1 zR=-X}L<%P&B6g&rAp8rHBOUk;nY*g?O)BsQMRhNfh=`X+TV3U*m-%Y7PXtTj2k{yk z8!1u&sV^$J{dJtK>VoXLXKa7r1oj(rzd(AHwVt`gHH5}^sos@TKEW>7;+Ns)dV3w4}BN{TD<2?NH6r@A zDZHj5KAfB1-`zA`rl6Ny;E{7q`LJsV|LY0;%S_WWB3xKcWxxl{rRt-tC?cAKlG$3KE`|IR3*)T=Vjj%!6xmw zW|ky#|E2MVdXwY1v^*hNGM3$Um1DRZP86(XI^&8+r|L+Si@ug3uhRZfEc4xs?B1bb zE823Q#fkZ@SD8VSklr8V_uu8`M|!M{B$m;ZQIZ@@3Bss+u+d{Laf^V!o zThbWL+7}M3xeQUIzvK7Y^YeV_iiMWE7a)q_{t^pcWA(dxi|_w&yweh_(9n;jb;|?+vJ0 zhwaxJ#>QHGSyyRKo!01zb5d}fAle2+{oUi|$}R81-TB2|>$T8c^$5D-r+rbte=knz z%K|r51254e=~FK>5pC+hFYpTogSCe;L)0|GhA|S_EJ{_SQf5WPPJP*WLLYcok8fu| zgJ@f)(B*=Z5`#Y$SFdN32lL&R2UV$OwD;g!>s7f?^?euYDMR^dY4EFDTwDdZIx<~; zhx2~D!PLy}*XWqxru#Ce64Uv(rwpIoNsyIoFl?TWxNbAPDy_N@M_$z57dFt;z$ ztl5Go^?(1aeIrYkden)*@e*#)7ERBUG20&B_wdH{I$GvD zdTGkV^7H4-Ly$A2RHV--Ju^^QA1to_^EckgnJ+fJTI%j=h;s1 zy@kvPO1N>p>8a0s^+IWPs=W>SSC*ES!}OFnd~rKamns~E;?9VB*}c~1JuWDe-#4d& zz3uY{jWzu(^}Cz%;ZM0v-{2t5-_^g5vVX<86rZANT{5Pe8b1xa{Zbh}qr-lOoNdY8`KpOj^-u2OQ`oNr%CI?{A)W ztIwGKyj(zgN}VaIj$}R_;rotBsrKL}ha#A1ou`sz_UGN2X(^kI({YD)ui4M=`Kd>> z^Zf1NB@Z-52p4}@>u5qcX+^4$?xW5{;yTyCmUPkmY~<++s&8hE3(V3-D?R(l2hDF= z^Q8GU#cNJ7%RuuFH+;RSmF;o8q2+cRoZJV+dQI0n>^LC1-c-pDSE^uZeoe5jd5*5K$=eDCLHO;t0qbX7}d zyM>UZWRtN%pUHRVCT|pxsy;zuzm`e_VPjYk3~=u$S`rm=R9vwyUw8YorBOI9s)Sz{ z?+dQqb5qtm0)+`b$cs8t#Dp}5Kw{pDM&yF^>gcK1xG`GYm=hQ+bCe2xAq+}IhQt{*?S;Ug(db)Zf!Nlk zuP1(iw{bB$B1CPOgo5z;RPf69%NBwgRovYC-8!Mdm9k(-HQu=C!T`@0VLTla7#b)X z9XDG#fM0yU?%LE4x65iU! zPn8DyD)z~RDlL$UK@tY)AcQSAx(XkN{mP7BpxT(qjo79|nsY-+2?cRVrEW(J-{O9a zjTSvXeu5^0@Ph%^m@ijmkcu$%)OZF14<~vl7%xh_LO_CooRQpsTcq8RaU&h3 zB*3%OiYAn6jfH_c_%c0B3{Zu3R|s!;(eC&%Hd;|47TY~|P z%((43&HyJ@;JxQX#iK|obyUfdnL;(Z3^R?!Y|E@0RWNRwzg7Sm8#A9G$wHq`d-|k0 zDEUd!Nr8a4mQ8Q3P#BaiW90|f`&ji1s#Wlz540>!(D2h_z>Hqj^UtUueKq0zu@IcU zjyb9>!18W*5LpO!ibD~95N};ebHK!)09<0IF#^% zlo%}%k(l{yECbS9RsDN8F{W8OHN!gy%QzeL1BTp1fSoQl6gjGL991kA7#w3+8 zUf70$rW!V%(X)JR%ZmwAbdX{EQW0orh@I-0({H1_~mNil(O45rby#KiC=9yL$C1e|2wPpW5S{HNl_l z*!z21i*>)t{C*$4uYCpgNxF3Dl6u#>yC-Qf>~_9RAGqXQ{r7(TQgb5Ax4@4*$e8!u zo?xV*bvv2?Zf|mTK2;h+x!q3x)81PpRWB&1c1IbHU#>K1Z#P_l~ZI zwq})_^42Lj)f+j7sq=T(_n;;(ex|RjX!m`CFIdmv{kJa_`c{l?ju+J;ltAu zE~xM>8EEmE48J#%SZ>U;mRZ(6>8TA*(T^~IjmMjNhedHIuAtOP9B#{WGss(qC6;u-(R3$6eli*^JbwH*D7O2@@UVSaGrOv}``uw{B-T>d{uRjnY}|3SzWHQSyx7ZvVaIj$DiH4V`zLX<;<2^bjjA zFaO&0Nu`-Lw=7V2FO&!SZ91VkusCjP4^1 zatxv*Sk8nII(L`5e9&}3M9<>q>af=B502@IkAL>G#tJEJoFE@R*O_o3Xs+v(PN_{N zjpN`F*bSv%)LZ9g7!ceQI+a*UTi4J4EYA zns{7Z3||NR*m4kg{-)}|h7d#rkDtyx^HLRmMy0*$eVntyA)dKx$03`oDeq zT4vv;O0F5RX*-P9y0wePPEO6Qd@tSF-|X%qG?~4Kh)PZFG1q!Jjq5a4Lh8!*;r;9g z!o!S{aHX|_dsPR(5dNeOxIqQj`iHNjl6o~qan-Gl>ZZuYG)40u%Cy6p=3OkKc$BUU ze{jkSp=G5g4AQ91?OwmOc};();7W#yyF){lJ zo;I}(5h2XI6_)Mx-`kp+G!q^H;Ojv3@TpTQelYB#%lNfQkJXGD+1I|W!3Ph);$5tx zf5$EMf&q27!wqWp5iTuOr$pPHf^OA_O!1T7zo4CGFmm6!9t%BurZuRG`6k5~ zCox*dwdeOSRWll;rC52ze5zZR$GC}fBeRL?03`Kw{sog zD7>p{$?(4;9<}_mdb%QVFEG%iAbfY< zUfJLOIqb3prpr_dDR67H?MS!)R%F3I3m9Wcja}Lt?1@I)4g}Pex5D&stS1R#jjYR; zVSqd1JT95`S2oyorKBfH+4hDq3Z(q7x-=9gVr;jwHu`Y2e9&kVlbwcpYk*hp)XA-t zfcAwJ4U3D{;LEQ^8iSA1RPJe(=0?^f;|soF>@r;lFqA0tQ#l2uS#0c@R^J|@^>-Td z`nY%<;#&QfokXnFx5!HyIfO3J_S+QS2F3m?O@QQ_n(@#TPS6}>7>j-nR&}Ai96tKG z=Qr_LvR4{+1y|ljgmCXl@M&{OYr)mw50y)Y_}UU6Rw@P~06`Rkrj39gxI@fIMA}Uj zVjzMNE;)29=oU1S$*m@oF!4@?qd)c>4U%#?qep@0;v|Fcmhcw!xmcY|Nfz&!db6At z?{3Vf&D86Xl{|E3+e{Z+s9FK{uk$gHEmGCxNo>0j;TObrS!9gZXcafo$>uDZ(Tu`< zldziF-iUg-nc2vHAP?cKjTF-3Mw9_Qk^YcdmG?51A^3c7^uIN(oK!rb@`6Q77)scS zF3^Ecb02ls1Q7F<3BG^-z!`QCF#c|JtsnZqk%v9>cT@cV-W zZ@Cma2p?0ssfI9V-+g?_Is1>lXj#R3zGiCKgAJ+7byC%|;(@h2N#>bO+o9NW^$ ziu5AFG1+qriH7fE)h<1lxonZygv6y_8Q+T1Wb|bA=vdq{OOLn6bOLb9Q6Q;WiSQCu zMBB#H#JD%u4W{?>mp^-Af~kvxFP}kqdCnx=FQ5+Y#^!$f7>`Hz`T4E97U$?69K2y= zB_JasV@TIt39ssGj&DNdBWk%Z&4S-gG^wU*rOUn6Uc1VR`cgllZ6iUn!RKYC96OTS zKQ;MWQ0Ha=q`ctqVBRg}_IP!S?OaFV*1&C-uaR*i#h2M4gsnOpfmluUz{aj$dbjepm;*7o^+;blw52mW9E9 z*;$`o(%PlnJTJai?M)OA^;!5g~5mo6zE-&)M@899sgF|EYtTpf!b+^n^ zR3?=tg`<4@B2I8GO{Qy4KKoMf2B66^8lt~{ws3fFXnqfd3{>yVqopCbx=XCVdXZc_ z47bk~$5@1K>LjU?`R&d^V=;U#nmB+a8mwkMlLteBqwjZxL{c7I@ZhLUpLxD_ROauE z4F&Kb7|6M**iq5|tB=*Fm{jTWsBU)_>+ktvU8!by7C^oc6ks--#3jUnO~NDRbE zd+If@R}LC|cAK{F^Q561rM=)T!)0}ErWm7u*N@E4h6o_lS^X%3^>Fah&cqwAjVdyu zKyZD#>!6_r48Y8*^Bm7Yx6bhAlc+3L>C&KE-Y{C71S_+UuUnv7$3pPW#R(`)bu0iZ zraCn=6#&qRA?CS6%~hOd$?DU28J@|Vc=!B%Y2G$~bF^J%)JY%Q&zPJUDjO+ABG{02 z8x0+2n+o2I$NdHrtSXh$^;pyowFdK|(Pv_}% zq@1=#GEnif`^HQ=Rspo*radH0_~44V8kCNFozR;>#QK(5kgjeVN` zsuZlpony0H8i5OerA101N9eeh7$?9(1@jh)hCQ#)JHxLSMil~gmp54_D*Vh>lNWnl z18_SNmNY+1YRO^!^=edUDwD)_m-%E_dIvUr=ja&`-c#*wT<@LLCFZhd&L--ydZIqo z6Dy}5&xj~sXxW>fSAY-U+#0{BPZRi{v;4Z(BHLTQWl~yRqz_AOFwicZ2yR_8!ZJL% zDC8ix#DZyN5GNBQ8F+TSLY5R#S8qmbGlU$#SjtD_*bL#0(DLyHLX`Du`L1aD{n^KUx07UCze@>NL zjg09#!@m|4-V7+=cZG#|{Z;Jj>~=FPF)@LFFnUqRi@Nt&Al8rpo;cAyJ131aUyk+Y zFEkUj=|2aS3A6Uelk}OVAN-&qUOu@t0yh3ux*xh+gm<2rU`hGcAmRJ;?T zm5S~VRXvcbZ+#@vU+CIUJRQWvGgxdVZJy*Wvt(i?aFRYTO1oZdoRz>~d@|AGE@36~ zK(i;tr$rphH%x4u8JFTO8j0V2dBG*2A4#N&0|mY!c__AU=qM zL~yOK_fDrgP&3H<2m%qq{aN*O1Sr#^g=f}ik>S=$=9oboEb|1*IQMM46AVnnlUNfB z7@T;?Ce~nx*8*q*!2fjfdc?&L8Bo9cwl?ZHel`~2`60}+bE zbZ8w{guPW}$B6S=uii1gUC;8P``@r`oW%v`PMK5~*fuA}HdX{Qsd=yx3Lmr|OH8H@ zR0ZtCy%5_i@5ZQ&lamB@f6Y9w)Eh+i(G}9nu=?9SzE&FBXysNs@3&tm`Mdx$rw)#e z5&MkSSzu|X4eCc89=){CDrNV%j+lGCcW(pM-)_1oatri(eK+(JPn}1hc8qTZHdZn9 z32xGz#Tm+iXK#~bI7P4Pl_TTw+E*}3$64+k*hTc5ox@h;mm#iJ&Dp^U@ZvnC5&sYf zv}3L_Sxe|z%4_TPmtXte-LPL7Dh|vqkd6Fz418{>F3^~n!^Sb+C0+uGq`En!lWP54 zOciC_++zqyBEVk}7Hb~L@iCibiD+(K)Cq&DrBWG&UpZ9ImVBQG`CjAmi_ndi*>-bZ zLTZve%o@ljL_mF|10vjmUh zLrq;cpFtiR&9}q=f1*t70yy9il_4CiU4`%P{B*8!&84fQ$`)zC2T{?5HFqlkVA4!JpnE2m6WeWM^5`641{sUh=~7nm=Oh`Y6094VC9Z?eo30;dWqw*VMj`+|zio z9mzXB4{8^XyHhSGe9MyDI4ZWF_R!n!Jd#eQva-_t+k3+@n@)DqDz6LG_^I%%9yJJ3 z@nd1l-g)_?WQe>;#e=t3{ECC5H}sdQ@O&{%xtW=yu&pn}aj-&}8vR-r@1%d&DQ@4L zQO|UR=o;GK97((XE1VU|l)L?StpdGP zxnA>L!Q0zAF!S@Ty*>5Liu80o`Haenii)-Zmzv!tKi5V%_QhiWYz)2tHF$VJCW{FH zkn&3xM;cm$-@zlS1i5p8%R8+8eX!*{=*)RIZRmvuM2-snO_0RLO6>b&zB22RZ~{Ia zb!+C5_B-64*pfwu`&-Y1z=){p)XQPkR#ZR3V4+r}P&6RwqZ_Kw9oOio&=k%6ViyE@aO-0=vA+%FGU;uAEHk~BPLi72svz6u<#Oq6%ykK|E;4+dLSy8FiC@wn+S zr(s#sPp+2OOD6q`x-i5TK@BW+GEO=)*~fNuxz;uL7}nhBU4W+Y%*8#qushDog4m5V z9if`AbQ>CEzxWi*eh{)J7#rkh_!#(NyE-u-WJSYkIpA~Q43QAmAhAbMT-n82^4$)4Ck4Rv5)c8-_3uYR0 zVRy?QYnwtKlq)S@opwq*pE&mwQL?O4MpxIhBuVQl3(jgOpz5ueZgx9X8_!9^IU+%_ zXDEB{ez>sq@CpQmCHgivIE;HaYhGYhp-L!%h5P2^QKZ{G<|&~z-KktFFGTNre(~eS z4^e^TECpXVztPW+8pbgXA3b_Eh6BjjhI(%HtWj@-B&?=)YqDK&BHc_c1gD=_D@~gw zx!b<8ZP`!iH$FeR!jT4OmOdbzE`U9XHPH~+>_6V@=;V}NQuq=JIKkz?!fc?DlW8fV zeT*^3Lgb5X6WAuTT|M;d=HDQ>`YcPnkzX-X=4cg3oQxdQ;_)Hlrg6*DKHkk$FUwmz zp@wAc&;HtzxPr&Sp|%(_@x3Da^PiR%Yk4|^d_uywKgg|7PM}f;1)^c9v@D{phn*|) z&-dZw3+vGkN})<0TqEoGkZ2>n3%f_F6^@@Ey(q#Q{t^ao{Y1J3tn{H_uDJ0=)c{`g zpbf)Wxs!yIXhWFn{MZiBb~(F@%*LQ2f7(-~lRQYl;*jQ6O%dtcO24bFM3gL4tbJZq zC6A%r-EgiCSwB)JbN``Gwu-PTwe>AQ=fX7!$UH402bUym&*UZCQtXB_zYlgjYW_+8 zb8fJR4P$E-lbz3-w*B;@6Wdkplhe+7KQ$#8;XgIq2XEvfUtM&6V$+qPEub0UYO5a@ zgHO);OS61roR73uG`|jTdm)*MWwE^(3Vf@>=j4~qFAdXRdlG4%oH*I6=FIuiA7Fd^ z+WjfZ3j;sc3^zXyzVW?vapX&s$kRm)DdG$o^Z;2n@)WZg%z;fW`YSu)Y)Gbj)?1!i z%UZLh$WY|ld2e%1{_gpZykTFN!pBzuuIS!cB%a2kidMYM82#GzNeT$K@oL)MYAXAr zV&h1=>+;WC)vny8;yIU!ucx1(Q$%Jusv4S0C*CHT+>`_R+m_vL`Ji!J#qM14Vre&= z+0#Fuq7waKWpOdRnftLQo=2uD+%Uh%#j@?Cg%9F#J;Gk$TOD|Bv0Y^FKk<%RVVZq(tE4m1_ z>$ijEk0W(GLhoupi->=po&#Q*MO-rvB(F!l(AXSFj>%Sz3Zc8xgb5&zkYJ)u_`?(s z;QB*uV7RC}e}tvOS;U^cy~#gWUv0l{ZJxi0$>l2E_Z%Yv9LLzjMOBJm08QR*GC*|C zcu^_9_d5j!szC==oKsnuJOKEzs>H9~zFFV1y9+Mh{G%-Fl7fPL+lzAz;rG+TDbU?c zh+~HCZs_8VIr2$?=tKs%iR%>$!Q*)X(E~;{dE?@W#_(Rz)UEu@_oo!!1w(#&Fa2%% zLw>zgpK;r{BE+UMNrUkHe);kxpBRCW(BhWiLlsTD_;Q7c2djSx$T8q1G1>g6GC)M6 ze!B$C#n`U?C~x5D>`s(IpS_lHdAd0|p7oWC=x5hS65Kn;A5yfpElwn8fPJ2DgGvA8 z2J10eM+Cv(83(3SJhu2VDq~ox8^#O(j8#CFcnAJC zn2c>tI>BqCyY2&r1Or^W)kcCP7{Zc5A>CR{4IW~GLhA_%WjGmx&hGi+SW}o;$-S_) z?eu|1>wreTyZihyz9Z#g?3nkm*k@c52l`=0;QYpHd;i$jwM@;(r(FHkq%5+4GtLD1 zmQh$*n%`lfxzF~uFPxE^dy{A$UXK+9tFHazva0l9A z++)c3SI3o9>A4;?tHVFZyxmDvONt!4;~Azn8M*okP~K{*$#5TUqU%EQ7d1s#FqZ8k z7w-q|yVGHbt7U1`N)7R;c*%2|-`S>XC|B^GnqkiBgdKtO(Z#6MwcqAVcu4|;dWU<@ z;h{M~>0sR;NdfEwZm4kfiU^qWInE8(DHkBQ!ZZtRzqnBIZ2nHEs4onwA5A3p?#P~i zyOr+GLSPCQX?%!@PfDFJf28(*N?1(iIsIS4;{OsB|3X;g9s19b5C2iqpX9j?=K=p5 zXvcN-XOMt?AQ{P*I-w(U^cPdW z!t&_RBWb4}(hknfEHcplBp&`jX0)XAtQ%ST+&%04fUya1V@PumE0hNHrT)SxJTQAe0&EMWU|V@F-o6=Cp^<}_GpTUA zb+q2`O_byKPZ4U<#l2*CZu2A@8Lm_h+x)fdy%v5&y(j#>7*$#w6~0Ri_Gwe7O~3Zu z9?iDM2$Wz);uny;`sHa#Xu5$g=M&|N&M%)3WOqIkXKaVXC%`sgn*C3!CcXBhc59H3 zYDTYnWy3X^P}9w&oEU0-|l-6FLsn-{KEcFKFUW2=7I~ zOMnVq9j~o@Uk)U7(=Qh0jYTrzHM%rf7hc+O$SfJkVI?>U?AN2Fk2!#s7j{SDU!rT2 zCVKZQ>IgjG3;loP9X49eo_k#VKWOadv|=6&|2N(NCjI}&JAhVbpJ~v2Ak7NMAn91k z>;GqTLq7?{<`v!e4!MK|V^F?c35iBw3V%@@3E~x_&q4q(Sy3VQ!HO!)B=oRSg>C#% zo}v5+OXk6d|ABIta?H18=$>qe5h(LmHFdauKl7D>=k983#?5LtIglsxC_9DixJ~- z;I5rlv}!t$q~IyunIt2E7hthD{G|U2)4`*caQi7f*q68;=PBhBE zN>%4NCJ%T~!3v<=^1UeBfUrh=>om@`XQ5h&Evh$1ZJ!#B+?$Qx0rcG-5M_Em5fT`R ztXad4pgHiyzql(vZ3u|bi=H^K0jS9?w zEPW#22uRFdi8R*IqV!q_uo5}O5lCeWF|!D4AC$JLCpWOiYzhDp=?3*{8NmV{GY}62xM4>RnCPtylJ&}Im+sW2_8%# z2z}1g-A5+`ZAzer?rXl~D8$t7j6H^6gt&q$M#;g;a$*bVj#fIn>^b5_*_o!KB!AE` zAFih~{P~dxE`{3{Z|VK}U?-@ahyo$%{l`y~PLkQOTk5o*nTG<(D$e~c&u}}m_U0nA z>5c%TyleRhhqJKc%?BLGX%m6yin{x6r|XWN#;x=#1+Pxb@y$mRxpWpy$L7*Hc+gK; zh5E3CKx%WliL0!dqb7Eo|1_p@>bjaz{~MkmMuOuXuH!hDcwkGIM}#(i z!I-5$b@Im6Q3hG1-8MBP$pipwJuGL#phDKqFd-P(8v3rzD7Y~mCbDWu#{HwQPt&E` zE2k4MoU*55^?0mJT_gh8Jxg@y=O+iRE=O@I{^%ZOZMb7fYNS9c>-0k%m};c0+g|jH zK9R3w-SzY(asN-@zOL$N#2ajJJ>dD`Jj6&Kt5f!wA5CHXbI|=)9T2!u=X?U#=$9?a7C9BdD!7b3r1qVL~9y74C|KK3ZOQ37^2 zu)s?r@{-r^qx+AR2N?Zm`@Vg9>)ouCS(_l35T9(KE!Bp_U+F_bcl^;06i+p&MIQEw zqS|JlmCrr;r!^Y$ zN`+c;%B93(ee5cLyiVWll+Vrndgl!LE}@eB4Uu3R__}CFn(#G5Yq+O8I<@UY?zPZC zu14{6+7fsMmf{gG(I!)cOb7Fwq<*Lfnq$aK<3hFFS>>CPJxLZ93h&+x)e@UtykI&F zM5U9>Wm^LG4|2?aS-x<~tb6&|%x=}QN5h44j|#Pc8kq=Jv@jcr_4s(ROu>}RQxkZ5 z9|&u^2#5N;o>d@-UQEuH?P(_k8kzlu0**w}t2u4qXWfCFlW9My8`zz6(|mp=ej+{5 zF{)T*t)~Z3{5fP*_dCbUJkLSKm-fa7vgKc@?1xv9(>E%i%TUC;?JZwLHT(?P=|?Ib z5Egq0%4WG&ORd|xV}b!&`KGx4a@lmL7w)e2RG82L(3B%rhtL$jh;@Rh6DZWHL&c;R zt<#JKKw1~n|6>AxNyJQ~r^~)5_Ep@Si9H5z9CFSPbSXfZ-kj^)TFg%Cyd5K`LHmS;F6DF2vEfrz;XLjkJ!n6h9MGd-#E zP91}O+=p+k0=^|K|=Wk!QWWb8i%J>tt z-j5%L{RWwrX8NTP6(1i(8CluuH*VbcR#dfIKa4`zrws0GFY_HkeS%YjKqWAPi%WPu zXFK5!z%)C-WKiz)>0T>S+!28xbAO;=Lof!L2+|AH+XJ^BPDjeoFD8(86QsuK>Q|bP z?57lR+9^aG0hO*PpcR$Jq@?tFU#c1y`2sGo&u`a5lz=pSCb`apV0ZbS$c(DZE`{St z0!}-jH$}#nvaWE%t(Ap^P(iI2I(-HM zhVU7L^@`+1(Z+>BvVEr?{w~~38TQ$Ql1;|_-lUJd(*v^L`4iwMLDzJ*0}_%EPBkQ* zZUd~r#I%0j>)=|;YUlnS5-oUXlHgb>UG^|{jQbBf|6lmED zVA)bO-x}_SV%bv-{1$6b4mXiF$H}5vhhzoycX6hel%I#6r|Efv3Mp0}0s&O3`J?(= zXZqeN8+?CvH)w5yiXYNbrA_%rjF8MAXOPr+M_T!@1>tgwf}t!g=$iBjAvqo~GXC^H1YQ&vwkm@kLoE&|l2_N`cY95{Yaw0u- z`w3z54#2v_-DZjmQhy`FnBF6lQ4`yAD=p#Th29Nb2KYStvk~XlgS!;I9F3%#A$bp7w_}nsY50BPP&B zw}cFz(#Oo#)t@XY_N66QMi}5h7}ACTHAm4m`SS-IT>Ld4exW_tqMJZ+34{ZQUpJo! zBYbyWiwo44@jcr^b95IxaVPe@^pj{%pt7;{eTqxB3QOD`K$Y+wEa-_nC? z{a5dBwk1H_`$S7n8ak)(2bl+Lkyx>=XVB!q$T7ijQ zvBNn+Iv{5!F&O4RKPk}0#Q>KajcGkkm8OfGeINzO>&sHrjeh9-GY&eFCOjtBIVi_K zlLX+tSqjETeR=gy>20C^v|<1*W4;`0D>v`Foab^6*RSm;e(=5IXuV@2AvHKRHguEK zTWXW(E^=A*Nrr_N#Ie2Do*gd3BP$1Zsf<{_`n%5Sy#W6Bty4?JpAZBak-Da1lK-iT zjB1(s@+SfwjEE8}5U#3t`Ll_2uHfYbM-yKNmR31nnhLeFd2#HWNMoYm@!0!gXyDI` z3u_m89myeA&<4L&6f2~cMaLl~DE{RSF0}`;46tN57y481nqMO4 z>+YJbA?=ue&{JPM`&}!73HaGO9Akf4V2;N;cYEW08Ug65FYvm1~e5s*WTm^^_pLGOeiiNI{;}o zKK(E#@}>1hDqI|wnz5o?7e@}Fz~qGwC#v!VS3S&|Km(jQrU59R9slO%54jERhxv9t z{%6+L2&*O9vG11tGbB+dRpR4GoOP7pSFv^m0MIl5HH{*CPM+FqO0*sA|E)m+o3?6Z`lGZP&z2W69G(Py6w5nf1<%t zhH{gra7n$*KxRxc&vl2nbeqZPU%5YW5bF4*>`yT2Kk%04*1=q|OYim|!X@hSHnX{imJn0Zx#ISQxYy^xN+$H8SaYK-tX#o5_O$(d(XK~V2Wj@-~)aqNXrQS{gz z(q^M$MRdbInDnfX7ao*$$Qn!)e{x=nibrjwT^MEVyKBv^=q;@XlD1ETTb+Lb9jp%| zlf$CgOlAo{ZUScc6QB5h=lt&|H*)^V3viqQaCkLHCpV&h zFK0$pR;i90;vO`3r8#KxNGmQ;jWbhV>rm@rvm8&dY!)(R?O)*pH}wnn8GMb?{w)>Y z5}FWUvoDSVS^qyKT+GCyqMW`&ubL|6lOJ;VEoDW0y=-kiSy&C99~TEtr5m#O{L2>y z4$PEJ)?1G}fX^rFD&vK@9kzhW+v(@fG89B-G0og-+8}~-K|L=IgPxp32#wYFD1cQE ze(lvIYr>eTtE*eUg-+27|5#Q=rm1m?ew^80HuC|9DN9gqK4-iUlus27MH>Amr-GG* zXGe}X;PjILE$k?9HVxiZHfBL4vvx0$v#Y)^d4NmNyDY618d_OKk>^3;_)q0Ay^_w& z7rL>&Pd3++u2yyo5j4&PM*}tkAA~%`rafte{!cc;bkHDTk zbm!#8yn<36uU#}HXnnvv6+aAX!a+ z&EpqH=-i~?0po1g6UOlYB+>(;vn*oBpWkik)WW@N7T+7)DF8k_V7iG5x#+PjGimvv zwrH(OT5tFocGmd1H3;3GFz+ z*CS};_iI(od+V!K*f`}N-XInDC=kc4r;{3ygKxBBzo@B1MYeC6PSbAdFi=zKhE0Rf z&X<1qJori}(_?|6aQ+o7k7wUUx#wZnV!5QsREN&xjzlSG_c>km3wMJRf|w#2#_z3; zRVNoz|NQa3(xJ0`=fTMR-XVf z>z{*3mjPe6#s-FH)22SFvL?{42}jv4Y7OieR2XsJHD9bq9emZYiR4@UfaqK{j|DM3 zDIf1IpNfQ5o!{AcmPxKffQ0U>{_`(x16qdtS@N=tUBNd#dLDL2Z~36+oS+JQ0Ed!@KJ@VCKqmB}}UeU>ao>VcgQ>HRoa zwOLQZ0HUU=yJX+{3APn7Tn6X{W&9fgXmG$i^P9eY?2VuB)VBKn(#c>#{tJbRwk$BO zPU804$62rgl-MRx2+~FZ_H4A2ED{*tz@aA~1TrIjAV2pa@qlE0Z^q+rXGh$$O!(#X zuwcke7A_uH-bGvJ(XcU&Bqiw9^KWR`0L~!<9|)WW-wGZp7j3fBHhs4-gTQ!ybmqd@ zXoAd7OnO)dWaqPe-&sQUaPCGH1GK>B^Jz}_N1xq|*|NKhPx-R$9}xpK|BV=!En;#^#-IWmfsOl6?ZBz9NAHXbQ2f|b`;2Zl$m>{OaPY6 zcl+m0rr*o!>(Rhg5OnM=eUp`y_1+RWi2k^X@0BmyULI6ChW!M4#1XCVU$P6Xt$iaYW#2+@i^>$3wvBPr%5;M>yS9|DpeocW9)L&4)hUpND^-=snwrU);cb&%ODHF-C4{hOU2B z{zK*O$83Pg1mbRXQ?Bz6n;TC~9Ao=w5Z`aai8;&wp!~+QW%Fhg$iU-HS2!Cq;Z;*T z38q)zmLM59M(ho?Ata_ph+TM#oJ_ytnb$WuoFF0ZJ^^lvhr~Jp3S9Z9^8&<06CKd> zH>+$g^>jT##zF<}kCxqi@c}xchLsTWbQ~iDIrzY`g+!HpNaPaR3L(oCs&nuuvbZiU z8XUMO4(iXn#fnlLgsmb3!-6OP+rbTZT0m?Vk8-|=n^F5aaS%1bcxN9#wZ>l-pU7J_ z!4VK9)c-9gQbt3TzX?np{IQx52EcM&^#m3Tg9gO?xj4aJPK^ZI2aF8D#qaNe+B)f- zPr|wRAc5foI#5}8OybRzg3giwusTKM-39G_bj4W2SR92)tY^|&nWd6XS1y6G848}s z@?--Kx{7TV#8|9OO>voyuz8bCPM`mHhMh9(vL3%`x}Lg^P-H3mg8SV!vnsqOQBsF= z1p-AvE8R9i{uiVtK8EyC^T=f`-eX8#bd8si3qUbO zBV`E@xTv>LlX>J$K~AS?{RXESyiUsR1|Ihflx)|Go19mUmVfe*uRaa7ad{3NLrA8a z-0PUMs3s*)NF~?apXB221{#{3)d35Ejp0L4giwa&qlZi`-|qgEsGyEoBxt`ei4x=w z{khUel%v_02;Uv$JDMnPy2x^n!V&dx%9uHlaDYTYsKiAXaRCB;;=l348N@F{-$*f> z&Awfy)<2t)6PE+bcxs;*iuOofvO4aJ`ze7?6sj?;v0ICM{a?TGxvSRRj@u4PTxiuejW!-V3KN_XT+pw5IxR$qKeWOD zF-IchaF1+7|K2Arvl>+59xy;(%uP=Z02>Y4xfa4<6oA#uQjoj_+8gQ`GiS{MKsbb$ zP%DswiSwd-wZ7~KeKgQ}2?Dj21hAjd%A0=t6ChRbq5DX8DxEQxD9xX?)!vo<+EtF!W>JwZ=%&~iS^NXpXA^{ zO;1bGM>bz!E^2y3>lljR>p4ey_U&Z)y2AUT-v>Dpfe8f&ZlWtqSnc5XA|b3%s|>#O zp%FvU#3B#)pJ=ALo+g?7bc>yPuVx|`>!vFiG}#8SGd!essq6#y1REIZJA|#qBnVa~ z!ISWnE#MDN2FX(mO%djJaJrA2vss)^iiMC~sxF7DBh^7=3w7h^#!a8axA6<$kg1~+ z9tHs9cOV9>c>Ta9f)lIJB-N=u$9VKhz2m2>YK5pH1=rZLX~rF4%Ds2!uLDBogk=RF zf8X#hM+$1-*uB;!l>BC88$@^mh$fhOFuu{~knRkP@X+7jn1G!uPK^Plao=A~yk4>{ zW1RoUE{tsUoFPa>kK0S5PYZ&e-pbI~)wRzf^&t0pZp2&$GI;4fNhr zCk;th-LL)y&a_c`&4kzxZFgpz5>a?k;N6oVr(bJUEc{Cz?{QAy333aZSP}}dq6A8S z&O8B#BGDflzpDZ~lMZMinvbX)Y`N1rm&rP*+ z=4RY}$p!zOje)~|7QrT~28!@BiC|UY%fFu?fZ1iSPMsqc3XWEK)8C=iiD}+3E;pzR z#YXD6A({TbTX@OdUuOs~2!8MU{NDo;t+JPzKL1-};sV)`NSPucV-8N@nn}v&7QI9$3f$QgnWR+oZ!=_^ro9r_qUh6 zZA4zRoCJpz&~s;f>D(4O#qH2Z;Dp%XoU3Rci<#0iSIj5WwsvF(Gx!76#c;I22My*wI)6xn;=@0Z z5`qB%-(-QqKv!qggq-_F-B%B&0jz%k+7BIGDIP=+k`mF1Be6fpK*5^a3W3zu*Iujg z`Q-sBpY_$HM{R^L|Ml#Fh^OZ{YlJe|v}S+o8(K2W2?}IU+-77!Y~+>QXY{gT)#IrC zHkB^xm+t%BLKp7y!oIqW%3-8c@?r`aA(v0^gDd$V7(DIiOjgN;{;52wdU8zdo6n5z zQg@`Qq3!;_g6mW~goD;7H_uBx$28ObCxcN|ka?c=8opgqeP}VW1G0ag&rSos4|s&F zFQgECAD?P2ms@M#WDAikz%`+3<_wqR^~dKM!|eX$kOIjP=g-ssc}T%a3v=hYf}O(P zkb zn1Yo>$T6pa_0Pmf%=PmQbsEZJd&$rMZiVX*dQDfG(DAn;+nC~Rmzf@&)kcW?*Xv80 z^Z0BrdI>iapZyai;QL?Aoq0Tz`yR*b`!Wbwhe(@_H6@I>NOtKQt+ol-*J#KPvJ4R= zNrmJnos_18B(g-76Dd1oP;|=HC}SJ<`^<38oY%egbzk?t>p!oVXP)1)Ki|*y^LhWs z(NZc9CdiupQoj`uE^hFmxzcM#Ec+8bE=Q^7&55g=>3v^;j;4e=rRjg;S?9R@W;Hrm zC4|Pv-uU|CrKEGw1`Moc>@9*8K=1`)#a61vzI}b%9-AmJ+tz7+ztW+ZUhVJTKlSy! zPhI`iv$!Fj9!Ztw*~Q~Id}y8iJ92S+uY&5D#=}#kv=ZnnH;tBcmYd30>oY;gYC6@R zn8rjkm@Uu;O{3bAuAOX4mM$^RP>D&5m6gdFf6@qwmjbxyMVnx4_9tUPOZ3i~PId@7 zwd+Y@rfvrWD2tI@1GMo5UDtX5a^MLHGy=fHb8X(3RMXu5JYu(F#N-oueAl(C={uFP zZuJ}ha>F_C#@3y9OMe}?j&%v5v zS$~%%@t1SAvRUlnjeQ`Imz<<1|0Ly3lV>WtquI&6?My5FUJ!g=zoDx0ltGE!#c_&J zw_nXQNX|p@)?;xlItXXmKXmZTl&AZkRLl&iHDCF8z5*@g$~59|Hm^`Dgg(#)+hrU# z68E*!$=|MatqpKu<}-R22&idAg1|E(q^^#i@3>-MU@+I~n#Q>bfqT+#UDTaceWJzF z{9e=@ehDqp)x|Z0oILl1@4!Vumw81bKo`y&DHH(6u-aHiZ+%a{n7-6_Q0dKuc3`u7 zPTG=t6N3G_%3RUXvif1_3fj)n<4;_h!2O9cF@cPI7S^26`JR1Y5}TONf1q*k`&fo8 zqk!`ttkBR2gtR+|^KXIsVo~z^hct=r$HEA@-r@O~T?RDjXstF>hM9+*VrE24JAvt? z>JoP`@C85;peiUf0WWEQa4D(&9$pVSJp1ZEA)V3*<9l$h4_QEUjf4B5l> zyYotzp$v$7WJH&|$LAWaugM8B5<3xf|ES!?-^$;r*M z9>_r>wgN`G#|$W9_VwQ$2nSGR3xklbS0ba-SAa|i9fR=y3StN_rOLem5QF7cUdSy# z`GfZU0A&e#dYu#R+r4U0?xcbOr7N=gbg2^+a z%SLCrFM{vf^*}7Jl$Q7Yi_DasiclJ@f#&ZrQtFxMsduW%BS>1N&r z_Qi}kl9*s$%luE!Gyk@2zIRr>t|+c`lwWV0H-Kig!KWalO#u_lGDWRHzWCL7O^`34 zxoewxc<7?oiYI4T%D z_@s6|&Qdzg;lKnx&&{ifkhB=FL`ZeDFf2n3*f8jaQhzaJbE(aCHZmX33L_fjA(n-6 z5JmF)w$0BOGE6umXeCT<)5B#e>*1%RcWi>6_mFLD7h-u1Ji@~{?g;1KczTl%kw7GD zv=rqQMDidIkOwiNq*B*xM{^>580%s|vr;7$%CqG8+CcvFaey~I6h(fYQPI=m{?UkY zzze}y0TjUmxSa(+qzD%TgaY7Tp!`RE9BD9%egmNr@DzJZSUylEw#^;m-1F(9y5dG5 z&Y0*boLQ#Bb@%)5Met}?bd=^O)o!Z2jmWJ~Xk~0UsiSea3!n-PihdXya0T$4DXJmR8_v`6HLPYq_R=djcxTB*Pi+_A|0ba%?P zMuRjO6i3)y$MZk|8e8za(LCzU6nzOFyVw@F2{C$Xoy)GTJ;RO2M(#PkY};#+3q7=s z#>Jh80%HVGTVd33VG=35EO%ZDPo#E=LGM>d3&%IXqKDy(me*2dU?x(i!SUE`Zag3j z0CDj^MVcGXj~XJlU~dOgq-HX?EiiQDV&V}q4+Sfm^4P?pR$aRtcIEK89;oQ@om*9{ zcZvaL&~%F*I0;WGKzcciY-z7A`HUL&&%y0ECPjglOGRB-ogGTTttx~AHL_gq9_E9- z){US)^xzmtWchig+)xoAF|ipQ7lo7jxP@eI(rB~;1BejtC9m;UGWqk{J9i5Tj6cOi zm2dwdru8P{yt+_HCA_3S?7*S}!sSi2V7l3IDH6mu&Xez6@$}}u3Y@JVENH?lEh+er zu`xRkUo;Phgu?X!;q+p=N3pT1xnb4k`!36vXd97H z@?NFsqR(JG*;j1M>tJ;-e(^k^==Z71*?np)gj8Q1%647IVzT~<0RQ^h4!PqG&k zZ+!D-E-MRQI^ch?Mwb5vRlxKGUVfxD$IvbTc!-CKoXJr!@U$0^B6+bL8Z!|{H6p8X zv;+YZV=fYLreAgAss}{}h2d&Ib#i>SBq}9j+cj3<5UZ2LRzmNez`>M5DnI2#>%gOZ z`_i6Tn_T^D9p7HmBL1RSvPSZsNCwYU+KT=C$oa!aW?*~5{UC%~l1$PcD6%W5j7jVZ zw2r{b(mS{%r76wh)pRsNRyQ|4a#=x{f2X{B_nw7fhI=j3R>!>WOQB^J8|#ZLH{)02 zh57ULotF?<1q;KpwQh3pKs7)Cu`|B!t8^J=0*I_W9nUvMGOzPjJkS~zaI@_rS@)mg zWvug8-{z7?dZ9m_RgwFcCd(dY3n`F{_Gk@GYKpuTob4x<~>fsZWZq>EQ)h#L@XS9`C z492XjvLU2-GC>tO3eCUoB*__58;s^Y2)0lkxZbbB@m#MssY(dLfjFYSH)w;A>g0Q)QpzPcf92=}Jx|*5LhWY{j5A@e4??*~<018eyQ%t_W&;bn z4;W~MzRUXv%|F@$zi=(_&u;#JC#o%AqfT+4*O;U-d^w8K-zNnHFX@@P}I^SDRRS`VK5jpOuLqql^qgvwnUf!Vr(18!YRB=-2TrzE<-z7 zjf1{~XM~oBlj|QoG#kDL;`9cK<@cu?9UY4%aK@ui3;pBa*(mJg$1Va)vmC@Jpf(d8 zPK8b@WPGn`uI#xsgW~}WdIFN(Q*VkiHq}J+babHlHrY_A`mkzZutW+g1J#dgS2T*l zn-`teljs}Kd(U6IH`1~FdU3>kKD45~wOc~cjQP9#^hRVk9u3KpEUbU+iVbW*AXJkQ z8ZSo<@sqU_P$QR16thfrAs}6$jqDujlM;j_08G(PNXu~^c_2~iy^rwy`56oAegH-8 zVe79`f6Bw$j{f!KJ%}mFM|>p>pH8Jn@42tGQ@cW#=`a?WvV3te9CSX4j8<%tstR_Y z+^`YeO0XHPU^g|k!2ASUv581>z9OiA&k!fdG~YsCDogkC2O_q+o!kuq9!*&*6X5=4 z1(eBc(9rjB`}WN6a~u9t58y()Kz5sh2og8D_l+J2PZj5;&t(VlA!=I~NRq9h~Dj2ORG;+=R1q?}lZW8)tS&$(zb9X}3*o1p*!a0+3pp9v)k)vo+(X^=f%PN$4Sf`ZZpE!qo?%PM8JmGNzd}u%c{WO$OuodA+-F zwuSY`)n{wCqMUS{R5l3nWHhXLJ02Ss=NFQO5wmct4?k`bW3@P&He~`zl4{(F;;NQ++u}yv$Hb&91E+$FgqLccf-o3|9D~U7YeT`m|g)H#rDvU=0M4}gUu8mr2-va%8~JF>4^_c~i4#d-C+vm_TSk9CrLR_wg|-**9w zSwTJ~c|wXhy>ND==d7F<58zJ-v{j&MV`Qj?$7N(>yc&oiaRE^cOQKv%`<%W#>H@5^ z+vA8JH(#@wvl{G$rMAhSFst}i&-~z^uSN{7l&@;clw^yG{`4;cjke{P;d=eT^mRPz j^%_qfpW_EeE32$AwHI2Rq{j8Kz@Pa(8E>;NBr3fc}R14mtQ2zK5dv4I=OlipVAm2Zs$uU0LCVxB1WNfIIYGO2lf0 zS%)2KfS3>Ms3c;Zh3C>aUyM)LI(b>&L-?5JN_u; zcof^!bj&S#ZEqSfT#9<-^obUD-RWD__^T6kZ_wBG?ssl^+}VG=+mZZS)_3p&lAC?h zx5934NAt=!>)&e!bs?~imeG}?bW>D507c!luW`?a(`CGPjj&f3{ofc)&G z5G=vXKY#hhFo81cclWoQD?FFz4i8rY>VJ`rseLq5`&1h!HYu^uq;s0^39-!;Sj<&^vFt}&`eF)tsoRApDom=kz zehQW?gv>bqb_J=FM3yb@C|w36+c?#td!7lH&esK=I*`6m{$je!ZOVRqx=qw$R`Z3F zr{l*v==_r*ACut@CfR}K1X_c82<5TODf}R@u9VY+Z-t$VDzRwPilswJQXl0 z3LEvFBKO(;X6GThR_(jf2PVX!@ge!9>#uFs@?_FT!sE*b{7jVUAIL7xW{S^-D)9$CH98SYG+~QLqBJ!M(M)*)%U%ZMx@wK5=nrDJv~4?at$1LRjBK zBYHvZXiBb61V{E1?(tJN3kJ1a!DG<93q~c;ejua$t5*&FCW=YCulAt5mP|NBMMq!% zjMgiOUPDV8NyCz#L;2PN-@lvQ{yx*5;7}iQdh>8+%+7(Mnc(CspHj&mUOj7h4~DM@ zt`b+p9gRbpoS_!;?AxKmuPuvF?Z;yuABCtFU?-B2>Vu-3Uy3?V=O31x%&WW*UZ#bQ zU&Qm7Q{Yykux*dx?YfiSfXA}!s>MgC@|{uN@LyZCK_o4oBIvVnaysK3@|$3^8wO-!+R*m2fu4?Br^t=#m%)DyNhSNUwc->FrXCK_*!Vj69`qot)~E0!XI zd{W~4UDbDcS?@e5Ip7Exe{@UDaT<*2JW}z+INDwE@gOQQ9&Iugx;JxakuS!!V6^82 zY{t93nu`*#a?wj{5RY4O<(OA2^!vp4B0O*mo2T@i8|U%eeV(I(JkWm*&zXbkx%IU%0ToGu-d$CiEi zzF@DgN^MbbFZ`|Mb48_xWNwZz3znrWBk70xJN@&$8SO3;{oU9;UR2QRn=fEm9h8Th z>FF#?V)TVf5Xz`;QB3`#4U?o>?X>FRKN}9-T!vRD7|!xiA}$@?`g9=&u1A-1ciNAK z^r(Qk%RoBZ{X@lf3hu%YtCpVnO^f@5^0VC<-K-b4+A4Qi~gI1~JdI9i4J z9VKk52So^s?$w_+DSsE(NN=YmOE zDZVN9h`k`Qis`>zXFJn#T2_r<$Bz~!8);l$=l)nk=hM&lh}^I#>ANZMsN_N0e$aKN zH1PT8kcLG(6Spzo7ReSpK1xTSl&J!CeluG( zXoO1hpJ|6qi(ja$n4qCWU{qU;^up%I$jE4$T~1Dp=)HN}cVeOB_otf4b#TDZ{A*hp z8|;8EX!_+h8P3yC(f(-+#v(OMoZR_Re4iu*I+WEzWcj;y>L>?+O_L4w$#y^H(^2-+ z7MT{i>j{G>-WJjofk2E~OnD(yFo`TvU4-^gOD!Mg!h0ZPhKGmi;Ow^b8#4(O*L;1Y z1#Xr-eyfur*mlrba_`=~9-u_#Ghz_w-wN&iI+)5^jY%fWNe!p8uPu?tGy#*Oip5k+}*{2^CpG2$%~7MdOn&};#p{Qd}$&$Yq~Jv+M&UU_XhjK&e%PoXtwcc z1CONRx6M>ZS5N~tW=Ui?cA?!cJ?`KOLZ`FWp#)}BHc--in#lQEK_~^Yg#280N_RZZ zuIy@C98Z78a}kHdfvn`8CWoP+#{QXEz|Zzkf*lzEM%IZb^H%(9nXivoWCY{ z=Us76#@%Ujhgnl5O z;m4k}sg||(FM}nnSQB*yX)n=egOV*s4U z1`L6Huu`$~kyg#^t0z=>-YkD&kZZ0LK_`$dKI$Eu?6+;~MetgWY1)^6<0pJiOUpP+DlY7tb%X$kiX6Evu0+wIS8jry+k=26(E5UMyh%4Y;K0V@X*qV@>2FvQc`+uMhIhl z-H3+y)@r=&wUDvu(4b}Ui#q@5>wEp|X(pyd#hhKrwKKtFXMY6k#pBKsKO9Jg(a6W` zo3f+aR~yEOF*FfqxPRho$MdNq|7UX%I&$AjoS6=>Q!$%AJi2>9v0B}TvuDBY^ZxyN z`^l#88a&SS-9qPsj1MRj)^g2bciq+`&l1;fqf`9C;iobusCFIk+Zi!_c-7I`>Cb7& z3N0&+-p>^;npJYLoXO)PN@11~c+|#RC+)Se>A!lrBk`iB<3J{Fsom(a+E7W~ZGPvm znxxszmvhw=bekU$wbGr^3jUQBp6k5s#-Wp|Dikrw%Xfa`6@GayVh)W|x3nxL_g~}c zzb0)Eh`xWfXhee&c6krfonpSrTZTm_dssPY3seJ^Z3ayu7df@Gig3FD1mDYb|JMY<`W2ya0LZSVcKnBo!^om$W4>2YhUR8LKYFdlE z+G8f@avC;Mo<$8S-qonY^v(()d+{QkaDWPxR$*dC=cQQZ_w&XDHpJkSBq|*olkpc1 z0MfW=tO2YGnWJmH^FrGfX1T;S30e|vYQ&imuyVHu=dd1lXZBjW2#rwQdI&5I4!ibOYjtvKkE8_5 zs}i9P;~@86ib(HR5uq3!HG}14;ImTBhT`FqI5W*bCa{aTY^;MfvS>NqUT12{kmyBKQJJIe{@SQ|yCb#9G{373-l}m1o>2qDu ztD9$(yCSoNDM?>h`0u{aJUH0??kZ~COg6bwe|ZH<21ncklJ3jN1w2as`vt_CH5^~S z-@gVv3D~|j8ltwJX&EosgkAU5B&-B((a*8k6xA43v-_ke{>=%h6EvbiIY$junw$+T zm3i37uU9XdtF)uTa_<;1(}9)$8FU$es;? z;Rir2@dm~NeMNn@`;YZfkfi$5V@`@d#TZ3+?4>MGp<8Kc2+h!|;ZiCHWrU_On}#_3 zMYu_jV8VzzcDm2`wrWPt%ZcfNGmym6s5u>_-=r7=hD8poS>ZprC!sTH;m|xmu)ePP zr@o=}f%FZ~4S!bul%SwhJoEph`oBdCKPvtXYO5ZLUwej&%gdUM!TtNYYRg9lb8^rZ zB`ZJQt!`*|_VmQmQxnx-1t4!6l%GCjQUI#t{Pm7Z-)SXGPZ;lc@k?#!;XyRlmEx{! zYFiG{6ks^@bR|hU>}@WH-tJ&vyzF@6^V6d5hs91`=QkJni-2SBLfn-#$0)ynNq(w| z4YlmvqUy@K$-61${j>-crNKnIZNg=2o-9?LG17; zn2daG&E5rImb}~)D(M8vyk?5u_SqyU&(DQ=Q&ryD*syDKr;q1L_|k_SjlA9xa!N!A zmDVU63~A*~$F-V94MRp{y7^^#j(q>|gZXOMl?Jqz+Dh3Jg$|airlPVE*gM>Y>_s6o2cy!C2lDb{*u`#RV=f z-uCiw121n(0`V%7?haj4Wx%f^-5OvB$eM#$|qIY-cQB)oJXtdYnw$ zp*eBCRBlyDHhfyBgRgSF5l^)nPj%_Ms`nRx$^%N#OY0AltMrO0K6v^i?jWBJ2=M_a z+_g+XLPAKQc7J)_+6JQwgK3eV@w-%taT|Cp+*&AA8|{e`f5eT-ThWq}YeHJyx>n1E zy0DCWFmx$A3jbx2#pF2-ET6^ErSr_|w`pB~u$NH%Xetj>Y1!*BMRDR7v<#2|`WX|@QM7r9&Z7<-4 ztp?ZAv2}BHYglqY<8yD3Lh@U2^n4+1_!S+Fz6+E^UG1;$hG{agt14hyHyGDt)~oOh zf=&j99E5YzEI_B)AftXucOWMHh#sZm>|bxN|pv{|5MWh-I5WzFs^yUMddx%P&qMw3MCR)b9s z?tRoH99f$y)8w+qQ=VtnW=H~G!&dU9f?42(H={%;NH|DtoojeKP!~Hy!vchoh#;OHtY$a+2WJ-2anVs^!!O9y!(>PO0tCA zUnw_@xUH3)81P{)4F8h7;HrW!u?x}42EcC$5{iF0HI2;C8P==4mX@gZZk#t)xO$QpPq+tYa7Y{Fhb-g-tf5b2_N_?gJN9abhv3P-YDDkR!!C*%2= zqg#7G)e;T6kGk2C-s|m#H<)Ri7Nsj;BgIVt+o%x^1}4`hj`hdYcQ@yIFWF7Y)&$LR z#dyxrrTIU%o++@U+IXmb2zg;{XVJ~ppNNg7x=xEJPf*T3MZ`^FgjY#L;u_fdP2+PK zqGM!o&pZC5!|MKpu&g_Z|6ykVwNmeM$i#WHAiJ^Eq&cTlI@dMWZXcF zp*FOnJZ2+TvssWk2?nf=NeSu`l+;qO9YoZKu-q%cCQi)H=8Bu?7ZWa%7%%V&!ZwZ` z@bT8HBZT7iLRnJqR^_oL9hUE~Aci*`Jz|U`Z(}mDvqbfIc?S&I7EP-kFzy zYE-e+@c9`B?i3zw!`$YAdF{KU;Dv{Vr~63j%4A!cryI`yTe37sHorGJ@r|&k~bL{!D4rY-szU&KH*l`uY?r@Bd6sB_u6>F~nxg=T{kmY*R|5wOHrZaG{#ylYIEm zr{@*$W^U&5?n+>{#Uvj(Y~oBc_%vAP$AMp(uiI6$1$~!u?&wxA5fF+^W>8U7wL9fN6qM%4@aQ1pZ{37@>z!~*V5siweq){-Oj6{)uX*XP<8c>&hXvXi(q*T zDdkVFa8Yw-XXkM%3TD&K8zxhvTYQA)mPPWL8dq!fyS(NuuHv!J*DH?Bou23ys(Dm4 zwJ~Vw`iEq0Q+rFCzaAk}le+XZmnM7bPt`09oV}`y3SS=|<<9cAZ=0plD?x(S@$q+p zS3SnnH!qYdJj?Ycx~BQ*q|=x8`s-0qRujIf)r73gb)8!RT&#|rOqmuR&z^CuqK3&G zZeAx!@uqxxpWfV4B%~y)VGbPY^*>1HwO7f$E0V)yZW&$-^1mYfCHV^|i3)fc9|ME) z`wLpsXp++LrvjHs^-V2eizZHOgHnPwFP=c6OfBUDX z>!{4CXI^UmbMKlen(5N)Ti-uQ9OnN{5BD$lRYDemTn8V8b>G!b$&r7s0JSYbHGS~Q zl~i?&%Xzt??kCb(gPZW%d)_5-;4mJ9vA~sp_07DZ-2fal=NX(oBiPM z@YQaajYzL$4{PfTyQhQjJ^|URp4nXLIANi)7r%^=)B+djjafvUQlDbq*3oL{$c93oyFT|W*lwL2eX`^;@ zaLAAR@Nxw^asVU&bpUC9Z*Q7U3lv0hB__Ny3K#i2j(yaxX1;<8oALP^gJwK@V~nM3 zvp`zF31l(d`&F;}ra)A$@95(47R~B&#l~QU<&;0XFe@voqXsx>s~aYzE-e2p%hOTK zlh1YJnNSy>j|Kel^Eur5>aaHX=|ZV}@m_>q*6~|}PP4B<{5tT!=!RKqtyc|V6%VNu z8xSIz-VD>ZRk^U>5S`Jv8BMJ412Q^`J_P^VPVnw)A-Ueh?T3drH7T;V7`2# zOWN;rEb(riOJnG2f`$Kin(W%cZKlq|i;dDql_@o($>AqdZ!54CCa=?8Hn(nxJ`Fo9 zDaPOJ6eTnuqyQEPu1K`P(S=UDC3CMMvf;F)+GH<5)DNw((JR~yEu;1;KJP_yH4+4S zpPs*N-};z+h3t_qbwFHkz%PGBS)Y5~%;IO?YkSO9d>fn3H zFsT>e?GrhO1q$KYMS-JM6S)gtKPz?cA-?uk&>#^4HY3~F$Pp)~nB>-4XPDcuX%jf} zGuogjiHZnb$^58~iDVLPKa+&!4&@{fe_a%ciJc6WTb4f&CO2kO;>tmA7m)G3|DDcG zv?!J(Wq+kIrsinR$&HX9vC`MF9ncFt6QT4~zkrrB`r>#%_tu_RY?agj%jfd&>T1pF zT2xZ9?ZOt>L>z00o9{zVwuD2Kx&9=3Zq((Eu;P!t` zpnYxvss;8IvvcQ1yvDfVSkilXMefweJuG+pa=~Zq6TK{-Xx9>ms~=+89$Wh>(dXZ_ z#N~_(@tcLD)fG!Fpb^fA z+SbjHX?hu|Z4q50bY_+Jqp$<$pWjRStB@P^pB|ktcZz~eP)+L}PS9#1Y49XD$6)R@dKAyZ59KI5o8?r(HO>2zK{?_vR_)9U8R zP!&vOpb@|UL~v$1XAxj^2m|&b!&PcRa!4(U zW?6WDAO6^MnPHU&$k`z+?06&1nkJ~#9u@3C3Prp6* zyT75#9YvV|@CGC~k`-x=$5($c_%U>`4sZf*B33D7oH6YD`Aw7460>SMZM} zkaT4_u})g_UBX2vsAH3rLloiRd)kaVez#_uuCxcsV~q#~6unwES~uwIpO%qAVw@ed z7kVlz2R&qTg{Ny{P+A_f5H1wgV3j0KAr*pggD8~8;+sHi&xB2T^;Cs{Pg3o%J3u%= z?-#~Fz)zxfFZs2f8Wqz1nnYi-Y}64us!#s1af(W$(Dbg&EA=TCjBX5$cow)EN`%97 zY?B`c)q=V*?`C*oy$>O{(`&X#H!eykClkV~dz$wI{%}!XCoW1!@(ztx*olk6dC}_9 zJdQNt>;u+I=O9BZup$!c9xC5Q=ry!fA05N@QI(PKG}Y;g)K=FVZz=;b=C$%${1LiX zG`Ki6&8wwB=*;%>dVJSPDG?9vvRiHu@(T?m`z)S+pPemY6Z-u&@FnkIF;>A`nP? z+s!+1=QK}9j5Sy&4WVgdpj5g-Ga$qs&0wSY+ut~!im`epw>@M%FfefLlF9Qj6y9)a zENA=j6uz{}4+)c6|LWB-6>Z)o-sIJnt~Kg*U9Zw0VzIcZvNniLIMGn-4tWH4&|{-! z+EmGXzL3jkK6Ls~*?8gse6rP)+W9nNH44A$;Fo6!6-Xq!C}3q*$94Z+`4?>B601l5 z*>?y}%xJCn3CxM)@o!bg!dy%nI4Cv$>`XG68>;Dkm?oo|*nqpr-6G})VCr$-I$r(9^)y?q9O+%fFIBls`v25X`e-LRud1*$R64>u&p ztZ2SQhQfq8{vnc|ypv-?**!6kb-f7G20(?Rfnq?fhi2iX)}6=s@uP>$RnzRckA#rV zxJrrE;+d5UW$n8l?P~NC#f++a%G@aG133d{PMm@Nv>QTA5j`^g-M)XZyYF|@_&e68 z6n~Ny9(XtWxYm>)X<%H+uLyVv+s*>a8aw!$d`>?N-qc0#Zp#z95=?OZP#9WkO9)0C z=r}1a2`OT-e0sN z#)3NftHwhxZLsr~H*^azZTs27nHI{}W}ZqJVqlo~QH8?b#)m+l^q6^#*oHk>zMYhm zROCK$)uh_z^4}3)TPBuUBmb7mE2SRmr1EQ1AP^y7ovq7%Ba?f%Mz_{oz5zj_A#<=& zxr*{)Wk(fkaDuDa2D;j{dW#OsZ=^YL=8V!)8}a?g2%&kv6*s9-A&#(9o6~VR&(8k% z@@0nQ%SeAer{g6MXO2>hkdu?!-e-~VeoO&JEFTKSss^luTolr~w|V(3twpv$&J))= zWTa!htFjnj0+)}j=ht+dM&%FPJ2SnfKykA0E=3XB6f9g^$%Z0J6G+GGf@*DH0u6r) zAaL(@DKop1{oN2dD)VkG**99u<;Oe=LC>#Sz1Q{iRcLs$H_tE_ccnN_!EI-z8VMs( z+7pEOgHDsqgLhJIL8#dbQgKV*TDvaYxW@D{WjqL-Rqym>>IiA>1m@N_?dtoa%{lft zvRc>9ys5bNq!;c}{J!_K+1bBD&n7j1-$<6Y%F<4%BW{S zQ^sPHc>TM6tT5AGk-ckz=zkH})7w_#PFTZsGG!I83>*eGCK@rAT$D%K6E2O+H*Y>& zDsZWo^4j?N(M;n&KvPW(y~qNOI=c1D(%j`1R~K*a6rVO6Sq@mtrSo#Ej++U$C$66h znDO&t*sPOV-Ec4Y2b+QX{r}nw|7tS?WBu+%!Dk${=r>f3sc0R&0q-alX*wC&>7l%n zHPhIY z9+rvlHe5N-8az7OcL14zt(X1_!%-d2skS|0ss9(R0Z@j(nEljv=R>i``&rLi^}_=9 zvOpF?oBoK~c=%^1a)6ornfsyl07o)w#$_l|x~~}_S1=g!xpM(=lPg11OUMn+?6 zPb(N;9aQd&v3I=9Gso%E(+alENI__Jim-GO!zODG5=(Wy59=-EY;}bhTC0yHV z0@T1#mh}DQRKNZ0-cVBdX%)NE5i7O7{6T}wh0a%!ag0n%ghc~lAa_O%g#0Hup7I3K zTY}(68Z1?PAb|)6$^cP0ke4uu+$M`+ynNOCo zj{k6iFjDvl(-4;#UNqI%vbY}Z0+5FHJMT@Cb7SO=5)u2$B2u1zFCk1rUBo$ zS~vEV96Q^~{o?-Kg{2SDO%fvIV{DX$aazaRYsAb{wQBZ0` zBh&XC(7Gj4)R`r5$PSQ>W3%D6`cxr=)Tj5Y+tNRIR$;%BY4_%`Ra|M%SOR0BLMrKu z%9~MGSMJx+ABU9pQ5UKfA0|=l1e!4Bhv7yv#IlS9se-cv_=Jp3s44ygO?2!M9V9@J zU-?Plzy#o|(>l)bb-WE)Q%|2r;}iv)P_l5t5lRbcqi_(H2cZ}K2sPhvP~(txZBk$T zkzB7tyLXH}fa$c4({bBZ1k*X?-ZJZVB2?wE;}T9Uzx66wT*>pH{xC>L3etW>UWrva z;2@x7?#TlNs!JFapyD zGBGkjf$`Az|ITk*Ifg`m9J}NY!T{X6ZYN00gRX>=!H-)Y9(zHFE~bYa58JG!llJvO z-9;fZas6FhBK&D`rT4Fg`5iz$TpuK&AJqJlnV61P3}QWi&Uztpu`oP8yC!dHio{{V z4YFD8%^uwS0!)s=QQ;E-|IuCJwcF#c&2t>Idsha$`Xqpe;s(87o0lI}aLXfN7Mzaqg!y^GsM5`F@Bk{U#gakgO=J zARMnHvc}#=iQ=HBZkxz6ra~HtP6Y4G2&WQ|hhqB*5x|53mPU|B<(=zR(-Prfp(-a0 zd$Ej+jLMx6&R_**08rK5Fwi-l&3=gjHbBU{>Iw)hFY#Z_+Dh9}>A;0AO|@>ejC z3PBVnd;=vSa9L@hRZuusRke;n`C&v0z{IoOy;FNy=;-K}SyO}1eXM{Da|es9rq{Uw zk}Wg{_NzDa7AIFV%jA{S^2c<7`+7Z*h$dx?>3*)qS44Pz02pBFI9sm79Lo& zK?z$~r?Jhnxa0@A)K-D2BZ9|LG4WWcXgBrn(o!g;GK&MAq)JGF9mNb5$}(sgTOKed zzDV^ac57l20rLSd5IVS_FzLhm7S@cnZ@FW8KR30uOrh9ey1#$DVALajQ!=r$$+tPcU*p>%MZK zW2yl(N1TSt!|U=B{UakklTc7Z308hBo|jF_TL5`Z#u=ySIq;7`hjxRIA^g{V6OB$2 zv&x_|nu28=zZ-lj{6clWL7!S)6xxvyg^at2(e-Ig0%Bk@OP1*Q{=pT*3oI1tG$;|J zY#vY#di14OKfpi+$~CwAxqySpOHV!m%JzLu4*3DqH98ppsd7QhlOQ*R(8DJkF?Tf7 z)Cir2@&XZi^PDeaeM?Rp4ai2ZsW?|tf35~#YITiGMUQ?262ppT0h`l$PyOe^a}YDs zDUimZgbh*L93y{({b>CLcswu5Zu6tOt;C!L`K7#8m<7x#o^op@%5$nlQrbCj1$$F~ zBq05-cH4-ciILn5zy(W2-=8SvRxW>>1>i` zfy1Tae4Io?F-IesqWF7cUOGF7i*PGP#5#>_^aw`eUP@@~49Jc)G6OtI|$7#f;Cd*+73dUDuRc)Sxp_tg^qJ$wLYjo^z5n|iOe2sks{c-p7$vigq{EdqeJ`oK?N=*?xzVj9c-w^{?E zquL---5GHv+VFiAFvlazqx~w?w*6V}`b;}1JE~|my9wUG*M4Ok{#~eM+SuVM2c}0b zS4<9TqXO9 z#j?intArp^nc4yfaWGnu+3Cp%oJI-WC98%;wquv$917rRb`5A;n>_53Z7a!Icn6Q) zZa8a+_%h-6x=ij|N$!}vw_^T&We?zxV9-&|r?@Ik0&u9-#R=Iw%HuM4Q5d6}PVPvt3S z5Xj`Opmp%L2m993KYFk=TNCax38IdBu#FD??7@6g~n7ad}nG?#tt!cn(4&PdM@;Fy|`pc z0`{|LN>ZRwopdeOULDf`PP<@bc3;)H|9d8#L7g68Y0REs=j9hW_S~&{neEI@`@PND(5-DU zR)6X3ZUZd81I?XQ5ZPufMdi?92d&H z49rX-xRtUp00$D}!FK>^M_#K_1_=DHZqwe@db?2ev1Q>hl*cZ57X;IwcI!8^@KXV< zh+sZR*T$#6AckrO`&VDTyVjBeGUBxgKeJIC5vNtk?~dkC)9BvtOiys)ngP2h5Q}v2{{hm!16I&LwZEaZKjc2wzMDSA>+bv;)-h^YSbU z3ybPQRXW6vrMFryGpnnUnq%NPRb^fMpT;reKYw=_!Gz7egD!>Xi!}ex2YwY@ZEp&H zCX?-H9-q$h3^QS&Gm>vj2o~5F!JB1lLQ;H2_kJDj^n(w!1IXJ4hK3|k-;^K$5T3#P z53SixLt;v{tlA0zX|9j`U|jeRo3Xpl|E@prqP6`%rrvsbVUP-NGdU4kR={qfy@p{(_q1&%OC(7ETk^~JCnWD6+2gSD2;Z+0oY0K=>Tcb>kR zxW%~r*7@TTWB84vob-%i81+sbi1KntXcFP0Eag+t(lQewSg^ke_tDqy-9 z0@J<^d`Lx7t?6W-R$ky*GfLgFhj@v+JmBV&frj3M@D$LA^?VdL$I{IlwXp|&^I!C4 zAl6$sFMLIte68N!S%uALoSUH8>?Eo^wF`PfAIVNc{oDsDtKUzsEyxqXCu4k80JF^H zFDWh#eZtvJ0I4eD^<2^WKm_e28sZ&^IoFBDi1ilr8-h^OzB;ht4*I&APk19hcp9s^ z0Wfb&g&-P|NV`3kEP+cJ@U0%9Erg-RH)9?hssSYZc$zaH9$>qaGLew+@P`tWI#!}I zBHtb4kO5&rvd}8>M5NgdHnipzgB%KLW%5}kSafIjKJu&jcglTzLSKA2vJ5uR7j{hM zFJtLM-H(IrY2<|;UJs%Hxw!o2>h1GWO%$bSAb!GeNuOI z8VS+yus|S)LUiO1XJTO4@V$hd3%VLC)@OfrB#d;(?a1$h_(@t@~Ip7aL&(*18!hR9xt;TE@ioUCx?8m2( zgQu`m1?<_)u&yHts25v!2yYrWjU@g6Ivp@Q(2@z*rdDZNF*YcjH#r?Nhy+qSR-Lnn z7dUz5kg!kqjqjgyMTAtH0_I~7nu4lM9N|M!ZGan%l++}8sHDKg=E`u5>&tERCD1+r zGG=N~m$@r>SMuD-tv6~wW5aa#bFE0TEgrqRuiE9ReR`O!sIvXY88E$b83)BH}nvrV-@0jmM@t?rCwZtw)*B8D~wM7B4 zc?j+{;&~iQ0hHbYW;ddf?gmMYT^7(qh63$3%UD3JC}36K>5zd$mBiyPrUx7l+UO!T zos0mY6j5ERK|26fAQ5Nn`pTI8<{&X5&$*>sQTCyxBJrENn>UJU?x}<_=FyL&0DMX# zLs7mz=}DK&VZ*7WL8UwVuXE-On^-u0Lo=F*WKwm}Is~a`vhWl0gR|x)`{T`emis7R zygbT|ZB|fFR)|zie9A~43rO(uvF8;^Ri@eL`iP0*`f|qE7u~N8JQ@%HBIhQN(IIX- zY00}}pGTl`g3NfL#29?3SP-a0Y}>}T6E%LBsT~8r`KmyMb%g@m`KYxqoftkKgvPyW z&kKx?Ey$3H26Oby_9Y2ti@GvD|L^wNfu0^VNAo-1^Q~JlOH03g6@w)H-n)x#-rk@g z75JZVl4)Z(SNEDUH>dF;!K1cbWzd8rp}q%N3)g6X>?5{;gD@cQtmq}Y`)rqP%D9YH zsmsdBroYm^eqCv6Yb!8_tU>K52o-HAIAirQEyBk&W^NAvdi+M%nf&X(rXg&Y^TJ<0 zniiXHdoqYr>F`W{p#+Qx!r#V31JAKBaoX-ep42MsR=ec1>M6R5HJJCNa*njIIFtz0 zas_2hS_&!`UXk=LWaI0*t(yk6*$|GC6Sj8dM#2oTu^;^&U`q=EL@7r^(@ALWy9p`0N{3Gt_y&XmfWni< zhD8oZ;PSb1JXB4)%YZjiX3Wew>sL=aF_maT&S?mscyiN5=s~x!Mi%G=n|q#u#Z55otO%cg;%;Z-y8PUbi93WhP2l{AQ1*gH zlCrYmvN{drmC(vB_3hm4Tyd8l7<`#~`ZMpS=lW4Y+|67g-__}iF*ir*gEB@1j<)eBPG z6L$l$R5<#%*2uZn^hF_P;;sHP#UITYZ#5jn&q0iuqYLp*h6Wzm^j|KzOUQP5AP}{a`0*WZEmL7fB3rM>1(Q&~E#{{`rgris?M*z5ez!4}sA}##e z=41Dc4v-ViV4^W&8_6=rOHeBERy%3&kP5&HWxD$f{Bp^{rL=3d(fWe|5tKjz8W-}T zP|)Y3z#hD*VN&4T2JH_DSRyZw>a5SO!2`~$>6cbXX%)&_reImNpBP%?k3icuu!6TC z03_3Ur%zCdqN>IFGoQ~$`5#D_d(w23vTcY$Zr8ff)lQiKe$@KWd$C1&s+zSnK^;KV z+_F%fXjC%@02@Qy`)cNO76^aie{PpB{-%mHD)m}5U$u8Zj9UWO6ExXV+CxqDZXXA{ zAu0tedH2q5rNaC;ue*sFR=d9fars0inSHmZYqbiP-wZ=@0qi3NlZgy`xnv6XdI+ewDRN=dn~N1}fA@|O zvBswPQxHgcdtj~jAFQeQU?}t6yHUZtls{%OInQ z>x~@aLj3E-1NWq8x)Z#D4({up>v;GHwz^D4cju1j!gsEyqsd(>b7}@7mtY|Liw2_g z$J1Dtop-34l%fD3UeL+vd#GaUDvup%ly%ero>a!;S$eAvP~nxCRni8* z9Ng?AoWGdns#O=I#IeEyX}Lhjzjk9YCz{CUwBS0jG&fd#@@oj}p3r@@k`C;iuvXM- z3c6l45(YhQIMfpdd96e3u$Op>gW2%mIoHW zz%##4nEM2@vVCLpx~{cargkfcJ-t24wt@v%xkIw}X_VL6ETpe@ZBVweKEU zA{N?pHuI{jnF_hwzN(*D( zvL*>-IVXG6$uiY((j$z+YQ}eG?nc&s*qq@<~Po4-dzguwpiA z>~6Mu?gunOHQV#^H2I!(%tYZKYNocH5h&Hz9hp6memQ3crLg7rEj z|9&-Kz*VVhi&ABo{zp2H6l|Kap7Aj*nRQ8wQhwydGu;tqVWXLV^d+eTFUUG!r>BRA zFQsg4hll+)J_qGfkf;rvX&5nf(jsf*SbW-==0eqbRN}MMDn&EV%uyGQ*o>ylfo2}f zWuI5WeUUQSuL}$LDiJ4+Zo0flCgR2sdv&mg3?|OTBTU+@%fIgCSX~!H*`!ma8nzOF z$HFnV6y#C+oH5IX7Rsq4yhF1tSpFRmXcuc%pBS#rss18H45yC5gyQMJ^&XS$gfI)| zBvqz*wMEvEdSKi7_v`f(cKFPkhhl}|#*@^NB?e;LGu87R1?WCQ*<#mJuLuje0D3Uw zph`5I+M&tRAii^_zP)*XsdLc}+SatYSF!Ai))FWs!~7^TWaEB(gY}!17Nc`bxobMA z`}_OVG&G;ksW#f*p{wqfE=ik~h18zMvv?~nzX2A`knkg%Vf!cjw&_Q`);VJjSL}Qo zC@|+ScvDKpv9s9wDwVv{z25po8f5H~;Y->WlmYk3%F5U_{{EU5ED&4d{_2LiujrMR zBVdvQb&@Qy13;G)nb&5?*u?o1TC`~5$_)jspT$Rh6==)9c;9{OWBv7&>kHqB12Xty z-lCLjh}Hy}6wdC9Ml-3T3?^K%9xbi1gtKDZ+ayck&BM0zrF(1m4;@-4j}fqqep6D5Rd(OT-eq z-F}HwjX+5+R-#}jBF#f!2ngp&XPRnUV*~zQ5AibG6BZCvwaI2#5j-XaQ7ZzHGJ>N0 ztzr1`WRv=>>t6s%&$GEmUcxU3s`(DkSu6(e2~b_*AVhKd2*oLQ42Ieh?X>JvYF&Dr z1Oh{V^3QHiakCf(Ht%S0LuCYb5@~Z3$7m<{`l2{S%0&Z)R0X754}anYM&Y}K;nr8g z!l3GN`f*Oq#@mwCTDxH^+o6cwAe7e z`>ba}cArV{Ev7S-GkUB5ebim`Vb7AAk)GA1273@*>Ofp+^DvV(-{nr`Ar{yKq0ItZW|boOp8xU@C_Sp8VI}HsgX=lESS?<$PVU*u0wcCv!#KN|gC#Y0#ZTV|d;sA|;a=1|DB32G{+2C7B5AZli^@yK!DHz7Klykd+D(e<oaU$2V4IvieATDYsL0b!}2c(~%gAFT|Hl}hTK zMVESll`#wsO;Tr%9d)xW)2n+9J3N)ZRTQV!Cp>g8ib2)Axqz+y&aV!_arV7pyuE`ehe3*ht2;1gI7=Ax6+X3u2+HOMp188C9`@SBDwcfI`GCl$@`^P)NcEYaVjD{%C zWpcC2WwZ(5ry_|djk56O;}O4x2zGXNE9tMq?jX#I4G`B@_lck#Cjdjw*flp*+wr(I zA|k?FW9QQxkXO3D%-nNU8;Z`opcXxAC;a>r#gf^>OIFsJJ@i}%ibbvRyfS*Bb$s)a z3(#QzT?FvO_nPYl(x)bx@B?tVG9ee_&NX3ubuk}s+^(Z9W1@Lql;Sn>1w+4|3P%7i z{Y@dC6iFB35Lt^04e|Rw+z#Ph8jx9fmEwE+7Io)Sz3uC}0A!%hPHBO5Z#mwG(F=EA z92I04F_A^9Y7i`f^`*hVv!gCaeW!64 z^O^wlg(YDG1p{{9qQ59;D!K;fKRo;#IYh31U?3H4%by#jlS98wpMY?HZMYgWrq4Y= zaQE%sZ21-qR0xzk0E=?>u6R0AGRS3KvRjnq3joQAVAs+d+av#Zj ziv}Eo;$-(RLN(si#itQH0kGu2#gA_3jec+j`C4K-wJ`3$|E?U^6lFpZa^WahuhG)8 zRy?e!0_bxv1XcXjC9Pz&U%3`@^^})cSy|yWZq%hT*NCw}ogCFon$H9lov|PT%ut8d zGg4lXw)Lbz>xgxpqfimFoX1Pp1$x=T1lLE(>>B2lMqGrw&ImqSw=E=vSC#jxc7xXulV#T!NPJIv2MupRA!An5=kd^P5<3tHd$z874!8xEH$Yiynkw!*k?8|Fov6 zHY_YqpnJ)plRG~@f)hR|qg`v7xfZ=%=BUi^rzsW{O9q3TSgqkQdAVxm;sV;KxYcbWbkMHsIeb1k;fK literal 0 HcmV?d00001 diff --git a/qmk/etc/rev2/snappy_rev2_info.json b/qmk/etc/rev2/snappy_rev2_info.json new file mode 100644 index 0000000..5142669 --- /dev/null +++ b/qmk/etc/rev2/snappy_rev2_info.json @@ -0,0 +1,331 @@ +{ + "keyboard_name": "snappy - rev2", + "url": "", + "maintainer": "phga", + "layouts": { + "LAYOUT": { + "layout": [ + { + "x": 3, + "y": 0 + }, + { + "x": 11, + "y": 0 + }, + { + "x": 2, + "y": 0.125 + }, + { + "x": 4, + "y": 0.125 + }, + { + "x": 5, + "y": 0.125 + }, + { + "x": 6, + "y": 0.125 + }, + { + "x": 8, + "y": 0.125 + }, + { + "x": 9, + "y": 0.125 + }, + { + "x": 10, + "y": 0.125 + }, + { + "x": 12, + "y": 0.125 + }, + { + "x": 3, + "y": 1 + }, + { + "x": 11, + "y": 1 + }, + { + "x": 2, + "y": 1.125 + }, + { + "x": 4, + "y": 1.125 + }, + { + "x": 5, + "y": 1.125 + }, + { + "x": 6, + "y": 1.125 + }, + { + "x": 8, + "y": 1.125 + }, + { + "x": 9, + "y": 1.125 + }, + { + "x": 10, + "y": 1.125 + }, + { + "x": 12, + "y": 1.125 + }, + { + "x": 0, + "y": 1.375 + }, + { + "x": 1, + "y": 1.375 + }, + { + "x": 13, + "y": 1.375 + }, + { + "x": 14, + "y": 1.375 + }, + { + "x": 3, + "y": 2 + }, + { + "x": 11, + "y": 2 + }, + { + "x": 2, + "y": 2.125 + }, + { + "x": 4, + "y": 2.125 + }, + { + "x": 5, + "y": 2.125 + }, + { + "x": 6, + "y": 2.125 + }, + { + "x": 8, + "y": 2.125 + }, + { + "x": 9, + "y": 2.125 + }, + { + "x": 10, + "y": 2.125 + }, + { + "x": 12, + "y": 2.125 + }, + { + "x": 0, + "y": 2.375 + }, + { + "x": 1, + "y": 2.375 + }, + { + "x": 13, + "y": 2.375 + }, + { + "x": 14, + "y": 2.375 + }, + { + "x": 3, + "y": 3 + }, + { + "x": 11, + "y": 3 + }, + { + "x": 2, + "y": 3.125 + }, + { + "x": 4, + "y": 3.125 + }, + { + "x": 5, + "y": 3.125 + }, + { + "x": 6, + "y": 3.125 + }, + { + "x": 8, + "y": 3.125 + }, + { + "x": 9, + "y": 3.125 + }, + { + "x": 10, + "y": 3.125 + }, + { + "x": 12, + "y": 3.125 + }, + { + "x": 0, + "y": 3.375 + }, + { + "x": 1, + "y": 3.375 + }, + { + "x": 13, + "y": 3.375 + }, + { + "x": 14, + "y": 3.375 + }, + { + "x": 3, + "y": 4 + }, + { + "x": 11, + "y": 4 + }, + { + "x": 2, + "y": 4.125 + }, + { + "x": 4, + "y": 4.125 + }, + { + "x": 5, + "y": 4.125 + }, + { + "x": 6, + "y": 4.125 + }, + { + "x": 8, + "y": 4.125 + }, + { + "x": 9, + "y": 4.125 + }, + { + "x": 10, + "y": 4.125 + }, + { + "x": 12, + "y": 4.125 + }, + { + "x": 0, + "y": 4.375 + }, + { + "x": 1, + "y": 4.375 + }, + { + "x": 13, + "y": 4.375 + }, + { + "x": 14, + "y": 4.375 + }, + { + "x": 3, + "y": 5 + }, + { + "x": 11, + "y": 5 + }, + { + "x": 2, + "y": 5.125 + }, + { + "x": 4, + "y": 5.125 + }, + { + "x": 5, + "y": 5.125 + }, + { + "x": 6, + "y": 5.125 + }, + { + "x": 8, + "y": 5.125 + }, + { + "x": 9, + "y": 5.125 + }, + { + "x": 10, + "y": 5.125 + }, + { + "x": 12, + "y": 5.125 + }, + { + "x": 0, + "y": 5.375 + }, + { + "x": 1, + "y": 5.375 + }, + { + "x": 13, + "y": 5.375 + }, + { + "x": 14, + "y": 5.375 + } + ] + } + } +} \ No newline at end of file diff --git a/qmk/etc/rev2/snappy_rev2_via_keyboard_definition.json b/qmk/etc/rev2/snappy_rev2_via_keyboard_definition.json new file mode 100644 index 0000000..23fad34 --- /dev/null +++ b/qmk/etc/rev2/snappy_rev2_via_keyboard_definition.json @@ -0,0 +1,276 @@ +{ + "name": "snappy v2", + "vendorId": "0xCAFE", + "productId": "0x0002", + "matrix": { + "rows": 12, + "cols": 7 + }, + "layouts": { + "keymap": [ + [ + { + "x": 3 + }, + "0,3", + { + "x": 7 + }, + "6,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "0,2", + { + "x": 1 + }, + "0,4", + "0,5", + "0,6", + { + "x": 1 + }, + "6,6", + "6,5", + "6,4", + { + "x": 1 + }, + "6,2" + ], + [ + { + "y": -0.125, + "x": 3 + }, + "1,3", + { + "x": 7 + }, + "7,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "1,2", + { + "x": 1 + }, + "1,4", + "1,5", + "1,6", + { + "x": 1 + }, + "7,6", + "7,5", + "7,4", + { + "x": 1 + }, + "7,2" + ], + [ + { + "y": -0.75 + }, + "1,0", + "1,1", + { + "x": 11 + }, + "7,1", + "7,0" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "2,3", + { + "x": 7 + }, + "8,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "2,2", + { + "x": 1 + }, + "2,4", + "2,5", + "2,6", + { + "x": 1 + }, + "8,6", + "8,5", + "8,4", + { + "x": 1 + }, + "8,2" + ], + [ + { + "y": -0.75 + }, + "2,0", + "2,1", + { + "x": 11 + }, + "8,1", + "8,0" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "3,3", + { + "x": 7 + }, + "9,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "3,2", + { + "x": 1 + }, + "3,4", + "3,5", + "3,6", + { + "x": 1 + }, + "9,6", + "9,5", + "9,4", + { + "x": 1 + }, + "9,2" + ], + [ + { + "y": -0.75 + }, + "3,0", + "3,1", + { + "x": 11 + }, + "9,1", + "9,0" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "4,3", + { + "x": 7 + }, + "10,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "4,2", + { + "x": 1 + }, + "4,4", + "4,5", + "4,6", + { + "x": 1 + }, + "10,6", + "10,5", + "10,4", + { + "x": 1 + }, + "10,2" + ], + [ + { + "y": -0.75 + }, + "4,0", + "4,1", + { + "x": 11 + }, + "10,1", + "10,0" + ], + [ + { + "y": -0.375, + "x": 3 + }, + "5,3", + { + "x": 7 + }, + "11,3" + ], + [ + { + "y": -0.875, + "x": 2 + }, + "5,2", + { + "x": 1 + }, + "5,4", + "5,5", + "5,6", + { + "x": 1 + }, + "11,6", + "11,5", + "11,4", + { + "x": 1 + }, + "11,2" + ], + [ + { + "y": -0.75 + }, + "5,0", + "5,1", + { + "x": 11 + }, + "11,1", + "11,0" + ] + ] + } +} diff --git a/qmk/etc/rev3/flash_nuke.uf2 b/qmk/etc/rev3/flash_nuke.uf2 new file mode 100644 index 0000000000000000000000000000000000000000..31291e64cbc94f58b3f1e2b3ce822cf0518be383 GIT binary patch literal 25600 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 b37j{)64w@}aSnI_oyYu-?f CURRENTLY NOT WORKING) + sudo make snappy/rev3:default:uf2-split-left + sudo make snappy/rev3:default:uf2-split-right + + # REV3_5 (promicro rp2040) (WITHOUT info.json) + sudo make snappy/rev3_5:default:uf2-split-left + sudo make snappy/rev3_5:default:uf2-split-right + + # Make sure to mount the RP2040 drive to /media/snappy for automatic copying of the .uf2 file + +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). + +## Bootloader + +Enter the bootloader in 3 ways: + +### REV1 & REV2 +* **Physical Reset Button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in Layout**: Press the key mapped to `QK_BOOT` (REV1 & REV2) if it is available + +### REV3 (NOT WORKING) & REV3_5 +* **Physical Reset Button**: Hold the `boot` button while plugging in the MC OR hold `boot` and press `reset` +* **Physical Bootmagic Key**: Hold the `boot` button while plugging in the MC OR hold `boot` and press `reset` +* **Keycode in Layout**: Press the key mapped to `QK_BOOT` (REV3 & REV3_5) if it is available + +info.json spec: https://github.com/qmk/qmk_firmware/blob/master/docs/reference_info_json.md + +### VIA (Troubleshooting) + +On GNU/Linux while using Chrome to access VIA (https://usevia.app/) +Navigate to `chrome://device-log` find hidrawXYZ + + sudo chown $USER:$USER /dev/hidrawXYZ + +For now we have to upload the `snappy_revXYZ_via_keyboard_definition.json` located in the `/etc/` folder manually to the via website \ No newline at end of file diff --git a/qmk/snappy/config.h b/qmk/snappy/config.h new file mode 100644 index 0000000..3305d63 --- /dev/null +++ b/qmk/snappy/config.h @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once \ No newline at end of file diff --git a/qmk/snappy/readme.md b/qmk/snappy/readme.md new file mode 100644 index 0000000..f437598 --- /dev/null +++ b/qmk/snappy/readme.md @@ -0,0 +1,43 @@ +# snappy + +![snappy](imgur.com image replace me!) + +*A short description of the keyboard/project* + +* Keyboard Maintainer: [Philip Gaber](https://github.com/qhga) +* Hardware Supported: *The PCBs, controllers supported* +* Hardware Availability: *Links to where you can find this hardware* + +Make example for this keyboard (after setting up your build environment): + + make snappy:default + + # REV1 & REV2 (elite c) + sudo make snappy/rev2:default:dfu-split-left + sudo make snappy/rev2:default:dfu-split-right + + # REV3 (promicro rp2040) (info.json -> NOT WORKING) + sudo make snappy/rev3:default:uf2-split-left + sudo make snappy/rev3:default:uf2-split-right + + # REV3_5 (promicro rp2040) (WITHOUT info.json) + sudo make snappy/rev3_5:default:uf2-split-left + sudo make snappy/rev3_5:default:uf2-split-right + + # Make sure to mount the RP2040 drive to /media/snappy for automatic copying of the .uf2 file + +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). + +## Bootloader + +Enter the bootloader in 3 ways: + +### REV1 & REV2 +* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead +* **Keycode in layout**: Press the key mapped to `QK_BOOT` (REV1 & REV2) if it is available + +### REV3 (NOT WORKING) & REV3_5 +* **Physical reset button**: Hold the `boot` button while plugging in the MC OR hold `boot` and press `reset` +* **Keycode in layout**: Press the key mapped to `QK_BOOT` (REV3 & REV3_5) if it is available + +info.json spec: https://github.com/qmk/qmk_firmware/blob/master/docs/reference_info_json.md diff --git a/qmk/snappy/rev1/README.md b/qmk/snappy/rev1/README.md new file mode 100644 index 0000000..3dfae81 --- /dev/null +++ b/qmk/snappy/rev1/README.md @@ -0,0 +1,3 @@ +# Important + +At the moment, this uses some patches from drashna (https://github.com/drashna/qmk_firmware/tree/pointing/large_reports) to make the trackball a bit smoother \ No newline at end of file diff --git a/qmk/snappy/rev1/config.h b/qmk/snappy/rev1/config.h new file mode 100644 index 0000000..e69e228 --- /dev/null +++ b/qmk/snappy/rev1/config.h @@ -0,0 +1,72 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* key matrix size */ +#define MATRIX_ROWS 12 +#define MATRIX_COLS 7 + +/* + * 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 { D4, C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 } + +/* COL2ROW, ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* + * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN. + */ +#define SOFT_SERIAL_PIN D2 // or D1, D2, D3, E6 +// Other options: MASTER_RIGHT +/* #define MASTER_LEFT */ +// Set the handedness by writing it to EEPROM +// Plug in left side: +// sudo make snappy/rev2:default:dfu-split-left +// Plug in right side: +// sudo make snappy/rev2:default:dfu-split-right +#define EE_HANDS + +// Also required for the trackball (if one wants to use MOUSE_EXT_REPORT) +#define SPLIT_POINTING_ENABLE +#define POINTING_DEVICE_LEFT +#define POINTING_DEVICE_ROTATION_90 +// This option requires drashnas fork and makes the trackball a bit smoother +#define MOUSE_EXT_REPORT + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT + +/* Bootmagic Lite key configuration */ +//#define BOOTMAGIC_LITE_ROW 0 +//#define BOOTMAGIC_LITE_COLUMN 0 diff --git a/qmk/snappy/rev1/info.json b/qmk/snappy/rev1/info.json new file mode 100644 index 0000000..2768057 --- /dev/null +++ b/qmk/snappy/rev1/info.json @@ -0,0 +1,333 @@ +{ + "keyboard_name": "snappy", + "manufacturer": "phga", + "maintainer": "qhga", + "url": "", + "usb": { + "vid": "0xCAFE", + "pid": "0x0001", + "device_version": "1.0.0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { + "x": 3, + "y": 0 + }, + { + "x": 11, + "y": 0 + }, + { + "x": 2, + "y": 0.125 + }, + { + "x": 4, + "y": 0.125 + }, + { + "x": 5, + "y": 0.125 + }, + { + "x": 8, + "y": 0.125 + }, + { + "x": 9, + "y": 0.125 + }, + { + "x": 10, + "y": 0.125 + }, + { + "x": 12, + "y": 0.125 + }, + { + "x": 3, + "y": 1 + }, + { + "x": 11, + "y": 1 + }, + { + "x": 2, + "y": 1.125 + }, + { + "x": 4, + "y": 1.125 + }, + { + "x": 5, + "y": 1.125 + }, + { + "x": 6, + "y": 1.125 + }, + { + "x": 8, + "y": 1.125 + }, + { + "x": 9, + "y": 1.125 + }, + { + "x": 10, + "y": 1.125 + }, + { + "x": 12, + "y": 1.125 + }, + { + "x": 0, + "y": 1.375 + }, + { + "x": 1, + "y": 1.375 + }, + { + "x": 13, + "y": 1.375 + }, + { + "x": 14, + "y": 1.375 + }, + { + "x": 3, + "y": 2 + }, + { + "x": 11, + "y": 2 + }, + { + "x": 2, + "y": 2.125 + }, + { + "x": 4, + "y": 2.125 + }, + { + "x": 5, + "y": 2.125 + }, + { + "x": 6, + "y": 2.125 + }, + { + "x": 8, + "y": 2.125 + }, + { + "x": 9, + "y": 2.125 + }, + { + "x": 10, + "y": 2.125 + }, + { + "x": 12, + "y": 2.125 + }, + { + "x": 0, + "y": 2.375 + }, + { + "x": 1, + "y": 2.375 + }, + { + "x": 13, + "y": 2.375 + }, + { + "x": 14, + "y": 2.375 + }, + { + "x": 3, + "y": 3 + }, + { + "x": 11, + "y": 3 + }, + { + "x": 2, + "y": 3.125 + }, + { + "x": 4, + "y": 3.125 + }, + { + "x": 5, + "y": 3.125 + }, + { + "x": 6, + "y": 3.125 + }, + { + "x": 8, + "y": 3.125 + }, + { + "x": 9, + "y": 3.125 + }, + { + "x": 10, + "y": 3.125 + }, + { + "x": 12, + "y": 3.125 + }, + { + "x": 0, + "y": 3.375 + }, + { + "x": 1, + "y": 3.375 + }, + { + "x": 13, + "y": 3.375 + }, + { + "x": 14, + "y": 3.375 + }, + { + "x": 3, + "y": 4 + }, + { + "x": 11, + "y": 4 + }, + { + "x": 2, + "y": 4.125 + }, + { + "x": 4, + "y": 4.125 + }, + { + "x": 5, + "y": 4.125 + }, + { + "x": 6, + "y": 4.125 + }, + { + "x": 8, + "y": 4.125 + }, + { + "x": 9, + "y": 4.125 + }, + { + "x": 10, + "y": 4.125 + }, + { + "x": 12, + "y": 4.125 + }, + { + "x": 0, + "y": 4.375 + }, + { + "x": 1, + "y": 4.375 + }, + { + "x": 13, + "y": 4.375 + }, + { + "x": 14, + "y": 4.375 + }, + { + "x": 3, + "y": 5 + }, + { + "x": 11, + "y": 5 + }, + { + "x": 2, + "y": 5.125 + }, + { + "x": 4, + "y": 5.125 + }, + { + "x": 5, + "y": 5.125 + }, + { + "x": 6, + "y": 5.125 + }, + { + "x": 8, + "y": 5.125 + }, + { + "x": 9, + "y": 5.125 + }, + { + "x": 10, + "y": 5.125 + }, + { + "x": 12, + "y": 5.125 + }, + { + "x": 0, + "y": 5.375 + }, + { + "x": 1, + "y": 5.375 + }, + { + "x": 13, + "y": 5.375 + }, + { + "x": 14, + "y": 5.375 + } + ] + } + } +} diff --git a/qmk/snappy/rev1/keymaps/default/config.h b/qmk/snappy/rev1/keymaps/default/config.h new file mode 100644 index 0000000..cd65c5f --- /dev/null +++ b/qmk/snappy/rev1/keymaps/default/config.h @@ -0,0 +1,6 @@ +#pragma once + +#define USE_SERIAL + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev1/keymaps/default/keymap.c b/qmk/snappy/rev1/keymaps/default/keymap.c new file mode 100644 index 0000000..54ad975 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/default/keymap.c @@ -0,0 +1,241 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _DVORAK, + _SPECIAL, + _FUNCTION, + _GAMING, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC +}; + +#define OS_LSFT OSM(MOD_LSFT) + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * DVORAK + ***************************************************************************/ + // R1 (9) +#define _____FN1__FN2__FN3__FN4___ ____, KC_MS_BTN3, KC_MS_BTN1, KC_MS_BTN2 +#define _____FN5__FN6__FN7__FN8___ KC_5, KC_6, KC_7, QK_BOOT + // R2 (14) +#define _1_____2_____3_____4_____5 KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define _6_____7_____8_____9_____0 KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0 + // R3 (14) +#define QUOT__COMM__DOT____P_____Y KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DEL +#define _F_____G_____C_____R_____L KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L + // R4 (14) +#define _A_____O_____E_____U_____I KC_A, KC_O, KC_E, KC_U, KC_I, UM_PARN +#define _D_____H_____T_____N_____S UM_BRAC, KC_D, KC_H, KC_T, KC_N, KC_S + // R5 (14) +#define _EQL___Q_____J_____K_____X KC_EQL, KC_Q, KC_J, KC_K, KC_X, UM_PARN +#define _B_____M_____W_____V_____Z UM_BRAC, KC_B, KC_M, KC_W, KC_V, KC_Z + // R6 (14) +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LSFT, KC_LGUI, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_SCLN, OSL(_FUNCTION),____, ____, ____ + + [_DVORAK] = + LAYOUT_wrapper( + _____FN1__FN2__FN3__FN4___, TO(_GAMING),_____FN5__FN6__FN7__FN8___, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, QUOT__COMM__DOT____P_____Y, _F_____G_____C_____R_____L, KC_BSLS, + KC_ESC, _A_____O_____E_____U_____I, _D_____H_____T_____N_____S, KC_SLASH, + KC_LALT, _EQL___Q_____J_____K_____X, _B_____M_____W_____V_____Z, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ________SPECIAL_L1________ ____, ____, ____, ____, ____, ____ +#define ________SPECIAL_L2________ RALT(KC_Q), RALT(KC_P), RALT(KC_5), RALT(KC_Y), RALT(KC_S), ____ +#define ________SPECIAL_L3________ ____, ____, ____, ____, ____, ____ + +#define ________SPECIAL_R1________ ____, ____, ____, KC_UP, ____, ____ +#define ________SPECIAL_R2________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ________SPECIAL_R3________ ____, ____, ____, ____, ____, QK_BOOT + + [_SPECIAL]= + LAYOUT_wrapper( + _____FN1__FN2__FN3__FN4___, ____,_____FN5__FN6__FN7__FN8___, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, ________SPECIAL_L1________, ________SPECIAL_R1________, KC_BSLS, + KC_ESC, ________SPECIAL_L2________, ________SPECIAL_R2________, KC_SLASH, + KC_LALT, ________SPECIAL_L3________, ________SPECIAL_R3________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * FUNCTION + ***************************************************************************/ +#define _________FUNC_L0__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_L1__________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define _________FUNC_L2__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_L3__________ ____, ____, ____, ____, ____, ____ + +#define _________FUNC_R0__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_R1__________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define _________FUNC_R2__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_R3__________ ____, ____, ____, ____, ____, ____ + + [_FUNCTION] = + LAYOUT_wrapper( + _____FN1__FN2__FN3__FN4___, ____,_____FN5__FN6__FN7__FN8___, + KC_GRAVE,_________FUNC_L0__________, _________FUNC_R0__________, UM_CURL, + KC_TAB, _________FUNC_L1__________, _________FUNC_R1__________, KC_BSLS, + KC_ESC, _________FUNC_L2__________, _________FUNC_R2__________, KC_SLASH, + KC_LALT, _________FUNC_L3__________, _________FUNC_R3__________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + + /*************************************************************************** + * GAMING + ***************************************************************************/ +#define _Q_____W_____E_____R_____T KC_Q, KC_W, KC_E, KC_R, KC_T, ____ +#define _A_____S_____D_____F_____G KC_A, KC_S, KC_D, KC_F, KC_G, ____ +#define _Z_____X_____C_____V_____B KC_Z, KC_X, KC_C, KC_V, KC_B, ____ + +#define _Y_____U_____I_____O_____P ____, KC_Y, KC_U, KC_I, KC_O, KC_P +#define _H_____J_____K_____L____SCLN ____, KC_H, KC_J, KC_K, KC_L, KC_SCLN +#define _N_____M____COMM__DOT___SLSH ____, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH +#define ____GAMING_BOTTOM_LEFT____ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_ENT +#define ____GAMING_BOTTOM_RIGHT___ OS_LSFT, KC_SPC, KC_SCLN, ____, ____, ____, ____ + + [_GAMING] = + LAYOUT_wrapper( + _____FN1__FN2__FN3__FN4___, TO(_DVORAK),_____FN5__FN6__FN7__FN8___, + KC_ESC, _1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, _Q_____W_____E_____R_____T, _Y_____U_____I_____O_____P, KC_BSLS, + KC_LSFT,_A_____S_____D_____F_____G, _H_____J_____K_____L____SCLN, KC_SLASH, + KC_LSFT,_Z_____X_____C_____V_____B, _N_____M____COMM__DOT___SLSH, KC_LCTL, + ____GAMING_BOTTOM_LEFT____, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,192,240,248,252, 60, 30, 30, 30, 30, 30,190,252,252,120, 0, 0, 30,254,254,254,192,224,224,240,240,120,124,124,124,252,252,248,248,240,224, 0, 0, 0, 0, 0,192,224,240,248,248,124,124, 60, 60,120,248,252,254,254,252, 0, 0, 0,254,254,248,248,252,126, 62, 62, 30, 30, 30, 60, 60,252,248,248,240,128, 0, 0,252,252,240,240,240,252,124, 62, 62, 30, 30, 30, 30, 30, 62,254,254,252,240,192, 2, 6, 62,254,252,248,224,192, 0, 0, 2, 2, 6, 6, 6, 14, 14,238,254,254,252, 56, 0, 0, + 0, 0, 0, 0, 0, 7, 31, 63, 63,127,124,240,224,224,224,193,193,129, 0, 0, 0, 0, 0,255,255,255, 63, 15, 3, 1, 0, 0, 0, 0, 0, 0, 1,255,255,255,255, 0, 0, 0,252,255,255,255, 7, 3, 0, 0, 0, 0, 0, 0, 3,255,255,255,255, 0, 0, 0,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231,255,255,252, 0,255,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,255,255,255,255,248, 0, 0, 0, 3, 31, 63,255,255,252,240,224,128,192,240,252,255,127, 15, 7, 0, 0, 0, 0, + 0, 0,128,192,128,128, 0, 0, 0, 0, 0, 0, 1, 3, 7,159,255,255,254,248, 0, 0,254,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0,255,255,255,255,240,192,128,128,128,192,192,240,248,255,255,255,255, 0, 0, 0,255,255,255,255,224,192,192,192,128,128,128,192,224,240,252,255,255,127, 31, 0,255,255,255,255,255,248,192,128,128,128,128,128,128,224,248,255,255,255,127, 63, 7, 0, 0, 0, 0, 0, 0, 1, 31,255,255,255,255,255,255, 31, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 7, 7, 15, 14, 30, 30, 30, 30, 30, 30, 30, 31, 15, 7, 3, 0, 16, 24, 31, 15, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 24, 31, 31, 15, 7, 0, 0, 0, 0, 3, 7, 15, 15, 31, 31, 31, 31, 31, 15, 15, 7, 7, 7, 15, 31, 28, 24, 0,255,255,255,255, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 3, 3, 1, 0, 0, 0,255,255,255,255, 7, 7, 7, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,248,255,255, 63, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,192, 96, 32, 48, 24, 8, 8, 8, 8, 24,240, 96, 0, 0, 0, 0, 0, 0, 0,224, 48, 24, 8, 8, 8, 8,200,120, 0, 0, 0, 0, 0, 0, 0, 0,192, 96, 48, 16, 48, 32,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,224,248,252,255,255, 31, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 56, 84, 16, 16, 19, 30, 12, 12, 12, 14, 10, 10, 11, 25, 17, 16, 16, 16, 24, 8, 8, 8, 8, 9, 11, 14, 6, 6, 6, 15, 9, 8, 24, 16, 16, 16, 16, 16, 24, 8, 15, 12, 28, 52, 38, 35, 33, 48, 16, 16, 16, 16, 16, 16, 16, 24, 24, 28, 28, 30, 30, 31, 31, 31, 15, 15, 6, 0, 0, 0, 0, 0, 16, 24, 24, 28, 28, 28, 30, 30, 30, 31, 15, 15, 15, 6, 0, 0, 0, 0, 0, 0, 8, 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + + if (is_keyboard_master()) { + oled_write_P(PSTR(" "), false); + + switch(get_highest_layer(layer_state)) { + case _DVORAK: + oled_write_P(PSTR("DVORAK <3\n"), false); + break; + case _GAMING: + oled_write_P(PSTR("GAMING <3\n"), false); + break; + case _SPECIAL: + oled_write_P(PSTR("SPECIAL\n"), false); + break; + case _FUNCTION: + oled_write_P(PSTR("FUNCTION\n"), false); + break; + default: + oled_write_P(PSTR("UNDEFINED S.O.S\n"), false); + break; + } + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + render_logo(); + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +bool RLFW = false; +bool RLBO = false; +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING("}"); + } else { + SEND_STRING("{"); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + // Otherwise shift makes bracket into curly bracket + del_mods(MOD_MASK_SHIFT); + SEND_STRING("]"); + } else { + SEND_STRING("["); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING(")"); + } else { + SEND_STRING("("); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev1/keymaps/default/readme.md b/qmk/snappy/rev1/keymaps/default/readme.md new file mode 100644 index 0000000..c1a5a02 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for snappy diff --git a/qmk/snappy/rev1/keymaps/qwertz/config.h b/qmk/snappy/rev1/keymaps/qwertz/config.h new file mode 100644 index 0000000..cd65c5f --- /dev/null +++ b/qmk/snappy/rev1/keymaps/qwertz/config.h @@ -0,0 +1,6 @@ +#pragma once + +#define USE_SERIAL + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev1/keymaps/qwertz/keymap.c b/qmk/snappy/rev1/keymaps/qwertz/keymap.c new file mode 100644 index 0000000..dbd5400 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/qwertz/keymap.c @@ -0,0 +1,214 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _QWERTZ, + _SPECIAL, + _FUNCTION, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC +}; + +#define OS_LSFT OSM(MOD_LSFT) + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * QWERTZ + ***************************************************************************/ +#define Q____FN1__FN2__FN3__FN4___ KC_ESC, KC_MS_BTN3, KC_MS_BTN1, KC_MS_BTN2 +#define Q_FN5__FN6__FN7__FN8__FN9_ KC_F5, KC_F8, KC_F10, KC_F11, KC_F12 + +#define _1_____2_____3_____4_____5 KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define _6_____7_____8_____9_____0 KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0 + +#define _Q_____W_____E_____R_____T KC_Q, KC_W, KC_E, KC_R, KC_T, ____ +#define _A_____S_____D_____F_____G KC_A, KC_S, KC_D, KC_F, KC_G, ____ +#define _Y_____X_____C_____V_____B KC_Z, KC_X, KC_C, KC_V, KC_B, ____ + +#define _Z_____U_____I_____O_____P ____, KC_Y, KC_U, KC_I, KC_O, KC_P +#define _H_____J_____K_____L____OE ____, KC_H, KC_J, KC_K, KC_L, RALT(KC_P) +#define _N_____M____COMM__DOT_DASH ____, KC_N, KC_M, KC_COMM, KC_DOT, KC_MINS + +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LGUI, KC_LALT, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_COMM, OSL(_FUNCTION),____, ____, ____ + + [_QWERTZ] = + LAYOUT_wrapper( + Q____FN1__FN2__FN3__FN4___, Q_FN5__FN6__FN7__FN8__FN9_, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, KC_BSLS, + KC_TAB, _Q_____W_____E_____R_____T, _Z_____U_____I_____O_____P, RALT(KC_Y), + KC_ESC, _A_____S_____D_____F_____G, _H_____J_____K_____L____OE, RALT(KC_Q), + KC_LSFT, _Y_____X_____C_____V_____B, _N_____M____COMM__DOT_DASH, KC_RSFT, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ________SPECIAL_L1________ ____, ____, ____, ____, ____, ____ +#define ________SPECIAL_L2________ RALT(KC_Q), RALT(KC_P), RALT(KC_5), RALT(KC_Y), RALT(KC_S), ____ +#define ________SPECIAL_L3________ ____, ____, ____, ____, ____, ____ + +#define ________SPECIAL_R1________ ____, ____, ____, KC_UP, ____, ____ +#define ________SPECIAL_R2________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ________SPECIAL_R3________ ____, ____, ____, ____, ____, QK_BOOT + + [_SPECIAL]= + LAYOUT_wrapper( + Q____FN1__FN2__FN3__FN4___, Q_FN5__FN6__FN7__FN8__FN9_, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, ________SPECIAL_L1________, ________SPECIAL_R1________, KC_BSLS, + KC_ESC, ________SPECIAL_L2________, ________SPECIAL_R2________, KC_SLASH, + KC_LALT, ________SPECIAL_L3________, ________SPECIAL_R3________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * FUNCTION + ***************************************************************************/ +#define _________FUNC_L0__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_L1__________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define _________FUNC_L2__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_L3__________ ____, ____, ____, ____, ____, ____ + +#define _________FUNC_R0__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_R1__________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define _________FUNC_R2__________ ____, ____, ____, ____, ____, ____ +#define _________FUNC_R3__________ ____, ____, ____, ____, ____, ____ + + [_FUNCTION] = + LAYOUT_wrapper( + _____FN1__FN2__FN3__FN4___, ____,_____FN5__FN6__FN7__FN8___, + KC_GRAVE,_________FUNC_L0__________, _________FUNC_R0__________, UM_CURL, + KC_TAB, _________FUNC_L1__________, _________FUNC_R1__________, KC_BSLS, + KC_ESC, _________FUNC_L2__________, _________FUNC_R2__________, KC_SLASH, + KC_LALT, _________FUNC_L3__________, _________FUNC_R3__________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,192,240,248,252, 60, 30, 30, 30, 30, 30,190,252,252,120, 0, 0, 30,254,254,254,192,224,224,240,240,120,124,124,124,252,252,248,248,240,224, 0, 0, 0, 0, 0,192,224,240,248,248,124,124, 60, 60,120,248,252,254,254,252, 0, 0, 0,254,254,248,248,252,126, 62, 62, 30, 30, 30, 60, 60,252,248,248,240,128, 0, 0,252,252,240,240,240,252,124, 62, 62, 30, 30, 30, 30, 30, 62,254,254,252,240,192, 2, 6, 62,254,252,248,224,192, 0, 0, 2, 2, 6, 6, 6, 14, 14,238,254,254,252, 56, 0, 0, + 0, 0, 0, 0, 0, 7, 31, 63, 63,127,124,240,224,224,224,193,193,129, 0, 0, 0, 0, 0,255,255,255, 63, 15, 3, 1, 0, 0, 0, 0, 0, 0, 1,255,255,255,255, 0, 0, 0,252,255,255,255, 7, 3, 0, 0, 0, 0, 0, 0, 3,255,255,255,255, 0, 0, 0,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231,255,255,252, 0,255,255,255,255,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,255,255,255,255,248, 0, 0, 0, 3, 31, 63,255,255,252,240,224,128,192,240,252,255,127, 15, 7, 0, 0, 0, 0, + 0, 0,128,192,128,128, 0, 0, 0, 0, 0, 0, 1, 3, 7,159,255,255,254,248, 0, 0,254,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0,255,255,255,255,240,192,128,128,128,192,192,240,248,255,255,255,255, 0, 0, 0,255,255,255,255,224,192,192,192,128,128,128,192,224,240,252,255,255,127, 31, 0,255,255,255,255,255,248,192,128,128,128,128,128,128,224,248,255,255,255,127, 63, 7, 0, 0, 0, 0, 0, 0, 1, 31,255,255,255,255,255,255, 31, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 3, 7, 7, 15, 14, 30, 30, 30, 30, 30, 30, 30, 31, 15, 7, 3, 0, 16, 24, 31, 15, 15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 24, 31, 31, 15, 7, 0, 0, 0, 0, 3, 7, 15, 15, 31, 31, 31, 31, 31, 15, 15, 7, 7, 7, 15, 31, 28, 24, 0,255,255,255,255, 15, 15, 15, 15, 15, 15, 15, 15, 7, 7, 3, 3, 1, 0, 0, 0,255,255,255,255, 7, 7, 7, 15, 15, 15, 15, 15, 15, 7, 7, 7, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,248,255,255, 63, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,192, 96, 32, 48, 24, 8, 8, 8, 8, 24,240, 96, 0, 0, 0, 0, 0, 0, 0,224, 48, 24, 8, 8, 8, 8,200,120, 0, 0, 0, 0, 0, 0, 0, 0,192, 96, 48, 16, 48, 32,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,192,224,248,252,255,255, 31, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 56, 84, 16, 16, 19, 30, 12, 12, 12, 14, 10, 10, 11, 25, 17, 16, 16, 16, 24, 8, 8, 8, 8, 9, 11, 14, 6, 6, 6, 15, 9, 8, 24, 16, 16, 16, 16, 16, 24, 8, 15, 12, 28, 52, 38, 35, 33, 48, 16, 16, 16, 16, 16, 16, 16, 24, 24, 28, 28, 30, 30, 31, 31, 31, 15, 15, 6, 0, 0, 0, 0, 0, 16, 24, 24, 28, 28, 28, 30, 30, 30, 31, 15, 15, 15, 6, 0, 0, 0, 0, 0, 0, 8, 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + + if (is_keyboard_master()) { + oled_write_P(PSTR(" "), false); + + switch(get_highest_layer(layer_state)) { + case _DVORAK: + oled_write_P(PSTR("DVORAK <3\n"), false); + break; + case _GAMING: + oled_write_P(PSTR("GAMING <3\n"), false); + break; + case _SPECIAL: + oled_write_P(PSTR("SPECIAL\n"), false); + break; + case _FUNCTION: + oled_write_P(PSTR("FUNCTION\n"), false); + break; + default: + oled_write_P(PSTR("UNDEFINED S.O.S\n"), false); + break; + } + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + render_logo(); + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +bool RLFW = false; +bool RLBO = false; +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING("}"); + } else { + SEND_STRING("{"); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + // Otherwise shift makes bracket into curly bracket + del_mods(MOD_MASK_SHIFT); + SEND_STRING("]"); + } else { + SEND_STRING("["); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING(")"); + } else { + SEND_STRING("("); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev1/keymaps/qwertz/readme.md b/qmk/snappy/rev1/keymaps/qwertz/readme.md new file mode 100644 index 0000000..6762024 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/qwertz/readme.md @@ -0,0 +1 @@ +# A QWERTZ keymap for snappy diff --git a/qmk/snappy/rev1/keymaps/tima/config.h b/qmk/snappy/rev1/keymaps/tima/config.h new file mode 100644 index 0000000..80fa393 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/tima/config.h @@ -0,0 +1,10 @@ +#pragma once + +#define USE_SERIAL +// #define USE_I2C + +// #define MASTER_LEFT +// #define MASTER_RIGHT + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev1/keymaps/tima/keymap.c b/qmk/snappy/rev1/keymaps/tima/keymap.c new file mode 100644 index 0000000..105eb60 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/tima/keymap.c @@ -0,0 +1,199 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum layer_names { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, +}; + +#define OS_LSFT OSM(MOD_LSFT) + +#define LAYOUT_wrapper( ... ) LAYOUT(__VA_ARGS__) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*********************************************************************************** + * DEFAULT + ***********************************************************************************/ + + // R1 (9) +#define ___HSTG___F5___F9___HCM___MOUSE__ KC_BSLS, KC_F5, KC_F9, KC_EQL +#define _TO3___PLAY___VOUP___VODO___MUTE_ TO(_LAYER3), KC_MPLY, KC_MUTE, KC_VOLU, KC_VOLD + // R2 (14) +#define __ESC__1_____2_____3_____4_____5__PLS__ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_RBRC +#define __MIN__6_____7_____8_____9_____0__QST__ KC_SLSH, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS + // R3 (14) +#define __TAB__Q_____W_____E_____R_____T_RIBR3_ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, RALT(KC_8) +#define _LFBR3_Z_____U_____I_____O_____P___UE__ RALT(KC_9), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC + // R4 (14) +#define __ESC__A_____S_____D_____F_____G_RIBR1_ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8) +#define _LFBR1_H_____J_____K_____L_____OE__AE__ S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT + // R5 (14) +#define _SHFT__Y_____X_____C_____V_____B_RIBR2_ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, RALT(KC_7) +#define _LFBR2_N_____M____COM___DOT___MIN__SHFT RALT(KC_0), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT + // R6 (14) +#define ______________BOTTOM_LEFT______________ KC_LALT, KC_NUBS, KC_LCTL, MO(_LAYER1), KC_LGUI, KC_LCTL, KC_RALT +#define ______________BOTTOM_RIGHT_____________ KC_ENT, KC_SPC, KC_BSPC, MO(_LAYER2), KC_NO, KC_PSCR, OSM(MOD_LSFT) + + [_LAYER0] = + LAYOUT_wrapper( + ___HSTG___F5___F9___HCM___MOUSE__, _TO3___PLAY___VOUP___VODO___MUTE_, + __ESC__1_____2_____3_____4_____5__PLS__, __MIN__6_____7_____8_____9_____0__QST__, + __TAB__Q_____W_____E_____R_____T_RIBR3_, _LFBR3_Z_____U_____I_____O_____P___UE__, + __ESC__A_____S_____D_____F_____G_RIBR1_, _LFBR1_H_____J_____K_____L_____OE__AE__, + _SHFT__Y_____X_____C_____V_____B_RIBR2_, _LFBR2_N_____M____COM___DOT___MIN__SHFT, + ______________BOTTOM_LEFT______________, ______________BOTTOM_RIGHT_____________ + ), + + /*********************************************************************************** + * LAYER 1 + ***********************************************************************************/ + + // R1 (9) +#define ____________LAYER1_L1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define ____________LAYER1_R1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT + // R2 (14) +#define _______________LAYER1_L2_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R2_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS + // R3 (14) +#define _______________LAYER1_L3_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R3_______________ KC_NO, KC_NO, KC_LBRC, KC_NO, KC_SCLN, KC_NO, KC_BSLS + // R4 (14) +#define _______________LAYER1_L4_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R4_______________ KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_SLSH + // R5 (14) +#define _______________LAYER1_L5_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R5_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT, KC_NO + // R6 (14) +#define _______________LAYER1_L6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER1_R6_______________ KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + + [_LAYER1] = + LAYOUT_wrapper( + ____________LAYER1_L1____________, ____________LAYER1_R1____________, + _______________LAYER1_L2_______________, _______________LAYER1_R2_______________, + _______________LAYER1_L3_______________, _______________LAYER1_R3_______________, + _______________LAYER1_L4_______________, _______________LAYER1_R4_______________, + _______________LAYER1_L5_______________, _______________LAYER1_R5_______________, + _______________LAYER1_L6_______________, _______________LAYER1_R6_______________ + ), + + /*********************************************************************************** + * LAYER 2 + ***********************************************************************************/ + + // R1 (9) +#define ____________LAYER2_L1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define ____________LAYER2_R1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT + // R2 (14) +#define _______________LAYER2_L2_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER2_R2_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // R3 (14) +#define _______________LAYER2_L3_______________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define _______________LAYER2_R3_______________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS + // R4 (14) +#define _______________LAYER2_L4_______________ KC_TRNS, KC_QUOT, KC_MINS, KC_MS_BTN4, KC_MS_BTN5, KC_NO, KC_NO +#define _______________LAYER2_R4_______________ KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, KC_NO, KC_SLSH + // R5 (14) +#define _______________LAYER2_L5_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER2_R5_______________ KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_NO, KC_NO, KC_NO, KC_NO + // R6 (14) +#define _______________LAYER2_L6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER2_R6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + + [_LAYER2] = + LAYOUT_wrapper( + ____________LAYER2_L1____________, ____________LAYER2_R1____________, + _______________LAYER2_L2_______________, _______________LAYER2_R2_______________, + _______________LAYER2_L3_______________, _______________LAYER2_R3_______________, + _______________LAYER2_L4_______________, _______________LAYER2_R4_______________, + _______________LAYER2_L5_______________, _______________LAYER2_R5_______________, + _______________LAYER2_L6_______________, _______________LAYER2_R6_______________ + ), + + /*********************************************************************************** + * LAYER 3 + ***********************************************************************************/ + + // R1 (9) +#define ____________LAYER3_L1____________ KC_F1, KC_F2, KC_F3, KC_F4 +#define ____________LAYER3_R1____________ TO(_LAYER0), KC_NO, KC_NO, KC_NO, KC_DEL + // R2 (14) +#define _______________LAYER3_L2_______________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6 +#define _______________LAYER3_R2_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO + // R3 (14) +#define _______________LAYER3_L3_______________ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y +#define _______________LAYER3_R3_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO + // R4 (14) +#define _______________LAYER3_L4_______________ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H +#define _______________LAYER3_R4_______________ KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO + // R5 (14) +#define _______________LAYER3_L5_______________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N +#define _______________LAYER3_R5_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO + // R6 (14) +#define _______________LAYER3_L6_______________ KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_TRNS +#define _______________LAYER3_R6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT + + [_LAYER3] = + LAYOUT_wrapper( + ____________LAYER3_L1____________, ____________LAYER3_R1____________, + _______________LAYER3_L2_______________, _______________LAYER3_R2_______________, + _______________LAYER3_L3_______________, _______________LAYER3_R3_______________, + _______________LAYER3_L4_______________, _______________LAYER3_R4_______________, + _______________LAYER3_L5_______________, _______________LAYER3_R5_______________, + _______________LAYER3_L6_______________, _______________LAYER3_R6_______________ + ), +}; + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 192, 192, 224, 240, 240, 248, 248, 252, 252, 254, 254, 252, 252, 248, 248, 240, 224, 224, 192, 192, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 224, 240, 240, 248, 248, 252, 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 252, 252, 120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63, 127, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 63, 63, 31, 31, 143, 143, 135, 131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 129, 131, 195, 195, 227, 241, 241, 248, 248, 252, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 252, 252, 248, 240, 240, 224, 224, 192, 192, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60, 126, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63, 127, 255, 255, 255, 127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + + if (is_keyboard_master()) { + oled_write_P(PSTR("\n "), false); + switch(get_highest_layer(layer_state)) { + case _LAYER0: + oled_write_P(PSTR("Default\n"),false); + break; + case _LAYER1: + oled_write_P(PSTR("Lower\n"),false); + break; + case _LAYER2: + oled_write_P(PSTR("Upper\n"),false); + break; + case _LAYER3: + oled_write_P(PSTR("Gaming\n"),false); + break; + } + } else { + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + // debug_enable=true; + // debug_matrix=true; + // debug_keyboard=true; + // debug_mouse=true; +} \ No newline at end of file diff --git a/qmk/snappy/rev1/keymaps/tima/readme.md b/qmk/snappy/rev1/keymaps/tima/readme.md new file mode 100644 index 0000000..6762024 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/tima/readme.md @@ -0,0 +1 @@ +# A QWERTZ keymap for snappy diff --git a/qmk/snappy/rev1/keymaps/tima/rules.mk b/qmk/snappy/rev1/keymaps/tima/rules.mk new file mode 100644 index 0000000..74c71e0 --- /dev/null +++ b/qmk/snappy/rev1/keymaps/tima/rules.mk @@ -0,0 +1,3 @@ +# Special features +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes \ No newline at end of file diff --git a/qmk/snappy/rev1/rev1.c b/qmk/snappy/rev1/rev1.c new file mode 100644 index 0000000..1e3aed7 --- /dev/null +++ b/qmk/snappy/rev1/rev1.c @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rev1.h" diff --git a/qmk/snappy/rev1/rev1.h b/qmk/snappy/rev1/rev1.h new file mode 100644 index 0000000..605bb01 --- /dev/null +++ b/qmk/snappy/rev1/rev1.h @@ -0,0 +1,38 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +#define LAYOUT( \ + L02, L03, L04, L05, R06, R05, R04, R03, R02, \ + L10, L11, L12, L13, L14, L15, L16, R16, R15, R14, R13, R12, R11, R10, \ + L20, L21, L22, L23, L24, L25, L26, R26, R25, R24, R23, R22, R21, R20, \ + L30, L31, L32, L33, L34, L35, L36, R36, R35, R34, R33, R32, R31, R30, \ + L40, L41, L42, L43, L44, L45, L46, R46, R45, R44, R43, R42, R41, R40, \ + L50, L51, L52, L53, L54, L55, L56, R56, R55, R54, R53, R52, R51, R50 \ + ) \ + { \ + { KC_NO, KC_NO, L02, L03, L04, L05, KC_NO }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { L40, L41, L42, L43, L44, L45, L46 }, \ + { L50, L51, L52, L53, L54, L55, L56 }, \ + { KC_NO, KC_NO, R02, R03, R04, R05, R06 }, \ + { R10, R11, R12, R13, R14, R15, R16 }, \ + { R20, R21, R22, R23, R24, R25, R26 }, \ + { R30, R31, R32, R33, R34, R35, R36 }, \ + { R40, R41, R42, R43, R44, R45, R46 }, \ + { R50, R51, R52, R53, R54, R55, R56 } \ + } diff --git a/qmk/snappy/rev1/rules.mk b/qmk/snappy/rev1/rules.mk new file mode 100644 index 0000000..15502cf --- /dev/null +++ b/qmk/snappy/rev1/rules.mk @@ -0,0 +1,17 @@ +# MCU name +MCU = atmega32u4 +# MCU = liatris +PIN_COMPATIBLE = elite_c +# Bootloader selection +BOOTLOADER = atmel-dfu +SPLIT_KEYBOARD = yes + +# Oled support +OLED_ENABLE = yes +OLED_DRIVER = ssd1306 + +# Trackball support (disable if not used) +MOUSEKEY_ENABLE = no +POINTING_DEVICE_ENABLE = no +SPLIT_POINTING_ENABLE = no +POINTING_DEVICE_DRIVER = pimoroni_trackball diff --git a/qmk/snappy/rev2/config.h b/qmk/snappy/rev2/config.h new file mode 100644 index 0000000..4143bbc --- /dev/null +++ b/qmk/snappy/rev2/config.h @@ -0,0 +1,68 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* key matrix size */ +#define MATRIX_ROWS 12 +#define MATRIX_COLS 7 + +/* + * 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 { D4, C6, D7, E6, B4, B5 } +#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 } + +/* COL2ROW, ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* + * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN. + */ +#define SOFT_SERIAL_PIN D2 // or D1, D2, D3, E6 +// Set the handedness manually +/* #define MASTER_LEFT */ +/* #define MASTER_RIGHT */ + +// Set the handedness by writing it to EEPROM +// Plug in left side: +// sudo make snappy/rev2:default:dfu-split-left +// Plug in right side: +// sudo make snappy/rev2:default:dfu-split-right +#define EE_HANDS + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 15 +#define USB_POLLING_INTERVAL_MS 1 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT + +/* Bootmagic Lite key configuration */ +//#define BOOTMAGIC_LITE_ROW 0 +//#define BOOTMAGIC_LITE_COLUMN 0 \ No newline at end of file diff --git a/qmk/snappy/rev2/info.json b/qmk/snappy/rev2/info.json new file mode 100644 index 0000000..00ef100 --- /dev/null +++ b/qmk/snappy/rev2/info.json @@ -0,0 +1,337 @@ +{ + "keyboard_name": "snappy v2", + "manufacturer": "phga", + "maintainer": "qhga", + "url": "", + "usb": { + "vid": "0xCAFE", + "pid": "0x0002", + "device_version": "2.0.0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { + "x": 3, + "y": 0 + }, + { + "x": 11, + "y": 0 + }, + { + "x": 2, + "y": 0.125 + }, + { + "x": 4, + "y": 0.125 + }, + { + "x": 5, + "y": 0.125 + }, + { + "x": 6, + "y": 0.125 + }, + { + "x": 8, + "y": 0.125 + }, + { + "x": 9, + "y": 0.125 + }, + { + "x": 10, + "y": 0.125 + }, + { + "x": 12, + "y": 0.125 + }, + { + "x": 3, + "y": 1 + }, + { + "x": 11, + "y": 1 + }, + { + "x": 2, + "y": 1.125 + }, + { + "x": 4, + "y": 1.125 + }, + { + "x": 5, + "y": 1.125 + }, + { + "x": 6, + "y": 1.125 + }, + { + "x": 8, + "y": 1.125 + }, + { + "x": 9, + "y": 1.125 + }, + { + "x": 10, + "y": 1.125 + }, + { + "x": 12, + "y": 1.125 + }, + { + "x": 0, + "y": 1.375 + }, + { + "x": 1, + "y": 1.375 + }, + { + "x": 13, + "y": 1.375 + }, + { + "x": 14, + "y": 1.375 + }, + { + "x": 3, + "y": 2 + }, + { + "x": 11, + "y": 2 + }, + { + "x": 2, + "y": 2.125 + }, + { + "x": 4, + "y": 2.125 + }, + { + "x": 5, + "y": 2.125 + }, + { + "x": 6, + "y": 2.125 + }, + { + "x": 8, + "y": 2.125 + }, + { + "x": 9, + "y": 2.125 + }, + { + "x": 10, + "y": 2.125 + }, + { + "x": 12, + "y": 2.125 + }, + { + "x": 0, + "y": 2.375 + }, + { + "x": 1, + "y": 2.375 + }, + { + "x": 13, + "y": 2.375 + }, + { + "x": 14, + "y": 2.375 + }, + { + "x": 3, + "y": 3 + }, + { + "x": 11, + "y": 3 + }, + { + "x": 2, + "y": 3.125 + }, + { + "x": 4, + "y": 3.125 + }, + { + "x": 5, + "y": 3.125 + }, + { + "x": 6, + "y": 3.125 + }, + { + "x": 8, + "y": 3.125 + }, + { + "x": 9, + "y": 3.125 + }, + { + "x": 10, + "y": 3.125 + }, + { + "x": 12, + "y": 3.125 + }, + { + "x": 0, + "y": 3.375 + }, + { + "x": 1, + "y": 3.375 + }, + { + "x": 13, + "y": 3.375 + }, + { + "x": 14, + "y": 3.375 + }, + { + "x": 3, + "y": 4 + }, + { + "x": 11, + "y": 4 + }, + { + "x": 2, + "y": 4.125 + }, + { + "x": 4, + "y": 4.125 + }, + { + "x": 5, + "y": 4.125 + }, + { + "x": 6, + "y": 4.125 + }, + { + "x": 8, + "y": 4.125 + }, + { + "x": 9, + "y": 4.125 + }, + { + "x": 10, + "y": 4.125 + }, + { + "x": 12, + "y": 4.125 + }, + { + "x": 0, + "y": 4.375 + }, + { + "x": 1, + "y": 4.375 + }, + { + "x": 13, + "y": 4.375 + }, + { + "x": 14, + "y": 4.375 + }, + { + "x": 3, + "y": 5 + }, + { + "x": 11, + "y": 5 + }, + { + "x": 2, + "y": 5.125 + }, + { + "x": 4, + "y": 5.125 + }, + { + "x": 5, + "y": 5.125 + }, + { + "x": 6, + "y": 5.125 + }, + { + "x": 8, + "y": 5.125 + }, + { + "x": 9, + "y": 5.125 + }, + { + "x": 10, + "y": 5.125 + }, + { + "x": 12, + "y": 5.125 + }, + { + "x": 0, + "y": 5.375 + }, + { + "x": 1, + "y": 5.375 + }, + { + "x": 13, + "y": 5.375 + }, + { + "x": 14, + "y": 5.375 + } + ] + } + } +} diff --git a/qmk/snappy/rev2/keymaps/default/config.h b/qmk/snappy/rev2/keymaps/default/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev2/keymaps/default/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev2/keymaps/default/keymap.c b/qmk/snappy/rev2/keymaps/default/keymap.c new file mode 100644 index 0000000..dfd6558 --- /dev/null +++ b/qmk/snappy/rev2/keymaps/default/keymap.c @@ -0,0 +1,222 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _DVORAK, + _SPECIAL, + _GAMING, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, + UM_SPAM, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) +/* #define OS_LGUI OSM(MOD_LGUI) */ +/* #define OS_LALT OSM(MOD_LALT) */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * DVORAK + ***************************************************************************/ + // R1 (10) +#define D_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define D_FN6__FN7__FN8__FN9__FN0_ TO(_GAMING), KC_F8, KC_F10, KC_F12, ____ + // R2 (14) +#define _1_____2_____3_____4_____5 KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define _6_____7_____8_____9_____0 KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0 + // R3 (14) +#define QUOT__COMM__DOT____P_____Y KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DEL +#define _F_____G_____C_____R_____L KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L + // R4 (14) +#define _A_____O_____E_____U_____I KC_A, KC_O, KC_E, KC_U, KC_I, UM_PARN +#define _D_____H_____T_____N_____S KC_COLN, KC_D, KC_H, KC_T, KC_N, KC_S + // R5 (14) +#define _EQL___Q_____J_____K_____X KC_EQL, KC_Q, KC_J, KC_K, KC_X, UM_PARN +#define _B_____M_____W_____V_____Z UM_BRAC, KC_B, KC_M, KC_W, KC_V, KC_Z + // R6 (14) +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LSFT, KC_LALT, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_SCLN, ____, ____, ____, KC_LALT + + [_DVORAK] = + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, QUOT__COMM__DOT____P_____Y, _F_____G_____C_____R_____L, KC_BSLS, + KC_ESC, _A_____O_____E_____U_____I, _D_____H_____T_____N_____S, KC_SLASH, + KC_LGUI, _EQL___Q_____J_____K_____X, _B_____M_____W_____V_____Z, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ________SPECIAL_L0________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define ________SPECIAL_L1________ ____, ____, ____, ____, ____, ____ +#define ________SPECIAL_L2________ RALT(KC_Q), RALT(KC_P), RALT(KC_5), RALT(KC_Y), RALT(KC_S), ____ +#define ________SPECIAL_L3________ ____, ____, ____, ____, ____, ____ + +#define ________SPECIAL_R0________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define ________SPECIAL_R1________ ____, ____, ____, KC_UP, ____, ____ +#define ________SPECIAL_R2________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ________SPECIAL_R3________ ____, ____, ____, ____, ____, QK_BOOT + + [_SPECIAL]= + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,________SPECIAL_L0________, ________SPECIAL_R0________, UM_CURL, + KC_TAB, ________SPECIAL_L1________, ________SPECIAL_R1________, KC_BSLS, + KC_ESC, ________SPECIAL_L2________, ________SPECIAL_R2________, KC_SLASH, + KC_LGUI, ________SPECIAL_L3________, ________SPECIAL_R3________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * GAMING + ***************************************************************************/ +#define G_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define G_FN6__FN7__FN8__FN9__FN0_ TO(_DVORAK), KC_F8, KC_F10, KC_F12, ____ +#define _Q_____W_____E_____R_____T KC_Q, KC_W, KC_E, KC_R, KC_T, ____ +#define _A_____S_____D_____F_____G KC_A, KC_S, KC_D, KC_F, KC_G, ____ +#define _Z_____X_____C_____V_____B KC_Z, KC_X, KC_C, KC_V, KC_B, ____ + +#define _Y_____U_____I_____O_____P ____, KC_Y, KC_U, KC_I, KC_O, KC_P +#define _H_____J_____K_____L__SCLN ____, KC_H, KC_J, KC_K, KC_L, KC_SCLN +#define _N_____M____COMM__DOT___UP ____, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP +#define ____GAMING_BOTTOM_LEFT____ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_ENT +#define ____GAMING_BOTTOM_RIGHT___ OS_LSFT, KC_SPC, KC_BSPC, UM_SPAM, KC_LEFT, KC_DOWN, KC_RIGHT + + [_GAMING] = + LAYOUT_wrapper( + G_FN1__FN2__FN3__FN4__FN5_, G_FN6__FN7__FN8__FN9__FN0_, + KC_ESC, _1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, _Q_____W_____E_____R_____T, _Y_____U_____I_____O_____P, KC_BSLS, + KC_LSFT,_A_____S_____D_____F_____G, _H_____J_____K_____L__SCLN, KC_SLASH, + KC_LSFT,_Z_____X_____C_____V_____B, _N_____M____COMM__DOT___UP, KC_LCTL, + ____GAMING_BOTTOM_LEFT____, ____GAMING_BOTTOM_RIGHT___ + ), +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_DVORAK] = "DVORAK"; + layer_names[_SPECIAL] = "SPECIAL"; + layer_names[_GAMING] = "GAMING"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +bool RLFW = false; +bool RLBO = false; +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_SPAM: + if (record->event.pressed) { + SEND_STRING("k"SS_DELAY(80)"k"); + } + return false; + break; + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING("}"); + } else { + SEND_STRING("{"); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + // Otherwise shift makes bracket into curly bracket + del_mods(MOD_MASK_SHIFT); + SEND_STRING("]"); + } else { + SEND_STRING("["); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING(")"); + } else { + SEND_STRING("("); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev2/keymaps/default/readme.md b/qmk/snappy/rev2/keymaps/default/readme.md new file mode 100644 index 0000000..c1a5a02 --- /dev/null +++ b/qmk/snappy/rev2/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for snappy diff --git a/qmk/snappy/rev2/keymaps/qwertz/config.h b/qmk/snappy/rev2/keymaps/qwertz/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev2/keymaps/qwertz/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev2/keymaps/qwertz/keymap.c b/qmk/snappy/rev2/keymaps/qwertz/keymap.c new file mode 100644 index 0000000..4ce4b2d --- /dev/null +++ b/qmk/snappy/rev2/keymaps/qwertz/keymap.c @@ -0,0 +1,181 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _QWERTZ, + _SPECIAL, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * QWERTZ + ***************************************************************************/ +#define _FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define SP__1_____2_____3_____4_____5__SP QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define SP__Q_____W_____E_____R_____T__SP KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, UM_CURL +#define SP__A_____S_____D_____F_____G__SP OS_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, UM_PARN +#define SP__Y_____X_____C_____V_____B__SP OS_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NUBS + +#define _FN6__FN7__FN8__FN9__FN0_ TO(_SPECIAL), KC_F8, KC_F10, KC_F12, KC_GRV +#define SP__6_____7_____8_____9_____0__SP KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS +#define SP__Z_____U_____I_____O_____P__SP KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC +#define SP__H_____J_____K_____L____OE__SP KC_NUHS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT +#define SP__N_____M____COMM__DOT_DASH__SP UM_BRAC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OS_LSFT + +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LALT, ____, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_RALT, ____, ____, ____, KC_EQL + + [_QWERTZ] = + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + SP__1_____2_____3_____4_____5__SP, SP__6_____7_____8_____9_____0__SP, + SP__Q_____W_____E_____R_____T__SP, SP__Z_____U_____I_____O_____P__SP, + SP__A_____S_____D_____F_____G__SP, SP__H_____J_____K_____L____OE__SP, + SP__Y_____X_____C_____V_____B__SP, SP__N_____M____COMM__DOT_DASH__SP, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ___________SPECIAL_L0___________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7 +#define ___________SPECIAL_L1___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L2___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L3___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_R0___________ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14 +#define ___________SPECIAL_R1___________ ____, ____, ____, KC_UP, ____, ____, ____ +#define ___________SPECIAL_R2___________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____, ____ +#define ___________SPECIAL_R3___________ ____, ____, ____, ____, ____, QK_BOOT, ____ + + [_SPECIAL]= + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + ___________SPECIAL_L0___________, ___________SPECIAL_R0___________, + ___________SPECIAL_L1___________, ___________SPECIAL_R1___________, + ___________SPECIAL_L2___________, ___________SPECIAL_R2___________, + ___________SPECIAL_L3___________, ___________SPECIAL_R3___________, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_QWERTZ] = "QWERTZ"; + layer_names[_SPECIAL] = "SPECIAL"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("0")); + } else { + SEND_STRING(SS_RALT("7")); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("9")); + } else { + SEND_STRING(SS_RALT("8")); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_LSFT("9")); + } else { + SEND_STRING(SS_LSFT("8")); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev2/keymaps/qwertz/readme.md b/qmk/snappy/rev2/keymaps/qwertz/readme.md new file mode 100644 index 0000000..5ab2b13 --- /dev/null +++ b/qmk/snappy/rev2/keymaps/qwertz/readme.md @@ -0,0 +1 @@ +# The qwertz keymap for snappy diff --git a/qmk/snappy/rev2/rev2.c b/qmk/snappy/rev2/rev2.c new file mode 100644 index 0000000..2e80e7d --- /dev/null +++ b/qmk/snappy/rev2/rev2.c @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rev2.h" diff --git a/qmk/snappy/rev2/rev2.h b/qmk/snappy/rev2/rev2.h new file mode 100644 index 0000000..6079eec --- /dev/null +++ b/qmk/snappy/rev2/rev2.h @@ -0,0 +1,38 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +#define LAYOUT( \ + L02, L03, L04, L05, L06, R06, R05, R04, R03, R02, \ + L10, L11, L12, L13, L14, L15, L16, R16, R15, R14, R13, R12, R11, R10, \ + L20, L21, L22, L23, L24, L25, L26, R26, R25, R24, R23, R22, R21, R20, \ + L30, L31, L32, L33, L34, L35, L36, R36, R35, R34, R33, R32, R31, R30, \ + L40, L41, L42, L43, L44, L45, L46, R46, R45, R44, R43, R42, R41, R40, \ + L50, L51, L52, L53, L54, L55, L56, R56, R55, R54, R53, R52, R51, R50 \ + ) \ + { \ + { KC_NO, KC_NO, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { L40, L41, L42, L43, L44, L45, L46 }, \ + { L50, L51, L52, L53, L54, L55, L56 }, \ + { KC_NO, KC_NO, R02, R03, R04, R05, R06 }, \ + { R10, R11, R12, R13, R14, R15, R16 }, \ + { R20, R21, R22, R23, R24, R25, R26 }, \ + { R30, R31, R32, R33, R34, R35, R36 }, \ + { R40, R41, R42, R43, R44, R45, R46 }, \ + { R50, R51, R52, R53, R54, R55, R56 } \ + } diff --git a/qmk/snappy/rev2/rules.mk b/qmk/snappy/rev2/rules.mk new file mode 100644 index 0000000..8c97ea3 --- /dev/null +++ b/qmk/snappy/rev2/rules.mk @@ -0,0 +1,22 @@ +# MCU name +MCU = atmega32u4 +# MCU = liatris +PIN_COMPATIBLE = elite_c +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Oled support +OLED_ENABLE = yes +OLED_DRIVER = ssd1306 +SPLIT_KEYBOARD = yes + +DEBOUNCE_TYPE = sym_eager_pk + +# Dynamic Layout Configuration +VIA_ENABLE = yes + +# Trackball support (disable if not used) +# MOUSEKEY_ENABLE = no +# POINTING_DEVICE_ENABLE = no +# SPLIT_POINTING_ENABLE = no +# POINTING_DEVICE_DRIVER = pimoroni_trackball diff --git a/qmk/snappy/rev3/config.h b/qmk/snappy/rev3/config.h new file mode 100644 index 0000000..8d3bf6e --- /dev/null +++ b/qmk/snappy/rev3/config.h @@ -0,0 +1,9 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once +// Set the handedness by writing it to EEPROM +#define EE_HANDS +/* #define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. */ +/* #define SERIAL_USART_TX_PIN GP0 // USART TX pin */ +/* #define SERIAL_USART_RX_PIN GP1 // USART RX pin */ diff --git a/qmk/snappy/rev3/info.json b/qmk/snappy/rev3/info.json new file mode 100644 index 0000000..fd3272a --- /dev/null +++ b/qmk/snappy/rev3/info.json @@ -0,0 +1,711 @@ +{ + "keyboard_name": "snappy v3", + "manufacturer": "phga", + "maintainer": "qhga", + "url": "", + "usb": { + "vid": "0xCAFE", + "pid": "0x1337", + "device_version": "3.0.0", + "polling_interval": 1 + }, + "qmk": { + "locking": { + "enabled": true, + "resync": true + } + }, + "bootloader": "rp2040", + "processor": "RP2040", + "diode_direction": "COL2ROW", + "matrix_pins": { + "cols": [ + "GP28", + "GP27", + "GP26", + "GP22", + "GP20", + "GP23", + "GP21" + ], + "rows": [ + "GP4", + "GP5", + "GP6", + "GP7", + "GP8", + "GP9" + ] + }, + "split": { + "enabled": true, + "transport": { + "protocol": "serial_usart" + }, + "bootmagic": { + "matrix": [ + 0, + 0 + ] + } + }, + "features": { + "bootmagic": true, + "nkro": true, + "command": false, + "console": false, + "backlight": false, + "rgblight": false, + "audio": false + }, + "build": { + "debounce_type": "sym_eager_pk" + }, + "debounce": 15, + "layouts": { + "LAYOUT": { + "layout": [ + { + "matrix": [ + 0, + 3 + ], + "x": 3, + "y": 0 + }, + { + "matrix": [ + 6, + 3 + ], + "x": 11, + "y": 0 + }, + { + "matrix": [ + 0, + 2 + ], + "x": 2, + "y": 0.125 + }, + { + "matrix": [ + 0, + 4 + ], + "x": 4, + "y": 0.125 + }, + { + "matrix": [ + 0, + 5 + ], + "x": 5, + "y": 0.125 + }, + { + "matrix": [ + 0, + 6 + ], + "x": 6, + "y": 0.125 + }, + { + "matrix": [ + 6, + 0 + ], + "x": 8, + "y": 0.125 + }, + { + "matrix": [ + 6, + 1 + ], + "x": 9, + "y": 0.125 + }, + { + "matrix": [ + 6, + 2 + ], + "x": 10, + "y": 0.125 + }, + { + "matrix": [ + 6, + 4 + ], + "x": 12, + "y": 0.125 + }, + { + "matrix": [ + 1, + 3 + ], + "x": 3, + "y": 1 + }, + { + "matrix": [ + 7, + 3 + ], + "x": 11, + "y": 1 + }, + { + "matrix": [ + 1, + 2 + ], + "x": 2, + "y": 1.125 + }, + { + "matrix": [ + 1, + 4 + ], + "x": 4, + "y": 1.125 + }, + { + "matrix": [ + 1, + 5 + ], + "x": 5, + "y": 1.125 + }, + { + "matrix": [ + 1, + 6 + ], + "x": 6, + "y": 1.125 + }, + { + "matrix": [ + 7, + 0 + ], + "x": 8, + "y": 1.125 + }, + { + "matrix": [ + 7, + 1 + ], + "x": 9, + "y": 1.125 + }, + { + "matrix": [ + 7, + 2 + ], + "x": 10, + "y": 1.125 + }, + { + "matrix": [ + 7, + 4 + ], + "x": 12, + "y": 1.125 + }, + { + "matrix": [ + 1, + 0 + ], + "x": 0, + "y": 1.375 + }, + { + "matrix": [ + 1, + 1 + ], + "x": 1, + "y": 1.375 + }, + { + "matrix": [ + 7, + 5 + ], + "x": 13, + "y": 1.375 + }, + { + "matrix": [ + 7, + 6 + ], + "x": 14, + "y": 1.375 + }, + { + "matrix": [ + 2, + 3 + ], + "x": 3, + "y": 2 + }, + { + "matrix": [ + 8, + 3 + ], + "x": 11, + "y": 2 + }, + { + "matrix": [ + 2, + 2 + ], + "x": 2, + "y": 2.125 + }, + { + "matrix": [ + 2, + 4 + ], + "x": 4, + "y": 2.125 + }, + { + "matrix": [ + 2, + 5 + ], + "x": 5, + "y": 2.125 + }, + { + "matrix": [ + 2, + 6 + ], + "x": 6, + "y": 2.125 + }, + { + "matrix": [ + 8, + 0 + ], + "x": 8, + "y": 2.125 + }, + { + "matrix": [ + 8, + 1 + ], + "x": 9, + "y": 2.125 + }, + { + "matrix": [ + 8, + 2 + ], + "x": 10, + "y": 2.125 + }, + { + "matrix": [ + 8, + 4 + ], + "x": 12, + "y": 2.125 + }, + { + "matrix": [ + 2, + 0 + ], + "x": 0, + "y": 2.375 + }, + { + "matrix": [ + 2, + 1 + ], + "x": 1, + "y": 2.375 + }, + { + "matrix": [ + 8, + 5 + ], + "x": 13, + "y": 2.375 + }, + { + "matrix": [ + 8, + 6 + ], + "x": 14, + "y": 2.375 + }, + { + "matrix": [ + 3, + 3 + ], + "x": 3, + "y": 3 + }, + { + "matrix": [ + 9, + 3 + ], + "x": 11, + "y": 3 + }, + { + "matrix": [ + 3, + 2 + ], + "x": 2, + "y": 3.125 + }, + { + "matrix": [ + 3, + 4 + ], + "x": 4, + "y": 3.125 + }, + { + "matrix": [ + 3, + 5 + ], + "x": 5, + "y": 3.125 + }, + { + "matrix": [ + 3, + 6 + ], + "x": 6, + "y": 3.125 + }, + { + "matrix": [ + 9, + 0 + ], + "x": 8, + "y": 3.125 + }, + { + "matrix": [ + 9, + 1 + ], + "x": 9, + "y": 3.125 + }, + { + "matrix": [ + 9, + 2 + ], + "x": 10, + "y": 3.125 + }, + { + "matrix": [ + 9, + 4 + ], + "x": 12, + "y": 3.125 + }, + { + "matrix": [ + 3, + 0 + ], + "x": 0, + "y": 3.375 + }, + { + "matrix": [ + 3, + 1 + ], + "x": 1, + "y": 3.375 + }, + { + "matrix": [ + 9, + 5 + ], + "x": 13, + "y": 3.375 + }, + { + "matrix": [ + 9, + 6 + ], + "x": 14, + "y": 3.375 + }, + { + "matrix": [ + 4, + 3 + ], + "x": 3, + "y": 4 + }, + { + "matrix": [ + 10, + 3 + ], + "x": 11, + "y": 4 + }, + { + "matrix": [ + 4, + 2 + ], + "x": 2, + "y": 4.125 + }, + { + "matrix": [ + 4, + 4 + ], + "x": 4, + "y": 4.125 + }, + { + "matrix": [ + 4, + 5 + ], + "x": 5, + "y": 4.125 + }, + { + "matrix": [ + 4, + 6 + ], + "x": 6, + "y": 4.125 + }, + { + "matrix": [ + 10, + 0 + ], + "x": 8, + "y": 4.125 + }, + { + "matrix": [ + 10, + 1 + ], + "x": 9, + "y": 4.125 + }, + { + "matrix": [ + 10, + 2 + ], + "x": 10, + "y": 4.125 + }, + { + "matrix": [ + 10, + 4 + ], + "x": 12, + "y": 4.125 + }, + { + "matrix": [ + 4, + 0 + ], + "x": 0, + "y": 4.375 + }, + { + "matrix": [ + 4, + 1 + ], + "x": 1, + "y": 4.375 + }, + { + "matrix": [ + 10, + 5 + ], + "x": 13, + "y": 4.375 + }, + { + "matrix": [ + 10, + 6 + ], + "x": 14, + "y": 4.375 + }, + { + "matrix": [ + 5, + 3 + ], + "x": 3, + "y": 5 + }, + { + "matrix": [ + 11, + 3 + ], + "x": 11, + "y": 5 + }, + { + "matrix": [ + 5, + 2 + ], + "x": 2, + "y": 5.125 + }, + { + "matrix": [ + 5, + 4 + ], + "x": 4, + "y": 5.125 + }, + { + "matrix": [ + 5, + 5 + ], + "x": 5, + "y": 5.125 + }, + { + "matrix": [ + 5, + 6 + ], + "x": 6, + "y": 5.125 + }, + { + "matrix": [ + 11, + 0 + ], + "x": 8, + "y": 5.125 + }, + { + "matrix": [ + 11, + 1 + ], + "x": 9, + "y": 5.125 + }, + { + "matrix": [ + 11, + 2 + ], + "x": 10, + "y": 5.125 + }, + { + "matrix": [ + 11, + 4 + ], + "x": 12, + "y": 5.125 + }, + { + "matrix": [ + 5, + 0 + ], + "x": 0, + "y": 5.375 + }, + { + "matrix": [ + 5, + 1 + ], + "x": 1, + "y": 5.375 + }, + { + "matrix": [ + 11, + 5 + ], + "x": 13, + "y": 5.375 + }, + { + "matrix": [ + 11, + 6 + ], + "x": 14, + "y": 5.375 + } + ] + } + } +} diff --git a/qmk/snappy/rev3/keymaps/default/config.h b/qmk/snappy/rev3/keymaps/default/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev3/keymaps/default/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev3/keymaps/default/keymap.c b/qmk/snappy/rev3/keymaps/default/keymap.c new file mode 100644 index 0000000..dfd6558 --- /dev/null +++ b/qmk/snappy/rev3/keymaps/default/keymap.c @@ -0,0 +1,222 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _DVORAK, + _SPECIAL, + _GAMING, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, + UM_SPAM, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) +/* #define OS_LGUI OSM(MOD_LGUI) */ +/* #define OS_LALT OSM(MOD_LALT) */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * DVORAK + ***************************************************************************/ + // R1 (10) +#define D_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define D_FN6__FN7__FN8__FN9__FN0_ TO(_GAMING), KC_F8, KC_F10, KC_F12, ____ + // R2 (14) +#define _1_____2_____3_____4_____5 KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define _6_____7_____8_____9_____0 KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0 + // R3 (14) +#define QUOT__COMM__DOT____P_____Y KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DEL +#define _F_____G_____C_____R_____L KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L + // R4 (14) +#define _A_____O_____E_____U_____I KC_A, KC_O, KC_E, KC_U, KC_I, UM_PARN +#define _D_____H_____T_____N_____S KC_COLN, KC_D, KC_H, KC_T, KC_N, KC_S + // R5 (14) +#define _EQL___Q_____J_____K_____X KC_EQL, KC_Q, KC_J, KC_K, KC_X, UM_PARN +#define _B_____M_____W_____V_____Z UM_BRAC, KC_B, KC_M, KC_W, KC_V, KC_Z + // R6 (14) +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LSFT, KC_LALT, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_SCLN, ____, ____, ____, KC_LALT + + [_DVORAK] = + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, QUOT__COMM__DOT____P_____Y, _F_____G_____C_____R_____L, KC_BSLS, + KC_ESC, _A_____O_____E_____U_____I, _D_____H_____T_____N_____S, KC_SLASH, + KC_LGUI, _EQL___Q_____J_____K_____X, _B_____M_____W_____V_____Z, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ________SPECIAL_L0________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define ________SPECIAL_L1________ ____, ____, ____, ____, ____, ____ +#define ________SPECIAL_L2________ RALT(KC_Q), RALT(KC_P), RALT(KC_5), RALT(KC_Y), RALT(KC_S), ____ +#define ________SPECIAL_L3________ ____, ____, ____, ____, ____, ____ + +#define ________SPECIAL_R0________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define ________SPECIAL_R1________ ____, ____, ____, KC_UP, ____, ____ +#define ________SPECIAL_R2________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ________SPECIAL_R3________ ____, ____, ____, ____, ____, QK_BOOT + + [_SPECIAL]= + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,________SPECIAL_L0________, ________SPECIAL_R0________, UM_CURL, + KC_TAB, ________SPECIAL_L1________, ________SPECIAL_R1________, KC_BSLS, + KC_ESC, ________SPECIAL_L2________, ________SPECIAL_R2________, KC_SLASH, + KC_LGUI, ________SPECIAL_L3________, ________SPECIAL_R3________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * GAMING + ***************************************************************************/ +#define G_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define G_FN6__FN7__FN8__FN9__FN0_ TO(_DVORAK), KC_F8, KC_F10, KC_F12, ____ +#define _Q_____W_____E_____R_____T KC_Q, KC_W, KC_E, KC_R, KC_T, ____ +#define _A_____S_____D_____F_____G KC_A, KC_S, KC_D, KC_F, KC_G, ____ +#define _Z_____X_____C_____V_____B KC_Z, KC_X, KC_C, KC_V, KC_B, ____ + +#define _Y_____U_____I_____O_____P ____, KC_Y, KC_U, KC_I, KC_O, KC_P +#define _H_____J_____K_____L__SCLN ____, KC_H, KC_J, KC_K, KC_L, KC_SCLN +#define _N_____M____COMM__DOT___UP ____, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP +#define ____GAMING_BOTTOM_LEFT____ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_ENT +#define ____GAMING_BOTTOM_RIGHT___ OS_LSFT, KC_SPC, KC_BSPC, UM_SPAM, KC_LEFT, KC_DOWN, KC_RIGHT + + [_GAMING] = + LAYOUT_wrapper( + G_FN1__FN2__FN3__FN4__FN5_, G_FN6__FN7__FN8__FN9__FN0_, + KC_ESC, _1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, _Q_____W_____E_____R_____T, _Y_____U_____I_____O_____P, KC_BSLS, + KC_LSFT,_A_____S_____D_____F_____G, _H_____J_____K_____L__SCLN, KC_SLASH, + KC_LSFT,_Z_____X_____C_____V_____B, _N_____M____COMM__DOT___UP, KC_LCTL, + ____GAMING_BOTTOM_LEFT____, ____GAMING_BOTTOM_RIGHT___ + ), +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_DVORAK] = "DVORAK"; + layer_names[_SPECIAL] = "SPECIAL"; + layer_names[_GAMING] = "GAMING"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +bool RLFW = false; +bool RLBO = false; +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_SPAM: + if (record->event.pressed) { + SEND_STRING("k"SS_DELAY(80)"k"); + } + return false; + break; + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING("}"); + } else { + SEND_STRING("{"); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + // Otherwise shift makes bracket into curly bracket + del_mods(MOD_MASK_SHIFT); + SEND_STRING("]"); + } else { + SEND_STRING("["); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING(")"); + } else { + SEND_STRING("("); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev3/keymaps/default/readme.md b/qmk/snappy/rev3/keymaps/default/readme.md new file mode 100644 index 0000000..c1a5a02 --- /dev/null +++ b/qmk/snappy/rev3/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for snappy diff --git a/qmk/snappy/rev3/rev3.c b/qmk/snappy/rev3/rev3.c new file mode 100644 index 0000000..f0dd23c --- /dev/null +++ b/qmk/snappy/rev3/rev3.c @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rev3.h" diff --git a/qmk/snappy/rev3/rev3.h b/qmk/snappy/rev3/rev3.h new file mode 100644 index 0000000..9746d58 --- /dev/null +++ b/qmk/snappy/rev3/rev3.h @@ -0,0 +1,6 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" diff --git a/qmk/snappy/rev3/rules.mk b/qmk/snappy/rev3/rules.mk new file mode 100644 index 0000000..34d119c --- /dev/null +++ b/qmk/snappy/rev3/rules.mk @@ -0,0 +1,8 @@ +# Split communication +SERIAL_DRIVER = vendor +# Oled support +OLED_ENABLE = yes +OLED_DRIVER = ssd1306 + +# Dynamic Layout Configuration +VIA_ENABLE = yes diff --git a/qmk/snappy/rev3_5/config.h b/qmk/snappy/rev3_5/config.h new file mode 100644 index 0000000..6ea4e40 --- /dev/null +++ b/qmk/snappy/rev3_5/config.h @@ -0,0 +1,49 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +/* key matrix size */ +#define MATRIX_ROWS 12 +#define MATRIX_COLS 7 + +/* + * 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 { GP4, GP5, GP6, GP7, GP8, GP9 } +#define MATRIX_COL_PINS { GP28, GP27, GP26, GP22, GP20, GP23, GP21 } +#define BOOTMAGIC_ROW 0 +#define BOOTMAGIC_COLUMN 6 +#define BOOTMAGIC_ROW_RIGHT 6 +#define BOOTMAGIC_COLUMN_RIGHT 6 + +/* COL2ROW, ROW2COL */ +#define DIODE_DIRECTION COL2ROW +// Set the handedness by writing it to EEPROM +#define EE_HANDS +// Used in ChibiOS/ARM boards that do not support VBUS detection (r2040 promicro, not liatris) +#define SPLIT_USB_DETECT +// ATTENTION: This has to be enabled on both halves so make sure you have a button on each +// half (independently) to get the half into bootloader mode. (e.g. BOOTMAGIC keys for both halves) +#define SPLIT_WATCHDOG_ENABLE +#define SPLIT_WATCHDOG_TIMEOUT 3000 +// https://github.com/qmk/qmk_firmware/blob/master/docs/serial_driver.md#usart-full-duplex +#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. +#define SERIAL_USART_TX_PIN GP0 // USART TX pin +#define SERIAL_USART_RX_PIN GP1 // USART RX pin + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 20 +#define USB_POLLING_INTERVAL_MS 1 + +/* 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 diff --git a/qmk/snappy/rev3_5/info.json b/qmk/snappy/rev3_5/info.json new file mode 100644 index 0000000..fbba25f --- /dev/null +++ b/qmk/snappy/rev3_5/info.json @@ -0,0 +1,337 @@ +{ + "keyboard_name": "snappy v3.5", + "manufacturer": "phga", + "maintainer": "qhga", + "url": "", + "usb": { + "vid": "0xCAFE", + "pid": "0x1337", + "device_version": "3.5.0" + }, + "layouts": { + "LAYOUT": { + "layout": [ + { + "x": 3, + "y": 0 + }, + { + "x": 11, + "y": 0 + }, + { + "x": 2, + "y": 0.125 + }, + { + "x": 4, + "y": 0.125 + }, + { + "x": 5, + "y": 0.125 + }, + { + "x": 6, + "y": 0.125 + }, + { + "x": 8, + "y": 0.125 + }, + { + "x": 9, + "y": 0.125 + }, + { + "x": 10, + "y": 0.125 + }, + { + "x": 12, + "y": 0.125 + }, + { + "x": 3, + "y": 1 + }, + { + "x": 11, + "y": 1 + }, + { + "x": 2, + "y": 1.125 + }, + { + "x": 4, + "y": 1.125 + }, + { + "x": 5, + "y": 1.125 + }, + { + "x": 6, + "y": 1.125 + }, + { + "x": 8, + "y": 1.125 + }, + { + "x": 9, + "y": 1.125 + }, + { + "x": 10, + "y": 1.125 + }, + { + "x": 12, + "y": 1.125 + }, + { + "x": 0, + "y": 1.375 + }, + { + "x": 1, + "y": 1.375 + }, + { + "x": 13, + "y": 1.375 + }, + { + "x": 14, + "y": 1.375 + }, + { + "x": 3, + "y": 2 + }, + { + "x": 11, + "y": 2 + }, + { + "x": 2, + "y": 2.125 + }, + { + "x": 4, + "y": 2.125 + }, + { + "x": 5, + "y": 2.125 + }, + { + "x": 6, + "y": 2.125 + }, + { + "x": 8, + "y": 2.125 + }, + { + "x": 9, + "y": 2.125 + }, + { + "x": 10, + "y": 2.125 + }, + { + "x": 12, + "y": 2.125 + }, + { + "x": 0, + "y": 2.375 + }, + { + "x": 1, + "y": 2.375 + }, + { + "x": 13, + "y": 2.375 + }, + { + "x": 14, + "y": 2.375 + }, + { + "x": 3, + "y": 3 + }, + { + "x": 11, + "y": 3 + }, + { + "x": 2, + "y": 3.125 + }, + { + "x": 4, + "y": 3.125 + }, + { + "x": 5, + "y": 3.125 + }, + { + "x": 6, + "y": 3.125 + }, + { + "x": 8, + "y": 3.125 + }, + { + "x": 9, + "y": 3.125 + }, + { + "x": 10, + "y": 3.125 + }, + { + "x": 12, + "y": 3.125 + }, + { + "x": 0, + "y": 3.375 + }, + { + "x": 1, + "y": 3.375 + }, + { + "x": 13, + "y": 3.375 + }, + { + "x": 14, + "y": 3.375 + }, + { + "x": 3, + "y": 4 + }, + { + "x": 11, + "y": 4 + }, + { + "x": 2, + "y": 4.125 + }, + { + "x": 4, + "y": 4.125 + }, + { + "x": 5, + "y": 4.125 + }, + { + "x": 6, + "y": 4.125 + }, + { + "x": 8, + "y": 4.125 + }, + { + "x": 9, + "y": 4.125 + }, + { + "x": 10, + "y": 4.125 + }, + { + "x": 12, + "y": 4.125 + }, + { + "x": 0, + "y": 4.375 + }, + { + "x": 1, + "y": 4.375 + }, + { + "x": 13, + "y": 4.375 + }, + { + "x": 14, + "y": 4.375 + }, + { + "x": 3, + "y": 5 + }, + { + "x": 11, + "y": 5 + }, + { + "x": 2, + "y": 5.125 + }, + { + "x": 4, + "y": 5.125 + }, + { + "x": 5, + "y": 5.125 + }, + { + "x": 6, + "y": 5.125 + }, + { + "x": 8, + "y": 5.125 + }, + { + "x": 9, + "y": 5.125 + }, + { + "x": 10, + "y": 5.125 + }, + { + "x": 12, + "y": 5.125 + }, + { + "x": 0, + "y": 5.375 + }, + { + "x": 1, + "y": 5.375 + }, + { + "x": 13, + "y": 5.375 + }, + { + "x": 14, + "y": 5.375 + } + ] + } + } +} diff --git a/qmk/snappy/rev3_5/keymaps/default/config.h b/qmk/snappy/rev3_5/keymaps/default/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/default/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev3_5/keymaps/default/keymap.c b/qmk/snappy/rev3_5/keymaps/default/keymap.c new file mode 100644 index 0000000..dfd6558 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/default/keymap.c @@ -0,0 +1,222 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _DVORAK, + _SPECIAL, + _GAMING, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, + UM_SPAM, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) +/* #define OS_LGUI OSM(MOD_LGUI) */ +/* #define OS_LALT OSM(MOD_LALT) */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * DVORAK + ***************************************************************************/ + // R1 (10) +#define D_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define D_FN6__FN7__FN8__FN9__FN0_ TO(_GAMING), KC_F8, KC_F10, KC_F12, ____ + // R2 (14) +#define _1_____2_____3_____4_____5 KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define _6_____7_____8_____9_____0 KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0 + // R3 (14) +#define QUOT__COMM__DOT____P_____Y KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_DEL +#define _F_____G_____C_____R_____L KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L + // R4 (14) +#define _A_____O_____E_____U_____I KC_A, KC_O, KC_E, KC_U, KC_I, UM_PARN +#define _D_____H_____T_____N_____S KC_COLN, KC_D, KC_H, KC_T, KC_N, KC_S + // R5 (14) +#define _EQL___Q_____J_____K_____X KC_EQL, KC_Q, KC_J, KC_K, KC_X, UM_PARN +#define _B_____M_____W_____V_____Z UM_BRAC, KC_B, KC_M, KC_W, KC_V, KC_Z + // R6 (14) +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LSFT, KC_LALT, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_SCLN, ____, ____, ____, KC_LALT + + [_DVORAK] = + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,_1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, QUOT__COMM__DOT____P_____Y, _F_____G_____C_____R_____L, KC_BSLS, + KC_ESC, _A_____O_____E_____U_____I, _D_____H_____T_____N_____S, KC_SLASH, + KC_LGUI, _EQL___Q_____J_____K_____X, _B_____M_____W_____V_____Z, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ________SPECIAL_L0________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define ________SPECIAL_L1________ ____, ____, ____, ____, ____, ____ +#define ________SPECIAL_L2________ RALT(KC_Q), RALT(KC_P), RALT(KC_5), RALT(KC_Y), RALT(KC_S), ____ +#define ________SPECIAL_L3________ ____, ____, ____, ____, ____, ____ + +#define ________SPECIAL_R0________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 +#define ________SPECIAL_R1________ ____, ____, ____, KC_UP, ____, ____ +#define ________SPECIAL_R2________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____ +#define ________SPECIAL_R3________ ____, ____, ____, ____, ____, QK_BOOT + + [_SPECIAL]= + LAYOUT_wrapper( + D_FN1__FN2__FN3__FN4__FN5_, D_FN6__FN7__FN8__FN9__FN0_, + KC_GRAVE,________SPECIAL_L0________, ________SPECIAL_R0________, UM_CURL, + KC_TAB, ________SPECIAL_L1________, ________SPECIAL_R1________, KC_BSLS, + KC_ESC, ________SPECIAL_L2________, ________SPECIAL_R2________, KC_SLASH, + KC_LGUI, ________SPECIAL_L3________, ________SPECIAL_R3________, KC_LCTL, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * GAMING + ***************************************************************************/ +#define G_FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define G_FN6__FN7__FN8__FN9__FN0_ TO(_DVORAK), KC_F8, KC_F10, KC_F12, ____ +#define _Q_____W_____E_____R_____T KC_Q, KC_W, KC_E, KC_R, KC_T, ____ +#define _A_____S_____D_____F_____G KC_A, KC_S, KC_D, KC_F, KC_G, ____ +#define _Z_____X_____C_____V_____B KC_Z, KC_X, KC_C, KC_V, KC_B, ____ + +#define _Y_____U_____I_____O_____P ____, KC_Y, KC_U, KC_I, KC_O, KC_P +#define _H_____J_____K_____L__SCLN ____, KC_H, KC_J, KC_K, KC_L, KC_SCLN +#define _N_____M____COMM__DOT___UP ____, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP +#define ____GAMING_BOTTOM_LEFT____ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_ENT +#define ____GAMING_BOTTOM_RIGHT___ OS_LSFT, KC_SPC, KC_BSPC, UM_SPAM, KC_LEFT, KC_DOWN, KC_RIGHT + + [_GAMING] = + LAYOUT_wrapper( + G_FN1__FN2__FN3__FN4__FN5_, G_FN6__FN7__FN8__FN9__FN0_, + KC_ESC, _1_____2_____3_____4_____5, _6_____7_____8_____9_____0, UM_CURL, + KC_TAB, _Q_____W_____E_____R_____T, _Y_____U_____I_____O_____P, KC_BSLS, + KC_LSFT,_A_____S_____D_____F_____G, _H_____J_____K_____L__SCLN, KC_SLASH, + KC_LSFT,_Z_____X_____C_____V_____B, _N_____M____COMM__DOT___UP, KC_LCTL, + ____GAMING_BOTTOM_LEFT____, ____GAMING_BOTTOM_RIGHT___ + ), +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_DVORAK] = "DVORAK"; + layer_names[_SPECIAL] = "SPECIAL"; + layer_names[_GAMING] = "GAMING"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +bool RLFW = false; +bool RLBO = false; +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_SPAM: + if (record->event.pressed) { + SEND_STRING("k"SS_DELAY(80)"k"); + } + return false; + break; + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING("}"); + } else { + SEND_STRING("{"); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + // Otherwise shift makes bracket into curly bracket + del_mods(MOD_MASK_SHIFT); + SEND_STRING("]"); + } else { + SEND_STRING("["); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + SEND_STRING(")"); + } else { + SEND_STRING("("); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev3_5/keymaps/default/readme.md b/qmk/snappy/rev3_5/keymaps/default/readme.md new file mode 100644 index 0000000..c1a5a02 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for snappy diff --git a/qmk/snappy/rev3_5/keymaps/default/rules.mk b/qmk/snappy/rev3_5/keymaps/default/rules.mk new file mode 100644 index 0000000..41ed140 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +EXTRAKEY_ENABLE = no +MOUSEKEY_ENABLE = no diff --git a/qmk/snappy/rev3_5/keymaps/maza/config.h b/qmk/snappy/rev3_5/keymaps/maza/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/maza/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev3_5/keymaps/maza/keymap.c b/qmk/snappy/rev3_5/keymaps/maza/keymap.c new file mode 100644 index 0000000..8ceb85f --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/maza/keymap.c @@ -0,0 +1,181 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _QWERTZ, + _SPECIAL, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * QWERTZ + ***************************************************************************/ +#define _FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define SP__1_____2_____3_____4_____5__SP QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define SP__Q_____W_____E_____R_____T__SP KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, UM_CURL +#define SP__A_____S_____D_____F_____G__SP KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, UM_PARN +#define SP__Y_____X_____C_____V_____B__SP OS_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NUBS + +#define _FN6__FN7__FN8__FN9__FN0_ KC_ESC, KC_F8, KC_F10, KC_F12, KC_GRV +#define SP__6_____7_____8_____9_____0__SP KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS +#define SP__Z_____U_____I_____O_____P__SP KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC +#define SP__H_____J_____K_____L____OE__SP KC_NUHS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT +#define SP__N_____M____COMM__DOT_DASH__SP UM_BRAC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OS_LSFT + +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LALT, KC_LALT, OSL(_SPECIAL), OS_LSFT, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ KC_BSPC, KC_SPC, KC_RALT, ____, ____, ____, KC_EQL + + [_QWERTZ] = + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + SP__1_____2_____3_____4_____5__SP, SP__6_____7_____8_____9_____0__SP, + SP__Q_____W_____E_____R_____T__SP, SP__Z_____U_____I_____O_____P__SP, + SP__A_____S_____D_____F_____G__SP, SP__H_____J_____K_____L____OE__SP, + SP__Y_____X_____C_____V_____B__SP, SP__N_____M____COMM__DOT_DASH__SP, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ___________SPECIAL_L0___________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7 +#define ___________SPECIAL_L1___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L2___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L3___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_R0___________ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14 +#define ___________SPECIAL_R1___________ ____, ____, ____, KC_UP, ____, ____, ____ +#define ___________SPECIAL_R2___________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____, ____ +#define ___________SPECIAL_R3___________ ____, ____, ____, ____, ____, QK_BOOT, ____ + + [_SPECIAL]= + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + ___________SPECIAL_L0___________, ___________SPECIAL_R0___________, + ___________SPECIAL_L1___________, ___________SPECIAL_R1___________, + ___________SPECIAL_L2___________, ___________SPECIAL_R2___________, + ___________SPECIAL_L3___________, ___________SPECIAL_R3___________, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_QWERTZ] = "QWERTZ"; + layer_names[_SPECIAL] = "SPECIAL"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("0")); + } else { + SEND_STRING(SS_RALT("7")); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("9")); + } else { + SEND_STRING(SS_RALT("8")); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_LSFT("9")); + } else { + SEND_STRING(SS_LSFT("8")); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev3_5/keymaps/maza/readme.md b/qmk/snappy/rev3_5/keymaps/maza/readme.md new file mode 100644 index 0000000..e2c9f0d --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/maza/readme.md @@ -0,0 +1 @@ +# Mazas qwertz keymap for snappy diff --git a/qmk/snappy/rev3_5/keymaps/qwertz/config.h b/qmk/snappy/rev3_5/keymaps/qwertz/config.h new file mode 100644 index 0000000..a519f8a --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwertz/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 diff --git a/qmk/snappy/rev3_5/keymaps/qwertz/keymap.c b/qmk/snappy/rev3_5/keymaps/qwertz/keymap.c new file mode 100644 index 0000000..4ce4b2d --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwertz/keymap.c @@ -0,0 +1,181 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _QWERTZ, + _SPECIAL, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + UM_PARN, + UM_CURL, + UM_BRAC, +}; + + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define ____ _______ +#define OS_LSFT OSM(MOD_LSFT) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /*************************************************************************** + * QWERTZ + ***************************************************************************/ +#define _FN1__FN2__FN3__FN4__FN5_ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define SP__1_____2_____3_____4_____5__SP QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DEL +#define SP__Q_____W_____E_____R_____T__SP KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, UM_CURL +#define SP__A_____S_____D_____F_____G__SP OS_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, UM_PARN +#define SP__Y_____X_____C_____V_____B__SP OS_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NUBS + +#define _FN6__FN7__FN8__FN9__FN0_ TO(_SPECIAL), KC_F8, KC_F10, KC_F12, KC_GRV +#define SP__6_____7_____8_____9_____0__SP KC_DEL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS +#define SP__Z_____U_____I_____O_____P__SP KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC +#define SP__H_____J_____K_____L____OE__SP KC_NUHS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT +#define SP__N_____M____COMM__DOT_DASH__SP UM_BRAC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OS_LSFT + +#define _______BOTTOM_LEFT________ KC_LCTL, KC_LALT, ____, OSL(_SPECIAL), KC_MINS, KC_BSPC, KC_ENT +#define _______BOTTOM_RIGHT_______ OS_LSFT, KC_SPC, KC_RALT, ____, ____, ____, KC_EQL + + [_QWERTZ] = + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + SP__1_____2_____3_____4_____5__SP, SP__6_____7_____8_____9_____0__SP, + SP__Q_____W_____E_____R_____T__SP, SP__Z_____U_____I_____O_____P__SP, + SP__A_____S_____D_____F_____G__SP, SP__H_____J_____K_____L____OE__SP, + SP__Y_____X_____C_____V_____B__SP, SP__N_____M____COMM__DOT_DASH__SP, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + + /*************************************************************************** + * SPECIAL + ***************************************************************************/ + +#define ___________SPECIAL_L0___________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7 +#define ___________SPECIAL_L1___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L2___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_L3___________ ____, ____, ____, ____, ____, ____, ____ +#define ___________SPECIAL_R0___________ KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14 +#define ___________SPECIAL_R1___________ ____, ____, ____, KC_UP, ____, ____, ____ +#define ___________SPECIAL_R2___________ ____, ____, KC_LEFT, KC_DOWN, KC_RIGHT, ____, ____ +#define ___________SPECIAL_R3___________ ____, ____, ____, ____, ____, QK_BOOT, ____ + + [_SPECIAL]= + LAYOUT_wrapper( + _FN1__FN2__FN3__FN4__FN5_, _FN6__FN7__FN8__FN9__FN0_, + ___________SPECIAL_L0___________, ___________SPECIAL_R0___________, + ___________SPECIAL_L1___________, ___________SPECIAL_R1___________, + ___________SPECIAL_L2___________, ___________SPECIAL_R2___________, + ___________SPECIAL_L3___________, ___________SPECIAL_R3___________, + _______BOTTOM_LEFT________, _______BOTTOM_RIGHT_______ + ), + +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,192,224,240,240,248,248,252,252,254,254,252,252,248,248,240,224,224,192,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64,224,240,240,248,248,252,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,254,252,252,120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63,127,127,255,255,255,255,255,255,255,255,255,255,255,127, 63, 63, 31, 31,143,143,135,131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,129,131,195,195,227,241,241,248,248,252,254,254,255,255,255,255,255,255,255,255,254,254,252,252,248,240,240,224,224,192,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63,127,255,255,255,127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +#endif + if (is_keyboard_master()) { + const char *layer_names[3]; // or { "DVORAK", "SPECIAL", "GAMING" }; + layer_names[_QWERTZ] = "QWERTZ"; + layer_names[_SPECIAL] = "SPECIAL"; + + render_logo(); + // Align right + size_t layer = get_highest_layer(layer_state); + oled_set_cursor(oled_max_chars() - 1 - strlen(layer_names[layer]), 1); + oled_write(layer_names[layer], false); + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + //debug_mouse=true; + +} + +uint8_t mods; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + mods = get_mods(); + switch (keycode) { + case UM_CURL: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("0")); + } else { + SEND_STRING(SS_RALT("7")); + } + set_mods(mods); + } + return false; + break; + case UM_BRAC: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_RALT("9")); + } else { + SEND_STRING(SS_RALT("8")); + } + set_mods(mods); + } + return false; + break; + case UM_PARN: + if (record->event.pressed) { + if (mods & MOD_MASK_SHIFT) { + del_mods(MOD_MASK_SHIFT); + SEND_STRING(SS_LSFT("9")); + } else { + SEND_STRING(SS_LSFT("8")); + } + set_mods(mods); + } + return false; + break; + default: + return true; + } +} diff --git a/qmk/snappy/rev3_5/keymaps/qwertz/readme.md b/qmk/snappy/rev3_5/keymaps/qwertz/readme.md new file mode 100644 index 0000000..5ab2b13 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/qwertz/readme.md @@ -0,0 +1 @@ +# The qwertz keymap for snappy diff --git a/qmk/snappy/rev3_5/keymaps/tima/config.h b/qmk/snappy/rev3_5/keymaps/tima/config.h new file mode 100644 index 0000000..84e1d24 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/tima/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define OLED_DISPLAY_128X64 +#define OLED_UPDATE_INTERVAL 10 \ No newline at end of file diff --git a/qmk/snappy/rev3_5/keymaps/tima/keymap.c b/qmk/snappy/rev3_5/keymaps/tima/keymap.c new file mode 100644 index 0000000..64f0059 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/tima/keymap.c @@ -0,0 +1,183 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Defines names for use in layer keycodes and the keymap +enum layer_names { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here +}; + +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) + +#define OS_LSFT OSM(MOD_LSFT) +/* #define OS_LGUI OSM(MOD_LGUI) */ +/* #define OS_LALT OSM(MOD_LALT) */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/*********************************************************************************** + * DEFAULT - _LAYER0 + ***********************************************************************************/ + +// R1 (10) +#define ___HASH___F5___F9___NONE___QUOT__ KC_BSLS, KC_F5, KC_F9, KC_NO, KC_EQL +#define _TO3___PLAY___MUTE___VOUP___VOLD_ TO(_LAYER3), KC_MPLY, KC_MUTE, KC_VOLU, KC_VOLD +// R2 (14) +#define __ESC__1_____2_____3_____4_____5__PLS__ QK_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_RBRC +#define __MIN__6_____7_____8_____9_____0__QST__ KC_SLSH, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS +// R3 (14) +#define __TAB__Q_____W_____E_____R_____T_RIBR3_ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, RALT(KC_8) +#define _LFBR3_Z_____U_____I_____O_____P___UE__ RALT(KC_9), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC +// R4 (14) +#define __ESC__A_____S_____D_____F_____G_RIBR1_ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8) +#define _LFBR1_H_____J_____K_____L_____OE__AE__ S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT +// R5 (14) +#define _SHFT__Y_____X_____C_____V_____B_RIBR2_ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, RALT(KC_7) +#define _LFBR2_N_____M____COM___DOT___MIN__SHFT RALT(KC_0), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT +// R6 (14) +#define ______________BOTTOM_LEFT______________ KC_LALT, KC_NUBS, KC_LCTL, MO(_LAYER1), KC_LGUI, KC_LCTL, KC_RALT +#define ______________BOTTOM_RIGHT_____________ KC_ENT, KC_SPC, KC_BSPC, MO(_LAYER2), KC_DEL, KC_PSCR, OSM(MOD_LSFT) + + [_LAYER0] = LAYOUT_wrapper(___HASH___F5___F9___NONE___QUOT__, _TO3___PLAY___MUTE___VOUP___VOLD_, __ESC__1_____2_____3_____4_____5__PLS__, __MIN__6_____7_____8_____9_____0__QST__, __TAB__Q_____W_____E_____R_____T_RIBR3_, _LFBR3_Z_____U_____I_____O_____P___UE__, __ESC__A_____S_____D_____F_____G_RIBR1_, _LFBR1_H_____J_____K_____L_____OE__AE__, _SHFT__Y_____X_____C_____V_____B_RIBR2_, _LFBR2_N_____M____COM___DOT___MIN__SHFT, ______________BOTTOM_LEFT______________, ______________BOTTOM_RIGHT_____________), + +/*********************************************************************************** + * LOWER - _LAYER1 + ***********************************************************************************/ + +// R1 (10) +#define ____________LAYER1_L1____________ QK_BOOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define ____________LAYER1_R1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +// R2 (14) +#define _______________LAYER1_L2_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R2_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS +// R3 (14) +#define _______________LAYER1_L3_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R3_______________ KC_NO, KC_NO, KC_LBRC, KC_NO, KC_SCLN, KC_NO, KC_BSLS +// R4 (14) +#define _______________LAYER1_L4_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R4_______________ KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_SLSH +// R5 (14) +#define _______________LAYER1_L5_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER1_R5_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QK_BOOT, KC_NO +// R6 (14) +#define _______________LAYER1_L6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER1_R6_______________ KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + + [_LAYER1] = LAYOUT_wrapper(____________LAYER1_L1____________, ____________LAYER1_R1____________, _______________LAYER1_L2_______________, _______________LAYER1_R2_______________, _______________LAYER1_L3_______________, _______________LAYER1_R3_______________, _______________LAYER1_L4_______________, _______________LAYER1_R4_______________, _______________LAYER1_L5_______________, _______________LAYER1_R5_______________, _______________LAYER1_L6_______________, _______________LAYER1_R6_______________), + +/*********************************************************************************** + * UPPER - _LAYER2 + ***********************************************************************************/ + +// R1 (10) +#define ____________LAYER2_L1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define ____________LAYER2_R1____________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT +// R2 (14) +#define _______________LAYER2_L2_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER2_R2_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +// R3 (14) +#define _______________LAYER2_L3_______________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define _______________LAYER2_R3_______________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS +// R4 (14) +#define _______________LAYER2_L4_______________ KC_TRNS, KC_QUOT, KC_MINS, KC_MS_BTN4, KC_MS_BTN5, KC_NO, KC_NO +#define _______________LAYER2_R4_______________ KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, KC_NO, KC_SLSH +// R5 (14) +#define _______________LAYER2_L5_______________ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +#define _______________LAYER2_R5_______________ KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_NO, KC_NO, KC_NO, KC_NO +// R6 (14) +#define _______________LAYER2_L6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS +#define _______________LAYER2_R6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + + [_LAYER2] = LAYOUT_wrapper(____________LAYER2_L1____________, ____________LAYER2_R1____________, _______________LAYER2_L2_______________, _______________LAYER2_R2_______________, _______________LAYER2_L3_______________, _______________LAYER2_R3_______________, _______________LAYER2_L4_______________, _______________LAYER2_R4_______________, _______________LAYER2_L5_______________, _______________LAYER2_R5_______________, _______________LAYER2_L6_______________, _______________LAYER2_R6_______________), + +/*********************************************************************************** + * Gaming - _LAYER3 + ***********************************************************************************/ + +// R1 (10) +#define ____________LAYER3_L1____________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define ____________LAYER3_R1____________ TO(_LAYER0), KC_NO, KC_NO, KC_TRNS, KC_DEL +// R2 (14) +#define _______________LAYER3_L2_______________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6 +#define _______________LAYER3_R2_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +// R3 (14) +#define _______________LAYER3_L3_______________ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y +#define _______________LAYER3_R3_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO +// R4 (14) +#define _______________LAYER3_L4_______________ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H +#define _______________LAYER3_R4_______________ KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO +// R5 (14) +#define _______________LAYER3_L5_______________ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N +#define _______________LAYER3_R5_______________ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO +// R6 (14) +#define _______________LAYER3_L6_______________ KC_LCTL, KC_LALT, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_TRNS +#define _______________LAYER3_R6_______________ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT + + [_LAYER3] = LAYOUT_wrapper(____________LAYER3_L1____________, ____________LAYER3_R1____________, _______________LAYER3_L2_______________, _______________LAYER3_R2_______________, _______________LAYER3_L3_______________, _______________LAYER3_R3_______________, _______________LAYER3_L4_______________, _______________LAYER3_R4_______________, _______________LAYER3_L5_______________, _______________LAYER3_R5_______________, _______________LAYER3_L6_______________, _______________LAYER3_R6_______________), +}; + +void matrix_scan_user(void) { +#ifdef CONSOLE_ENABLE + /* uprintf("matrix_scan_user\n"); */ +#endif +} + +#ifdef OLED_ENABLE +static void render_logo(void) { + static const char PROGMEM raw_logo[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 192, 192, 224, 240, 240, 248, 248, 252, 252, 254, 254, 252, 252, 248, 248, 240, 224, 224, 192, 192, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 224, 240, 240, 248, 248, 252, 252, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 252, 252, 120, 56, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 15, 31, 31, 63, 63, 127, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 63, 63, 31, 31, 143, 143, 135, 131, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 129, 131, 195, 195, 227, 241, 241, 248, 248, 252, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 252, 252, 248, 240, 240, 224, 224, 192, 192, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 60, 60, 126, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 127, 63, 63, 31, 31, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 3, 7, 15, 15, 31, 31, 63, 63, 127, 255, 255, 255, 127, 63, 63, 31, 31, 15, 15, 7, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + oled_write_raw_P(raw_logo, sizeof(raw_logo)); +} + +bool oled_task_user(void) { +# ifdef CONSOLE_ENABLE + /* uprintf("oled_task_user\n"); */ +# endif + if (is_keyboard_master()) { + oled_write_P(PSTR("\n "), false); + switch (get_highest_layer(layer_state)) { + case _LAYER0: + oled_write_P(PSTR("Default\n"), false); + break; + case _LAYER1: + oled_write_P(PSTR("Lower\n"), false); + break; + case _LAYER2: + oled_write_P(PSTR("Upper\n"), false); + break; + case _LAYER3: + oled_write_P(PSTR("Gaming\n"), false); + break; + } + } else { + // Center logo on second screen + oled_set_cursor(6, 0); + render_logo(); + } + return false; +} +#endif + +void keyboard_post_init_user(void) { + oled_init(OLED_ROTATION_180); + /* render_logo(); */ + // Customise these values to desired behaviour + /* debug_enable=true; */ + /* debug_matrix=true; */ + /* debug_keyboard=true; */ + // debug_mouse=true; +} \ No newline at end of file diff --git a/qmk/snappy/rev3_5/keymaps/tima/readme.md b/qmk/snappy/rev3_5/keymaps/tima/readme.md new file mode 100644 index 0000000..6762024 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/tima/readme.md @@ -0,0 +1 @@ +# A QWERTZ keymap for snappy diff --git a/qmk/snappy/rev3_5/keymaps/tima/rules.mk b/qmk/snappy/rev3_5/keymaps/tima/rules.mk new file mode 100644 index 0000000..74c71e0 --- /dev/null +++ b/qmk/snappy/rev3_5/keymaps/tima/rules.mk @@ -0,0 +1,3 @@ +# Special features +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes \ No newline at end of file diff --git a/qmk/snappy/rev3_5/rev3_5.c b/qmk/snappy/rev3_5/rev3_5.c new file mode 100644 index 0000000..e912fa3 --- /dev/null +++ b/qmk/snappy/rev3_5/rev3_5.c @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rev3_5.h" diff --git a/qmk/snappy/rev3_5/rev3_5.h b/qmk/snappy/rev3_5/rev3_5.h new file mode 100644 index 0000000..6079eec --- /dev/null +++ b/qmk/snappy/rev3_5/rev3_5.h @@ -0,0 +1,38 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +#define LAYOUT( \ + L02, L03, L04, L05, L06, R06, R05, R04, R03, R02, \ + L10, L11, L12, L13, L14, L15, L16, R16, R15, R14, R13, R12, R11, R10, \ + L20, L21, L22, L23, L24, L25, L26, R26, R25, R24, R23, R22, R21, R20, \ + L30, L31, L32, L33, L34, L35, L36, R36, R35, R34, R33, R32, R31, R30, \ + L40, L41, L42, L43, L44, L45, L46, R46, R45, R44, R43, R42, R41, R40, \ + L50, L51, L52, L53, L54, L55, L56, R56, R55, R54, R53, R52, R51, R50 \ + ) \ + { \ + { KC_NO, KC_NO, L02, L03, L04, L05, L06 }, \ + { L10, L11, L12, L13, L14, L15, L16 }, \ + { L20, L21, L22, L23, L24, L25, L26 }, \ + { L30, L31, L32, L33, L34, L35, L36 }, \ + { L40, L41, L42, L43, L44, L45, L46 }, \ + { L50, L51, L52, L53, L54, L55, L56 }, \ + { KC_NO, KC_NO, R02, R03, R04, R05, R06 }, \ + { R10, R11, R12, R13, R14, R15, R16 }, \ + { R20, R21, R22, R23, R24, R25, R26 }, \ + { R30, R31, R32, R33, R34, R35, R36 }, \ + { R40, R41, R42, R43, R44, R45, R46 }, \ + { R50, R51, R52, R53, R54, R55, R56 } \ + } diff --git a/qmk/snappy/rev3_5/rules.mk b/qmk/snappy/rev3_5/rules.mk new file mode 100644 index 0000000..6584cdb --- /dev/null +++ b/qmk/snappy/rev3_5/rules.mk @@ -0,0 +1,15 @@ +MCU = RP2040 +BOOTLOADER = rp2040 +SERIAL_DRIVER = vendor +# Key is defined in config.h +BOOTMAGIC_ENABLE = yes + +# Oled support +OLED_ENABLE = yes +OLED_DRIVER = ssd1306 +SPLIT_KEYBOARD = yes + +DEBOUNCE_TYPE = sym_eager_pk + +# Dynamic Layout Configuration +VIA_ENABLE = yes diff --git a/qmk/snappy/rules.mk b/qmk/snappy/rules.mk new file mode 100644 index 0000000..84dea74 --- /dev/null +++ b/qmk/snappy/rules.mk @@ -0,0 +1,3 @@ +# Current default revision +# NOTE: Additional mk rules in the specific folders (rev1, ...) +DEFAULT_FOLDER = snappy/rev3_5 diff --git a/qmk/snappy/snappy.c b/qmk/snappy/snappy.c new file mode 100644 index 0000000..dbe85bf --- /dev/null +++ b/qmk/snappy/snappy.c @@ -0,0 +1,4 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "snappy.h" diff --git a/qmk/snappy/snappy.h b/qmk/snappy/snappy.h new file mode 100644 index 0000000..c762389 --- /dev/null +++ b/qmk/snappy/snappy.h @@ -0,0 +1,16 @@ +// Copyright 2022 Philip Gaber (@qhga) +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "quantum.h" + +#ifdef KEYBOARD_snappy_rev1 + #include "rev1.h" +#elif KEYBOARD_snappy_rev2 + #include "rev2.h" +#elif KEYBOARD_snappy_rev3 + #include "rev3.h" +#elif KEYBOARD_snappy_rev3_5 + #include "rev3_5.h" +#endif