Add support for encoder mapping. (#13286)
This commit is contained in:
		
							parent
							
								
									7121a228eb
								
							
						
					
					
						commit
						8d5eacb7dd
					
				
					 16 changed files with 279 additions and 53 deletions
				
			
		| 
						 | 
				
			
			@ -14,9 +14,11 @@ GNU General Public License for more details.
 | 
			
		|||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
*/
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
#include "host.h"
 | 
			
		||||
#include "keycode.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
#include "keymap.h"
 | 
			
		||||
#include "mousekey.h"
 | 
			
		||||
#include "programmable_button.h"
 | 
			
		||||
#include "command.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +91,7 @@ void action_exec(keyevent_t event) {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef SWAP_HANDS_ENABLE
 | 
			
		||||
    // Swap hands handles both keys and encoders, if ENCODER_MAP_ENABLE is defined.
 | 
			
		||||
    if (!IS_NOEVENT(event)) {
 | 
			
		||||
        process_hand_swap(&event);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -136,27 +139,65 @@ void action_exec(keyevent_t event) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#ifdef SWAP_HANDS_ENABLE
 | 
			
		||||
extern const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS];
 | 
			
		||||
#    ifdef ENCODER_MAP_ENABLE
 | 
			
		||||
extern const uint8_t PROGMEM encoder_hand_swap_config[NUM_ENCODERS];
 | 
			
		||||
#    endif // ENCODER_MAP_ENABLE
 | 
			
		||||
 | 
			
		||||
bool swap_hands = false;
 | 
			
		||||
bool swap_held  = false;
 | 
			
		||||
 | 
			
		||||
bool should_swap_hands(size_t index, uint8_t *swap_state, bool pressed) {
 | 
			
		||||
    size_t  array_index = index / (CHAR_BIT);
 | 
			
		||||
    size_t  bit_index   = index % (CHAR_BIT);
 | 
			
		||||
    uint8_t bit_val     = 1 << bit_index;
 | 
			
		||||
    bool    do_swap     = pressed ? swap_hands : swap_state[array_index] & bit_val;
 | 
			
		||||
    return do_swap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_swap_hands_state(size_t index, uint8_t *swap_state, bool on) {
 | 
			
		||||
    size_t  array_index = index / (CHAR_BIT);
 | 
			
		||||
    size_t  bit_index   = index % (CHAR_BIT);
 | 
			
		||||
    uint8_t bit_val     = 1 << bit_index;
 | 
			
		||||
    if (on) {
 | 
			
		||||
        swap_state[array_index] |= bit_val;
 | 
			
		||||
    } else {
 | 
			
		||||
        swap_state[array_index] &= ~bit_val;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** \brief Process Hand Swap
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: Needs documentation.
 | 
			
		||||
 */
 | 
			
		||||
void process_hand_swap(keyevent_t *event) {
 | 
			
		||||
    static swap_state_row_t swap_state[MATRIX_ROWS];
 | 
			
		||||
 | 
			
		||||
    keypos_t         pos     = event->key;
 | 
			
		||||
    swap_state_row_t col_bit = (swap_state_row_t)1 << pos.col;
 | 
			
		||||
    bool             do_swap = event->pressed ? swap_hands : swap_state[pos.row] & (col_bit);
 | 
			
		||||
 | 
			
		||||
    if (do_swap) {
 | 
			
		||||
        event->key.row = pgm_read_byte(&hand_swap_config[pos.row][pos.col].row);
 | 
			
		||||
        event->key.col = pgm_read_byte(&hand_swap_config[pos.row][pos.col].col);
 | 
			
		||||
        swap_state[pos.row] |= col_bit;
 | 
			
		||||
    } else {
 | 
			
		||||
        swap_state[pos.row] &= ~(col_bit);
 | 
			
		||||
    keypos_t pos = event->key;
 | 
			
		||||
    if (pos.row < MATRIX_ROWS && pos.col < MATRIX_COLS) {
 | 
			
		||||
        static uint8_t matrix_swap_state[((MATRIX_ROWS * MATRIX_COLS) + (CHAR_BIT)-1) / (CHAR_BIT)];
 | 
			
		||||
        size_t         index   = (size_t)(pos.row * MATRIX_COLS) + pos.col;
 | 
			
		||||
        bool           do_swap = should_swap_hands(index, matrix_swap_state, event->pressed);
 | 
			
		||||
        if (do_swap) {
 | 
			
		||||
            event->key.row = pgm_read_byte(&hand_swap_config[pos.row][pos.col].row);
 | 
			
		||||
            event->key.col = pgm_read_byte(&hand_swap_config[pos.row][pos.col].col);
 | 
			
		||||
            set_swap_hands_state(index, matrix_swap_state, true);
 | 
			
		||||
        } else {
 | 
			
		||||
            set_swap_hands_state(index, matrix_swap_state, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#    ifdef ENCODER_MAP_ENABLE
 | 
			
		||||
    else if (pos.row == KEYLOC_ENCODER_CW || pos.row == KEYLOC_ENCODER_CCW) {
 | 
			
		||||
        static uint8_t encoder_swap_state[((NUM_ENCODERS) + (CHAR_BIT)-1) / (CHAR_BIT)];
 | 
			
		||||
        size_t         index   = pos.col;
 | 
			
		||||
        bool           do_swap = should_swap_hands(index, encoder_swap_state, event->pressed);
 | 
			
		||||
        if (do_swap) {
 | 
			
		||||
            event->key.row = pos.row;
 | 
			
		||||
            event->key.col = pgm_read_byte(&encoder_hand_swap_config[pos.col]);
 | 
			
		||||
            set_swap_hands_state(index, encoder_swap_state, true);
 | 
			
		||||
        } else {
 | 
			
		||||
            set_swap_hands_state(index, encoder_swap_state, false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#    endif // ENCODER_MAP_ENABLE
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue