mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 05:12:33 +01:00 
			
		
		
		
	Eager pk/pr optimization (#5621)
* Optimizations to eager_pk * eager_pr also uses changed boolean now.
This commit is contained in:
		
							parent
							
								
									ffc82ebdb2
								
							
						
					
					
						commit
						d0fb7005d5
					
				| @ -24,10 +24,9 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
| #ifndef DEBOUNCE | #ifndef DEBOUNCE | ||||||
|   #define DEBOUNCE 5 | #  define DEBOUNCE 5 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #if (MATRIX_COLS <= 8) | #if (MATRIX_COLS <= 8) | ||||||
| #  define ROW_SHIFTER ((uint8_t)1) | #  define ROW_SHIFTER ((uint8_t)1) | ||||||
| #elif (MATRIX_COLS <= 16) | #elif (MATRIX_COLS <= 16) | ||||||
| @ -36,11 +35,10 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. | |||||||
| #  define ROW_SHIFTER ((uint32_t)1) | #  define ROW_SHIFTER ((uint32_t)1) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #define debounce_counter_t uint8_t | #define debounce_counter_t uint8_t | ||||||
| 
 | 
 | ||||||
| static debounce_counter_t *debounce_counters; | static debounce_counter_t *debounce_counters; | ||||||
|  | static bool                counters_need_update; | ||||||
| 
 | 
 | ||||||
| #define DEBOUNCE_ELAPSED 251 | #define DEBOUNCE_ELAPSED 251 | ||||||
| #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | ||||||
| @ -48,39 +46,39 @@ static debounce_counter_t *debounce_counters; | |||||||
| void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | ||||||
| void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | ||||||
| 
 | 
 | ||||||
| //we use num_rows rather than MATRIX_ROWS to support split keyboards
 | // we use num_rows rather than MATRIX_ROWS to support split keyboards
 | ||||||
| void debounce_init(uint8_t num_rows) | void debounce_init(uint8_t num_rows) { | ||||||
| { |   debounce_counters = (debounce_counter_t *)malloc(num_rows * MATRIX_COLS * sizeof(debounce_counter_t)); | ||||||
|   debounce_counters = (debounce_counter_t*)malloc(num_rows*MATRIX_COLS * sizeof(debounce_counter_t)); |  | ||||||
|   int i             = 0; |   int i             = 0; | ||||||
|   for (uint8_t r = 0; r < num_rows; r++) |   for (uint8_t r = 0; r < num_rows; r++) { | ||||||
|   { |     for (uint8_t c = 0; c < MATRIX_COLS; c++) { | ||||||
|     for (uint8_t c = 0; c < MATRIX_COLS; c++) |  | ||||||
|     { |  | ||||||
|       debounce_counters[i++] = DEBOUNCE_ELAPSED; |       debounce_counters[i++] = DEBOUNCE_ELAPSED; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | ||||||
| { |  | ||||||
|   uint8_t current_time = timer_read() % MAX_DEBOUNCE; |   uint8_t current_time = timer_read() % MAX_DEBOUNCE; | ||||||
|  |   if (counters_need_update) { | ||||||
|     update_debounce_counters(num_rows, current_time); |     update_debounce_counters(num_rows, current_time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (changed) { | ||||||
|     transfer_matrix_values(raw, cooked, num_rows, current_time); |     transfer_matrix_values(raw, cooked, num_rows, current_time); | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //If the current time is > debounce counter, set the counter to enable input.
 | // If the current time is > debounce counter, set the counter to enable input.
 | ||||||
| void update_debounce_counters(uint8_t num_rows, uint8_t current_time) | void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | ||||||
| { |   counters_need_update                 = false; | ||||||
|   debounce_counter_t *debounce_pointer = debounce_counters; |   debounce_counter_t *debounce_pointer = debounce_counters; | ||||||
|   for (uint8_t row = 0; row < num_rows; row++) |   for (uint8_t row = 0; row < num_rows; row++) { | ||||||
|   { |     for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||||||
|     for (uint8_t col = 0; col < MATRIX_COLS; col++) |       if (*debounce_pointer != DEBOUNCE_ELAPSED) { | ||||||
|     { |  | ||||||
|       if (*debounce_pointer != DEBOUNCE_ELAPSED) |  | ||||||
|       { |  | ||||||
|         if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { |         if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { | ||||||
|           *debounce_pointer = DEBOUNCE_ELAPSED; |           *debounce_pointer = DEBOUNCE_ELAPSED; | ||||||
|  |         } else { | ||||||
|  |           counters_need_update = true; | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       debounce_pointer++; |       debounce_pointer++; | ||||||
| @ -89,24 +87,17 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // upload from raw_matrix to final matrix;
 | // upload from raw_matrix to final matrix;
 | ||||||
| void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | ||||||
| { |  | ||||||
|   debounce_counter_t *debounce_pointer = debounce_counters; |   debounce_counter_t *debounce_pointer = debounce_counters; | ||||||
|   for (uint8_t row = 0; row < num_rows; row++) |   for (uint8_t row = 0; row < num_rows; row++) { | ||||||
|   { |     matrix_row_t delta        = raw[row] ^ cooked[row]; | ||||||
|     matrix_row_t existing_row = cooked[row]; |     matrix_row_t existing_row = cooked[row]; | ||||||
|     matrix_row_t raw_row = raw[row]; |     for (uint8_t col = 0; col < MATRIX_COLS; col++) { | ||||||
| 
 |  | ||||||
|     for (uint8_t col = 0; col < MATRIX_COLS; col++) |  | ||||||
|     { |  | ||||||
|       matrix_row_t col_mask = (ROW_SHIFTER << col); |       matrix_row_t col_mask = (ROW_SHIFTER << col); | ||||||
|       bool final_value = raw_row & col_mask; |       if ((delta & col_mask) && *debounce_pointer == DEBOUNCE_ELAPSED) { | ||||||
|       bool existing_value = existing_row & col_mask; |  | ||||||
|       if (*debounce_pointer == DEBOUNCE_ELAPSED && |  | ||||||
|           (existing_value != final_value)) |  | ||||||
|       { |  | ||||||
|         *debounce_pointer    = current_time; |         *debounce_pointer    = current_time; | ||||||
|         existing_row ^= col_mask; //flip the bit.
 |         counters_need_update = true; | ||||||
|  |         existing_row ^= col_mask;  // flip the bit.
 | ||||||
|       } |       } | ||||||
|       debounce_pointer++; |       debounce_pointer++; | ||||||
|     } |     } | ||||||
| @ -114,8 +105,4 @@ void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t n | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool debounce_active(void) | bool debounce_active(void) { return true; } | ||||||
| { |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
|  | |||||||
| @ -24,13 +24,13 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred. | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
| #ifndef DEBOUNCE | #ifndef DEBOUNCE | ||||||
|   #define DEBOUNCE 5 | #  define DEBOUNCE 5 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| #define debounce_counter_t uint8_t | #define debounce_counter_t uint8_t | ||||||
| 
 | 
 | ||||||
| static debounce_counter_t *debounce_counters; | static debounce_counter_t *debounce_counters; | ||||||
|  | static bool                counters_need_update; | ||||||
| 
 | 
 | ||||||
| #define DEBOUNCE_ELAPSED 251 | #define DEBOUNCE_ELAPSED 251 | ||||||
| #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | #define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1) | ||||||
| @ -38,33 +38,35 @@ static debounce_counter_t *debounce_counters; | |||||||
| void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | void update_debounce_counters(uint8_t num_rows, uint8_t current_time); | ||||||
| void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time); | ||||||
| 
 | 
 | ||||||
| //we use num_rows rather than MATRIX_ROWS to support split keyboards
 | // we use num_rows rather than MATRIX_ROWS to support split keyboards
 | ||||||
| void debounce_init(uint8_t num_rows) | void debounce_init(uint8_t num_rows) { | ||||||
| { |   debounce_counters = (debounce_counter_t *)malloc(num_rows * sizeof(debounce_counter_t)); | ||||||
|   debounce_counters = (debounce_counter_t*)malloc(num_rows*sizeof(debounce_counter_t));   |   for (uint8_t r = 0; r < num_rows; r++) { | ||||||
|   for (uint8_t r = 0; r < num_rows; r++) |  | ||||||
|   {     |  | ||||||
|     debounce_counters[r] = DEBOUNCE_ELAPSED; |     debounce_counters[r] = DEBOUNCE_ELAPSED; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) | void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) { | ||||||
| { |  | ||||||
|   uint8_t current_time = timer_read() % MAX_DEBOUNCE; |   uint8_t current_time = timer_read() % MAX_DEBOUNCE; | ||||||
|  |   if (counters_need_update) { | ||||||
|     update_debounce_counters(num_rows, current_time); |     update_debounce_counters(num_rows, current_time); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (changed) { | ||||||
|     transfer_matrix_values(raw, cooked, num_rows, current_time); |     transfer_matrix_values(raw, cooked, num_rows, current_time); | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //If the current time is > debounce counter, set the counter to enable input.
 | // If the current time is > debounce counter, set the counter to enable input.
 | ||||||
| void update_debounce_counters(uint8_t num_rows, uint8_t current_time) | void update_debounce_counters(uint8_t num_rows, uint8_t current_time) { | ||||||
| { |   counters_need_update                 = false; | ||||||
|   debounce_counter_t *debounce_pointer = debounce_counters; |   debounce_counter_t *debounce_pointer = debounce_counters; | ||||||
|   for (uint8_t row = 0; row < num_rows; row++) |   for (uint8_t row = 0; row < num_rows; row++) { | ||||||
|   {     |     if (*debounce_pointer != DEBOUNCE_ELAPSED) { | ||||||
|     if (*debounce_pointer != DEBOUNCE_ELAPSED) |  | ||||||
|     { |  | ||||||
|       if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { |       if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) { | ||||||
|         *debounce_pointer = DEBOUNCE_ELAPSED; |         *debounce_pointer = DEBOUNCE_ELAPSED; | ||||||
|  |       } else { | ||||||
|  |         counters_need_update = true; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     debounce_pointer++; |     debounce_pointer++; | ||||||
| @ -72,29 +74,21 @@ void update_debounce_counters(uint8_t num_rows, uint8_t current_time) | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // upload from raw_matrix to final matrix;
 | // upload from raw_matrix to final matrix;
 | ||||||
| void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) | void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) { | ||||||
| { |  | ||||||
|   debounce_counter_t *debounce_pointer = debounce_counters; |   debounce_counter_t *debounce_pointer = debounce_counters; | ||||||
|   for (uint8_t row = 0; row < num_rows; row++) |   for (uint8_t row = 0; row < num_rows; row++) { | ||||||
|   { |  | ||||||
|     matrix_row_t existing_row = cooked[row]; |     matrix_row_t existing_row = cooked[row]; | ||||||
|     matrix_row_t raw_row      = raw[row]; |     matrix_row_t raw_row      = raw[row]; | ||||||
| 
 | 
 | ||||||
|     //determine new value basd on debounce pointer + raw value
 |     // determine new value basd on debounce pointer + raw value
 | ||||||
|     if (*debounce_pointer == DEBOUNCE_ELAPSED && |     if (*debounce_pointer == DEBOUNCE_ELAPSED && (existing_row != raw_row)) { | ||||||
|       (existing_row != raw_row)) |  | ||||||
|     { |  | ||||||
|       *debounce_pointer    = current_time; |       *debounce_pointer    = current_time; | ||||||
|       existing_row = raw_row;  |       cooked[row]          = raw_row; | ||||||
|  |       counters_need_update = true; | ||||||
|     } |     } | ||||||
|     cooked[row] = existing_row; |  | ||||||
| 
 | 
 | ||||||
|     debounce_pointer++; |     debounce_pointer++; | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool debounce_active(void) | bool debounce_active(void) { return true; } | ||||||
| { |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alex Ong
						Alex Ong