diff options
Diffstat (limited to 'keyboard/planck/matrix_center.c')
| -rw-r--r-- | keyboard/planck/matrix_center.c | 71 | 
1 files changed, 69 insertions, 2 deletions
| diff --git a/keyboard/planck/matrix_center.c b/keyboard/planck/matrix_center.c index 8e34130d6f..2a603f334b 100644 --- a/keyboard/planck/matrix_center.c +++ b/keyboard/planck/matrix_center.c @@ -23,10 +23,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #include <avr/io.h>  #include <util/delay.h>  #include "action_layer.h" -#include "print.h" +// #include "print.h"  #include "debug.h"  #include "util.h"  #include "matrix.h" +#include "analog.h"  #ifndef DEBOUNCE @@ -40,9 +41,14 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];  static matrix_row_t read_cols(void);  static void init_cols(void); +static void init_encoder(void); +static void init_pot(void);  static void unselect_rows(void);  static void select_row(uint8_t row); - +int16_t analogRead(uint8_t pin); +uint8_t state; +int32_t position; +int16_t value;  inline  uint8_t matrix_rows(void) @@ -61,6 +67,8 @@ void matrix_init(void)      // initialize row and col      unselect_rows();      init_cols(); +    init_encoder(); +    init_pot();      // initialize matrix state: all keys off      for (uint8_t i=0; i < MATRIX_ROWS; i++) { @@ -69,6 +77,50 @@ void matrix_init(void)      }  } +static void init_encoder(void) +{ +    DDRC &= ~(1<<6 | 1<<7); +    PORTC |=  (1<<6 | 1<<7); + +    uint8_t s = 0; +    _delay_ms(1); +    if (PINC&(1<<6)) s |= 1; +    if (PINC&(1<<7)) s |= 2; +    state = s; +    position = 0; +} + +void read_encoder(void) +{ +    uint8_t s = state & 3; +    if (PINC&(1<<6)) s |= 4; +    if (PINC&(1<<7)) s |= 8; +    state = (s >> 2); +    switch (s) { +        case 1: case 7: case 8: case 14: +            position++;  +            break; +        case 2: case 4: case 11: case 13: +            position--;  +            break; +        case 3: case 12: +            position += 2;  +            break; +        case 6: case 9: +            position -= 2;  +            break; +    } +} + +#define HEX(n) (((n) < 10) ? ((n) + '0') : ((n) + 'A' - 10)) + +static void init_pot(void) +{ +    // DDRD &= ~(1<<4); +    // PORTD |=  (1<<4); +    // DIDR2 = (1<<0); +} +  uint8_t matrix_scan(void)  {      for (uint8_t i = 0; i < MATRIX_ROWS; i++) { @@ -95,6 +147,21 @@ uint8_t matrix_scan(void)          }      } +    read_encoder(); +    if (position >= 2) { +        register_code(KC_AUDIO_VOL_UP); +        unregister_code(KC_AUDIO_VOL_UP); +        position = 0; +    } else if (position <= -2) { +        register_code(KC_AUDIO_VOL_DOWN); +        unregister_code(KC_AUDIO_VOL_DOWN); +        position = 0; +    } + +    // uint16_t val = analogRead(11); + +    // debug("analogRead: "); debug_hex(val); debug("\n"); +      return 1;  } | 
