]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - keyboard/ergodox/matrix.c
Add my keymap
[max/tmk_keyboard.git] / keyboard / ergodox / matrix.c
index e50932c92c25ffc752fc4a7098d5cb6e82c2599f..cecfe574c08abb7379c10bc4ab9ebc235f1f5783 100644 (file)
@@ -29,7 +29,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "matrix.h"
 #include "ergodox.h"
 #include "i2cmaster.h"
-#ifdef DEBUG_MATRIX_FREQ
+#ifdef DEBUG_MATRIX_SCAN_RATE
 #include  "timer.h"
 #endif
 
@@ -44,12 +44,12 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
 
 static matrix_row_t read_cols(uint8_t row);
 static void init_cols(void);
-static void unselect_rows();
+static void unselect_rows(void);
 static void select_row(uint8_t row);
 
-static uint8_t mcp23018_status;
+static uint8_t mcp23018_reset_loop;
 
-#ifdef DEBUG_MATRIX_FREQ
+#ifdef DEBUG_MATRIX_SCAN_RATE
 uint32_t matrix_timer;
 uint32_t matrix_scan_count;
 #endif
@@ -71,6 +71,7 @@ void matrix_init(void)
     // initialize row and col
     init_ergodox();
     mcp23018_status = init_mcp23018();
+    ergodox_blink_all_leds();
     unselect_rows();
     init_cols();
 
@@ -80,7 +81,7 @@ void matrix_init(void)
         matrix_debouncing[i] = 0;
     }
 
-#ifdef DEBUG_MATRIX_FREQ
+#ifdef DEBUG_MATRIX_SCAN_RATE
     matrix_timer = timer_read32();
     matrix_scan_count = 0;
 #endif
@@ -88,7 +89,22 @@ void matrix_init(void)
 
 uint8_t matrix_scan(void)
 {
-#ifdef DEBUG_MATRIX_FREQ
+    if (mcp23018_status) { // if there was an error
+        if (++mcp23018_reset_loop == 0) {
+            // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
+            // this will be approx bit more frequent than once per second
+            print("trying to reset mcp23018\n");
+            mcp23018_status = init_mcp23018();
+            if (mcp23018_status) {
+                print("left side not responding\n");
+            } else {
+                print("left side attached\n");
+                ergodox_blink_all_leds();
+            }
+        }
+    }
+
+#ifdef DEBUG_MATRIX_SCAN_RATE
     matrix_scan_count++;
 
     uint32_t timer_now = timer_read32();
@@ -134,9 +150,14 @@ uint8_t matrix_scan(void)
         case 4:
         case 5:
         case 7:
-            // red
+            // white
             ergodox_left_led_1_on();
             break;
+        case 9:
+            // white+green
+            ergodox_left_led_1_on();
+            ergodox_left_led_3_on();
+            break;
         default:
             // none
             break;
@@ -212,11 +233,11 @@ uint8_t matrix_key_count(void)
  *
  * Teensy
  * col: 0   1   2   3   4   5
- * pin: F0  F1  F4  F5  F6  F7 
+ * pin: F0  F1  F4  F5  F6  F7
  *
  * MCP23018
  * col: 0   1   2   3   4   5
- * pin: B5  B4  B3  B2  B1  B0 
+ * pin: B5  B4  B3  B2  B1  B0
  */
 static void  init_cols(void)
 {
@@ -305,7 +326,7 @@ static void select_row(uint8_t row)
             // set other rows hi-Z : 1
             mcp23018_status = i2c_start(I2C_ADDR_WRITE);        if (mcp23018_status) goto out;
             mcp23018_status = i2c_write(GPIOA);                 if (mcp23018_status) goto out;
-            mcp23018_status = i2c_write( 0xFF & ~(1<<row) 
+            mcp23018_status = i2c_write( 0xFF & ~(1<<row)
                                   & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
                               );                                if (mcp23018_status) goto out;
         out:
@@ -346,4 +367,3 @@ static void select_row(uint8_t row)
         }
     }
 }
-