diff --git a/implementation/Model01.cpp b/implementation/Model01.cpp index 612501f9..16df6ecf 100644 --- a/implementation/Model01.cpp +++ b/implementation/Model01.cpp @@ -2,149 +2,35 @@ #include "WS2812.h" #include "Model01.h" - -sx1509Class Model01_::leftsx1509(LEFT_SX1509_ADDRESS); -sx1509Class Model01_::rightsx1509(RIGHT_SX1509_ADDRESS); - - -WS2812 Model01_::LED(LED_COUNT); - Model01_::Model01_(void) { } -void Model01_::leds_setup() { - LED.setOutput(LED_DATA_PIN); - LED.setColorOrderGRB(); // Uncomment for RGB color order +void Model01_::setup(void) { } + void Model01_::led_set_crgb_at(byte row, byte col, cRGB color) { - LED.set_crgb_at(key_led_map[row][col], color); } cRGB Model01_::get_key_color(byte row, byte col) { - return LED.get_crgb_at(key_led_map[row][col]); } void Model01_::led_set_crgb_at(uint8_t i, cRGB crgb) { - LED.set_crgb_at(i, crgb); } void Model01_::led_sync() { - LED.sync(); } -void Model01_::scan_row(byte row) { - if (left_initted) { - leftsx1509.updatePinState(left_rowpins[row], LOW); - leftsx1509.sendPinStates(); - leftsx1509.fetchPinStates(); - } - if (right_initted) { - rightsx1509.updatePinState(right_rowpins[row], LOW); - rightsx1509.sendPinStates(); - rightsx1509.fetchPinStates(); - - } -} -void Model01_::finish_scanning_row(byte row) { - if (left_initted) - leftsx1509.updatePinState(left_rowpins[row], HIGH); - if (right_initted) - rightsx1509.updatePinState(right_rowpins[row], HIGH); -} - -void Model01_::scan_left_col(byte row, byte col,uint8_t *state) { - - //If we see an electrical connection on I->J, - - - *state <<= 1; - - if (left_initted && leftsx1509.readPrefetchedPin(left_colpins[col])) { - *state |= 0; - } else { - *state |= 1; - } -} - -void Model01_::scan_right_col(byte row, byte col, uint8_t *state) { - - //If we see an electrical connection on I->J, - - *state <<= 1; - - - if (right_initted && rightsx1509.readPrefetchedPin(right_colpins[col])) { - *state |= 0; - } else { - *state |= 1; - } - -} +void Model01_::scan_matrix() { + //scan the Keyboard matrix looking for connections + for (byte row = 0; row < LEFT_ROWS; row++) { - - -boolean Model01_::right_hand_connected(void) { - if (right_initted) { - return true; - } else { - return false; - } -} - -void Model01_::pins_setup() { - right_initted = setup_sx1509(rightsx1509, right_colpins, right_rowpins); - left_initted = setup_sx1509(leftsx1509, left_colpins, left_rowpins); - rightsx1509.fetchPinStates(); -} - - -void Model01_::make_input(sx1509Class sx1509, uint8_t pin) { - sx1509.pinDir(pin, INPUT); // Set SX1509 pin 1 as an input - sx1509.writePin(pin, HIGH); // Activate pull-up -} - -void Model01_::make_output(sx1509Class sx1509, uint8_t pin) { - sx1509.pinDir(pin, OUTPUT); - sx1509.writePin(pin, HIGH); -} - -int Model01_::setup_sx1509 (sx1509Class sx1509, uint8_t colpins[], uint8_t rowpins[]) { - byte initted; - - for (int counter = 0; counter < 10; counter++) { - initted = sx1509.init(); - - if (initted) - break; - } - - if (initted) { // init ok - // In order to use the keypad, the clock must first be - // configured. We can call configureClock() with the default - // parameters (2MHz internal oscillator, no clock in/out). - sx1509.configClock(); - - - // the debounceConfig function sets the debounce time. This - // function's parameter should be a 3-bit value. - // 3: 4ms * 2MHz/fOSC - sx1509.debounceConfig(4); - - for (int i = 0; i < LEFT_ROWS; i++) { - make_output(sx1509, rowpins[i]); - } - - for (int j = 0; j < LEFT_COLS; j++) { - make_input(sx1509, colpins[j]); - sx1509.debounceEnable(colpins[j]); + for (byte col = 0; col < LEFT_COLS; col++) { + handle_key_event(row, col); + handle_key_event(row, (COLS - 1) - col); } - - } - return initted; - } diff --git a/implementation/Model01.h b/implementation/Model01.h index c2d5a0d1..076b5a64 100644 --- a/implementation/Model01.h +++ b/implementation/Model01.h @@ -1,36 +1,17 @@ #pragma once +#include "../keymaps.h" #include "../generated/keymaps.h" -#include "WS2812.h" -#include "KeyboardioSX1509.h" +#include "../key_events.h" -#define USE_HSV_CURVE 1 - -// SX1509 I2C address (10) -#define LEFT_SX1509_ADDRESS 0x70 -// SX1509 I2C address (11) -#define RIGHT_SX1509_ADDRESS 0x71 #define RIGHT_COLS 8 #define RIGHT_ROWS 4 #define LEFT_COLS 8 #define LEFT_ROWS 4 -static uint8_t left_colpins[]= {7,6,5,4,3,2,1,0}; -static uint8_t left_rowpins[]= {8,9,10,11}; - -static uint8_t right_colpins[]= {0,1,2,3,4,5,6,7}; -static uint8_t right_rowpins[]= {8,9,10,11}; - - -#define COLS 16 -#define ROWS 4 -#define KEYMAPS 3 -#define NUMPAD_KEYMAP 2 -#define KEYMAP_LIST KEYMAP_QWERTY KEYMAP_GENERIC_FN2 KEYMAP_NUMPAD - class Model01_ { public: @@ -40,40 +21,24 @@ class Model01_ { void led_set_crgb_at(uint8_t i, cRGB crgb); cRGB get_key_color(byte row, byte col); - - void scan_row(byte row); - void finish_scanning_row(byte row); - void scan_right_col(byte row, byte col, uint8_t *state); - void scan_left_col(byte row, byte col, uint8_t *state); - void pins_setup(); - boolean right_hand_connected(void); - void leds_setup(); + void scan_matrix(void); + void setup(); private: - static sx1509Class leftsx1509; - static sx1509Class rightsx1509; - static WS2812 LED; - int right_initted = 0; - int left_initted = 0; + static constexpr uint8_t key_led_map[4][16] = { + {3,4,11,12,19,20,26,27, 36,37,43,44,51,52,59,60}, + {2,5,10,13,18,21,31,28, 35,32,42,45,50,53,58,61}, + {1,6,9,14, 17,22,25,29, 34,38,41,46,49,54,57,62}, + {0,7,8,15,16,23,24,30, 33,39,40,47,48,55,56,63}, + }; - void make_input(sx1509Class sx1509, uint8_t pin) ; - void make_output(sx1509Class sx1509, uint8_t pin) ; - int setup_sx1509 (sx1509Class sx1509, uint8_t colpins[], uint8_t rowpins[]); }; -#define LED_DATA_PIN 4 #define LED_COUNT 64 -static const uint8_t key_led_map[4][16] = { - {3,4,11,12,19,20,26,27, 36,37,43,44,51,52,59,60}, - {2,5,10,13,18,21,31,28, 35,32,42,45,50,53,58,61}, - {1,6,9,14, 17,22,25,29, 34,38,41,46,49,54,57,62}, - {0,7,8,15,16,23,24,30, 33,39,40,47,48,55,56,63}, -}; - #define LED_PGDN 0 #define LED_PGUP 1