aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/xd75/keymaps/odyssey/config.h17
-rw-r--r--keyboards/xd75/keymaps/odyssey/keymap.c241
-rw-r--r--keyboards/xd75/keymaps/odyssey/readme.md2
-rw-r--r--keyboards/xd75/keymaps/odyssey/rules.mk3
4 files changed, 263 insertions, 0 deletions
diff --git a/keyboards/xd75/keymaps/odyssey/config.h b/keyboards/xd75/keymaps/odyssey/config.h
new file mode 100644
index 000000000..63eee4ea1
--- /dev/null
+++ b/keyboards/xd75/keymaps/odyssey/config.h
@@ -0,0 +1,17 @@
1#pragma once
2#define MK_3_SPEED
3#define TAPPING_TERM 20
4#define MOUSEKEY_DELAY 100
5#define MOUSEKEY_INTERVAL 20
6#define MOUSEKEY_MAX_SPEED 4
7#define MOUSEKEY_TIME_TO_MAX 10
8#define MOUSEKEY_WHEEL_MAX_SPEED 4
9#define MOUSEKEY_WHEEL_TIME_TO_MAX 10
10#define MK_C_OFFSET_0 4
11#define MK_C_INTERVAL_0 30
12#define MK_C_OFFSET_1 8
13#define MK_C_INTERVAL_1 20
14#define MK_C_OFFSET_2 16
15#define MK_C_INTERVAL_2 20
16#define MK_C_OFFSET_UNMOD 3
17#define MK_C_INTERVAL_UNMOD 25
diff --git a/keyboards/xd75/keymaps/odyssey/keymap.c b/keyboards/xd75/keymaps/odyssey/keymap.c
new file mode 100644
index 000000000..35510379c
--- /dev/null
+++ b/keyboards/xd75/keymaps/odyssey/keymap.c
@@ -0,0 +1,241 @@
1#include QMK_KEYBOARD_H
2
3// Layer shorthand
4#define _QW 0
5#define _CM 1
6#define _FN 2
7
8typedef enum {
9 NONE_NONE,
10 SINGLE_TAP,
11 SINGLE_HOLD,
12 DOUBLE_SINGLE_TAP
13} td_state_t;
14
15static td_state_t td_state = NONE_NONE;
16int cur_dance (qk_tap_dance_state_t *state);
17void altlp_finished (qk_tap_dance_state_t *state, void *user_data);
18void altlp_reset (qk_tap_dance_state_t *state, void *user_data);
19
20// Four differend underglow states for 2 language layouts x 2 states of colemak layer
21enum layer_states {
22 S_ENGLISH,
23 S_COLEMAK,
24 S_CRUSSIAN,
25 S_QRUSSIAN
26} l_state = S_ENGLISH;
27
28// CLMK to toggle colemak (active only with english qwerty, saves intent in russian but does nothing untill switched back to english)
29// RNBW - rainbow underglow
30// PING - ping pong underglow
31// SP_UP/DW - underglow speed controls
32enum custom_keycodes {
33 STUB = SAFE_RANGE,
34 CLMK,
35 RNBW,
36 PING,
37 SP_UP,
38 SP_DW
39};
40
41// Escape if taped, FN layer mod if held
42enum tapdance_codes {
43 LESC
44};
45
46bool sstate = false;
47int rgb = 0;
48int speed = 300;
49
50void set_colors(int r, int g, int b) {
51 for(int i = 0; i<6; i++) {
52 sethsv(r, g, b, (LED_TYPE *)&led[i]);
53 }
54 rgblight_set();
55}
56
57void update_led_state_c(void) {
58 if (rgb>0) return;
59 if (td_state == SINGLE_HOLD) set_colors(HSV_BLUE);
60 else {
61 if (l_state == S_ENGLISH) set_colors(HSV_RED);
62 if (l_state == S_QRUSSIAN) set_colors(HSV_GREEN);
63 if (l_state == S_COLEMAK) set_colors(HSV_YELLOW);
64 if (l_state == S_CRUSSIAN) set_colors(85, 100, 100);
65 }
66}
67
68int cur_dance (qk_tap_dance_state_t *state) {
69 if (state->count == 1) {
70 if (state->interrupted && state->pressed) { return SINGLE_HOLD; }
71 else if (!state->pressed) { return SINGLE_TAP; }
72 else { return SINGLE_HOLD; }
73 }
74 if (state->count == 2) { return DOUBLE_SINGLE_TAP; }
75 else { return 3; }
76}
77
78// Tapdance code stolen long time ago from one of the forum answers i found related to my problem, sadly can't provide link for the credits
79void lesc_finished (qk_tap_dance_state_t *state, void *user_data) {
80 td_state = cur_dance(state);
81 switch (td_state) {
82 case SINGLE_TAP:
83 register_code16(KC_ESC);
84 break;
85 case SINGLE_HOLD:
86 layer_on(_FN);
87 update_led_state_c();
88 sstate = false;
89 break;
90 case DOUBLE_SINGLE_TAP:
91 break;
92 case NONE_NONE:
93 break;
94 }
95}
96
97void lesc_reset (qk_tap_dance_state_t *state, void *user_data) {
98 switch (td_state) {
99 case SINGLE_TAP:
100 unregister_code16(KC_ESC);
101 break;
102 case SINGLE_HOLD:
103 layer_off(_FN);
104 if (sstate == false) {
105 register_code16(KC_ESC);
106 unregister_code16(KC_ESC);
107 }
108 break;
109 case DOUBLE_SINGLE_TAP:
110 break;
111 case NONE_NONE:
112 break;
113 }
114 td_state = NONE_NONE;
115 update_led_state_c();
116}
117
118qk_tap_dance_action_t tap_dance_actions[] = {
119 [LESC] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lesc_finished, lesc_reset)
120};
121
122const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
123 [_QW] = LAYOUT_ortho_5x15( /* QWERTY */
124KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, RNBW, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
125KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT,
126KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, CLMK, KC_DEL, SP_UP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
127KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, KC_UP, SP_DW, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
128KC_LCTL, LSFT(KC_9), KC_LALT, KC_LGUI, TD(LESC),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_ENT, TD(LESC),KC_RGUI, KC_RALT, RSFT(KC_0),KC_RCTL
129 ),
130 [_CM] = LAYOUT_ortho_5x15( /* COLEMAK */
131_______, _______, _______, _______, _______, _______, _______, PING, _______, _______, _______, _______, _______, _______, _______,
132_______, KC_Q, KC_W, KC_F, KC_P, KC_Z, _______, _______, _______, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_SLSH,
133_______, KC_A, KC_R, KC_S, KC_T, KC_G, _______, _______, _______, KC_M, KC_N, KC_E, KC_I, KC_O, _______,
134_______, KC_X, KC_V, KC_C, KC_D, KC_B, _______, _______, _______, KC_K, KC_H, KC_DOT, KC_COMM, KC_QUOT, _______,
135_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
136 ),
137 [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */
138KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_P7, KC_P8, KC_P9, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
139RESET, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_P4, KC_P5, KC_P6, _______, _______, _______, RSFT(KC_MINS), LSFT(KC_MINS), _______,
140_______, KC_MS_L, KC_MS_D, KC_MS_R, KC_MINS, KC_WH_D, KC_P1, KC_P2, KC_P3, _______, KC_PPLS, KC_ACL0, KC_ACL1, KC_ACL2, _______,
141_______, KC_ACL0, KC_ACL1, KC_ACL2, KC_WH_L, KC_WH_R, KC_NLCK, KC_PGUP, KC_P0, _______, _______, _______, _______, _______, _______,
142RGB_TOG, _______, _______, _______, KC_BSPC, KC_BSPC, KC_HOME, KC_PGDN, KC_END, KC_BSPC, KC_BSPC, _______, _______, _______, _______
143 )
144};
145
146bool process_record_user(uint16_t keycode, keyrecord_t *record) {
147 if(keycode != TD(LESC))
148 sstate = true;
149 switch (keycode) {
150 case SP_UP:
151 if (speed>25)
152 speed -= 25;
153 break;
154 case SP_DW:
155 if (speed < 1000)
156 speed += 25;
157 break;
158 case RNBW:
159 if(record->event.pressed) {
160 rgb = rgb == 0 ? 1 : 0;
161 update_led_state_c();
162 }
163 break;
164 case PING:
165 if(record->event.pressed) {
166 rgb = rgb == 0 ? 2 : 0;
167 update_led_state_c();
168 }
169 break;
170 case CLMK:
171 if(record->event.pressed) {
172 if (l_state == S_COLEMAK) {
173 layer_off(_CM);
174 l_state = S_ENGLISH;
175 }
176 else if (l_state == S_ENGLISH) {
177 layer_on(_CM);
178 l_state = S_COLEMAK;
179 }
180 else if (l_state == S_CRUSSIAN) { l_state = S_QRUSSIAN; }
181 else if (l_state == S_QRUSSIAN) { l_state = S_CRUSSIAN; }
182 }
183 update_led_state_c();
184 break;
185 case KC_CAPS:
186 if(record->event.pressed) {
187 if (l_state == S_ENGLISH) l_state = S_QRUSSIAN;
188 else if (l_state == S_QRUSSIAN) l_state = S_ENGLISH;
189 else if (l_state == S_COLEMAK) {
190 layer_off(_CM);
191 l_state = S_CRUSSIAN;
192 }
193 else if (l_state == S_CRUSSIAN) {
194 layer_on(_CM);
195 l_state = S_COLEMAK;
196 }
197 update_led_state_c();
198 }
199 break;
200 }
201 return true;
202}
203
204void matrix_init_user(void) { }
205
206// Rainbow globals
207int t = 0;
208int rc = 0;
209int col = 0;
210bool right = false;
211
212void matrix_scan_user(void) {
213 if (rgb==0) return; // Do nothing each tick right away if neither of animations enabled
214 if (rgb==1) {
215 if (rc == 0) {
216 rc = speed;
217 for(int i = 0; i<6; i++) {
218 sethsv(42*((t+i)%6), 255, 255, (LED_TYPE *)&led[i]);
219 }
220 rgblight_set();
221 t++; t = t % 6;
222 }
223 } else if (rgb==2) {
224 if (rc == 0) {
225 rc = speed;
226 col = (col + 1) % 36;
227 for (int i = 0; i<6; i++) {
228 if (i==t)
229 sethsv(42*(((col-1)/6)%6), 255, 255, (LED_TYPE *)&led[(right ? t : 5-t)]);
230 else
231 sethsv(0, 0, 0, (LED_TYPE *)&led[right ? i : 5-i]);
232 }
233 rgblight_set();
234 t++; t = t % 6;
235 if (t == 0) right = !right;
236 }
237 }
238 rc--;
239}
240
241void led_set_user(uint8_t usb_led) { }
diff --git a/keyboards/xd75/keymaps/odyssey/readme.md b/keyboards/xd75/keymaps/odyssey/readme.md
new file mode 100644
index 000000000..668c2bf23
--- /dev/null
+++ b/keyboards/xd75/keymaps/odyssey/readme.md
@@ -0,0 +1,2 @@
1Personal keymap of flutterlice
2Called Odyssey because it took me what feels like ten year to come up with perfect keymap that satisfied all my needs.
diff --git a/keyboards/xd75/keymaps/odyssey/rules.mk b/keyboards/xd75/keymaps/odyssey/rules.mk
new file mode 100644
index 000000000..5d80f2004
--- /dev/null
+++ b/keyboards/xd75/keymaps/odyssey/rules.mk
@@ -0,0 +1,3 @@
1TAP_DANCE_ENABLE=yes
2MOUSEKEY_ENABLE=yes
3COMMAND_ENABLE=no