Beispiel #1
0
uint8_t matrix_scan(void)
{

#if DIODE_DIRECTION == COL2ROW
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        select_row(i);
        _delay_us(30);  // without this wait read unstable value.
        matrix_row_t cols = read_cols();
        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];
            }
        }
    }
#else
    for (uint8_t i = 0; i < MATRIX_COLS; i++) {
        select_row(i);
        _delay_us(30);  // without this wait read unstable value.
        matrix_row_t rows = read_cols();
        if (matrix_reversed_debouncing[i] != rows) {
            matrix_reversed_debouncing[i] = rows;
            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_COLS; i++) {
                matrix_reversed[i] = matrix_reversed_debouncing[i];
            }
        }
    }
    for (uint8_t y = 0; y < MATRIX_ROWS; y++) {
        matrix_row_t row = 0;
        for (uint8_t x = 0; x < MATRIX_COLS; x++) {
            row |= ((matrix_reversed[x] & (1<<y)) >> y) << x;
        }
        matrix[y] = row;
    }
#endif

    if (matrix_scan_kb) {
        (*matrix_scan_kb)();
    }

    return 1;
}
Beispiel #2
0
static void init_pins(void) {
  unselect_rows();
  for (uint8_t x = 0; x < MATRIX_COLS; x++) {
    setPinInputHigh(col_pins[x]);
  }
}
Beispiel #3
0
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;
}
Beispiel #4
0
uint8_t matrix_scan(void)
{
#ifdef DEBUG_SHOW_SCAN_LED
	LedInfo2_On();
#endif

    for (uint8_t row = 0; row < MATRIX_ROWS; row++)
    {
        select_row(row);
        _delay_us(15); // without this wait read unstable value.
        matrix_row_t cols = read_cols();

#ifndef DEBUG_SHOW_SCAN_LED
        if (cols)
            LedInfo2_On();
        else
            LedInfo2_Off();
#endif

        if (matrix_debouncing[row] != cols)
        {
            // dprintf("bounce %u\r\n", row);

            matrix_debouncing[row] = cols;
            debouncing_times[row] = timer_read();
            debouncing[row] = true;
        }

        unselect_rows();
    }

#if 0
    if (debouncing)
    {
        LedInfo1_On();

    	if (timer_elapsed(debouncing_time) > DEBOUNCE_TIME)
    	{
			for (int i = 0; i < MATRIX_ROWS; i++)
			{
				matrix[i] = matrix_debouncing[i];
			}

			debouncing = false;
    	}
    }
    else
    {
        LedInfo1_Off();
    }
#endif

    for (uint8_t row = 0; row < MATRIX_ROWS; row++)
    {
        if (debouncing[row])
        {
            LedInfo1_On();

            if (timer_elapsed(debouncing_times[row]) > DEBOUNCE_TIME)
            {
                // dprintf("bounced %u\r\n", row);

                matrix[row] = matrix_debouncing[row];
                debouncing[row] = false;

                animation_typematrix_row(row, matrix[row]);
            }
        }
        else
        {
            LedInfo1_Off();
        }
    }

#ifdef BACKLIGHT_ENABLE
    animate();
#endif

#ifdef DEBUG_SHOW_SCAN_LED
    LedInfo2_Off();
#endif

    return 1;
}
Beispiel #5
0
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_SCAN_RATE
    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 SHOW_LAYER_LEDS
    uint8_t layer = biton32(layer_state);

    // use the leds 2 and 3 to show which layer is currently active
    ergodox_board_led_off();
    ergodox_right_led_2_off();
    ergodox_right_led_3_off();
    switch (layer) {
        case 0:
            // no leds
            break;
        case 1:
            ergodox_right_led_3_on();
            break;
        case 2:
            ergodox_right_led_2_on();
            break;
        case 3:
            ergodox_right_led_2_on();
            ergodox_right_led_3_on();
            break;
    }
#endif

#ifdef KEYMAP_CUB
    uint8_t layer = biton32(layer_state);

    ergodox_board_led_off();
    ergodox_right_led_1_off();
    ergodox_right_led_2_off();
    ergodox_right_led_3_off();
    switch (layer) {
        case 1:
            // no leds
            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;
    }

    mcp23018_status = ergodox_left_leds_update();
#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;
}
Beispiel #6
0
/* Row pin configuration
 * row: 0   1   2   3   4  5
 * pin: C0  C1  C2  C3  C4 C5
 */
static void init_rows(void)
{
    unselect_rows();
}