aboutsummaryrefslogtreecommitdiff
path: root/common/keyboard.c
diff options
context:
space:
mode:
authortmk <nobody@nowhere>2012-10-09 13:48:39 +0900
committertmk <nobody@nowhere>2012-10-17 15:55:37 +0900
commit16ba9bda5601ebef6e4db04a5ad079af32370815 (patch)
treea93e18f16ebeb0933263dd6ed9e9e545edeaf367 /common/keyboard.c
parente9af482690152f1beedbbb915791eccd2d5c22d1 (diff)
downloadqmk_firmware-16ba9bda5601ebef6e4db04a5ad079af32370815.tar.gz
qmk_firmware-16ba9bda5601ebef6e4db04a5ad079af32370815.zip
Add consumer/system usage support.
Diffstat (limited to 'common/keyboard.c')
-rw-r--r--common/keyboard.c122
1 files changed, 106 insertions, 16 deletions
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++) {