|  |  |  | @ -22,12 +22,36 @@ struct key_state { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static struct key_state key_state_array[KEY_STATE_MAX_LENGTH]; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static uint32_t modifiers_state; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void input_init(void) { | 
			
		
	
		
			
				
					|  |  |  |  | 	int i; | 
			
		
	
		
			
				
					|  |  |  |  | 	for (i = 0; i < KEY_STATE_MAX_LENGTH; ++i) { | 
			
		
	
		
			
				
					|  |  |  |  | 		struct key_state none = { 0, 0, 0 }; | 
			
		
	
		
			
				
					|  |  |  |  | 		key_state_array[i] = none; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	modifiers_state = 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | uint32_t modifier_state_changed(uint32_t new_state, uint32_t mod) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if ((new_state & mod) != 0) { // pressed
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if ((modifiers_state & mod) != 0) { // already pressed
 | 
			
		
	
		
			
				
					|  |  |  |  | 			return MOD_STATE_UNCHANGED; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { // pressed
 | 
			
		
	
		
			
				
					|  |  |  |  | 			return MOD_STATE_PRESSED; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} else { // not pressed
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if ((modifiers_state & mod) != 0) { // released
 | 
			
		
	
		
			
				
					|  |  |  |  | 			return MOD_STATE_RELEASED; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { // already released
 | 
			
		
	
		
			
				
					|  |  |  |  | 			return MOD_STATE_UNCHANGED; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void modifiers_state_update(uint32_t new_state) { | 
			
		
	
		
			
				
					|  |  |  |  | 	modifiers_state = new_state; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static uint8_t find_key(uint32_t key_sym, uint32_t key_code, bool update) { | 
			
		
	
	
		
			
				
					|  |  |  | 
 |