add encoder docs

This commit is contained in:
Jack Humbert 2018-06-03 22:58:59 -04:00
parent ff4a1ae5d2
commit 21665df8eb
4 changed files with 48 additions and 6 deletions

View File

@ -34,6 +34,7 @@
* [Bootmagic](feature_bootmagic.md) * [Bootmagic](feature_bootmagic.md)
* [Command](feature_command.md) * [Command](feature_command.md)
* [Dynamic Macros](feature_dynamic_macros.md) * [Dynamic Macros](feature_dynamic_macros.md)
* [Encoders](feature_encoders.md)
* [Grave Escape](feature_grave_esc.md) * [Grave Escape](feature_grave_esc.md)
* [Key Lock](feature_key_lock.md) * [Key Lock](feature_key_lock.md)
* [Layouts](feature_layouts.md) * [Layouts](feature_layouts.md)

41
docs/feature_encoders.md Normal file
View File

@ -0,0 +1,41 @@
# Encoders
Basic encoders are supported by adding this to your `rules.mk`:
ENCODER_ENABLE = yes
and this to your `config.h`:
#define NUMBER_OF_ENCODERS 1
#define ENCODERS_PAD_A { B12 }
#define ENCODERS_PAD_B { B13 }
Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.:
#define ENCODERS_PAD_A { encoder1a, encoder2a }
#define ENCODERS_PAD_B { encoder1a, encoder2b }
If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions.
Additionally, the resolution can be specified in the same file (the default & suggested is 4):
#define ENCODER_RESOLUTION 4
## Callbacks
The callback functions can be inserted into your `<keyboard>.c`:
void encoder_update_kb(uint8_t index, bool clockwise) {
encoder_update_user(index, clockwise);
}
or `keymap.c`:
void encoder_update_user(uint8_t index, bool clockwise) {
}
## Hardware
The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground.

View File

@ -259,7 +259,7 @@ uint16_t muse_counter = 0;
uint8_t muse_offset = 70; uint8_t muse_offset = 70;
uint16_t muse_tempo = 50; uint16_t muse_tempo = 50;
void encoder_update(bool clockwise) { void encoder_update_user(int8_t index, bool clockwise) {
if (muse_mode) { if (muse_mode) {
if (IS_LAYER_ON(_RAISE)) { if (IS_LAYER_ON(_RAISE)) {
if (clockwise) { if (clockwise) {

View File

@ -35,11 +35,11 @@ static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0};
static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0};
__attribute__ ((weak)) __attribute__ ((weak))
void encoder_update_user(bool clockwise) { } void encoder_update_user(int8_t index, bool clockwise) { }
__attribute__ ((weak)) __attribute__ ((weak))
void encoder_update_kb(bool clockwise) { void encoder_update_kb(int8_t index, bool clockwise) {
encoder_update_user(clockwise); encoder_update_user(index, clockwise);
} }
void encoder_init(void) { void encoder_init(void) {
@ -57,10 +57,10 @@ void encoder_read(void) {
encoder_state[i] |= (readPad(encoders_pad_a[i]) << 0) | (readPad(encoders_pad_b[i]) << 1); encoder_state[i] |= (readPad(encoders_pad_a[i]) << 0) | (readPad(encoders_pad_b[i]) << 1);
encoder_value[i] += encoder_LUT[encoder_state[i] & 0xF]; encoder_value[i] += encoder_LUT[encoder_state[i] & 0xF];
if (encoder_value[i] >= ENCODER_RESOLUTION) { if (encoder_value[i] >= ENCODER_RESOLUTION) {
encoder_update_kb(COUNTRECLOCKWISE); encoder_update_kb(i, COUNTRECLOCKWISE);
} }
if (encoder_value[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise if (encoder_value[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise
encoder_update_kb(CLOCKWISE); encoder_update_kb(i, CLOCKWISE);
} }
encoder_value[i] %= ENCODER_RESOLUTION; encoder_value[i] %= ENCODER_RESOLUTION;
} }