]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - tmk.c
refactor keyboard.h, host.h
[max/tmk_keyboard.git] / tmk.c
diff --git a/tmk.c b/tmk.c
index 7af0c748c803819b80d10243ac89509423560053..00b571d54de8aff3c7fc6d4c49ae24ab35def13f 100644 (file)
--- a/tmk.c
+++ b/tmk.c
 
 #include <stdbool.h>
 #include <avr/io.h>
-#include <avr/pgmspace.h>
 #include <avr/interrupt.h>
 #include <util/delay.h>
+#include "keyboard.h"
 #include "usb.h"
-#include "usb_keyboard.h"
-#include "usb_mouse.h"
+#include "matrix_skel.h"
 #include "print.h"
-#include "matrix.h"
-#include "keymap_hhkb.h"
+#include "debug.h"
+#include "util.h"
 #include "jump_bootloader.h"
+#ifdef PS2_MOUSE_ENABLE
+#   include "ps2_mouse.h"
+#endif
 
 
-// for teensy 2.0
-#define LED_CONFIG    (DDRD |= (1<<6))
-#define LED_ON        (PORTD |= (1<<6))
-#define LED_OFF       (PORTD &= ~(1<<6))
 #define CPU_PRESCALE(n)    (CLKPR = 0x80, CLKPR = (n))
 
-#define MOUSE_MOVE_UNIT 10
-#define MOUSE_DELAY_MS 200
-#define MOUSE_DELAY_ACC 5
 
-
-static void print_matrix(void);
-
-
-uint16_t idle_count=0;
+bool debug_enable = false;
+bool debug_matrix = false;
+bool debug_keyboard = false;
+bool debug_mouse = false;
 
 
 int main(void)
 {
+    DEBUG_LED_CONFIG;
+    DEBUG_LED_OFF;
+
     // set for 16 MHz clock
     CPU_PRESCALE(0);
 
@@ -66,165 +63,35 @@ int main(void)
     usb_init();
     while (!usb_configured()) /* wait */ ;
 
-    // Wait an extra second for the PC's operating system to load drivers
-    // and do whatever it does to actually be ready for input
-    // needs such long time in my PC.
-    /* wait for debug print. no need for normal use */
-    for (int i =0; i < 6; i++) {
-        LED_CONFIG;
-        LED_ON;
-        _delay_ms(500);
-        LED_OFF;
-        _delay_ms(500);
+    keyboard_init();
+    matrix_scan();
+    if (matrix_key_count() >= 3) {
+#ifdef DEBUG_LED
+        for (int i = 0; i < 6; i++) {
+            DEBUG_LED_CONFIG;
+            DEBUG_LED_ON;
+            _delay_ms(500);
+            DEBUG_LED_OFF;
+            _delay_ms(500);
+        }
+#else
+        _delay_ms(5000);
+#endif
+        print_enable = true;
+        debug_enable = true;
+        debug_matrix = true;
+        debug_keyboard = true;
+        debug_mouse = true;
+        print("debug enabled.\n");
+    }
+    if (matrix_key_count() >= 4) {
+        print("jump to bootloader...\n");
+        _delay_ms(1000);
+        jump_bootloader(); // not return
     }
 
-    // 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<<TOIE0);
-
-
-    matrix_init();
-
-    bool modified = false;
-    bool has_ghost = false;
-    int layer = 0;
-    int key_index = 0;
-    uint8_t mouse_x = 0;
-    uint8_t mouse_y = 0;
-    uint8_t mouse_btn = 0;
-    int8_t mouse_wheel = 0;
-    int8_t mouse_hwheel = 0;
-    int mouse_repeat = 0;
 
-    print("\nt.m.k. keyboard 1.0 for hhkb\n");
     while (1) {
-        matrix_scan();
-        modified = matrix_is_modified();
-        has_ghost = matrix_has_ghost();
-        layer = get_layer();
-
-        // print matrix state for debug
-        if (modified) {
-            print_matrix();
-
-            // LED flash for debug
-            LED_CONFIG;
-            LED_ON;
-        }
-
-        keyboard_modifier_keys = 0;
-        for (int i = 0; i < 3; i++) keyboard_keys[i] = KB_NO;
-        key_index = 0;
-        mouse_x = 0;
-        mouse_y = 0;
-        mouse_btn = 0;
-        mouse_wheel = 0;
-        mouse_hwheel = 0;
-
-        // convert matrix state to HID report
-        for (int row = 0; row < MATRIX_ROWS; row++) {
-            for (int col = 0; col < MATRIX_COLS; col++) {
-                if (matrix[row] & 1<<col) continue;
-
-                uint8_t code = get_keycode(layer, row, col);
-                if (code == KB_NO) {
-                    continue;
-                } else if (KB_LCTRL <= code && code <= KB_RGUI) {
-                    // modifier keys(0xE0-0xE7)
-                    keyboard_modifier_keys |= 1<<(code & 0x07);
-                } else if (code >= MS_UP) {
-                    // mouse
-                    if (code == MS_UP)    mouse_y -= MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10);
-                    if (code == MS_DOWN)  mouse_y += MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10);
-                    if (code == MS_LEFT)  mouse_x -= MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10);
-                    if (code == MS_RIGHT) mouse_x += MOUSE_MOVE_UNIT + (mouse_repeat < 50 ? mouse_repeat/5 : 10);
-                    if (code == MS_BTN1)  mouse_btn |= 1<<0;
-                    if (code == MS_BTN2)  mouse_btn |= 1<<1;
-                    if (code == MS_BTN3)  mouse_btn |= 1<<2;
-                    if (code == MS_BTN4)  mouse_btn |= 1<<3;
-                    if (code == MS_BTN5)  mouse_btn |= 1<<4;
-                    if (code == MS_WH_UP)  mouse_wheel += 1;
-                    if (code == MS_WH_DOWN)  mouse_wheel -= 1;
-                    if (code == MS_WH_LEFT)  mouse_hwheel -= 1;
-                    if (code == MS_WH_RIGHT) mouse_hwheel += 1;
-                } else {
-                    // normal keys
-                    if (key_index < 6)
-                        keyboard_keys[key_index] = code;
-                    key_index++;
-                }
-            }
-        }
-
-        if (!has_ghost)  {
-            // when 4 left modifier keys down
-            if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
-                // cancel all keys
-                keyboard_modifier_keys = 0;
-                for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
-                usb_keyboard_send();
-
-                print("jump to bootloader...\n");
-                _delay_ms(100);
-                jump_bootloader(); // not return
-            }
-
-            if (mouse_x || mouse_y || mouse_wheel || mouse_hwheel || mouse_btn != mouse_buttons) {
-                mouse_buttons = mouse_btn;
-                usb_mouse_move(mouse_x, mouse_y, mouse_wheel, mouse_hwheel);
-                key_sent = true;
-
-                // acceleration
-                _delay_ms(MOUSE_DELAY_MS >> (mouse_repeat < MOUSE_DELAY_ACC ? mouse_repeat : MOUSE_DELAY_ACC));
-                mouse_repeat++;
-            } else {
-                mouse_repeat = 0;
-            }
-
-
-            // send keys to host
-            if (modified) {
-                if (key_index > 6) {
-                    //Rollover
-                }
-                usb_keyboard_send();
-                if (keyboard_keys[0])
-                    key_sent = true;
-
-                // LED flash for debug
-                LED_CONFIG;
-                LED_OFF;
-            }
-        }
-        _delay_ms(2);
+       keyboard_proc(); 
     }
 }
-
-static void print_matrix(void) {
-            print("\nr/c 01234567\n");
-            for (int row = 0; row < MATRIX_ROWS; row++) {
-                phex(row); print(": ");
-                pbin_reverse(matrix[row]);
-                if (matrix_has_ghost_in_row(row)) {
-                    print(" <ghost");
-                }
-                print("\n");
-            }
-            print("keys: ");
-            for (int i = 0; i < 6; i++) { phex(keyboard_keys[i]); print(" "); }
-            print("\n");
-            print("mod: "); phex(keyboard_modifier_keys); print("\n");
-}
-
-// This interrupt routine is run approx 61 times per second.
-// A very simple inactivity timeout is implemented, where we
-// will send a space character and print a message to the
-// hid_listen debug message window.
-ISR(TIMER0_OVF_vect)
-{
-    idle_count++;
-}