Keep track of encoder activity (#11595)
* Keep track of encoder activity, provide API for either matrix/encoder. * Fixup build when no RGBLIGHT or Backlight enabled.
This commit is contained in:
		
							parent
							
								
									bdb757e189
								
							
						
					
					
						commit
						1108210f1b
					
				| @ -94,7 +94,8 @@ void encoder_init(void) { | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| static void encoder_update(int8_t index, uint8_t state) { | ||||
| static bool encoder_update(int8_t index, uint8_t state) { | ||||
|     bool    changed = false; | ||||
|     uint8_t i       = index; | ||||
| 
 | ||||
| #ifdef ENCODER_RESOLUTIONS | ||||
| @ -109,40 +110,53 @@ static void encoder_update(int8_t index, uint8_t state) { | ||||
|     encoder_pulses[i] += encoder_LUT[state & 0xF]; | ||||
|     if (encoder_pulses[i] >= resolution) { | ||||
|         encoder_value[index]++; | ||||
|         changed = true; | ||||
|         encoder_update_kb(index, ENCODER_COUNTER_CLOCKWISE); | ||||
|     } | ||||
|     if (encoder_pulses[i] <= -resolution) {  // direction is arbitrary here, but this clockwise
 | ||||
|         encoder_value[index]--; | ||||
|         changed = true; | ||||
|         encoder_update_kb(index, ENCODER_CLOCKWISE); | ||||
|     } | ||||
|     encoder_pulses[i] %= resolution; | ||||
|     return changed; | ||||
| } | ||||
| 
 | ||||
| void encoder_read(void) { | ||||
| bool encoder_read(void) { | ||||
|     bool changed = false; | ||||
|     for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) { | ||||
|         encoder_state[i] <<= 2; | ||||
|         encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); | ||||
|         encoder_update(i, encoder_state[i]); | ||||
|         changed |= encoder_update(i, encoder_state[i]); | ||||
|     } | ||||
|     return changed; | ||||
| } | ||||
| 
 | ||||
| #ifdef SPLIT_KEYBOARD | ||||
| void last_encoder_activity_trigger(void); | ||||
| 
 | ||||
| void encoder_state_raw(uint8_t* slave_state) { memcpy(slave_state, &encoder_value[thisHand], sizeof(uint8_t) * NUMBER_OF_ENCODERS); } | ||||
| 
 | ||||
| void encoder_update_raw(uint8_t* slave_state) { | ||||
|     bool changed = false; | ||||
|     for (uint8_t i = 0; i < NUMBER_OF_ENCODERS; i++) { | ||||
|         uint8_t index = i + thatHand; | ||||
|         int8_t  delta = slave_state[i] - encoder_value[index]; | ||||
|         while (delta > 0) { | ||||
|             delta--; | ||||
|             encoder_value[index]++; | ||||
|             changed = true; | ||||
|             encoder_update_kb(index, ENCODER_COUNTER_CLOCKWISE); | ||||
|         } | ||||
|         while (delta < 0) { | ||||
|             delta++; | ||||
|             encoder_value[index]--; | ||||
|             changed = true; | ||||
|             encoder_update_kb(index, ENCODER_CLOCKWISE); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // Update the last encoder input time -- handled external to encoder_read() when we're running a split
 | ||||
|     if (changed) last_encoder_activity_trigger(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -20,7 +20,7 @@ | ||||
| #include "quantum.h" | ||||
| 
 | ||||
| void encoder_init(void); | ||||
| void encoder_read(void); | ||||
| bool encoder_read(void); | ||||
| 
 | ||||
| void encoder_update_kb(int8_t index, bool clockwise); | ||||
| void encoder_update_user(int8_t index, bool clockwise); | ||||
|  | ||||
| @ -97,9 +97,19 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| #    include "dip_switch.h" | ||||
| #endif | ||||
| 
 | ||||
| static uint32_t last_input_modification_time = 0; | ||||
| uint32_t        last_input_activity_time(void) { return last_input_modification_time; } | ||||
| uint32_t        last_input_activity_elapsed(void) { return timer_elapsed32(last_input_modification_time); } | ||||
| 
 | ||||
| static uint32_t last_matrix_modification_time = 0; | ||||
| uint32_t        last_matrix_activity_time(void) { return last_matrix_modification_time; } | ||||
| uint32_t        last_matrix_activity_elapsed(void) { return timer_elapsed32(last_matrix_modification_time); } | ||||
| void            last_matrix_activity_trigger(void) { last_matrix_modification_time = last_input_modification_time = timer_read32(); } | ||||
| 
 | ||||
| static uint32_t last_encoder_modification_time = 0; | ||||
| uint32_t        last_encoder_activity_time(void) { return last_encoder_modification_time; } | ||||
| uint32_t        last_encoder_activity_elapsed(void) { return timer_elapsed32(last_encoder_modification_time); } | ||||
| void            last_encoder_activity_trigger(void) { last_encoder_modification_time = last_input_modification_time = timer_read32(); } | ||||
| 
 | ||||
| // Only enable this if console is enabled to print to
 | ||||
| #if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE) | ||||
| @ -338,12 +348,15 @@ void keyboard_task(void) { | ||||
| #ifdef QMK_KEYS_PER_SCAN | ||||
|     uint8_t keys_processed = 0; | ||||
| #endif | ||||
| #ifdef ENCODER_ENABLE | ||||
|     bool encoders_changed = false; | ||||
| #endif | ||||
| 
 | ||||
|     housekeeping_task_kb(); | ||||
|     housekeeping_task_user(); | ||||
| 
 | ||||
|     uint8_t matrix_changed = matrix_scan(); | ||||
|     if (matrix_changed) last_matrix_modification_time = timer_read32(); | ||||
|     if (matrix_changed) last_matrix_activity_trigger(); | ||||
| 
 | ||||
|     if (should_process_keypress()) { | ||||
|         for (uint8_t r = 0; r < MATRIX_ROWS; r++) { | ||||
| @ -399,7 +412,8 @@ MATRIX_LOOP_END: | ||||
| #endif | ||||
| 
 | ||||
| #ifdef ENCODER_ENABLE | ||||
|     encoder_read(); | ||||
|     encoders_changed = encoder_read(); | ||||
|     if (encoders_changed) last_encoder_activity_trigger(); | ||||
| #endif | ||||
| 
 | ||||
| #ifdef QWIIC_ENABLE | ||||
| @ -409,10 +423,14 @@ MATRIX_LOOP_END: | ||||
| #ifdef OLED_DRIVER_ENABLE | ||||
|     oled_task(); | ||||
| #    ifndef OLED_DISABLE_TIMEOUT | ||||
|     // Wake up oled if user is using those fabulous keys!
 | ||||
|     // Wake up oled if user is using those fabulous keys or spinning those encoders!
 | ||||
| #        ifdef ENCODER_ENABLE | ||||
|     if (matrix_changed || encoders_changed) oled_on(); | ||||
| #        else | ||||
|     if (matrix_changed) oled_on(); | ||||
| #        endif | ||||
| #    endif | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MOUSEKEY_ENABLE | ||||
|     // mousekey repeat & acceleration
 | ||||
|  | ||||
| @ -73,9 +73,15 @@ void keyboard_post_init_user(void); | ||||
| void housekeeping_task_kb(void); | ||||
| void housekeeping_task_user(void); | ||||
| 
 | ||||
| uint32_t last_input_activity_time(void);     // Timestamp of the last matrix or encoder activity
 | ||||
| uint32_t last_input_activity_elapsed(void);  // Number of milliseconds since the last matrix or encoder activity
 | ||||
| 
 | ||||
| uint32_t last_matrix_activity_time(void);     // Timestamp of the last matrix activity
 | ||||
| uint32_t last_matrix_activity_elapsed(void);  // Number of milliseconds since the last matrix activity
 | ||||
| 
 | ||||
| uint32_t last_encoder_activity_time(void);     // Timestamp of the last encoder activity
 | ||||
| uint32_t last_encoder_activity_elapsed(void);  // Number of milliseconds since the last encoder activity
 | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user