Fix debouncing bug in hid_liber(Issue #26)
This commit is contained in:
		
							parent
							
								
									5a0415749d
								
							
						
					
					
						commit
						681e019450
					
				
					 1 changed files with 18 additions and 21 deletions
				
			
		|  | @ -24,10 +24,8 @@ | ||||||
| static uint8_t debouncing = DEBOUNCE; | 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[MATRIX_ROWS]; | ||||||
| static matrix_row_t *matrix_debounced; | static matrix_row_t matrix_debouncing[MATRIX_ROWS]; | ||||||
| static matrix_row_t _matrix0[MATRIX_ROWS]; |  | ||||||
| static matrix_row_t _matrix1[MATRIX_ROWS]; |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| #define _DDRA (uint8_t *const)&DDRA | #define _DDRA (uint8_t *const)&DDRA | ||||||
|  | @ -148,30 +146,24 @@ 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; |         matrix[i] = 0; | ||||||
|     matrix = _matrix0; |         matrix_debouncing[i] = 0; | ||||||
|     matrix_debounced = _matrix1; |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||||
| { | { | ||||||
|     if (!debouncing) { |  | ||||||
|         uint8_t *tmp = matrix_debounced; |  | ||||||
|         matrix_debounced = matrix; |  | ||||||
|         matrix = tmp; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     for (uint8_t col = 0; col < MATRIX_COLS; col++) {  // 0-7
 |     for (uint8_t col = 0; col < MATRIX_COLS; col++) {  // 0-7
 | ||||||
|         pull_column(col);   // output hi on theline
 |         pull_column(col);   // output hi on theline
 | ||||||
|         _delay_us(5);       // without this wait it won't read stable value.
 |         _delay_us(5);       // without this wait it won't read stable value.
 | ||||||
|         for (uint8_t row = 0; row < MATRIX_ROWS; row++) {  // 0-17
 |         for (uint8_t row = 0; row < MATRIX_ROWS; row++) {  // 0-17
 | ||||||
|             bool prev_bit = matrix[row] & (1<<col); |             bool prev_bit = matrix_debouncing[row] & (1<<col); | ||||||
|             bool curr_bit = *row_pin[row] & row_bit[row]; |             bool curr_bit = *row_pin[row] & row_bit[row]; | ||||||
|             if (prev_bit != curr_bit) { |             if (prev_bit != curr_bit) { | ||||||
|                 matrix[row] ^= (1<<col); |                 matrix_debouncing[row] ^= ((matrix_row_t)1<<col); | ||||||
|                 if (debouncing) { |                 if (debouncing) { | ||||||
|                     debug("bounce!: "); debug_hex(debouncing); print("\n"); |                     dprintf("bounce!: %02X\n", debouncing); | ||||||
|                 } |                 } | ||||||
|                 debouncing = DEBOUNCE; |                 debouncing = DEBOUNCE; | ||||||
|             } |             } | ||||||
|  | @ -180,8 +172,13 @@ uint8_t matrix_scan(void) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (debouncing) { |     if (debouncing) { | ||||||
|         _delay_ms(1); |         if (--debouncing) { | ||||||
|         debouncing--; |             _delay_ms(1); | ||||||
|  |         } else { | ||||||
|  |             for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||||
|  |                 matrix[i] = matrix_debouncing[i]; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return 1; |     return 1; | ||||||
|  | @ -202,13 +199,13 @@ bool matrix_has_ghost(void) | ||||||
| inline | inline | ||||||
| bool matrix_is_on(uint8_t row, uint8_t col) | bool matrix_is_on(uint8_t row, uint8_t col) | ||||||
| { | { | ||||||
|     return (matrix_debounced[row] & (1<<col)); |     return (matrix[row] & ((matrix_row_t)1<<col)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| inline | inline | ||||||
| matrix_row_t matrix_get_row(uint8_t row) | matrix_row_t matrix_get_row(uint8_t row) | ||||||
| { | { | ||||||
|     return matrix_debounced[row]; |     return matrix[row]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void matrix_print(void) | void matrix_print(void) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tmk
						tmk