X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=keyboard%2Fergodox%2Fmatrix.c;h=cecfe574c08abb7379c10bc4ab9ebc235f1f5783;hb=3e8289b53ce929484651fc065fb5f718e4e3ae21;hp=0c5b73113f5d64bd87f90fdd4b7a8585b01df592;hpb=d30fba8ce25350cdf0c221ada43c0020d1eac2ed;p=max%2Ftmk_keyboard.git diff --git a/keyboard/ergodox/matrix.c b/keyboard/ergodox/matrix.c index 0c5b7311..cecfe574 100644 --- a/keyboard/ergodox/matrix.c +++ b/keyboard/ergodox/matrix.c @@ -29,7 +29,7 @@ along with this program. If not, see . #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<