]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - converter/xt_usb/matrix.c
onekey: Add settings for Xtal-less V-USB
[max/tmk_keyboard.git] / converter / xt_usb / matrix.c
index 4218e39bb367066c9e6ac24f4f85e90a0c0c315d..51742dd27b9d39a2b57002cad08ae6c1a7f6fc5a 100644 (file)
@@ -28,10 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 static void matrix_make(uint8_t code);
 static void matrix_break(uint8_t code);
-static void matrix_clear(void);
-#ifdef MATRIX_HAS_GHOST
-static bool matrix_has_ghost_in_row(uint8_t row);
-#endif
 
 static uint8_t matrix[MATRIX_ROWS];
 #define ROW(code)      (code>>3)
@@ -41,20 +37,6 @@ static uint8_t matrix[MATRIX_ROWS];
 #define PRINT_SCREEN   (0x7C)
 #define PAUSE          (0x7D)
 
-static bool is_modified = false;
-
-
-inline
-uint8_t matrix_rows(void)
-{
-    return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
-    return MATRIX_COLS;
-}
 
 void matrix_init(void)
 {
@@ -132,15 +114,12 @@ uint8_t matrix_scan(void)
     } state = INIT;
 
 
-    is_modified = false;
-
     // 'pseudo break code' hack
     if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) {
         matrix_break(PAUSE);
     }
 
     uint8_t code = xt_host_recv();
-    if (code) xprintf("%X\r\n", code);
     switch (state) {
         case INIT:
             switch (code) {
@@ -150,19 +129,13 @@ uint8_t matrix_scan(void)
                 case 0xE1:
                     state = E1;
                     break;
-                case 0x00:
-                    break;
                 default:    // normal key make
-                    if (code < 0x80) {
+                    if (code < 0x80 && code != 0x00) {
                         xprintf("make: %X\r\n", code);
                         matrix_make(code);
-                    } else if (code > 0x80 && code < 0xFF) {
+                    } else if (code > 0x80 && code < 0xFF && code != 0x00) {
                         xprintf("break %X\r\n", code);
                         matrix_break(code - 0x80);
-                    } else {
-                        matrix_clear();
-                        clear_keyboard();
-                        xprintf("unexpected scan code at INIT: %02X\n", code);
                     }
                     state = INIT;
             }
@@ -175,194 +148,86 @@ uint8_t matrix_scan(void)
                 case 0xB7:
                     state = E0_B7;
                     break;
-                case 0x00:
-                    state = INIT;
-                    break;
                 default:
-                    if (code < 0x80) {
+                    if (code < 0x80 && code != 0x00) {
                         matrix_make(move_codes(code));
-                    } else if (code > 0x80 && code < 0xFF) {
+                    } else if (code > 0x80 && code < 0xFF && code != 0x00) {
                         matrix_break(move_codes(code - 0x80));
-                    } else {
-                        matrix_clear();
-                        clear_keyboard();
-                        xprintf("unexpected scan code at E0: %02X\n", code);
                     }
                     state = INIT;
             }
             break;
         case E0_2A:
-            switch (code) {
-                case 0xE0:
-                    state = E0_2A_E0;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0xE0)
+                state = E0_2A_E0;
+            else
+                state = INIT;
             break;
         case E0_2A_E0:
-            switch (code) {
-                case 0x37:
-                    matrix_make(PRINT_SCREEN);
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0x37)
+                matrix_make(PRINT_SCREEN);
+            else
+                state = INIT;
             break;
         case E0_B7:
-            switch (code) {
-                case 0xE0:
-                    state = E0_B7;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0xE0)
+                state = E0_B7;
+            else
+                state = INIT;
             break;
         case E0_B7_E0:
-          switch (code) {
-              case 0xAA:
-                  matrix_break(PRINT_SCREEN);
-                  break;
-              default:
-                  state = INIT;
-          }
+          if(code == 0xAA)
+              matrix_break(PRINT_SCREEN);
+          else
+              state = INIT;
           break;
         case E1:
-            switch (code) {
-                case 0x1D:
-                    state = E1_1D;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if (code == 0x1D)
+                state = E1_1D;
+            else
+                state = INIT;
             break;
         case E1_1D:
-            switch (code) {
-                case 0x45:
-                    state = E1_1D_45;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0x45)
+                state = E1_1D_45;
+            else
+                state = INIT;
             break;
         case E1_1D_45:
-            switch (code) {
-                case 0xE1:
-                    state = E1_1D_45_E1;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0xE1)
+                state = E1_1D_45_E1;
+            else
+                state = INIT;
             break;
         case E1_1D_45_E1:
-            switch (code) {
-                case 0x9D:
-                    state = E1_1D_45_E1_9D;
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0x9D)
+                state = E1_1D_45_E1_9D;
+            else
+                state = INIT;
             break;
         case E1_1D_45_E1_9D:
-            switch (code) {
-                case 0xC5:
-                    matrix_make(PAUSE);
-                    break;
-                default:
-                    state = INIT;
-            }
+            if(code == 0xC5)
+                matrix_make(PAUSE);
+            else
+                state = INIT;
             break;
         default:
             state = INIT;
     }
-
-    // TODO: request RESEND when error occurs?
-/*
-    if (PS2_IS_FAILED(ps2_error)) {
-        uint8_t ret = ps2_host_send(PS2_RESEND);
-        xprintf("Resend: %02X\n", ret);
-    }
-*/
     return 1;
 }
 
-bool matrix_is_modified(void)
-{
-    return is_modified;
-}
-
-inline
-bool matrix_has_ghost(void)
-{
-#ifdef MATRIX_HAS_GHOST
-    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-        if (matrix_has_ghost_in_row(i))
-            return true;
-    }
-#endif
-    return false;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
-    return (matrix[row] & (1<<col));
-}
-
 inline
 uint8_t matrix_get_row(uint8_t row)
 {
     return matrix[row];
 }
 
-void matrix_print(void)
-{
-    print("\nr/c 01234567\n");
-    for (uint8_t row = 0; row < matrix_rows(); row++) {
-        phex(row); print(": ");
-        pbin_reverse(matrix_get_row(row));
-#ifdef MATRIX_HAS_GHOST
-        if (matrix_has_ghost_in_row(row)) {
-            print(" <ghost");
-        }
-#endif
-        print("\n");
-    }
-}
-
-uint8_t matrix_key_count(void)
-{
-    uint8_t count = 0;
-    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-        count += bitpop(matrix[i]);
-    }
-    return count;
-}
-
-#ifdef MATRIX_HAS_GHOST
-inline
-static bool matrix_has_ghost_in_row(uint8_t row)
-{
-    // no ghost exists in case less than 2 keys on
-    if (((matrix[row] - 1) & matrix[row]) == 0)
-        return false;
-
-    // ghost exists in case same state as other row
-    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
-        if (i != row && (matrix[i] & matrix[row]) == matrix[row])
-            return true;
-    }
-    return false;
-}
-#endif
-
-
 inline
 static void matrix_make(uint8_t code)
 {
     if (!matrix_is_on(ROW(code), COL(code))) {
         matrix[ROW(code)] |= 1<<COL(code);
-        is_modified = true;
     }
 }
 
@@ -371,12 +236,10 @@ static void matrix_break(uint8_t code)
 {
     if (matrix_is_on(ROW(code), COL(code))) {
         matrix[ROW(code)] &= ~(1<<COL(code));
-        is_modified = true;
     }
 }
 
-inline
-static void matrix_clear(void)
+void matrix_clear(void)
 {
     for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
 }