@@ -44,7 +44,7 @@ void matrix_init(void); | |||
/* scan all key states on matrix */ | |||
uint8_t matrix_scan(void); | |||
/* whether modified from previous scan. used after matrix_scan. */ | |||
bool matrix_is_modified(void); | |||
bool matrix_is_modified(void) __attribute__ ((deprecated)); | |||
/* whether a swtich is on */ | |||
bool matrix_is_on(uint8_t row, uint8_t col); | |||
/* matrix state on row */ |
@@ -34,13 +34,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
static uint8_t debouncing = DEBOUNCE; | |||
/* matrix state(1:on, 0:off) */ | |||
static uint16_t *matrix; | |||
static uint16_t *matrix_debouncing; | |||
static uint16_t matrix0[MATRIX_ROWS]; | |||
static uint16_t matrix1[MATRIX_ROWS]; | |||
static bool is_modified; | |||
static matrix_row_t *matrix; | |||
static matrix_row_t *matrix_debouncing; | |||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||
static uint16_t read_cols(void); | |||
static matrix_row_t read_cols(void); | |||
static void init_cols(void); | |||
static void unselect_rows(void); | |||
static void select_row(uint8_t row); | |||
@@ -71,36 +70,32 @@ void matrix_init(void) | |||
matrix[i] = 0; | |||
matrix_debouncing[i] = 0; | |||
} | |||
is_modified = false; | |||
} | |||
uint8_t matrix_scan(void) | |||
{ | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
//unselect_rows(); | |||
select_row(i); | |||
_delay_us(30); // without this wait read unstable value. | |||
uint16_t cols = read_cols(); | |||
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; | |||
is_modified = false; | |||
} | |||
unselect_rows(); | |||
} | |||
//unselect_rows(); | |||
if (debouncing) { | |||
debouncing--; | |||
_delay_ms(1); | |||
} else { | |||
uint16_t *tmp = matrix; | |||
matrix = matrix_debouncing; | |||
matrix_debouncing = tmp; | |||
is_modified = true; | |||
if (--debouncing) { | |||
_delay_ms(1); | |||
} else { | |||
matrix_row_t *tmp = matrix; | |||
matrix = matrix_debouncing; | |||
matrix_debouncing = tmp; | |||
} | |||
} | |||
return 1; | |||
@@ -108,13 +103,8 @@ uint8_t matrix_scan(void) | |||
bool matrix_is_modified(void) | |||
{ | |||
return is_modified; | |||
} | |||
inline | |||
bool matrix_has_ghost(void) | |||
{ | |||
return false; | |||
if (debouncing) return false; | |||
return true; | |||
} | |||
inline | |||
@@ -124,7 +114,7 @@ bool matrix_is_on(uint8_t row, uint8_t col) | |||
} | |||
inline | |||
uint16_t matrix_get_row(uint8_t row) | |||
matrix_row_t matrix_get_row(uint8_t row) | |||
{ | |||
return matrix[row]; | |||
} | |||
@@ -167,7 +157,7 @@ static void init_cols(void) | |||
PORTB |= (1<<6 | 1<< 5 | 1<<4 | 1<<3 | 1<<1 | 1<<0); | |||
} | |||
static uint16_t read_cols(void) | |||
static matrix_row_t read_cols(void) | |||
{ | |||
return (PINF&(1<<0) ? 0 : (1<<0)) | | |||
(PINF&(1<<1) ? 0 : (1<<1)) | |
@@ -27,18 +27,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#define DEVICE_VER 0x0100 | |||
#define PRODUCT Happy Buckling Keyboard | |||
#define DESCRIPTION mod version of IBM Model M keyboard | |||
/* matrix size */ | |||
#define MATRIX_ROWS 12 | |||
#define MATRIX_COLS 8 | |||
/* define if matrix has ghost */ | |||
#define MATRIX_HAS_GHOST | |||
/* Set 0 if need no debouncing */ | |||
#define DEBOUNCE 10 | |||
/* legacy keymap support */ | |||
#define USE_LEGACY_KEYMAP | |||
/* key combination for command */ | |||
#define IS_COMMAND() ( \ | |||
@@ -46,10 +48,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) \ | |||
) | |||
/* mouse keys */ | |||
#ifdef MOUSEKEY_ENABLE | |||
# define MOUSEKEY_DELAY_TIME 128 | |||
#endif | |||
/* Boot Section Size in *BYTEs* | |||
* Teensy halfKay 512 | |||
* Teensy++ halfKay 1024 | |||
* Atmel DFU loader 4096 | |||
* LUFA bootloader 4096 | |||
* USBaspLoader 2048 | |||
*/ | |||
#define BOOTLOADER_SIZE 4096 | |||
#endif |
@@ -32,32 +32,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* COL: PD0-7 | |||
* ROW: PB0-7, PF4-7 | |||
*/ | |||
#if (MATRIX_COLS > 16) | |||
# error "MATRIX_COLS must not exceed 16" | |||
#endif | |||
#if (MATRIX_ROWS > 255) | |||
# error "MATRIX_ROWS must not exceed 255" | |||
#endif | |||
#ifndef DEBOUNCE | |||
# define DEBOUNCE 0 | |||
# define DEBOUNCE 10 | |||
#endif | |||
static uint8_t debouncing = DEBOUNCE; | |||
// matrix state buffer(1:on, 0:off) | |||
#if (MATRIX_COLS <= 8) | |||
static uint8_t *matrix; | |||
static uint8_t *matrix_prev; | |||
static uint8_t _matrix0[MATRIX_ROWS]; | |||
static uint8_t _matrix1[MATRIX_ROWS]; | |||
#else | |||
static uint16_t *matrix; | |||
static uint16_t *matrix_prev; | |||
static uint16_t _matrix0[MATRIX_ROWS]; | |||
static uint16_t _matrix1[MATRIX_ROWS]; | |||
#endif | |||
static uint8_t *matrix_debouncing; | |||
static uint8_t matrix0[MATRIX_ROWS]; | |||
static uint8_t matrix1[MATRIX_ROWS]; | |||
#ifdef MATRIX_HAS_GHOST | |||
static bool matrix_has_ghost_in_row(uint8_t row); | |||
@@ -100,37 +84,35 @@ void matrix_init(void) | |||
PORTD = 0xFF; | |||
// initialize matrix state: all keys off | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||
matrix = _matrix0; | |||
matrix_prev = _matrix1; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix0[i] = 0x00; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix1[i] = 0x00; | |||
matrix = matrix0; | |||
matrix_debouncing = matrix1; | |||
} | |||
uint8_t matrix_scan(void) | |||
{ | |||
if (!debouncing) { | |||
uint8_t *tmp = matrix_prev; | |||
matrix_prev = matrix; | |||
matrix = tmp; | |||
} | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
unselect_rows(); | |||
select_row(i); | |||
_delay_us(30); // without this wait read unstable value. | |||
if (matrix[i] != (uint8_t)~read_col()) { | |||
matrix[i] = (uint8_t)~read_col(); | |||
if (matrix_debouncing[i] != read_col()) { | |||
matrix_debouncing[i] = read_col(); | |||
if (debouncing) { | |||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | |||
debug("bounce!: "); debug_hex(debouncing); debug("\n"); | |||
} | |||
_delay_ms(1); // TODO: work around. HAHAHAHAHAAHA | |||
debouncing = DEBOUNCE; | |||
} | |||
unselect_rows(); | |||
} | |||
unselect_rows(); | |||
if (debouncing) { | |||
debouncing--; | |||
if (--debouncing) { | |||
_delay_ms(1); | |||
} else { | |||
uint8_t *tmp = matrix; | |||
matrix = matrix_debouncing; | |||
matrix_debouncing = tmp; | |||
} | |||
} | |||
return 1; | |||
@@ -139,12 +121,7 @@ uint8_t matrix_scan(void) | |||
bool matrix_is_modified(void) | |||
{ | |||
if (debouncing) return false; | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
if (matrix[i] != matrix_prev[i]) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
return true; | |||
} | |||
inline | |||
@@ -202,7 +179,7 @@ static bool matrix_has_ghost_in_row(uint8_t row) | |||
inline | |||
static uint8_t read_col(void) | |||
{ | |||
return PIND; | |||
return ~PIND; | |||
} | |||
inline |
@@ -41,12 +41,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
/* Set 0 if need no debouncing */ | |||
#define DEBOUNCE 8 | |||
/* legacy keymap support */ | |||
#define USE_LEGACY_KEYMAP | |||
/* key combination for command */ | |||
#define IS_COMMAND() ( \ | |||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | |||
) | |||
/* Boot Section Size in *BYTEs* | |||
* Teensy halfKay 512 | |||
* Teensy++ halfKay 1024 | |||
* Atmel DFU loader 4096 | |||
* LUFA bootloader 4096 | |||
* USBaspLoader 2048 | |||
*/ | |||
#define BOOTLOADER_SIZE 4096 | |||
// TODO: configurable | |||
#define DEBUG_LED 0 | |||
#define DEBUG_LED_CONFIG |
@@ -173,7 +173,6 @@ uint8_t matrix_scan(void) | |||
if (debouncing) { | |||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | |||
} | |||
_delay_ms(1); // improved affect on bouncing | |||
debouncing = DEBOUNCE; | |||
} | |||
} | |||
@@ -181,6 +180,7 @@ uint8_t matrix_scan(void) | |||
} | |||
if (debouncing) { | |||
_delay_ms(1); | |||
debouncing--; | |||
} | |||
@@ -29,19 +29,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#define MANUFACTURER t.m.k. | |||
#define PRODUCT Macway mod | |||
/* message strings */ | |||
#define DESCRIPTION t.m.k. keyboard firmware for Macway mod | |||
/* matrix size */ | |||
#define MATRIX_ROWS 9 | |||
#define MATRIX_COLS 8 | |||
/* define if matrix has ghost */ | |||
#define MATRIX_HAS_GHOST | |||
/* Set 0 if need no debouncing */ | |||
#define DEBOUNCE 5 | |||
/* legacy keymap support */ | |||
#define USE_LEGACY_KEYMAP | |||
/* key combination for command */ | |||
#define IS_COMMAND() ( \ | |||
@@ -49,17 +51,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | |||
) | |||
/* layer switching */ | |||
#define LAYER_SWITCH_DELAY 100 | |||
#define LAYER_SEND_FN_TERM 300 | |||
/* mouse keys */ | |||
#ifdef MOUSEKEY_ENABLE | |||
# define MOUSEKEY_DELAY_TIME 192 | |||
#endif | |||
/* Boot Section Size in *BYTEs* | |||
* Teensy halfKay 512 | |||
* Teensy++ halfKay 1024 | |||
* Atmel DFU loader 4096 | |||
* LUFA bootloader 4096 | |||
* USBaspLoader 2048 | |||
*/ | |||
#define BOOTLOADER_SIZE 4096 | |||
/* PS/2 mouse */ | |||
#ifdef PS2_MOUSE_ENABLE |
@@ -37,27 +37,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#ifndef DEBOUNCE | |||
# define DEBOUNCE 0 | |||
# define DEBOUNCE 5 | |||
#endif | |||
static uint8_t debouncing = DEBOUNCE; | |||
// matrix state buffer(1:on, 0:off) | |||
#if (MATRIX_COLS <= 8) | |||
static uint8_t *matrix; | |||
static uint8_t *matrix_prev; | |||
static uint8_t _matrix0[MATRIX_ROWS]; | |||
static uint8_t _matrix1[MATRIX_ROWS]; | |||
#else | |||
static uint16_t *matrix; | |||
static uint16_t *matrix_prev; | |||
static uint16_t _matrix0[MATRIX_ROWS]; | |||
static uint16_t _matrix1[MATRIX_ROWS]; | |||
#endif | |||
static matrix_row_t *matrix; | |||
static matrix_row_t *matrix_debouncing; | |||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||
#ifdef MATRIX_HAS_GHOST | |||
static bool matrix_has_ghost_in_row(uint8_t row); | |||
#endif | |||
static uint8_t read_col(void); | |||
static matrix_row_t read_col(void); | |||
static void unselect_rows(void); | |||
static void select_row(uint8_t row); | |||
@@ -83,26 +76,22 @@ void matrix_init(void) | |||
PORTB = 0xFF; | |||
// initialize matrix state: all keys off | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||
matrix = _matrix0; | |||
matrix_prev = _matrix1; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||
matrix0[i] = 0; | |||
matrix1[i] = 0; | |||
} | |||
matrix = matrix0; | |||
matrix_debouncing = matrix1; | |||
} | |||
uint8_t matrix_scan(void) | |||
{ | |||
if (!debouncing) { | |||
uint8_t *tmp = matrix_prev; | |||
matrix_prev = matrix; | |||
matrix = tmp; | |||
} | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
unselect_rows(); | |||
select_row(i); | |||
_delay_us(30); // without this wait read unstable value. | |||
if (matrix[i] != (uint8_t)~read_col()) { | |||
matrix[i] = (uint8_t)~read_col(); | |||
if (matrix[i] != read_col()) { | |||
matrix[i] = read_col(); | |||
if (debouncing) { | |||
debug("bounce!: "); debug_hex(debouncing); print("\n"); | |||
} | |||
@@ -112,7 +101,14 @@ uint8_t matrix_scan(void) | |||
unselect_rows(); | |||
if (debouncing) { | |||
debouncing--; | |||
if (--debouncing) { | |||
_delay_ms(1); | |||
} else { | |||
matrix_row_t *tmp = matrix; | |||
matrix = matrix_debouncing; | |||
matrix_debouncing = tmp; | |||
} | |||
} | |||
return 1; | |||
@@ -121,24 +117,7 @@ uint8_t matrix_scan(void) | |||
bool matrix_is_modified(void) | |||
{ | |||
if (debouncing) return false; | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
if (matrix[i] != matrix_prev[i]) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
inline | |||
bool matrix_has_ghost(void) | |||
{ | |||
#ifdef MATRIX_HAS_GHOST | |||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | |||
if (matrix_has_ghost_in_row(i)) | |||
return true; | |||
} | |||
#endif | |||
return false; | |||
return true; | |||
} | |||
inline | |||
@@ -148,11 +127,7 @@ bool matrix_is_on(uint8_t row, uint8_t col) | |||
} | |||
inline | |||
#if (MATRIX_COLS <= 8) | |||
uint8_t matrix_get_row(uint8_t row) | |||
#else | |||
uint16_t matrix_get_row(uint8_t row) | |||
#endif | |||
matrix_row_t matrix_get_row(uint8_t row) | |||
{ | |||
return matrix[row]; | |||
} | |||
@@ -207,9 +182,9 @@ static bool matrix_has_ghost_in_row(uint8_t row) | |||
#endif | |||
inline | |||
static uint8_t read_col(void) | |||
static matrix_row_t read_col(void) | |||
{ | |||
return PINB; | |||
return ~PINB; | |||
} | |||
inline |
@@ -26,11 +26,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
#define MANUFACTURER t.m.k. | |||
#define PRODUCT Phantom | |||
/* message strings */ | |||
#define DESCRIPTION t.m.k. keyboard firmware for Phantom | |||
/* matrix size */ | |||
#define MATRIX_ROWS 6 | |||
#define MATRIX_COLS 17 | |||
@@ -41,12 +39,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
/* Set 0 if need no debouncing */ | |||
#define DEBOUNCE 7 | |||
/* legacy keymap support */ | |||
#define USE_LEGACY_KEYMAP | |||
/* key combination for command */ | |||
#define IS_COMMAND() ( \ | |||
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ | |||
) | |||
/* Boot Section Size in *BYTEs* | |||
* Teensy halfKay 512 | |||
* Teensy++ halfKay 1024 | |||
* Atmel DFU loader 4096 | |||
* LUFA bootloader 4096 | |||
* USBaspLoader 2048 | |||
*/ | |||
#define BOOTLOADER_SIZE 4096 | |||
// TODO: configurable | |||
#define DEBUG_LED 0 | |||
#define DEBUG_LED_CONFIG |
@@ -26,8 +26,8 @@ static uint8_t debouncing = DEBOUNCE; | |||
// bit array of key state(1:on, 0:off) | |||
static matrix_row_t *matrix; | |||
static matrix_row_t *matrix_debounced; | |||
static matrix_row_t _matrix0[MATRIX_ROWS]; | |||
static matrix_row_t _matrix1[MATRIX_ROWS]; | |||
static matrix_row_t matrix0[MATRIX_ROWS]; | |||
static matrix_row_t matrix1[MATRIX_ROWS]; | |||
#define _DDRA (uint8_t *const)&DDRA | |||
@@ -164,20 +164,16 @@ void matrix_init(void) | |||
setup_leds(); | |||
// initialize matrix state: all keys off | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; | |||
matrix = _matrix0; | |||
matrix_debounced = _matrix1; | |||
for (uint8_t i=0; i < MATRIX_ROWS; i++) { | |||
matrix0[i] = 0; | |||
matrix1[i] = 0; | |||
} | |||
matrix = matrix0; | |||
matrix_debounced = matrix1; | |||
} | |||
uint8_t matrix_scan(void) | |||
{ | |||
if (!debouncing) { | |||
matrix_row_t *tmp = matrix_debounced; | |||
matrix_debounced = matrix; | |||
matrix = tmp; | |||
} | |||
for (uint8_t col = 0; col < MATRIX_COLS; col++) { // 0-16 | |||
pull_column(col); // output hi on theline | |||
_delay_us(3); // without this wait it won't read stable value. | |||
@@ -196,7 +192,13 @@ uint8_t matrix_scan(void) | |||
} | |||
if (debouncing) { | |||
debouncing--; | |||
if (--debouncing) { | |||
_delay_ms(1); | |||
} else { | |||
matrix_row_t *tmp = matrix_debounced; | |||
matrix_debounced = matrix; | |||
matrix = tmp; | |||
} | |||
} | |||
return 1; | |||
@@ -208,12 +210,6 @@ bool matrix_is_modified(void) | |||
return true; | |||
} | |||
inline | |||
bool matrix_has_ghost(void) | |||
{ | |||
return false; | |||
} | |||
inline | |||
bool matrix_is_on(uint8_t row, uint8_t col) | |||
{ |