Created
February 10, 2019 18:30
-
-
Save crossdjinn/7f984995ad49b8325bbe628edff1f3a2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "TrinketHidCombo.h" | |
#define PIN_ENCODER_A 4 | |
#define PIN_ENCODER_B 5 | |
#define TRINKET_PINx PINB | |
static uint8_t enc_prev_pos = 0; | |
static uint8_t enc_flags = 0; | |
void setup() | |
{ | |
// set pins as input with internal pull-up resistors enabled | |
pinMode(PIN_ENCODER_A, INPUT); | |
pinMode(PIN_ENCODER_B, INPUT); | |
digitalWrite(PIN_ENCODER_A, HIGH); | |
digitalWrite(PIN_ENCODER_B, HIGH); | |
TrinketHidCombo.begin(); // start the USB device engine and enumerate | |
// get an initial reading on the encoder pins | |
if (digitalRead(PIN_ENCODER_A) == LOW) { | |
enc_prev_pos |= (1 << 0); | |
} | |
if (digitalRead(PIN_ENCODER_B) == LOW) { | |
enc_prev_pos |= (1 << 1); | |
} | |
} | |
void loop() | |
{ | |
int8_t enc_action = 0; // 1 or -1 if moved, sign is direction | |
// note: for better performance, the code will now use | |
// direct port access techniques | |
// http://www.arduino.cc/en/Reference/PortManipulation | |
uint8_t enc_cur_pos = 0; | |
// read in the encoder state first | |
if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_A)) { | |
enc_cur_pos |= (1 << 0); | |
} | |
if (bit_is_clear(TRINKET_PINx, PIN_ENCODER_B)) { | |
enc_cur_pos |= (1 << 1); | |
} | |
// if any rotation at all | |
if (enc_cur_pos != enc_prev_pos) | |
{ | |
if (enc_prev_pos == 0x00) | |
{ | |
// this is the first edge | |
if (enc_cur_pos == 0x01) { | |
enc_flags |= (1 << 0); | |
} | |
else if (enc_cur_pos == 0x02) { | |
enc_flags |= (1 << 1); | |
} | |
} | |
if (enc_cur_pos == 0x03) | |
{ | |
// this is when the encoder is in the middle of a "step" | |
enc_flags |= (1 << 4); | |
} | |
else if (enc_cur_pos == 0x00) | |
{ | |
// this is the final edge | |
if (enc_prev_pos == 0x02) { | |
enc_flags |= (1 << 2); | |
} | |
else if (enc_prev_pos == 0x01) { | |
enc_flags |= (1 << 3); | |
} | |
// check the first and last edge | |
// or maybe one edge is missing, if missing then require the middle state | |
// this will reject bounces and false movements | |
if (bit_is_set(enc_flags, 0) && (bit_is_set(enc_flags, 2) || bit_is_set(enc_flags, 4))) { | |
enc_action = 1; | |
} | |
else if (bit_is_set(enc_flags, 2) && (bit_is_set(enc_flags, 0) || bit_is_set(enc_flags, 4))) { | |
enc_action = 1; | |
} | |
else if (bit_is_set(enc_flags, 1) && (bit_is_set(enc_flags, 3) || bit_is_set(enc_flags, 4))) { | |
enc_action = -1; | |
} | |
else if (bit_is_set(enc_flags, 3) && (bit_is_set(enc_flags, 1) || bit_is_set(enc_flags, 4))) { | |
enc_action = -1; | |
} | |
enc_flags = 0; // reset for next time | |
} | |
} | |
enc_prev_pos = enc_cur_pos; | |
if (enc_action > 0) { | |
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP); | |
} | |
else if (enc_action < 0) { | |
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN); | |
} | |
else { | |
TrinketHidCombo.poll(); // do nothing, check if USB needs anything done | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment