]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - common/keyboard.c
Merge branch 'phantom'
[max/tmk_keyboard.git] / common / keyboard.c
index be01e5540cd39001c3d87928b41f38ebd92b340b..cd1ceb420cfac3b9089f1627b6a5720735852376 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
+Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -25,14 +25,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "command.h"
 #include "util.h"
+#include "sendchar.h"
 #ifdef MOUSEKEY_ENABLE
 #include "mousekey.h"
 #endif
-#ifdef EXTRAKEY_ENABLE
-#include <util/delay.h>
-#endif
 
 
+#define Kdebug(s)       do { if (debug_keyboard) debug(s); } while(0)
+#define Kdebug_P(s)     do { if (debug_keyboard) debug_P(s); } while(0)
+#define Kdebug_hex(s)   do { if (debug_keyboard) debug_hex(s); } while(0)
+
 #define LAYER_DELAY     250
 
 typedef enum keykind {
@@ -127,8 +129,8 @@ static void layer_switch_on(uint8_t code)
     fn_state_bits |= FN_BIT(code);
     uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer);
     if (current_layer != new_layer) {
-        debug("Layer Switch(on): "); debug_hex(current_layer);
-        debug(" -> "); debug_hex(new_layer); debug("\n");
+        Kdebug("Layer Switch(on): "); Kdebug_hex(current_layer);
+        Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n");
 
         clear_keyboard_but_mods();
         current_layer = new_layer;
@@ -141,8 +143,8 @@ static bool layer_switch_off(uint8_t code)
     fn_state_bits &= ~FN_BIT(code);
     uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer);
     if (current_layer != new_layer) {
-        debug("Layer Switch(off): "); debug_hex(current_layer);
-        debug(" -> "); debug_hex(new_layer); debug("\n");
+        Kdebug("Layer Switch(off): "); Kdebug_hex(current_layer);
+        Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n");
 
         clear_keyboard_but_mods();
         current_layer = new_layer;
@@ -154,16 +156,20 @@ static bool layer_switch_off(uint8_t code)
 static void register_code(uint8_t code)
 {
     if IS_KEY(code) {
-        host_add_key(code);
-        host_send_keyboard_report();
+        if (!command_proc(code)) {
+            host_add_key(code);
+            host_send_keyboard_report();
+        }
     }
     else if IS_MOD(code) {
         host_add_mod_bit(MOD_BIT(code));
         host_send_keyboard_report();
     }
     else if IS_FN(code) {
-        host_add_key(keymap_fn_keycode(FN_INDEX(code)));
-        host_send_keyboard_report();
+        if (!command_proc(keymap_fn_keycode(FN_INDEX(code)))) {
+            host_add_key(keymap_fn_keycode(FN_INDEX(code)));
+            host_send_keyboard_report();
+        }
     }
     else if IS_MOUSEKEY(code) {
 #ifdef MOUSEKEY_ENABLE
@@ -330,9 +336,9 @@ static void unregister_code(uint8_t code)
  *      Ld: Switch back to default layer(*unregister* all keys but modifiers)
  */
 #define NEXT(state)     do { \
-    debug("NEXT: "); print_P(state_str(kbdstate)); \
+    Kdebug("NEXT: "); Kdebug_P(state_str(kbdstate)); \
     kbdstate = state; \
-    debug(" -> "); print_P(state_str(kbdstate)); debug("\n"); \
+    Kdebug(" -> "); Kdebug_P(state_str(kbdstate)); Kdebug("\n"); \
 } while (0)
 
 static inline void process_key(keyevent_t event)
@@ -342,11 +348,11 @@ static inline void process_key(keyevent_t event)
 
     uint8_t tmp_mods;
 
-    debug("state: "); print_P(state_str(kbdstate));
-    debug(" kind: "); debug_hex(kind);
-    debug(" code: "); debug_hex(code);
-    if (event.pressed) { debug("d"); } else { debug("u"); }
-    debug("\n");
+    Kdebug("state: "); Kdebug_P(state_str(kbdstate));
+    Kdebug(" kind: "); Kdebug_hex(kind);
+    Kdebug(" code: "); Kdebug_hex(code);
+    if (event.pressed) { Kdebug("d"); } else { Kdebug("u"); }
+    Kdebug("\n");
 
     switch (kbdstate) {
         case IDLE:
@@ -538,7 +544,10 @@ static inline void process_key(keyevent_t event)
 
 void keyboard_init(void)
 {
-    debug_keyboard = true;
+    // TODO: to enable debug print magic key bind on boot time
+
+    // TODO: configuration of sendchar impl
+    print_sendchar_func = sendchar;
 
     timer_init();
     matrix_init();
@@ -550,31 +559,25 @@ void keyboard_init(void)
 void keyboard_task(void)
 {
     static matrix_row_t matrix_prev[MATRIX_ROWS];
+    static uint8_t led_status = 0;
     matrix_row_t matrix_row = 0;
     matrix_row_t matrix_change = 0;
 
     matrix_scan();
-    if (command_proc()) {
-        debug("COMMAND\n");
-        // TODO: COMMAND state?
-        clear_keyboard();
-        return;
-    }
-
-    for (int r = 0; r < MATRIX_ROWS; r++) {
+    for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
         matrix_row = matrix_get_row(r);
         matrix_change = matrix_row ^ matrix_prev[r];
         if (matrix_change) {
             if (debug_matrix) matrix_print();
 
-            for (int c = 0; c < MATRIX_COLS; c++) {
-                if (matrix_change & (1<<c)) {
+            for (uint8_t c = 0; c < MATRIX_COLS; c++) {
+                if (matrix_change & ((matrix_row_t)1<<c)) {
                     process_key((keyevent_t){
                         .key = (key_t){ .row = r, .col = c },
-                        .pressed = (matrix_row & (1<<c))
+                        .pressed = (matrix_row & ((matrix_row_t)1<<c))
                     });
                     // record a processed key
-                    matrix_prev[r] ^= (1<<c);
+                    matrix_prev[r] ^= ((matrix_row_t)1<<c);
                     // process a key per task call
                     goto MATRIX_LOOP_END;
                 }
@@ -613,12 +616,18 @@ void keyboard_task(void)
             is_matrix_on |= matrix_get_row(r);
         }
         if (!is_matrix_on) {
-            debug("FAIL SAFE: clear all keys(default layer).\n");
+            Kdebug("FAIL SAFE: clear all keys(default layer).\n");
             clear_keyboard();
             current_layer = default_layer;
         }
     }
-    
+
+    // update LED
+    if (led_status != host_keyboard_leds()) {
+        led_status = host_keyboard_leds();
+        keyboard_set_leds(led_status);
+    }
+
     return;
 }