]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - mykey.c
add mouse wheel function.
[max/tmk_keyboard.git] / mykey.c
diff --git a/mykey.c b/mykey.c
index 337089c94275e10e5067b32ec4f107331e61bbf8..b0656ee1f45ddd1308b00c33f7fb60116fc724ac 100644 (file)
--- a/mykey.c
+++ b/mykey.c
@@ -30,7 +30,9 @@
 #include <avr/interrupt.h>
 #include <util/delay.h>
 
-#include "usb_device.h"
+#include "usb.h"
+#include "usb_keyboard.h"
+#include "usb_mouse.h"
 #include "print.h"
 #include "matrix.h"
 #include "keymap.h"
@@ -41,6 +43,8 @@
 #define LED_OFF        (PORTD |= (1<<6))
 #define CPU_PRESCALE(n)    (CLKPR = 0x80, CLKPR = (n))
 
+static void print_matrix(void);
+
 
 uint16_t idle_count=0;
 
@@ -48,16 +52,9 @@ uint16_t idle_count=0;
 
 int main(void)
 {
-    bool modified = false;
-    bool has_ghost = false;
-    uint8_t key_index = 0;
-
     // set for 16 MHz clock
     CPU_PRESCALE(0);
 
-    matrix_init();
-
-
     // Initialize the USB, and then wait for the host to set configuration.
     // If the Teensy is powered without a PC connected to the USB port,
     // this will wait forever.
@@ -76,68 +73,114 @@ int main(void)
     TCCR0B = 0x05;
     TIMSK0 = (1<<TOIE0);
 
-    print("firmware 0.2 for t.m.k.\n");
 
-    while (1) {
-        int layer = 0;
-        uint8_t row, col, code;
+    matrix_init();
+    print("firmware 0.3 for t.m.k.\n");
 
+    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;
+    while (1) {
         matrix_scan();
-        layer = get_layer();
-
         modified = matrix_is_modified();
         has_ghost = matrix_has_ghost();
+        layer = get_layer();
+
+        // print matrix state for debug
+        if (modified) {
+            print_matrix();
 
-        // doesnt send keys during ghost occurs
-        if (modified && !has_ghost) {
-            key_index = 0;
-            keyboard_modifier_keys = 0;
-            for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
-
-            for (row = 0; row < MATRIX_ROWS; row++) {
-                for (col = 0; col < MATRIX_COLS; col++) {
-                    if (matrix[row] & 1<<col) continue;
-
-                    code = get_keycode(layer, row, col);
-                    if (code == KB_NO) {
-                        continue;
-                    } else if (KB_LCTRL <= code && code <= KB_RGUI) {
-                        // modifier keycode: 0xE0-0xE7
-                        keyboard_modifier_keys |= 1<<(code & 0x07);
-                    } else {
-                        if (key_index < 6)
-                            keyboard_keys[key_index] = code;
-                        key_index++;
-                    }
+            // LED flush
+            DDRD |= 1<<PD6;
+            PORTD |= 1<<PD6;
+        }
+
+        keyboard_modifier_keys = 0;
+        for (int i = 0; i < 6; 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 keycode: 0xE0-0xE7
+                    keyboard_modifier_keys |= 1<<(code & 0x07);
+                } else if (code >= MS_UP) {
+                    // mouse
+                    if (code == MS_UP)    mouse_y -= 15;
+                    if (code == MS_DOWN)  mouse_y += 15;
+                    if (code == MS_LEFT)  mouse_x -= 15;
+                    if (code == MS_RIGHT) mouse_x += 15;
+                    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 {
+                    if (key_index < 6)
+                        keyboard_keys[key_index] = code;
+                    key_index++;
                 }
             }
+        }
 
-            // run bootloader when 4 left modifier keys down
+        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(1000);
-                jump_bootloader();
+                jump_bootloader(); // not return
             }
 
-            if (key_index > 6) {
-                //Rollover
+            if (mouse_x || mouse_y || mouse_wheel || mouse_hwheel || mouse_btn != mouse_buttons) {
+                mouse_buttons = mouse_btn;
+                print("mouse_buttons: 0b"); pbin(mouse_buttons); print("\n");
+                print("mouse_wheel: 0x"); phex(mouse_wheel); print("\n");
+                usb_mouse_move(mouse_x, mouse_y, mouse_wheel, mouse_hwheel);
+                _delay_ms(100);
             }
 
-            usb_keyboard_send();
-
 
-            // variables shared with interrupt routines must be
-            // accessed carefully so the interrupt routine doesn't
-            // try to use the variable in the middle of our access
-            cli();
-            idle_count = 0;
-            sei();
+            // send keys to host
+            if (modified) {
+                if (key_index > 6) {
+                    //Rollover
+                }
+                usb_keyboard_send();
+            }
         }
+        _delay_ms(2);
+    }
+}
 
-        // print matrix state for debug
-        if (modified) {
+static void print_matrix(void) {
             print("\nr/c 01234567\n");
-            for (row = 0; row < MATRIX_ROWS; row++) {
+            for (int row = 0; row < MATRIX_ROWS; row++) {
                 phex(row); print(": ");
                 pbin_reverse(matrix[row]);
                 if (matrix_has_ghost_in_row(row)) {
@@ -149,13 +192,6 @@ int main(void)
             for (int i = 0; i < 6; i++) { phex(keyboard_keys[i]); print(" "); }
             print("\n");
             print("mod: "); phex(keyboard_modifier_keys); print("\n");
-        }
-
-        // now the current pins will be the previous, and
-        // wait a short delay so we're not highly sensitive
-        // to mechanical "bounce".
-        _delay_ms(2);
-    }
 }
 
 // This interrupt routine is run approx 61 times per second.
@@ -165,8 +201,4 @@ int main(void)
 ISR(TIMER0_OVF_vect)
 {
     idle_count++;
-    if (idle_count > 61 * 8) {
-        idle_count = 0;
-        print(".");
-    }
 }