aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/host.c8
-rw-r--r--common/host.h1
-rw-r--r--common/keyboard.c122
-rw-r--r--common/mousekey.c7
-rw-r--r--common/usb_keycodes.h41
5 files changed, 141 insertions, 38 deletions
diff --git a/common/host.c b/common/host.c
index fddd5b662..0a03807f7 100644
--- a/common/host.c
+++ b/common/host.c
@@ -69,6 +69,14 @@ void host_unregister_key(uint8_t key)
69 host_send_keyboard_report(); 69 host_send_keyboard_report();
70} 70}
71 71
72void host_clear_all_keys_but_mods(void)
73{
74 for (int8_t i = 0; i < REPORT_KEYS; i++) {
75 keyboard_report->keys[i] = 0;
76 }
77 host_send_keyboard_report();
78}
79
72/* keyboard report operations */ 80/* keyboard report operations */
73void host_add_key(uint8_t key) 81void host_add_key(uint8_t key)
74{ 82{
diff --git a/common/host.h b/common/host.h
index 84a6c2477..a6dff8de0 100644
--- a/common/host.h
+++ b/common/host.h
@@ -42,6 +42,7 @@ uint8_t host_keyboard_leds(void);
42/* new interface */ 42/* new interface */
43void host_register_key(uint8_t key); 43void host_register_key(uint8_t key);
44void host_unregister_key(uint8_t key); 44void host_unregister_key(uint8_t key);
45void host_clear_all_keys_but_mods(void);
45 46
46/* keyboard report operations */ 47/* keyboard report operations */
47void host_add_key(uint8_t key); 48void host_add_key(uint8_t key);
diff --git a/common/keyboard.c b/common/keyboard.c
index b7063a264..328941df3 100644
--- a/common/keyboard.c
+++ b/common/keyboard.c
@@ -41,8 +41,6 @@ typedef enum keykind {
41 FNK_DOWN, FNK_UP, 41 FNK_DOWN, FNK_UP,
42 KEY_DOWN, KEY_UP, 42 KEY_DOWN, KEY_UP,
43 MOD_DOWN, MOD_UP, 43 MOD_DOWN, MOD_UP,
44 MOUSEKEY_DOWN, MOUSEKEY_UP,
45 DELAY
46} keykind_t; 44} keykind_t;
47 45
48typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t; 46typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
@@ -69,15 +67,17 @@ static const char *state_str(kbdstate_t state)
69 67
70static inline keykind_t get_keykind(uint8_t code, bool pressed) 68static inline keykind_t get_keykind(uint8_t code, bool pressed)
71{ 69{
72 if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP); 70 if IS_KEY(code) return (pressed ? KEY_DOWN : KEY_UP);
73 if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP); 71 if IS_MOD(code) return (pressed ? MOD_DOWN : MOD_UP);
74 if IS_FN(code) { 72 if IS_FN(code) {
75 if (keymap_fn_keycode(FN_INDEX(code))) 73 if (keymap_fn_keycode(FN_INDEX(code)))
76 return (pressed ? FNK_DOWN : FNK_UP); 74 return (pressed ? FNK_DOWN : FNK_UP);
77 else 75 else
78 return (pressed ? FN_DOWN : FN_UP); 76 return (pressed ? FN_DOWN : FN_UP);
79 } 77 }
80 if IS_MOUSEKEY(code) return (pressed ? MOUSEKEY_DOWN : MOUSEKEY_UP); 78 if IS_MOUSEKEY(code) return (pressed ? KEY_DOWN : KEY_UP);
79 if IS_SYSTEM(code) return (pressed ? KEY_DOWN : KEY_UP);
80 if IS_CONSUMER(code) return (pressed ? KEY_DOWN : KEY_UP);
81 return NONE; 81 return NONE;
82} 82}
83 83
@@ -86,7 +86,13 @@ static void layer_switch_on(uint8_t code)
86 if (!IS_FN(code)) return; 86 if (!IS_FN(code)) return;
87 fn_state_bits |= FN_BIT(code); 87 fn_state_bits |= FN_BIT(code);
88 if (current_layer != keymap_fn_layer(FN_INDEX(code))) { 88 if (current_layer != keymap_fn_layer(FN_INDEX(code))) {
89 //TODO: clear all key execpt Mod key 89 // clear all key execpt Mod key
90 host_clear_all_keys_but_mods();
91 host_system_send(0);
92 host_consumer_send(0);
93 mousekey_clear();
94 mousekey_send();
95
90 debug("Layer Switch(on): "); debug_hex(current_layer); 96 debug("Layer Switch(on): "); debug_hex(current_layer);
91 current_layer = keymap_fn_layer(FN_INDEX(code)); 97 current_layer = keymap_fn_layer(FN_INDEX(code));
92 debug(" -> "); debug_hex(current_layer); debug("\n"); 98 debug(" -> "); debug_hex(current_layer); debug("\n");
@@ -98,7 +104,13 @@ static void layer_switch_off(uint8_t code)
98 if (!IS_FN(code)) return; 104 if (!IS_FN(code)) return;
99 fn_state_bits &= ~FN_BIT(code); 105 fn_state_bits &= ~FN_BIT(code);
100 if (current_layer != keymap_fn_layer(biton(fn_state_bits))) { 106 if (current_layer != keymap_fn_layer(biton(fn_state_bits))) {
101 //TODO: clear all key execpt Mod key 107 // clear all key execpt Mod key
108 host_clear_all_keys_but_mods();
109 host_system_send(0);
110 host_consumer_send(0);
111 mousekey_clear();
112 mousekey_send();
113
102 debug("Layer Switch(off): "); debug_hex(current_layer); 114 debug("Layer Switch(off): "); debug_hex(current_layer);
103 current_layer = keymap_fn_layer(biton(fn_state_bits)); 115 current_layer = keymap_fn_layer(biton(fn_state_bits));
104 debug(" -> "); debug_hex(current_layer); debug("\n"); 116 debug(" -> "); debug_hex(current_layer); debug("\n");
@@ -128,6 +140,7 @@ static inline bool is_anykey_down(void)
128 140
129static void register_code(uint8_t code) 141static void register_code(uint8_t code)
130{ 142{
143debug("register_code\n");
131 if IS_KEY(code) { 144 if IS_KEY(code) {
132 host_add_key(code); 145 host_add_key(code);
133 host_send_keyboard_report(); 146 host_send_keyboard_report();
@@ -140,6 +153,84 @@ static void register_code(uint8_t code)
140 mousekey_on(code); 153 mousekey_on(code);
141 mousekey_send(); 154 mousekey_send();
142 } 155 }
156 else if IS_CONSUMER(code) {
157debug("consumer\n");
158 uint16_t usage = 0;
159 switch (code) {
160 case KB_AUDIO_MUTE:
161 usage = AUDIO_MUTE;
162 break;
163 case KB_AUDIO_VOL_UP:
164 usage = AUDIO_VOL_UP;
165 break;
166 case KB_AUDIO_VOL_DOWN:
167 usage = AUDIO_VOL_DOWN;
168 break;
169 case KB_MEDIA_NEXT_TRACK:
170 usage = TRANSPORT_NEXT_TRACK;
171 break;
172 case KB_MEDIA_PREV_TRACK:
173 usage = TRANSPORT_PREV_TRACK;
174 break;
175 case KB_MEDIA_STOP:
176 usage = TRANSPORT_STOP;
177 break;
178 case KB_MEDIA_PLAY_PAUSE:
179 usage = TRANSPORT_PLAY_PAUSE;
180 break;
181 case KB_MEDIA_SELECT:
182 usage = AL_CC_CONFIG;
183 break;
184 case KB_MAIL:
185 usage = AL_EMAIL;
186 break;
187 case KB_CALCULATOR:
188 usage = AL_CALCULATOR;
189 break;
190 case KB_MY_COMPUTER:
191 usage = AL_LOCAL_BROWSER;
192 break;
193 case KB_WWW_SEARCH:
194 usage = AC_SEARCH;
195 break;
196 case KB_WWW_HOME:
197 usage = AC_HOME;
198 break;
199 case KB_WWW_BACK:
200 usage = AC_BACK;
201 break;
202 case KB_WWW_FORWARD:
203 usage = AC_FORWARD;
204 break;
205 case KB_WWW_STOP:
206 usage = AC_STOP;
207 break;
208 case KB_WWW_REFRESH:
209 usage = AC_REFRESH;
210 break;
211 case KB_WWW_FAVORITES:
212 usage = AC_BOOKMARKS;
213 break;
214 }
215debug("usage: "); phex16(usage); debug("\n");
216 host_consumer_send(usage);
217 }
218 else if IS_SYSTEM(code) {
219 uint16_t usage = 0;
220 switch (code) {
221 case KB_SYSTEM_POWER:
222 usage = SYSTEM_POWER_DOWN;
223 break;
224 case KB_SYSTEM_SLEEP:
225 usage = SYSTEM_SLEEP;
226 break;
227 case KB_SYSTEM_WAKE:
228 usage = SYSTEM_WAKE_UP;
229 break;
230 }
231 host_system_send(usage);
232 }
233
143} 234}
144 235
145static void unregister_code(uint8_t code) 236static void unregister_code(uint8_t code)
@@ -156,6 +247,12 @@ static void unregister_code(uint8_t code)
156 mousekey_off(code); 247 mousekey_off(code);
157 mousekey_send(); 248 mousekey_send();
158 } 249 }
250 else if IS_CONSUMER(code) {
251 host_consumer_send(0x0000);
252 }
253 else if IS_SYSTEM(code) {
254 host_system_send(0x0000);
255 }
159} 256}
160 257
161/* 258/*
@@ -254,7 +351,6 @@ static inline void process_key(keyevent_t event)
254 layer_switch_off(code); 351 layer_switch_off(code);
255 break; 352 break;
256 case KEY_DOWN: 353 case KEY_DOWN:
257 case MOUSEKEY_DOWN:
258 register_code(code); 354 register_code(code);
259 NEXT(PRESSING); 355 NEXT(PRESSING);
260 break; 356 break;
@@ -262,7 +358,6 @@ static inline void process_key(keyevent_t event)
262 register_code(code); 358 register_code(code);
263 break; 359 break;
264 case KEY_UP: 360 case KEY_UP:
265 case MOUSEKEY_UP:
266 case MOD_UP: 361 case MOD_UP:
267 unregister_code(code); 362 unregister_code(code);
268 break; 363 break;
@@ -283,16 +378,16 @@ static inline void process_key(keyevent_t event)
283 register_code(keymap_fn_keycode(FN_INDEX(code))); 378 register_code(keymap_fn_keycode(FN_INDEX(code)));
284 break; 379 break;
285 case FNK_UP: 380 case FNK_UP:
381 // can't know whether layer switched or not
382 layer_switch_off(code);
286 unregister_code(keymap_fn_keycode(FN_INDEX(code))); 383 unregister_code(keymap_fn_keycode(FN_INDEX(code)));
287 break; 384 break;
288 case KEY_DOWN: 385 case KEY_DOWN:
289 case MOD_DOWN: 386 case MOD_DOWN:
290 case MOUSEKEY_DOWN:
291 register_code(code); 387 register_code(code);
292 break; 388 break;
293 case KEY_UP: 389 case KEY_UP:
294 case MOD_UP: 390 case MOD_UP:
295 case MOUSEKEY_UP:
296 unregister_code(code); 391 unregister_code(code);
297 // no key registered? mousekey, mediakey, systemkey 392 // no key registered? mousekey, mediakey, systemkey
298 if (!host_has_anykey()) 393 if (!host_has_anykey())
@@ -307,7 +402,6 @@ static inline void process_key(keyevent_t event)
307 case FN_DOWN: 402 case FN_DOWN:
308 case FNK_DOWN: 403 case FNK_DOWN:
309 case KEY_DOWN: 404 case KEY_DOWN:
310 case MOUSEKEY_DOWN:
311 waiting_key = (keyrecord_t) { 405 waiting_key = (keyrecord_t) {
312 .event = event, 406 .event = event,
313 .code = code, 407 .code = code,
@@ -339,7 +433,6 @@ static inline void process_key(keyevent_t event)
339 } 433 }
340 break; 434 break;
341 case KEY_UP: 435 case KEY_UP:
342 case MOUSEKEY_UP:
343 unregister_code(code); 436 unregister_code(code);
344 NEXT(IDLE); 437 NEXT(IDLE);
345 break; 438 break;
@@ -355,7 +448,6 @@ static inline void process_key(keyevent_t event)
355 case FN_DOWN: 448 case FN_DOWN:
356 case FNK_DOWN: 449 case FNK_DOWN:
357 case KEY_DOWN: 450 case KEY_DOWN:
358 case MOUSEKEY_DOWN:
359 tmp_mods = keyboard_report->mods; 451 tmp_mods = keyboard_report->mods;
360 host_set_mods(delayed_fn.mods); 452 host_set_mods(delayed_fn.mods);
361 register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code))); 453 register_code(keymap_fn_keycode(FN_INDEX(delayed_fn.code)));
@@ -389,7 +481,6 @@ static inline void process_key(keyevent_t event)
389 } 481 }
390 break; 482 break;
391 case KEY_UP: 483 case KEY_UP:
392 case MOUSEKEY_UP:
393 if (code == waiting_key.code) { 484 if (code == waiting_key.code) {
394 layer_switch_on(delayed_fn.code); 485 layer_switch_on(delayed_fn.code);
395 NEXT(IDLE); 486 NEXT(IDLE);
@@ -444,7 +535,6 @@ void keyboard_task(void)
444 matrix_row = matrix_get_row(r); 535 matrix_row = matrix_get_row(r);
445 matrix_change = matrix_row ^ matrix_prev[r]; 536 matrix_change = matrix_row ^ matrix_prev[r];
446 if (matrix_change) { 537 if (matrix_change) {
447 // TODO: print once per scan
448 if (debug_matrix) matrix_print(); 538 if (debug_matrix) matrix_print();
449 539
450 for (int c = 0; c < MATRIX_COLS; c++) { 540 for (int c = 0; c < MATRIX_COLS; c++) {
diff --git a/common/mousekey.c b/common/mousekey.c
index 7f8e860aa..222d9e445 100644
--- a/common/mousekey.c
+++ b/common/mousekey.c
@@ -135,13 +135,6 @@ void mousekey_send(void)
135void mousekey_clear(void) 135void mousekey_clear(void)
136{ 136{
137 report = (report_mouse_t){}; 137 report = (report_mouse_t){};
138/*
139 report.buttons = 0;
140 report.x = 0;
141 report.y = 0;
142 report.v = 0;
143 report.h = 0;
144*/
145} 138}
146 139
147static void mousekey_debug(void) 140static void mousekey_debug(void)
diff --git a/common/usb_keycodes.h b/common/usb_keycodes.h
index 61d6bf002..6a4437418 100644
--- a/common/usb_keycodes.h
+++ b/common/usb_keycodes.h
@@ -24,15 +24,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
24 24
25 25
26#define IS_ERROR(code) (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED) 26#define IS_ERROR(code) (KB_ROLL_OVER <= (code) && (code) <= KB_UNDEFINED)
27#define IS_ANY(code) (KB_A <= (code)) 27#define IS_ANY(code) (KB_A <= (code) && (code) <= 0xFF)
28#define IS_KEY(code) (KB_A <= (code) && (code) <= KB_EXSEL) 28#define IS_KEY(code) (KB_A <= (code) && (code) <= KB_EXSEL)
29#define IS_MOD(code) (KB_LCTRL <= (code) && (code) <= KB_RGUI) 29#define IS_MOD(code) (KB_LCTRL <= (code) && (code) <= KB_RGUI)
30
30#define IS_FN(code) (KB_FN0 <= (code) && (code) <= KB_FN7) 31#define IS_FN(code) (KB_FN0 <= (code) && (code) <= KB_FN7)
31#define IS_MOUSEKEY(code) (KB_MS_UP <= (code) && (code) <= KB_MS_WH_RIGHT) 32#define IS_MOUSEKEY(code) (KB_MS_UP <= (code) && (code) <= KB_MS_WH_RIGHT)
32#define IS_MOUSEKEY_MOVE(code) (KB_MS_UP <= (code) && (code) <= KB_MS_RIGHT) 33#define IS_MOUSEKEY_MOVE(code) (KB_MS_UP <= (code) && (code) <= KB_MS_RIGHT)
33#define IS_MOUSEKEY_BUTTON(code) (KB_MS_BTN1 <= (code) && (code) <= KB_MS_BTN5) 34#define IS_MOUSEKEY_BUTTON(code) (KB_MS_BTN1 <= (code) && (code) <= KB_MS_BTN5)
34#define IS_MOUSEKEY_WHEEL(code) (KB_MS_WH_UP <= (code) && (code) <= KB_MS_WH_RIGHT) 35#define IS_MOUSEKEY_WHEEL(code) (KB_MS_WH_UP <= (code) && (code) <= KB_MS_WH_RIGHT)
35 36
37#define IS_SPECIAL(code) ((0xB0 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF))
38#define IS_CONSUMER(code) (KB_MUTE <= (code) && (code) <= KB_WFAV)
39#define IS_SYSTEM(code) (KB_POWER <= (code) && (code) <= KB_WAKE)
40
36#define MOD_BIT(code) (1<<((code) & 0x07)) 41#define MOD_BIT(code) (1<<((code) & 0x07))
37#define FN_BIT(code) (1<<((code) - KB_FN0)) 42#define FN_BIT(code) (1<<((code) - KB_FN0))
38#define FN_INDEX(code) ((code) - KB_FN0) 43#define FN_INDEX(code) ((code) - KB_FN0)
@@ -137,14 +142,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
137 142
138 143
139/* Special keycode */ 144/* Special keycode */
145/* NOTE: 0xA5-DF and 0xE8-FF can be used for internal special purpose */
140enum special_keycodes { 146enum special_keycodes {
141 /* System Control */ 147 /* System Control */
142 KB_SYSTEM_POWER = 0xB0, 148 KB_SYSTEM_POWER = 0xA5,
143 KB_SYSTEM_SLEEP, 149 KB_SYSTEM_SLEEP,
144 KB_SYSTEM_WAKE, 150 KB_SYSTEM_WAKE, /* 0xA7 */
151 /* 0xA8-AF */
145 152
146 /* Consumer Page */ 153 /* Consumer Page */
147 KB_AUDIO_MUTE, 154 KB_AUDIO_MUTE = 0xB0,
148 KB_AUDIO_VOL_UP, 155 KB_AUDIO_VOL_UP,
149 KB_AUDIO_VOL_DOWN, 156 KB_AUDIO_VOL_DOWN,
150 KB_MEDIA_NEXT_TRACK, 157 KB_MEDIA_NEXT_TRACK,
@@ -157,13 +164,14 @@ enum special_keycodes {
157 KB_MY_COMPUTER, 164 KB_MY_COMPUTER,
158 KB_WWW_SEARCH, 165 KB_WWW_SEARCH,
159 KB_WWW_HOME, 166 KB_WWW_HOME,
160 KB_WWW_BACK, /* 0xC0 */ 167 KB_WWW_BACK,
161 KB_WWW_FORWARD, 168 KB_WWW_FORWARD,
162 KB_WWW_STOP, 169 KB_WWW_STOP,
163 KB_WWW_REFRESH, 170 KB_WWW_REFRESH, /* 0xC0 */
164 KB_WWW_FAVORITES, 171 KB_WWW_FAVORITES, /* 0xC1 */
172 /* 0xC2-DF vacant for future use */
165 173
166 /* reserve 0xE0-E7 for Modifiers */ 174 /* 0xE0-E7 for Modifiers. DO NOT USE. */
167 175
168 /* Layer Switching */ 176 /* Layer Switching */
169 KB_FN0 = 0xE8, 177 KB_FN0 = 0xE8,
@@ -173,7 +181,7 @@ enum special_keycodes {
173 KB_FN4, 181 KB_FN4,
174 KB_FN5, 182 KB_FN5,
175 KB_FN6, 183 KB_FN6,
176 KB_FN7, 184 KB_FN7, /* 0xEF */
177 185
178 /* Mousekey */ 186 /* Mousekey */
179 KB_MS_UP = 0xF0, 187 KB_MS_UP = 0xF0,
@@ -189,11 +197,13 @@ enum special_keycodes {
189 KB_MS_WH_UP, 197 KB_MS_WH_UP,
190 KB_MS_WH_DOWN, 198 KB_MS_WH_DOWN,
191 KB_MS_WH_LEFT, 199 KB_MS_WH_LEFT,
192 KB_MS_WH_RIGHT, 200 KB_MS_WH_RIGHT, /* 0xFC */
201 /* 0xFD-FF vacant for future use */
193}; 202};
194 203
204/* USB HID Keyboard/Keypad Usage(0x07) */
195enum keycodes { 205enum keycodes {
196 KB_NO = 0, 206 KB_NO = 0x00,
197 KB_ROLL_OVER, 207 KB_ROLL_OVER,
198 KB_POST_FAIL, 208 KB_POST_FAIL,
199 KB_UNDEFINED, 209 KB_UNDEFINED,
@@ -357,9 +367,10 @@ enum keycodes {
357 KB_OPER, 367 KB_OPER,
358 KB_CLEAR_AGAIN, 368 KB_CLEAR_AGAIN,
359 KB_CRSEL, 369 KB_CRSEL,
360 KB_EXSEL, 370 KB_EXSEL, /* 0xA4 */
371
372 /* NOTE: 0xA5-DF are used for internal special purpose */
361 373
362 /* NOTE: 0xB0-DF are used as special_keycodes */
363#if 0 374#if 0
364 KB_KP_00 = 0xB0, 375 KB_KP_00 = 0xB0,
365 KB_KP_000, 376 KB_KP_000,
@@ -406,7 +417,7 @@ enum keycodes {
406 KB_KP_BINARY, 417 KB_KP_BINARY,
407 KB_KP_OCTAL, 418 KB_KP_OCTAL,
408 KB_KP_DECIMAL, 419 KB_KP_DECIMAL,
409 KB_KP_HEXADECIMAL, 420 KB_KP_HEXADECIMAL, /* 0xDD */
410#endif 421#endif
411 422
412 /* Modifiers */ 423 /* Modifiers */
@@ -419,7 +430,7 @@ enum keycodes {
419 KB_RALT, 430 KB_RALT,
420 KB_RGUI, 431 KB_RGUI,
421 432
422 /* NOTE: 0xE8-FF are used as special_keycodes */ 433 /* NOTE: 0xE8-FF are used for internal special purpose */
423}; 434};
424 435
425#endif /* USB_KEYCODES_H */ 436#endif /* USB_KEYCODES_H */