From: tmk Date: Fri, 29 Oct 2010 06:17:18 +0000 (+0900) Subject: improve layer switching X-Git-Url: https://git.friedersdorff.com/?a=commitdiff_plain;h=45d4a7a89883c3433604d4e011b665796a583008;p=max%2Ftmk_keyboard.git improve layer switching --- diff --git a/Makefile.common b/Makefile.common index 5febcd75..bec799c0 100644 --- a/Makefile.common +++ b/Makefile.common @@ -50,6 +50,7 @@ # List C source files here. (C dependencies are automatically generated.) SRC = tmk.c \ + layer.c \ key_process.c \ usb_keyboard.c \ usb_mouse.c \ @@ -57,6 +58,7 @@ SRC = tmk.c \ usb.c \ jump_bootloader.c \ print.c \ + timer.c \ util.c SRC += $(TARGET_SRC) diff --git a/README b/README index e5463401..4c19ddba 100644 --- a/README +++ b/README @@ -93,9 +93,6 @@ debouncing logic will be coded when bouncing occurs. bouncing doesnt occur on my ALPS switch so far. scan rate is too slow?(to be measure) -layer switching - time before switching - timeout when not used during specific time Trackpoint(PS/2) receive PS/2 signal from TrackPoint @@ -136,6 +133,9 @@ debug on/off key print on/off mouse print on/off 2010/10/26 - +layer switching + time before switching + timeout when not used during specific time + 2010/10/30 EOF diff --git a/debug.h b/debug.h index d1c7b90f..367a6492 100644 --- a/debug.h +++ b/debug.h @@ -6,7 +6,7 @@ #define debug(s) if(debug_enable) print(s) #define debug_hex(c) if(debug_enable) phex(c) -#define debug_hex16(i) if(debug_enable) phex(i) +#define debug_hex16(i) if(debug_enable) phex16(i) #define debug_bin(c) if(debug_enable) pbin(c) #define debug_bin_reverse(c) if(debug_enable) pbin_reverse(c) diff --git a/hhkb/controller.h b/hhkb/controller.h index aa862cdc..32a10b7c 100644 --- a/hhkb/controller.h +++ b/hhkb/controller.h @@ -3,4 +3,10 @@ #include "controller_teensy.h" + +/* matrix row size */ +#define MATRIX_ROWS 8 +/* matrix column size */ +#define MATRIX_COLS 8 + #endif diff --git a/hhkb/keymap.c b/hhkb/keymap.c index 2b887d9c..cad601d4 100644 --- a/hhkb/keymap.c +++ b/hhkb/keymap.c @@ -6,16 +6,13 @@ #include #include "usb_keyboard.h" #include "usb_keycodes.h" -#include "matrix.h" #include "print.h" #include "debug.h" #include "util.h" -#include "keymap.h" +#include "controller.h" +#include "keymap_skel.h" -#define FN_KEYCODE(fn) (pgm_read_byte(&fn_keycode[(fn)])) -#define FN_LAYER(fn) (pgm_read_byte(&fn_layer[(fn)])) -#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) #define KEYMAP( \ R3C1, R3C0, R0C0, R1C0, R1C1, R2C0, R2C1, R4C0, R4C1, R6C0, R6C1, R7C0, R7C1, R5C0, R5C1, \ R3C2, R0C1, R0C2, R1C3, R1C2, R2C3, R2C2, R4C2, R4C3, R6C2, R6C3, R7C3, R7C2, R5C2, \ @@ -34,9 +31,7 @@ { R7C0, R7C1, R7C2, R7C3, R7C4, R7C5, R7C6, KB_NO } \ } - -static int current_layer = 0; -static bool layer_used = false; +#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) /* layer to change into while Fn key pressed */ @@ -153,76 +148,22 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -uint8_t keymap_get_keycode(int row, int col) +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { - return keymap_get_keycodel(current_layer, row, col); + return KEYCODE(layer, row, col); } -uint8_t keymap_get_keycodel(int layer, int row, int col) +int keymap_fn_layer(uint8_t fn_bits) { - uint8_t code = KEYCODE(layer, row, col); - // normal key or mouse key - if (IS_KEY(code) || IS_MOUSE(code)) - layer_used = true; - return code; + return pgm_read_byte(&fn_layer[biton(fn_bits)]); } -inline -int keymap_get_layer(void) +uint8_t keymap_fn_keycode(uint8_t fn_bits) { - return current_layer; + return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); } -inline -int keymap_set_layer(int layer) -{ - current_layer = layer; - return current_layer; -} - -inline bool keymap_is_special_mode(uint8_t fn_bits) { return (keyboard_modifier_keys == (BIT_LCTRL | BIT_LSHIFT | BIT_LALT | BIT_LGUI)); } - -void keymap_fn_proc(uint8_t fn_bits) -{ - // layer switching - static uint8_t last_bits = 0; - static uint8_t last_mod = 0; - - if (usb_keyboard_has_key() || fn_bits == last_bits) { - // do nothing during press other than Fn key - return; - } else if (fn_bits == 0) { - // send key when Fn key is released without using the layer - if (!layer_used) { - uint8_t code = FN_KEYCODE(biton(last_bits)); - if (code != KB_NO) { - if (IS_MOD(code)) { - keyboard_modifier_keys = last_mod | 1<<(code & 0x07); - } else { - keyboard_keys[0] = code; - keyboard_modifier_keys = last_mod; - } - usb_keyboard_send(); - usb_keyboard_print(); - usb_keyboard_clear(); - } - } - last_bits = 0; - last_mod = 0; - layer_used = false; - keymap_set_layer(0); // default layer - } else if ((fn_bits & (fn_bits - 1)) == 0) { - // switch layer when just one Fn Key is pressed - last_bits = fn_bits; - last_mod = keyboard_modifier_keys; - layer_used = false; - keymap_set_layer(FN_LAYER(biton(fn_bits))); - debug("layer: "); phex(current_layer); debug("("); - debug_bin(last_bits); debug(")\n"); - debug("last_mod: "); debug_hex(last_mod); debug("\n"); - } -} diff --git a/hhkb/keymap.h b/hhkb/keymap.h deleted file mode 100644 index c65c2e19..00000000 --- a/hhkb/keymap.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef KEYMAP_H -#define KEYMAP_H 1 - -#include "usb_keycodes.h" -#include "keymap_skel.h" - -#endif diff --git a/hhkb/matrix.c b/hhkb/matrix.c index d95ee113..cf5e8a0e 100644 --- a/hhkb/matrix.c +++ b/hhkb/matrix.c @@ -5,9 +5,10 @@ #include #include #include -#include "matrix.h" #include "print.h" #include "util.h" +#include "controller.h" +#include "matrix_skel.h" // matrix is active low. (key on: 0/key off: 1) // @@ -27,8 +28,8 @@ #define KEY_ON ((PINE&(1<<6)) ? false : true) // matrix state buffer -uint8_t *matrix; -uint8_t *matrix_prev; +static uint8_t *matrix; +static uint8_t *matrix_prev; static uint8_t _matrix0[MATRIX_ROWS]; static uint8_t _matrix1[MATRIX_ROWS]; diff --git a/hhkb/matrix.h b/hhkb/matrix.h deleted file mode 100644 index 5efffea5..00000000 --- a/hhkb/matrix.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef MATRIX_H -#define MATRIX_H 1 - -#include -#include "matrix_skel.h" - - -#define MATRIX_ROWS 8 -#define MATRIX_COLS 8 - - -extern uint8_t *matrix; -extern uint8_t *matrix_prev; - -#endif diff --git a/key_process.c b/key_process.c index 9ba0d83a..af0b5897 100644 --- a/key_process.c +++ b/key_process.c @@ -1,17 +1,18 @@ #include #include #include -#include "usb_keyboard.h" -#include "usb_mouse.h" -#include "usb_keycodes.h" #include "print.h" #include "debug.h" +#include "timer.h" #include "util.h" #include "jump_bootloader.h" +#include "usb_keyboard.h" +#include "usb_mouse.h" +#include "usb_keycodes.h" +#include "layer.h" #include "matrix_skel.h" #include "keymap_skel.h" #include "controller.h" - #include "key_process.h" @@ -61,7 +62,7 @@ void proc_matrix(void) { for (int col = 0; col < matrix_cols(); col++) { if (!matrix_is_on(row, col)) continue; - uint8_t code = keymap_get_keycode(row, col); + uint8_t code = layer_get_keycode(row, col); if (code == KB_NO) { // do nothing } else if (IS_MOD(code)) { @@ -95,12 +96,25 @@ void proc_matrix(void) { } } } - keymap_fn_proc(fn_bits); + layer_switching(fn_bits); // when 4 left modifier keys down if (keymap_is_special_mode(fn_bits)) { switch (keyboard_keys[0]) { - case KB_B: // bootloader + case KB_H: // help + print_enable = true; + print("b: jump to bootloader\n"); + print("d: debug print toggle\n"); + print("k: keyboard debug toggle\n"); + print("m: mouse debug toggle\n"); + print("x: matrix debug toggle\n"); + print("v: print version\n"); + print("t: print timer count\n"); + print("p: print enable toggle\n"); + _delay_ms(500); + print_enable = false; + break; + case KB_B: // bootloader usb_keyboard_clear(); usb_keyboard_send(); print_enable = true; @@ -113,8 +127,8 @@ void proc_matrix(void) { usb_keyboard_send(); debug_enable = !debug_enable; if (debug_enable) { - print("debug enabled.\n"); print_enable = true; + print("debug enabled.\n"); debug_matrix = true; debug_keyboard = true; debug_mouse = true; @@ -160,9 +174,29 @@ void proc_matrix(void) { case KB_V: // print version & information usb_keyboard_clear(); usb_keyboard_send(); + print_enable = true; print(STR(DESCRIPTION) "\n"); _delay_ms(1000); break; + case KB_T: // print timer + usb_keyboard_clear(); + usb_keyboard_send(); + print_enable = true; + print("timer: "); phex16(timer_count); print("\n"); + _delay_ms(500); + break; + case KB_P: // print toggle + usb_keyboard_clear(); + usb_keyboard_send(); + if (print_enable) { + print("print disabled.\n"); + print_enable = false; + } else { + print_enable = true; + print("print enabled.\n"); + } + _delay_ms(1000); + break; } } diff --git a/keymap_skel.h b/keymap_skel.h index c2b94177..e4ac560e 100644 --- a/keymap_skel.h +++ b/keymap_skel.h @@ -6,13 +6,16 @@ #include "usb_keycodes.h" -uint8_t keymap_get_keycode(int row, int col); -uint8_t keymap_get_keycodel(int layer, int row, int col); -int keymap_get_layer(void); -int keymap_set_layer(int layer); +/* keycode in specific layer */ +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col); +/* layer to move during press Fn key */ +int keymap_fn_layer(uint8_t fn_bits); + +/* keycode to send when release Fn key without using */ +uint8_t keymap_fn_keycode(uint8_t fn_bits); + +/* whether special key combination */ bool keymap_is_special_mode(uint8_t fn_bits); -/* process Fn keys. This.should be called every scan. */ -void keymap_fn_proc(uint8_t fn_bits); #endif diff --git a/layer.c b/layer.c new file mode 100644 index 00000000..5b9b591f --- /dev/null +++ b/layer.c @@ -0,0 +1,92 @@ +#include "keymap_skel.h" +#include "usb_keyboard.h" +#include "debug.h" +#include "timer.h" +#include "layer.h" + +/* + * LAYER_ENTER_DELAY: prevent from moving new layer + * press release + * Fn key sate ____|~~~~~~~~~~~~~~~~~~~|_______________ + * + * enter_delay |======| + * new layer + * Layer sw ___________|~~~~~~~~~~~~|_______________ + */ +#define LAYER_ENTER_DELAY 10 + +/* + * LAYER_SEND_FN_TERM: send keycode if release key in this term + * press release(send) + * Fn key state ____|~~~~~~~~~~~~~|_______________ + * press | release(not send) + * Fn key state ____|~~~~~~~~~~~~~|~~~~~~|__________ + * | | + * send_fn_term |=============o==| x + */ +#define LAYER_SEND_FN_TERM 30 + + +static uint8_t current_layer = 0; +static bool layer_used = false; + + +uint8_t layer_get_keycode(uint8_t row, uint8_t col) +{ + uint8_t code = keymap_get_keycode(current_layer, row, col); + // normal key or mouse key + if ((IS_KEY(code) || IS_MOUSE(code))) + layer_used = true; + return code; +} + +void layer_switching(uint8_t fn_bits) +{ + // layer switching + static uint8_t last_bits = 0; + static uint8_t last_mod = 0; + static uint16_t last_timer = 0; + + //uint16_t now_timer; + + if (fn_bits == last_bits) { + // switch layer when specific time elapsed + if (current_layer != keymap_fn_layer(fn_bits) && + timer_elapsed(last_timer) > LAYER_ENTER_DELAY) { + current_layer = keymap_fn_layer(fn_bits); + debug("time_elapsed: "); debug_hex16(timer_elapsed(last_timer)); debug("\n"); + debug("switch layer: "); debug_hex(current_layer); debug("\n"); + } + } else if (fn_bits == 0) { + // send key when Fn key is released without using the layer and within specific time + if ((!layer_used || current_layer != keymap_fn_layer(last_bits)) && + timer_elapsed(last_timer) < LAYER_SEND_FN_TERM) { + uint8_t code = keymap_fn_keycode(last_bits); + if (code != KB_NO) { + if (IS_MOD(code)) { + keyboard_modifier_keys = last_mod | MOD_BIT(code); + } else { + keyboard_keys[0] = code; + keyboard_modifier_keys = last_mod; + } + usb_keyboard_send(); + usb_keyboard_print(); + usb_keyboard_clear(); + } + } + last_bits = 0; + last_mod = 0; + layer_used = false; + current_layer = 0; // default layer + } else if ((fn_bits & (fn_bits - 1)) == 0) { + // switch layer when just one Fn Key is pressed + if (!usb_keyboard_has_key()) { + last_bits = fn_bits; + last_mod = keyboard_modifier_keys; + last_timer = timer_read(); + debug("last_bits: "); debug_bin(last_bits); debug("\n"); + debug("last_mod: "); debug_hex(last_mod); debug("\n"); + debug("last_timer: "); debug_hex16(last_timer); debug("\n"); + } + } +} diff --git a/layer.h b/layer.h new file mode 100644 index 00000000..79a54985 --- /dev/null +++ b/layer.h @@ -0,0 +1,13 @@ +#ifndef LAYER_H +#define LAYER_H 1 + +#include + + +/* return keycode for switch */ +uint8_t layer_get_keycode(uint8_t row, uint8_t col); + +/* process layer switching */ +void layer_switching(uint8_t fn_bits); + +#endif diff --git a/macway/controller.h b/macway/controller.h index aa862cdc..22fd694f 100644 --- a/macway/controller.h +++ b/macway/controller.h @@ -3,4 +3,10 @@ #include "controller_teensy.h" + +/* matrix row size */ +#define MATRIX_ROWS 9 +/* matrix column size */ +#define MATRIX_COLS 8 + #endif diff --git a/macway/keymap.c b/macway/keymap.c index 652a5306..00927a66 100644 --- a/macway/keymap.c +++ b/macway/keymap.c @@ -4,18 +4,16 @@ #include #include #include +#include #include "usb_keyboard.h" #include "usb_keycodes.h" -#include "matrix.h" #include "print.h" #include "debug.h" #include "util.h" -#include "keymap.h" +#include "controller.h" +#include "keymap_skel.h" -#define FN_KEYCODE(fn) (pgm_read_byte(&fn_keycode[(fn)])) -#define FN_LAYER(fn) (pgm_read_byte(&fn_layer[(fn)])) -#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) #define KEYMAP( \ R1C1, R1C0, R2C0, R3C0, R4C0, R4C1, R5C1, R5C0, R6C0, R7C0, R8C0, R8C1, R6C1, R0C2, \ R1C2, R1C3, R2C3, R3C3, R4C3, R4C2, R5C2, R5C3, R6C3, R7C3, R8C3, R8C2, R6C2, \ @@ -34,14 +32,11 @@ { R8C0, R8C1, R8C2, R8C3, R8C4, R8C5, KB_NO, R8C7 } \ } +#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) -static int current_layer = 0; -static bool layer_used = false; -/* layer to change into while Fn key pressed */ -static const int PROGMEM fn_layer[] = { 0, 1, 2, 3, 4, 0, 2, 3 }; +static const uint8_t PROGMEM fn_layer[] = { 0, 1, 2, 3, 4, 0, 2, 3 }; -/* keycode to sent when Fn key released without using layer keys. */ static const uint8_t PROGMEM fn_keycode[] = { KB_NO, // FN_0 [NOT USED] KB_NO, // FN_1 layer 1 @@ -73,6 +68,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KB_LSFT,KB_Z, KB_X, KB_C, KB_V, KB_B, KB_N, KB_M, KB_COMM,KB_DOT, KB_SLSH,KB_RSFT,FN_1, \ FN_7, KB_LGUI,KB_LALT,KB_SPC, FN_6, KB_BSLS,KB_GRV, KB_NO, KB_NO), + /* Layer 1: HHKB mode (HHKB Fn) * ,-----------------------------------------------------------. * |Pow| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | @@ -92,6 +88,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KP_PLUS,KP_MINS,KB_END, KB_PGDN,KB_DOWN,KB_RSFT,FN_1, \ KB_NO, KB_LGUI,KB_LALT,KB_SPC, KB_RALT,KB_NO, KB_NO, KB_NO, KB_NO), + /* Layer 2: Vi mode (Quote/Rmeta) * ,-----------------------------------------------------------. * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| ` | @@ -111,6 +108,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KB_LSFT,KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_NO, KB_RSFT,KB_NO, \ KB_NO, KB_LGUI,KB_LALT,KB_SPC, FN_6, KB_NO, KB_NO, KB_NO, KB_NO), + /* Layer 3: Mouse mode (Semicolon) * ,-------------------------------------------------------- --. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | @@ -131,6 +129,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KB_LSFT,KB_NO, MS_DOWN,KB_NO, KB_NO, KB_NO, MS_BTN2,MS_BTN1,MS_BTN2,MS_BTN3,KB_NO, KB_RSFT,KB_NO, \ FN_7, KB_LGUI,KB_LALT,MS_BTN1,KB_RALT,KB_NO, KB_NO, KB_NO, KB_NO), + /* Layer 4: Matias half keyboard style (Space) * ,-----------------------------------------------------------. * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | @@ -152,76 +151,22 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -uint8_t keymap_get_keycode(int row, int col) +uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) { - return keymap_get_keycodel(current_layer, row, col); + return KEYCODE(layer, row, col); } -uint8_t keymap_get_keycodel(int layer, int row, int col) +int keymap_fn_layer(uint8_t fn_bits) { - uint8_t code = KEYCODE(layer, row, col); - // normal key or mouse key - if (IS_KEY(code) || IS_MOUSE(code)) - layer_used = true; - return code; + return pgm_read_byte(&fn_layer[biton(fn_bits)]); } -inline -int keymap_get_layer(void) +uint8_t keymap_fn_keycode(uint8_t fn_bits) { - return current_layer; + return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); } -inline -int keymap_set_layer(int layer) -{ - current_layer = layer; - return current_layer; -} - -inline bool keymap_is_special_mode(uint8_t fn_bits) { return (keyboard_modifier_keys == (BIT_LCTRL | BIT_LSHIFT | BIT_LALT | BIT_LGUI)); } - -void keymap_fn_proc(uint8_t fn_bits) -{ - // layer switching - static int last_bits = 0; - static uint8_t last_mod = 0; - - if (usb_keyboard_has_key() || fn_bits == last_bits) { - // do nothing during press other than Fn key - return; - } else if (fn_bits == 0) { - // send key when Fn key is released without using the layer - if (!layer_used) { - uint8_t code = FN_KEYCODE(biton(last_bits)); - if (code != KB_NO) { - if (IS_MOD(code)) { - keyboard_modifier_keys = last_mod | 1<<(code & 0x07); - } else { - keyboard_keys[0] = code; - keyboard_modifier_keys = last_mod; - } - usb_keyboard_send(); - usb_keyboard_print(); - usb_keyboard_clear(); - } - } - last_bits = 0; - last_mod = 0; - layer_used = false; - keymap_set_layer(0); // default layer - } else if ((fn_bits & (fn_bits - 1)) == 0) { - // switch layer when just one Fn Key is pressed - last_bits = fn_bits; - last_mod = keyboard_modifier_keys; - layer_used = false; - keymap_set_layer(FN_LAYER(biton(fn_bits))); - debug("layer: "); phex(current_layer); debug("("); - debug_bin(last_bits); debug(")\n"); - debug("last_mod: "); debug_hex(last_mod); debug("\n"); - } -} diff --git a/macway/keymap.h b/macway/keymap.h deleted file mode 100644 index c65c2e19..00000000 --- a/macway/keymap.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef KEYMAP_H -#define KEYMAP_H 1 - -#include "usb_keycodes.h" -#include "keymap_skel.h" - -#endif diff --git a/macway/matrix.c b/macway/matrix.c index 30da657e..c2b3fb8b 100644 --- a/macway/matrix.c +++ b/macway/matrix.c @@ -5,9 +5,10 @@ #include #include #include -#include "matrix.h" #include "print.h" #include "util.h" +#include "controller.h" +#include "matrix_skel.h" // matrix is active low. (key on: 0/key off: 1) // row: Hi-Z(unselected)/low output(selected) @@ -16,8 +17,8 @@ // PB0-PB7 // matrix state buffer -uint8_t *matrix; -uint8_t *matrix_prev; +static uint8_t *matrix; +static uint8_t *matrix_prev; static uint8_t _matrix0[MATRIX_ROWS]; static uint8_t _matrix1[MATRIX_ROWS]; diff --git a/macway/matrix.h b/macway/matrix.h deleted file mode 100644 index c11f1f3e..00000000 --- a/macway/matrix.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef MATRIX_H -#define MATRIX_H 1 - -#include -#include "matrix_skel.h" - - -#define MATRIX_ROWS 9 -#define MATRIX_COLS 8 - - -extern uint8_t *matrix; -extern uint8_t *matrix_prev; - -#endif diff --git a/matrix_skel.h b/matrix_skel.h index 5a02f207..59c4eca1 100644 --- a/matrix_skel.h +++ b/matrix_skel.h @@ -1,5 +1,5 @@ #ifndef MATRIX_SKEL_H -#define MATRIX_SKEL_H 1 +#define MATRIX_SKEL_H 1 #include diff --git a/timer.c b/timer.c new file mode 100644 index 00000000..23663042 --- /dev/null +++ b/timer.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include "timer.h" + +uint16_t timer_count = 0; + +// Configure timer 0 to generate a timer overflow interrupt every +// 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock +// This demonstrates how to use interrupts to implement a simple +// inactivity timeout. +void timer_init(void) +{ + TCCR0A = 0x00; + TCCR0B = 0x05; + TIMSK0 = (1< + +#define TIMER_DIFF(a, b) ((a) >= (b) ? (a) - (b) : UINT16_MAX - (b) + (a)) + + +extern uint16_t timer_count; + + +void timer_init(void); +void timer_clear(void); +uint16_t timer_read(void); +uint16_t timer_elapsed(uint16_t last); + +#endif diff --git a/tmk.c b/tmk.c index ae138623..53da9aa8 100644 --- a/tmk.c +++ b/tmk.c @@ -35,17 +35,17 @@ #include "debug.h" #include "util.h" #include "controller.h" +#include "timer.h" #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) + bool debug_enable = false; bool debug_matrix = false; bool debug_keyboard = false; bool debug_mouse = false; -uint16_t idle_count=0; - int main(void) { @@ -58,14 +58,7 @@ int main(void) usb_init(); while (!usb_configured()) /* wait */ ; - // Configure timer 0 to generate a timer overflow interrupt every - // 256*1024 clock cycles, or approx 61 Hz when using 16 MHz clock - // This demonstrates how to use interrupts to implement a simple - // inactivity timeout. - TCCR0A = 0x00; - TCCR0B = 0x05; - TIMSK0 = (1<