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++; uint32_t timer_now = timer_read32(); if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) { print("matrix scan frequency: "); pdec(matrix_scan_count); print("\n"); matrix_timer = timer_now; matrix_scan_count = 0; } #endif #ifdef KEYMAP_CUB 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 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: // red ergodox_left_led_1_on(); break; default: // none break; } mcp23018_status = ergodox_left_leds_update(); #endif #ifdef KEYMAP_SIMON uint8_t layer = biton32(layer_state); ergodox_board_led_off(); switch (layer) { case 0: // none break; default: ergodox_board_led_on(); break; } #endif for (uint8_t i = 0; i < MATRIX_ROWS; i++) { select_row(i); matrix_row_t cols = read_cols(i); if (matrix_debouncing[i] != cols) { matrix_debouncing[i] = cols; if (debouncing) { debug("bounce!: "); debug_hex(debouncing); debug("\n"); } debouncing = DEBOUNCE; } unselect_rows(); } if (debouncing) { if (--debouncing) { _delay_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; } } } return 1; }
uint8_t matrix_scan(void) { #ifdef ERGODOX_LEFT_LEDS 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(); } // not actually needed because we already calling init_mcp23018() in next line // ergodox_left_leds_update(); #endif uint8_t mcp23018_status = init_mcp23018(); for (uint8_t i = 0; i < MATRIX_ROWS; i++) { select_row(mcp23018_status, i); _delay_us(30); // without this wait read unstable value. matrix_row_t cols = read_cols(mcp23018_status, i); if (matrix_debouncing[i] != cols) { matrix_debouncing[i] = cols; if (debouncing) { debug("bounce!: "); debug_hex(debouncing); debug("\n"); } debouncing = DEBOUNCE; } unselect_rows(mcp23018_status); } if (debouncing) { if (--debouncing) { _delay_ms(1); } else { for (uint8_t i = 0; i < MATRIX_ROWS; i++) { matrix[i] = matrix_debouncing[i]; } } } return 1; }