]> git.friedersdorff.com Git - max/tmk_keyboard.git/blobdiff - keyboard/ergodox/matrix.c
Initial version of Ergodox-FAQ.md
[max/tmk_keyboard.git] / keyboard / ergodox / matrix.c
index 2103a01814e525616f84383d5e08b275af92ebbd..ee0d5d230f33a188c4bc70503e4cd53d8c8ad50e 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
 
@@ -47,9 +47,9 @@ 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
+#ifdef DEBUG_MATRIX_SCAN_RATE
 uint32_t matrix_timer;
 uint32_t matrix_scan_count;
 #endif
@@ -81,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
@@ -89,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();
@@ -135,8 +150,13 @@ 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