]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - layer.c
add debouncing into macway/matrix.c.
[max/tmk_keyboard.git] / layer.c
diff --git a/layer.c b/layer.c
old mode 100644 (file)
new mode 100755 (executable)
index 6d3b14b..3f9e55a
--- a/layer.c
+++ b/layer.c
@@ -1,9 +1,27 @@
-#include "keymap_skel.h"
-#include "usb_keyboard.h"
+/*
+Copyright 2011 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
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "keymap.h"
+#include "host.h"
 #include "debug.h"
 #include "timer.h"
 #include "layer.h"
 
+
 /*
  * Parameters:
  *     ENTER_DELAY         |=======|
  */
 
 // LAYER_ENTER_DELAY: prevent from moving new layer
-#define LAYER_ENTER_DELAY 10
+#define LAYER_ENTER_DELAY 150
 
 // LAYER_SEND_FN_TERM: send keycode if release key in this term
-#define LAYER_SEND_FN_TERM 40
+#define LAYER_SEND_FN_TERM 500
 
 
 uint8_t default_layer = 0;
@@ -75,7 +93,7 @@ uint8_t layer_get_keycode(uint8_t row, uint8_t col)
 }
 
 // bit substract b from a
-#define BIT_SUBT(a, b) (a&(a^b))
+#define BIT_SUBST(a, b) (a&(a^b))
 void layer_switching(uint8_t fn_bits)
 {
     // layer switching
@@ -89,7 +107,7 @@ void layer_switching(uint8_t fn_bits)
             // do nothing
         } else {
             if (timer_elapsed(last_timer) > LAYER_ENTER_DELAY) {
-                uint8_t _layer_to_switch = new_layer(BIT_SUBT(fn_bits, sent_fn));
+                uint8_t _layer_to_switch = new_layer(BIT_SUBST(fn_bits, sent_fn));
                 if (current_layer != _layer_to_switch) { // not switch layer yet
                     debug("Fn case: 1,2,3(LAYER_ENTER_DELAY passed)\n");
                     debug("Switch Layer: "); debug_hex(current_layer);
@@ -98,23 +116,23 @@ void layer_switching(uint8_t fn_bits)
                     debug(" -> "); debug_hex(current_layer); debug("\n");
                 }
             } else {
-                if (usb_keyboard_has_key()) { // other keys is pressed
-                    uint8_t _fn_to_send = BIT_SUBT(fn_bits, sent_fn);
+                if (host_has_anykey()) { // other keys is pressed
+                    uint8_t _fn_to_send = BIT_SUBST(fn_bits, sent_fn);
                     if (_fn_to_send) {
                         debug("Fn case: 4(send Fn before other key pressed)\n");
                         // send only Fn key first
-                        usb_keyboard_swap_report();
-                        usb_keyboard_clear_report();
-                        usb_keyboard_add_code(keymap_fn_keycode(_fn_to_send));   // TODO: do all Fn keys
-                        usb_keyboard_set_mods(last_mods);
-                        usb_keyboard_send();
-                        usb_keyboard_swap_report();
+                        host_swap_keyboard_report();
+                        host_clear_keyboard_report();
+                        host_set_mods(last_mods);
+                        host_add_code(keymap_fn_keycode(_fn_to_send));   // TODO: do all Fn keys
+                        host_send_keyboard_report();
+                        host_swap_keyboard_report();
                         sent_fn |= _fn_to_send;
                     }
                 }
             }
             // add Fn keys to send
-            //usb_keyboard_add_code(keymap_fn_keycode(fn_bits&sent_fn));  // TODO: do all Fn keys
+            //host_add_code(keymap_fn_keycode(fn_bits&sent_fn));  // TODO: do all Fn keys
         }
     } else { // Fn state is changed(edge)
         uint8_t fn_changed = 0;
@@ -126,52 +144,51 @@ void layer_switching(uint8_t fn_bits)
         debug("last_timer: "); debug_hex16(last_timer); debug("\n");
 
         // pressed Fn
-        if ((fn_changed = BIT_SUBT(fn_bits, last_fn))) {
+        if ((fn_changed = BIT_SUBST(fn_bits, last_fn))) {
         debug("fn_changed: "); debug_bin(fn_changed); debug("\n");
-            if (usb_keyboard_has_key()) {
+            if (host_has_anykey()) {
                 debug("Fn case: 5(pressed Fn with other key)\n");
                 sent_fn |= fn_changed;
             } else if (fn_changed & sent_fn) { // pressed same Fn in a row
                 if (timer_elapsed(last_timer) > LAYER_ENTER_DELAY) {
-                    debug("Fn case: 6(repate2)\n");
+                    debug("Fn case: 6(not repeat)\n");
                     // time passed: not repeate
                     sent_fn &= ~fn_changed;
                 } else {
-                    debug("Fn case: 6(repate)\n");
+                    debug("Fn case: 6(repeat)\n");
                 }
             }
         }
         // released Fn
-        if ((fn_changed = BIT_SUBT(last_fn, fn_bits))) {
+        if ((fn_changed = BIT_SUBST(last_fn, fn_bits))) {
         debug("fn_changed: "); debug_bin(fn_changed); debug("\n");
             if (timer_elapsed(last_timer) < LAYER_SEND_FN_TERM) {
-                //if (!layer_used && BIT_SUBT(fn_changed, sent_fn)) {  // layer not used && Fn not sent
-                if (BIT_SUBT(fn_changed, sent_fn)) {  // layer not used && Fn not sent
+                if (!layer_used && BIT_SUBST(fn_changed, sent_fn)) {
                     debug("Fn case: 2(send Fn one shot: released Fn during LAYER_SEND_FN_TERM)\n");
                     // send only Fn key first
-                    usb_keyboard_swap_report();
-                    usb_keyboard_clear_report();
-                    usb_keyboard_add_code(keymap_fn_keycode(fn_changed));   // TODO: do all Fn keys
-                    usb_keyboard_set_mods(last_mods);
-                    usb_keyboard_send();
-                    usb_keyboard_swap_report();
+                    host_swap_keyboard_report();
+                    host_clear_keyboard_report();
+                    host_set_mods(last_mods);
+                    host_add_code(keymap_fn_keycode(fn_changed));   // TODO: do all Fn keys
+                    host_send_keyboard_report();
+                    host_swap_keyboard_report();
                     sent_fn |= fn_changed;
                 }
             }
             debug("Switch Layer(released Fn): "); debug_hex(current_layer);
-            current_layer = new_layer(BIT_SUBT(fn_bits, sent_fn));
-            layer_used = false;
+            current_layer = new_layer(BIT_SUBST(fn_bits, sent_fn));
             debug(" -> "); debug_hex(current_layer); debug("\n");
         }
 
+        layer_used = false;
         last_fn = fn_bits;
-        last_mods = usb_keyboard_mods;
+        last_mods = keyboard_report->mods;
         last_timer = timer_read();
     }
     // send Fn keys
     for (uint8_t i = 0; i < 8; i++) {
         if ((sent_fn & fn_bits) & (1<<i)) {
-            usb_keyboard_add_code(keymap_fn_keycode(1<<i));
+            host_add_code(keymap_fn_keycode(1<<i));
         }
     }
 }