]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - keyboard/ergodox/matrix.c
Refactor mcp23018_status and give possibility to re-attach left side
[tmk_firmware.git] / keyboard / ergodox / matrix.c
index 90c129d0389050c8567822e33abe5d566c5c7588..7621e913e000fdc2c372d5766ce033df8509e0c0 100644 (file)
@@ -47,7 +47,7 @@ static void init_cols(void);
 static void unselect_rows();
 static void select_row(uint8_t row);
 
-static uint8_t mcp23018_status;
+static uint8_t mcp23018_reset_loop;
 
 #ifdef DEBUG_MATRIX_FREQ
 uint32_t matrix_timer;
@@ -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();
 
@@ -88,6 +89,21 @@ void matrix_init(void)
 
 uint8_t matrix_scan(void)
 {
+    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_FREQ
     matrix_scan_count++;
 
@@ -106,6 +122,9 @@ uint8_t matrix_scan(void)
     uint8_t layer = biton32(layer_state);
 
     ergodox_board_led_off();
+    ergodox_left_led_1_off();
+    ergodox_left_led_2_off();
+    ergodox_left_led_3_off();
     switch (layer) {
         case 1:
             // all
@@ -115,14 +134,14 @@ uint8_t matrix_scan(void)
             break;
         case 2:
             // blue
-            ergodox_left_led_1_off();
             ergodox_left_led_2_on();
-            ergodox_left_led_3_off();
             break;
+        case 8:
+            // blue and green
+            ergodox_left_led_2_on();
+            // break missed intentionally
         case 3:
             // green
-            ergodox_left_led_1_off();
-            ergodox_left_led_2_off();
             ergodox_left_led_3_on();
             break;
         case 6:
@@ -130,16 +149,12 @@ uint8_t matrix_scan(void)
             // break missed intentionally
         case 4:
         case 5:
+        case 7:
             // red
             ergodox_left_led_1_on();
-            ergodox_left_led_2_off();
-            ergodox_left_led_3_off();
             break;
         default:
             // none
-            ergodox_left_led_1_off();
-            ergodox_left_led_2_off();
-            ergodox_left_led_3_off();
             break;
     }