]> 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 0c5b73113f5d64bd87f90fdd4b7a8585b01df592..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();
@@ -105,43 +121,49 @@ uint8_t matrix_scan(void)
 #ifdef KEYMAP_CUB
     uint8_t layer = biton32(layer_state);
 
-    if (layer == 1) {
-        ergodox_left_led_1_on();
-        ergodox_left_led_2_off();
-        ergodox_left_led_3_off();
-    } else if (layer == 2) {
-        ergodox_left_led_1_off();
-        ergodox_left_led_2_on();
-        ergodox_left_led_3_off();
-    } else if (layer == 3) {
-        ergodox_left_led_1_off();
-        ergodox_left_led_2_off();
-        ergodox_left_led_3_on();
-    } else if (layer == 4) {
-        ergodox_left_led_1_on();
-        ergodox_left_led_2_off();
-        ergodox_left_led_3_on();
-    } else if (layer == 5) {
-        ergodox_left_led_1_on();
-        ergodox_left_led_2_on();
-        ergodox_left_led_3_off();
-    } else if (layer == 6) {
-        ergodox_left_led_1_off();
-        ergodox_left_led_2_on();
-        ergodox_left_led_3_on();
-    } else if (layer == 7) {
-        ergodox_left_led_1_on();
-        ergodox_left_led_2_on();
-        ergodox_left_led_3_on();
-    } else {
-        ergodox_left_led_1_off();
-        ergodox_left_led_2_off();
-        ergodox_left_led_3_off();
+    ergodox_board_led_off();
+    ergodox_left_led_1_off();
+    ergodox_left_led_2_off();
+    ergodox_left_led_3_off();
+    switch (layer) {
+        case 1:
+            // all
+            ergodox_left_led_1_on();
+            ergodox_left_led_2_on();
+            ergodox_left_led_3_on();
+            break;
+        case 2:
+            // blue
+            ergodox_left_led_2_on();
+            break;
+        case 8:
+            // blue and green
+            ergodox_left_led_2_on();
+            // break missed intentionally
+        case 3:
+            // green
+            ergodox_left_led_3_on();
+            break;
+        case 6:
+            ergodox_board_led_on();
+            // break missed intentionally
+        case 4:
+        case 5:
+        case 7:
+            // 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;
     }
 
-    // not actually needed because we already calling init_mcp23018() in next line
     mcp23018_status = ergodox_left_leds_update();
-
 #endif
 
     for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
@@ -211,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)
 {
@@ -304,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:
@@ -345,4 +367,3 @@ static void select_row(uint8_t row)
         }
     }
 }
-