/*
-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
#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 {
typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t;
-uint8_t current_layer = 0;
+#ifdef KEYMAP_DEFAULT_LAYER
+uint8_t default_layer = KEYMAP_DEFAULT_LAYER;
+uint8_t current_layer = KEYMAP_DEFAULT_LAYER;
+#else
uint8_t default_layer = 0;
+uint8_t current_layer = 0;
+#endif
/* keyboard internal states */
static kbdstate_t kbdstate = IDLE;
{
if (!IS_FN(code)) return;
fn_state_bits |= FN_BIT(code);
- if (current_layer != keymap_fn_layer(FN_INDEX(code))) {
- clear_keyboard_but_mods();
+ uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer);
+ if (current_layer != new_layer) {
+ Kdebug("Layer Switch(on): "); Kdebug_hex(current_layer);
+ Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n");
- debug("Layer Switch(on): "); debug_hex(current_layer);
- current_layer = keymap_fn_layer(FN_INDEX(code));
- debug(" -> "); debug_hex(current_layer); debug("\n");
+ clear_keyboard_but_mods();
+ current_layer = new_layer;
}
}
{
if (!IS_FN(code)) return false;
fn_state_bits &= ~FN_BIT(code);
- if (current_layer != keymap_fn_layer(biton(fn_state_bits))) {
- clear_keyboard_but_mods();
+ uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer);
+ if (current_layer != new_layer) {
+ Kdebug("Layer Switch(off): "); Kdebug_hex(current_layer);
+ Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n");
- debug("Layer Switch(off): "); debug_hex(current_layer);
- current_layer = keymap_fn_layer(biton(fn_state_bits));
- debug(" -> "); debug_hex(current_layer); debug("\n");
+ clear_keyboard_but_mods();
+ current_layer = new_layer;
return true;
}
return false;
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
* 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)
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:
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();
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++) {
matrix_row = matrix_get_row(r);
matrix_change = matrix_row ^ matrix_prev[r];
is_matrix_on |= matrix_get_row(r);
}
if (!is_matrix_on) {
- debug("FAIL SAFE: clear all keys.\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;
}