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