From 23e11934c049f94ca2caa1d40662da725314d776 Mon Sep 17 00:00:00 2001 From: kemonine Date: Thu, 17 Sep 2020 15:28:58 -0400 Subject: [PATCH] Cleanup code ; implement double tap of lalt to flip between layer 1 and 0 to help with arrow key shortcuts on right hand that are bound to layer 1 --- firmware/alt/kemonine/qmk/keymap.c | 108 ++++++- .../kemonine/qmk/massdrop_alt_kemonine.bin | Bin 47096 -> 47824 bytes .../massdrop/alt/keymaps/kemonine/keymap.c | 264 ++++++++++++++++++ .../massdrop/alt/keymaps/kemonine/rules.mk | 2 + firmware/alt/kemonine/qmk/rules.mk | 3 +- 5 files changed, 363 insertions(+), 14 deletions(-) create mode 100644 firmware/alt/kemonine/qmk/qmk_firmware/keyboards/massdrop/alt/keymaps/kemonine/keymap.c create mode 100644 firmware/alt/kemonine/qmk/qmk_firmware/keyboards/massdrop/alt/keymaps/kemonine/rules.mk diff --git a/firmware/alt/kemonine/qmk/keymap.c b/firmware/alt/kemonine/qmk/keymap.c index cf8cdaea..71147b1a 100644 --- a/firmware/alt/kemonine/qmk/keymap.c +++ b/firmware/alt/kemonine/qmk/keymap.c @@ -4,7 +4,24 @@ #include QMK_KEYBOARD_H +#define TAPPING_TERM 200 + #define CAPS_LED 30 +#define LALT_LED 60 + +#define RGB_KMN_NO_COLOR 0, 0, 0 +#define RGB_KMN_CYAN 128, 255, 255 +#define RGB_KMN_CYAN_HILIGHT 0, 191, 255 + +#define HS_KMN_ORANGE 10,255 +#define HS_KMN_CYAN 128, 255 + +keymap_config_t keymap_config; +rgb_config_t rgb_matrix_config; + +uint8_t cur_dance(qk_tap_dance_state_t *state); +void al_finished(qk_tap_dance_state_t *state, void *user_data); +void al_reset(qk_tap_dance_state_t *state, void *user_data); enum alt_keycodes { U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active @@ -16,12 +33,28 @@ enum alt_keycodes { MD_BOOT, //Restart into bootloader after hold timeout }; -keymap_config_t keymap_config; -rgb_config_t rgb_matrix_config; +typedef struct { + bool is_press_action; + uint8_t state; +} tap; + +enum { + SINGLE_TAP = 1, + SINGLE_HOLD, + DOUBLE_TAP +}; + +enum td_keycodes { + ALT_LAYER // Our example key: `LALT` when held, `(` when tapped. Add additional keycodes for each tapdance. +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [ALT_LAYER] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, al_finished, al_reset) +}; const uint8_t PROGMEM layercolors[][2] = { - [0] = {10,255}, - [1] = {128, 255} + [0] = {HS_KMN_ORANGE}, + [1] = {HS_KMN_CYAN} }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -29,21 +62,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, LM(1, MOD_LALT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LGUI, MO(1), KC_SPC, MO(1), KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + KC_LCTL, KC_LGUI, TD(ALT_LAYER), KC_SPC, MO(1), KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), [1] = LAYOUT_65_ansi_blocker(KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_CAPS, KC_TRNS, KC_TRNS, KC_MS_UP, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, - KC_NO, KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_UP, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, + KC_TRNS, KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_UP, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN2, KC_MS_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PLAY_PAUSE, KC_RSFT, RGB_VAI, KC_MUTE, - KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_NO, KC_RCTL, KC_VOLD, RGB_VAD, KC_VOLU) + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RCTL, KC_VOLD, RGB_VAD, KC_VOLU), }; const uint8_t PROGMEM ledcolors[][DRIVER_LED_TOTAL][3] = { [1] = { - {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, - {128, 255, 255}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, {0, 0, 0}, {128, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, - {0, 0, 0}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {0, 0, 0}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, - {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, {128, 255, 255}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, {0, 0, 0}, {128, 255, 255}, {128, 255, 255}, - {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255}, {128, 255, 255} + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN} } }; @@ -60,6 +93,51 @@ void matrix_init_user(void) { void matrix_scan_user(void) { }; +uint8_t cur_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } else if (state->count == 2) return DOUBLE_TAP; + else return 8; +} + +// Initialize tap structure associated with example tap dance key +static tap al_tap_state = { + .is_press_action = true, + .state = 0 +}; + +// Functions that control what our tap dance key does +void al_finished(qk_tap_dance_state_t *state, void *user_data) { + al_tap_state.state = cur_dance(state); + switch (al_tap_state.state) { + case SINGLE_TAP: + tap_code(KC_LALT); + break; + case SINGLE_HOLD: + //layer_on(1); + break; + case DOUBLE_TAP: + // Check to see if the layer is already set + if (layer_state_is(1)) { + // If already set, then switch it off + layer_off(1); + } else { + // If not already set, then switch the layer on + layer_on(1); + } + break; + } +} + +void al_reset(qk_tap_dance_state_t *state, void *user_data) { + // If the key was held down and now is released then switch off the layer + if (al_tap_state.state == SINGLE_HOLD) { + layer_off(1); + } + al_tap_state.state = 0; +} + // Set the colors for individual LEDs for a given layer void set_leds_color( int layer) { for (int i = 0; i < DRIVER_LED_TOTAL; i++) { @@ -96,10 +174,14 @@ void rgb_matrix_indicators_user(void) { case 1: set_leds_color(1); break; + case 2: + set_layer_color(0); + rgb_matrix_set_color(LALT_LED, RGB_KMN_CYAN_HILIGHT); + break; } } if (host_keyboard_leds() & (1<mNGFt&l2~j58wH8SEOEz{%lEK~VX2H?}6$3h{Qc`DX<6n~Ub8OjRne9aS z#a(V#yM>tdLkx_GF(3ye#>JQz3u97kip`hk@=&JBlkt`lg!ned#?RApaa;?;<-c+e z^?aSLiI@*jqLep;s)I{CwZSDE-`n0xIVVD>P;tE8PL-xMc?QR)G!nBi9D_;pG+x&7 z*;*2(Fmq~!MwiFMdz&R{x!PvI;S1Kk3qD#JQ>f#bB{8yQx#@;G20MWruXQL5uBa0J z#ikx=Lz63!e%e(H8Na6m_)TP4GG+8y$H@-Q?9b|{bvTQaxDHzE=y4k+%eB6{QmX zs*}d_YxcRoLCf*S9Gg597X`IBf~W>U(!Lp#A94(yob|Bqn?FEW2wT@3kzdepq9v3eT z)84R1_?H~)?;g52SGw!&cUJ7VK=?hjcSXmSU?4`D6b2;3cs6q}zAZ$_@pU%J?-!~p zQlS58BN2WYUk&A#IrSD!dEX*{^i8l>E$A$Du(TFM5@i;^H_YUjn)v4~sfKDujfBtb zBDG2l2aD1-gYbKgN%#`b-Ls%>9q4drMl+Q>GU|UF@;DKUjZDMw2Rc<6SONTx5E$m! zgq&bqBaj$tGtwOYc_)c!chl!>B<5!~9cU*px7~CY*jy87%HIdy%gt{yLEgV_zHlC% zZ=G-sX7+E6GfeFj+h@oRg!JsA7q1$NyxyQ((N$w-FOJd}=Is5UDh8f9)hcG{@?agp zv`Ms|DHJoO=rexeV55MHo%0TfMGdD7nySe0>XoU}`QE*Gio0Hw|ul7Lc zi&xpe0Z$D0~GLE3}n#ehhuv+{J2bVR6YJmLr&ymO}`#5s(rmw;a++XNyB)%tlf(a)u?i$?Ox#8W|#h)OIMPhWNCX4@U5Wt zbL;&GP50!#v$L-vrVY9T`vRYpyrJ9rimlt44QH&aVbA#1r5u0N<^lWvjLkS!J(5#5 z30^T3e+>GFsFfCCMnBA@8BRG|^EgW_>|kVtyv3<#r2M#UHaIFY0e1_kddy|x{Pml7 zD)HAzwFC;Z+|X?`nRR($D7HE(TAZ|I_EuE9n`((l4C?8Kss!szGdyaoLSHEdFBTLX z0`rp^9S!X)vE34_2KocBJs%wpv|W^|VvwE?gO;mf(55yfT-n z&IL%g%jbn@HtF}-l$ApYsx;d*0h%3#kvhs(JK4$DP(^gp82u|*LtFG)A+|GL3PkbCVy^D>EAL#)n4!_&U*2XX8ik<9E{9ex6$uEz_X(J)VEss-smfv3E#E>XJssH^_CvD5U{6i#r4ViCL}n-Co%)FSU0KJ> zp}GY$HE4(a=hfTw@$0S_Xi9v=s>EuTqOSL$g%z}l@*mmWhxQBGhwJVxQDncrDrE+C zmXsqg)Z}?-!z-!MW+L%j&G8#aysg=#6Rb;x-(izJnh1_qF<}o3i>5@k;II}@ub-uo zIXj{oM`#q=2|v5rQ&RyVkCb(*40YQn|M$*gSzeb@Hu^Uv!6@U!QI5?KtfK^ZJC$Ro zIh|YY?ajJ!^*c)ePvqBZ@?9MdMh}~`1h-HCOg9H_g>r)gDwZzK#fOykHWWX`Lq(H` z2JA?}fMB$fYACT6k)&d(w+eYd|NPIV5V-u+9vgl4mrBZBoM8B!uu!+Q2+% zRz{R9U=rnfIRtB&U|hQ?E23GjE*9!mO7VjMqW^T9ofx9zJUUtHkWg7Dr1%Y^iSaa$ zB_xKVbl8*zrH1gM1;SqxkV+CxXNc);C~!rggo3=b_|P`^$H*ZVzvO&x5U% zdcyB_z_G(8uo1%&=EvJ7H4^^3qtx)WzSzJidp;VTH{k z_wa?le~&ynm!{4~DGsaMtY|cJR`D5Ly1Xwk2&_il-o!<7 zS|~%=g7s^N<~Pbe|Li|lq858=a`)}BZFrCi@Sr{X2#?kWk!Q3}jGElvZ~ zC`t(*2DctqB5+{HC%Sp4w!me5;?glYB_})1!UP-+hwN7(hz{uL;NR~+$m zN3u7@h?YX6!jPfKcEZCUFq%~qYgr?yg{lhDi4NB$HEoviVuT1KPJ~RN}P}*EGRuB za!&Wl?xEv-iLc4!Dba$LPO#p_a{|0(q^o^$#abv>uR|?7!nUQ4E_&8k@W(InPX!ld z6=up!oYG-kXp%rX&*a-61w7j+)u;d$Idgs@%F23Qkbhb))u3*dQ`Ji)UTrw6+f7u{ z7i511><@Umi77J%R_L8Xg+Z4CmMF;}hjoclp;duDLV&jBn0t75<&fTueJ zl_%h*fR~HBO5+1q3%mkw0pLKu*?>a<=K)p%PIJOR026>q4VN$V)bs&yl8K$p7$%bk z5G8zTXK3Bjgv^iJ6wOL>Q>j_eZfb5;q;Hp13-<{&fedP`@3LMN7`(0KUxL>`s=aWR zP+i{RG>3AvZ*XP3OV`8WQ$<@2o(WN%a``g9?DD{0yQHv)U3VDLrf(o|eBIQux3U+@ zz6I_F=94qsO)bf}Nxx+ias_NPiC*RKsg5?6jaxL+soUs!ULdILc~8<-WAfNy3TS8k zCK}cXVaotW*$*7?B^hMUJwifB#>q1Yq?9FSk9wg6O3K);+7}+-HjG~ykj-eTvb#6!sY zQ+7bQRZpd1)~2Zy*v;r^7THe_{5Ff79!+nv$f7E}~X+gN5%IJ9$%)Ur01`I~H8QHm@XDsdb8v?yJ62Q1r|tTQ=r{f90F})aW=Hh;^VSgqK9c_2z`%To_RLt4h{okx1ij;rzT3? zA9_I01 zbHZg9nrF^Au17GDMV1tZw-REPY(q()7cRk3;GV(ul_Yw210|1SUzfyr3!ybNyz{^081lTpZQtbhHf@x{#qZ0 z!(sJs`j7P=@31zo%kxJB@{TsB{dg0N%i|sl9w%S{i(OFcT9Hbcd57&>a7ui_8CiV^ z+TLNa78d*AjXC_3c$qE&JGU_9=~Bp!il5!OJQq!&EcVbOqUZq)UzrbRSLN@qzx0S4 zD|;!Myh!U;29Y^9PY7Q@IKKW^2|K(f8r}siE=q^C|6;8VTEK}@irc@8EnAH8!;2GX znepo4G%lj+5FysT5)yLQg@1MPC_`9wn2lUIWk^XZ6a|ZkR8X<#$ zUJG(>z(D|$KQMl>G>)p!4(-KDcK96p>@G=xvj}o0<~Dc^_n55gZCb)UC`-nHiS(N1)|-;F?{QV5gu&9SW8KqNTJyyR$6H z2hDIb;i|H+pylC1QQ}&V*!{iZG8m`-8vp0m8tFLy68{wv7%v=%$I;HchL0n`P2RI3` zZh%sNqHFAlXS-Esf=)|8v=Cr6@I?S60NB+`_Vnr<;@+GI9CkXJ{knQ_FxsOZ`W%4J zM*+?Q@YmS#=MMOw8hb(YB4gN^-)O%!mjVX#?)j+Z*C(o6&EhK%ox%Rr-S{vND?5 zj1wx;sO(S-^viZusYS}h8mhwSA$GB9ou3|df!`TIHhe+IgwF}FvANapK4@=)Tv1!X zYO7OZ$Q@!W)fGNSi8~l{huEx5#>XUKn-d}Sgv}{_7=_cqi~shM9bdvuJj8Zy&c=Q> z9~X7>6yEpZ9ew5TL+q_B(V#oG#r#;jJ*!e(rp-w*As!$4aAww)$q$!Yf0)-e#-XIo%zkFl+Ua^>{+7ZSkpBvv1RGxY(*PyNIjz5egS^X6V0|IvgKv$yKORk4dd*RG zvc`k$t?_2^+TS@cojGc!QpzU3mhMN<5`GV`@vYZhr+o|u2wCwa6vzF9?0nNWZf_Lr zS2zIXzk!%-P4cEU;7`Q2E*q=&ouz({c(2GM#3z@{r31VqL?H10Df!qq`OT1i{gU5? zTa<%@Oa|NlV0zoQ(J+x#*y{)hgSt=!I1(`aT7bR}un-{DEvp6kJU~7`f?GzB21o{& z1+@)-!y(B!D9cEH0r(ieE`X^3r2y*zytrjV3deJ&my~IZ8x%M&w8vjg5G){o065;@ N@A4X>{^Lr?{{gGy!P5W$ delta 7525 zcmbt3d3;k<*7v@bG$~j}DbjQ$OX*6Xr66k|ZD~rIA{2{Opin@iFrY1Nts}N&kzLS> z3bG8iZ;WkYlr5x%g6N30A|qf?7=Z|Gufy`vG|8KDUQ$KA@sIJ#?|1Gw_pEn0_uThh zTCa1iU$~mG2BN$FH9}_p7a+I%x^steC~g9{L}XTO&WK`j6fGd7a?(WR|?R{;+@E(H{?v&E)z8?L14! z&a>+RnQ8+bt_<-}xl5XG^} z+|Ujuanynj^oc%T3_A3SKG7HYq?QbqhE(JsuOd$=Y=CW2+oFw;Rhf`5$J2CGm2;>OT79CK4x>V)YksPtgI8Q= znmy$WG_hAJCw$PgOciocGCB-I9}C0Mn5dxLBZ>8r;FQE=(oaqegv3D> zv*SUQ2lT$gGJ0-pRnNU7F7zBPyw|l<)%zqbywi19#ec~QZ*;W;b)3wyL{|~RwY}63 zS)ntJu=B#!t`$K)e0jmSwu+>jZ{-EnRjUdHyA55Kt$qOsG*i)*C zS)X|8ue)oWKS2cMdR;c$00Vx*rAX}4DkZ8~xkODH(Q(47E-Gx2>YNIocescl)T}X6 zVYau*$?2{;CEzm9m@id0H^Ls82N0bBpq@=s4;#GPtuRwF*~|;0-DHc-%)#z!OhnkY zhZpV!*)=E1DnW)hz_SMR0KCH+Q<|&VQFVT&#>&=P4T_TZ0u@z}fIPM~e9RWJL zlO+BSpkv%5@uEyq;X3Gl+xkjXMuYA8o=K|K+#BEIY|jpA)tM!YI8{0UTewg99G3JS zU7xal1Sj=+>NFwUnc9BF%JtYmxwp?)U+&3Ks%Ed<_Ksc+TTLz68IY5XO|V|P<&ai8 zV@j3j3Ws^>*u*MBqC!!^St5$H36l86en>sGy`M1% zx$S4z(SCRI8`DmR=6$~KzVcVir7ne~3i($q< zuK+q_s-La_I%2Y)t_FJ7R2Hvo{6FS@1JTrg`4*tJ2WSSg?JmFhdY~((vOWS+pm0?$d2WEnCaAfiyCv4gJxj z>|Z?lQ< zHR;Da+PzdTdwt>s$tQjxsi2&P37+138x|Cwc-o=1%Lf81WG~DcA0@BVTP!9aAwcCP zqy(tyguxNrk*Ho0zjMGIShQ8OYB-myIUx!b=xjm)w8}(mQxlEQ7Rl|Si77zulKCIY z^mUnzNkW~hr2f#(P6`XbSy0Pns0zgK7OP7N=a#wIOG#_uXU`*KBtRR$Zh!&hgm?j0 z11~Mr9ua!6j^r5irG3y_c_otdOWDBz z`XD8lyUWe~l`<+Q%T0vWJj^g~0r!xHJu`3{r}MCZsY|(Ux>$W`-{{Xf6P#3+;>04E zd!t{@=4_4aHgi-P70O)fTx#SD1KczRTyU!FQE<`qbqv!b>8Q}(brsC6Ie(UGptcNG zMgW?F%UIpOL+(}N`TJ4jJsYOq(#PCHIUAJLFA~)hmeZ^1vK6hTYEeCEen31kZD?ez z+bb@1Q{i>DBswKEJcFcOmh!yf7jE`$npS&n*B!3D6)Ursnn$;8agnsGDtgi@7I(4s zwD>X6Zj(UCU(CB*3c|kU2@!_7Ks~M06z}RgnF{~zlEj6Q^@(NKhE_?OC)F=j;Ik5V zKX-tQP1kWhce1kdXr&8=SkLOxQ>c>dPLIm?+NEpI!M3GHM6gRp#Y+BL_5%m$(D7fx zE~-uuL8YL&o$@Y@XI<$dQ>MH9k0bf}HTHVQsViUO6V*m5*Z+&goykhD_+Gw$iBQF6 z4GE{c*yBUegBe(<;UT6sYZwx4se^dv1@1wI+LqWrgf9a&cfiT}t-5F6M z?+0$PZ%+s5O@w)MM9B1MU`L6p0`CY|frXt!NPxJQl@>b@W-&T6GwD8G zT251=B$}mW=iUz5`+6G@rpY`a%<+8)JknbUymB^g=y3W1``gg0p2|*m4Cq|!q{3qM z!_XYg>1JueibucZ`P?~Oecnlg&7M!7ea-U`v@<;|&P$CgSNXVM@|G;{q`?H9_3d>c zegURKgaynoENRwk&m0J+?0wzYa#f)l28)pGxmTu1s;iX}63%*v&;bzPrNS;)zLRiZC2^^T$dBccxcUHUJ>~H~&Rv4U zA;NB!KYT7G^l(e4A_|Xg$-*rQCGlIh(-bUt1XCh+f_2vjN@)-4DI}q#mw}?XFI=h&Z^oLO~*-%(%^4fVXgF3xY2pTxh=Z1>MLA3 z=)=hpGIew^3mqG-pDc%uD%V0*L;ZGi_e-GvHTGHlSYr)xaatV?YUE)#CGp1q#aW=j zeYK4go@uW+ad0Xd78<%)65A!Zg|CNaxgR`Y&_Q->+#NMn>?n9qQkbv8 z{m9ERre_0D=4uL9l{ROie1*vlppVOg9PCpIF}xI@xq=g*+j^7k30W68-MVLf z)eWoG=4dK^4O9?Tjee2Sts4n+h`&=(Ei1CDEMo+6)Ha1>T6H9RT`8#y)OW`kwj?W8 zHCA4eHSFW8r~&u;HU(xci9bskyWf(xfK`PgUc_4gtb((RAr`svN#c2^d~4Xq?96FZ zzDYNJoO?L3B)cR_ZHL=WoPUsq_JM;Mn*#70pTevMJkvM+3enXzYU~f=@FkfNX@;0_Z;9bz|S0Ht=X|PPx^=+oh}B<>qwkOT;$VQ^k5!c<`L)l^s@80 zfR&&%3vdwN={`xX0(=kj)pB2N4gov~`dYwu0S*V82RItA1+WhAICulw2Md7NCW!|e zRAuf3?4bwQBRNBr=fYq?+3p-mfb!s|tcS!yocod+P6PF3C$h(#1kZ;sP);9WO-F@6u)a77Li2ktOmNn;Ahbuh_$YX!u zi9S$|dk%WVtjIi1*$BP&ncaL(fQrcbjy5uHo`mg$!NJeM+Y;*7ti$r}p#i053&KJC zR>5%EWIbOnodU`%Tt;J>z-=J_S=i1I4Kb0pYlK7-Q`6B@GJ&0)_+c<=Ag7RRzjNhH zz0^s6RpQ{A*zQTg=^pFFNne3iW-l5IWv;X6>ku@IhL<$I@%bq$Z{a+8*R7o3Vxv+X zkTtzH51my{O@a2cscT`l>35IDQ7^iu1|>h0IF+No`4M*d-UNDt(P@K~hvSIu2pcvn z1^Tn6EtA6`uLa-`>zL+{Ib|6k+04@Tw z16+t>2k+13PD+e>;E9mFUXK{-4Vw^F=n;>z)enpeS9`yQ@{ga~Fg-qn$>RcyXQv;S z?$1aa%{t05=N*=J*p%Iypzcu?Qa(KtKMlf9R|1ct_~o#SRhMT>odBc5>KzFc*-uj_ zi`_IaO#79FSBhV0f3@${KXnryEBgdS=UYMx!7~S!2oY)sCp7LcvC{bow2-ZsKMvX> z^DQB$0oP199{)lXvjF*}3kK6d>-q(wIfLbGLh{}u5LCl#!mK*QKCb9L1UdeM#PHYlD`B2tkB2?R9#<5E zm4#LEFkiS3_oH4Qha)Se4Z%(A9{DDqFMz|dFiVA;Bno)n?%5!TpEz)-P!Ce}^~yWb z^Fg&cqqhN#SzY?xt!77MGyfO|EY2BJ0GcnxPv^tR_gTGXOh*_YJ@VfVbP(rN?}FR6(NxU}2FN3;j_5CIAdIhAFGo z%4c&7^f2gHw!LazBfOJx@A3H{R{1L43?o4pfH~3 zW+0qppZztK1N5^W^?Fk74SF&jnRh>#jA-eTPb2EF1d;W*CC^YeZ2FqsfLMC%XlNJJ z;u(FuHiaIuHrGm&9%Ic*!+>>iX#zcE^)4MvmFp5AF3VhQl&Mqf{^kAYI<{i@Uqega z6wE$M$nhia<>C+_r&#EUln~TE1!G02iRG`zP-1T#t6NbMf|PuMLAH*CJZ-&&bNuPS z;M@CjMkspWEby4Wrs?V@a1z(Ctd%(!cjbOrR@8)_&+s#8?f!MFXjKBps#iH~@t3|0Ec=4Z&kj@j<$`3Os`{kt%+1jna?7gjB94%t+ZYzc_N_6|UP*lPn^&>*8 zMccR1UUVlR&D)?bZYSjIHmiF_JnfU#59)%AI9vzR2X>e%@;d%$9kTNys^*DAB#CUa zCcPZhr%xSNE_s=dU4WIl2npF`z5D$;X-z&H{6zq5P=FoR z1@MvpuLx;?I)L3!&hV#!(X7H64Zod$Hv*Ic3count == 1) { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } else if (state->count == 2) return DOUBLE_TAP; + else return 8; +} + +// Initialize tap structure associated with example tap dance key +static tap al_tap_state = { + .is_press_action = true, + .state = 0 +}; + +// Functions that control what our tap dance key does +void al_finished(qk_tap_dance_state_t *state, void *user_data) { + al_tap_state.state = cur_dance(state); + switch (al_tap_state.state) { + case SINGLE_TAP: + tap_code(KC_LALT); + break; + case SINGLE_HOLD: + //layer_on(1); + break; + case DOUBLE_TAP: + // Check to see if the layer is already set + if (layer_state_is(1)) { + // If already set, then switch it off + layer_off(1); + } else { + // If not already set, then switch the layer on + layer_on(1); + } + break; + } +} + +void al_reset(qk_tap_dance_state_t *state, void *user_data) { + // If the key was held down and now is released then switch off the layer + if (al_tap_state.state == SINGLE_HOLD) { + layer_off(1); + } + al_tap_state.state = 0; +} + +// Set the colors for individual LEDs for a given layer +void set_leds_color( int layer) { + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + uint8_t val = pgm_read_byte(&ledcolors[layer][i][2]); + // if the brightness of the led is set to 0 in the map, + // the value is not overriden with global controls, allowing the led + // to appear turned off + HSV hsv = { .h = pgm_read_byte(&ledcolors[layer][i][0]), .s = pgm_read_byte(&ledcolors[layer][i][1]), .v = val == 0 ? 0 : rgb_matrix_config.hsv.v}; + RGB rgb = hsv_to_rgb( hsv ); + rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +// Set the colors for ALL LEDs for a given layer +void set_layer_color( uint8_t layer ) { + HSV hsv = { .h = pgm_read_byte(&layercolors[layer][0]), .s = pgm_read_byte(&layercolors[layer][1]), .v = rgb_matrix_config.hsv.v}; + RGB rgb = hsv_to_rgb( hsv ); + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +// Override standard rgb colorization stuff +void rgb_matrix_indicators_user(void) { + uint32_t mode = rgblight_get_mode(); + // assign colors if the matrix is on and the current mode + // is SOLID COLORS => No animations running + if(rgb_matrix_config.enable == 1 && mode == RGB_MATRIX_SOLID_COLOR) { + uint8_t layer = biton32(layer_state); + switch (layer) { + case 0: + set_layer_color(0); + break; + case 1: + set_leds_color(1); + break; + case 2: + set_layer_color(0); + rgb_matrix_set_color(LALT_LED, RGB_KMN_CYAN_HILIGHT); + break; + } + } + if (host_keyboard_leds() & (1<event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + case RGB_TOG: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_KEYLIGHT); + rgb_matrix_set_color_all(0, 0, 0); + } + break; + case LED_FLAG_KEYLIGHT: { + rgb_matrix_set_flags(LED_FLAG_UNDERGLOW); + rgb_matrix_set_color_all(0, 0, 0); + } + break; + case LED_FLAG_UNDERGLOW: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_disable_noeeprom(); + } + break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable_noeeprom(); + } + break; + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/firmware/alt/kemonine/qmk/qmk_firmware/keyboards/massdrop/alt/keymaps/kemonine/rules.mk b/firmware/alt/kemonine/qmk/qmk_firmware/keyboards/massdrop/alt/keymaps/kemonine/rules.mk new file mode 100644 index 00000000..d6c1de32 --- /dev/null +++ b/firmware/alt/kemonine/qmk/qmk_firmware/keyboards/massdrop/alt/keymaps/kemonine/rules.mk @@ -0,0 +1,2 @@ +MOUSEKEY_ENABLE = yes +TAP_DANCE_ENABLE = yes \ No newline at end of file diff --git a/firmware/alt/kemonine/qmk/rules.mk b/firmware/alt/kemonine/qmk/rules.mk index 35591533..d6c1de32 100644 --- a/firmware/alt/kemonine/qmk/rules.mk +++ b/firmware/alt/kemonine/qmk/rules.mk @@ -1 +1,2 @@ -MOUSEKEY_ENABLE = yes \ No newline at end of file +MOUSEKEY_ENABLE = yes +TAP_DANCE_ENABLE = yes \ No newline at end of file