]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - keyboard/IIgs_Standard/matrix.c
Fix debug code of serial_soft.c
[max/tmk_keyboard.git] / keyboard / IIgs_Standard / matrix.c
index c44ac641c9a1d020b1055853eb9555041d88f9f9..6ca55b7ea24d3bf9f9e97dcbc0545a2ca5fc7aac 100644 (file)
@@ -26,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "util.h"
 #include "matrix.h"
+#include "led.h"
 
 
 #if (MATRIX_COLS > 16)
@@ -85,11 +86,16 @@ void matrix_init(void)
     PORTC |= 0b01111111;
     DDRE &= ~0b00000010;
     PORTE |= 0b00000010;
+       //DDRB &= ~0b00000100;
+       //PORTB |= 0b00000100;
        // modifier     B3/4,F4/5,E4    always input
-    DDRB |=  0b00011000;
-    PORTB &= 0b00011000;
-    DDRF |= ~0b00110000;
-    PORTF &= 0b00110000;
+       //                      A0
+    //DDRA |=  0b00000001;
+    //PORTA &= 0b00000001;
+    //DDRB |=  0b00011000;
+    //PORTB &= 0b00011000;
+    //DDRF |= ~0b00110000;
+    //PORTF &= 0b00110000;
     //DDRB &= ~0b00011000;
     //PORTB |= 0b00011000;
     //DDRF &= ~0b00110000;
@@ -116,14 +122,32 @@ uint8_t matrix_scan(void)
         unselect_rows();
         select_row(i);
         _delay_us(30);  // without this wait read unstable value.
-        if (matrix[i] != (uint8_t)~read_col(i)) {
-            matrix[i] = (uint8_t)~read_col(i);
-            if (debouncing) {
-                debug("bounce!: "); debug_hex(debouncing); print("\n");
-            }
-            debouncing = DEBOUNCE;
-        }
-    }
+               if ( i == ( MATRIX_ROWS - 1 ) ) {                                                       // CHECK CAPS LOCK
+                       if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {            // CAPS LOCK is ON on HOST
+                               if ( ~read_col(i) & (1<< 4) ) {                                                         // CAPS LOCK is still DOWN ( 0bXXX1_XXXX)       
+                                       matrix[i]        = ~read_col(i) & 0b11101111;                           // change CAPS LOCK as released
+                               } else {                                                                                                        // CAPS LOCK in UP
+                                       matrix[i] = ~read_col(i) | 0b00010000;                                          // send fake caps lock down
+                               }
+                       } else {                                                                                                        // CAPS LOCK is OFF on HOST
+                       if (matrix[i] != (uint8_t)~read_col(i)) {
+                               matrix[i] = (uint8_t)~read_col(i);
+                               if (debouncing) {
+                                       debug("bounce!: "); debug_hex(debouncing); print("\n");
+                                       }
+                                       debouncing = DEBOUNCE;
+                               }
+                       }
+               } else {
+               if (matrix[i] != (uint8_t)~read_col(i)) {
+                       matrix[i] = (uint8_t)~read_col(i);
+                       if (debouncing) {
+                               debug("bounce!: "); debug_hex(debouncing); print("\n");
+                               }
+                               debouncing = DEBOUNCE;
+                       }
+               }
+       }
     unselect_rows();
 
     if (debouncing) {
@@ -159,7 +183,17 @@ bool matrix_has_ghost(void)
 inline
 bool matrix_is_on(uint8_t row, uint8_t col)
 {
-    return (matrix[row] & (1<<col));
+//     if ( row == ( MATRIX_ROWS - 1 ) && col == 4) {                                                  // CHECK CAPS LOCK
+//     if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {            // CAPS LOCK is ON on HOST
+//                     if ((matrix_prev[row] & 0b00010000) && (~matrix[row] & 0b00010000)) {
+//                             debug("CapsLock Reverse:");debug_hex(matrix[row]);
+//                             matrix[row] |= 0b00010000;
+//                             matrix_prev[row] &= ~0b00010000;
+//                             debug("->");debug_hex(matrix[row]);debug("\n");
+//                     }
+//             } 
+//     }
+       return (matrix[row] & (1<<col));
 }
 
 inline
@@ -229,12 +263,13 @@ static uint8_t read_col(uint8_t row)
        // Modifier would be copied to report->mods except E4(CAPSLOCK)
        uint8_t tmp;
        if ( row == 10 ) {
-               tmp = 0xF0;
+               tmp = 0xC0;
                tmp |= (PINB >> 3 ) & 0b00000011;       // LEFT CTRL  is 0bit in modifier (HID Spec)
                                                                                        // LEFT SHIFT is 1bit in modifier (HID Spec)
                tmp |= (PINF >> 3 ) & 0b00000100;       // LEFT ALT   is 2bit in modifier (HID Spec)
                tmp |= (PINF >> 1 ) & 0b00001000;       // LEFT GUI   is 3bit in modifier (HID Spec)
-               //tmp |= (PINE << 1 ) & 0b00010000;     // Caps Lock(Should not be in modifier
+               tmp |= (PINA << 4 ) & 0b00010000;       // CAPSLOCK
+               tmp |= (PINB << 3 ) & 0b00100000;       // POWER         
        } else {
                tmp = 0x00;
                tmp = (PINE >> 1)&0b00000001; 
@@ -257,8 +292,10 @@ static void unselect_rows(void)
     DDRF  &= ~0b11000111; // PF: 7,6,2,1,0 
     PORTF &= ~0b11000111;
        // to unselect virtual row(modifier), set port to output with low
-    DDRB  |=  0b00011000; // PB: 3,4 for modifier(row10)
-    PORTB &= ~0b00011000;
+    DDRA  |=  0b00000001; // PA: 0 for CAPSLOCK
+    PORTA &= ~0b00000001;
+    DDRB  |=  0b00011100; // PB: 3,4 for modifier(row10)
+    PORTB &= ~0b00011100; // PB: 2 for power
     DDRF  |=  0b00110000; // PF: 4,5 for modifier
     PORTF &= ~0b00110000;
 }
@@ -314,8 +351,10 @@ static void select_row(uint8_t row)
                case 10:
                        // modifier has no row enable
                        // to select virtual row, set port as input
-                   DDRB &= ~0b00011000;
-                   PORTB |= 0b00011000;
+                   DDRA &= ~0b00000001;
+                   PORTA |= 0b00000001;
+                   DDRB &= ~0b00011100;
+                   PORTB |= 0b00011100;
                    DDRF &= ~0b00110000;
                    PORTF |= 0b00110000;
             break;