mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-09-10 17:15:43 +00:00
Compare commits
4 Commits
drop-1.0.0
...
0.6.414
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf215487ba | ||
|
|
e717dcaa09 | ||
|
|
38fdf7a2d2 | ||
|
|
663ca6ba9d |
@@ -127,9 +127,7 @@ Once it does this, you'll want to reset the controller. It should then show out
|
||||
>>> dfu-programmer atmega32u4 reset
|
||||
```
|
||||
|
||||
If you have any issues with this, you may need to this:
|
||||
|
||||
sudo make <my_keyboard>:<my_keymap>:dfu
|
||||
?> If you have any issues with this - such as `dfu-programmer: no device present` - please see the [Frequently Asked Build Questions](faq_build.md).
|
||||
|
||||
#### DFU commands
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ void rgb_matrix_indicators_user(void)
|
||||
break;
|
||||
|
||||
case _RGB: {
|
||||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
HSV hsv = { rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v };
|
||||
HSV hui = hsv;
|
||||
HSV hud = hsv;
|
||||
HSV sai = hsv;
|
||||
|
||||
@@ -1,216 +0,0 @@
|
||||
/*
|
||||
* Good on you for modifying your layout, this is the most nonQMK layout you will come across
|
||||
* There are three modes, Steno (the default), QWERTY (Toggleable) and a Momentary symbol layer
|
||||
*
|
||||
* Don't modify the steno layer directly, instead add chords using the keycodes and macros
|
||||
* from sten.h to the layout you want to modify.
|
||||
*
|
||||
* Observe the comment above processQWERTY!
|
||||
*
|
||||
* http://docs.gboards.ca
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "sten.h"
|
||||
#include "keymap_steno.h"
|
||||
#define IGNORE_MOD_TAP_INTERRUPT
|
||||
|
||||
int getKeymapCount(void);
|
||||
|
||||
// Proper Layers
|
||||
#define FUNCT (LSD | LK | LP | LH)
|
||||
#define MEDIA (LSD | LK | LW | LR)
|
||||
#define MOVE (ST1 | ST2)
|
||||
|
||||
/* Keyboard Layout
|
||||
* ,---------------------------------. ,------------------------------.
|
||||
* | FN | LSU | LFT | LP | LH | ST1 | | ST3 | RF | RP | RL | RT | RD |
|
||||
* |-----+-----+-----+----+----|-----| |-----|----+----+----+----+----|
|
||||
* | PWR | LSD | LK | LW | LR | ST2 | | ST4 | RR | RG | RB | RS | RZ |
|
||||
* `---------------------------------' `------------------------------'
|
||||
* ,---------------, .---------------.
|
||||
* | NUM | LA | LO | | RE | RU | NUM |
|
||||
* `---------------' `---------------'
|
||||
*/
|
||||
|
||||
// YOU MUST ORDER THIS!
|
||||
// P Will return from processing on the first match it finds. Therefore
|
||||
// PJ Will run the requested action, remove the matched chord and continue
|
||||
//
|
||||
// First any chords that would conflict with PJs need to be checked, then PJs, lastly Ps.
|
||||
// For all chords should be ordered by length in their section!
|
||||
//
|
||||
// http://docs.gboards.ca
|
||||
bool processQwerty(void) {
|
||||
// Place P's that would be trashed by PJ's here
|
||||
P( RT | RS | RD | RZ | NUM, SEND_STRING(VERSION); SEND_STRING(__DATE__));
|
||||
P( NUM | LA | LO | RE | RU, SEND(KC_MPLY));
|
||||
P( ST1 | ST2 | ST3 | ST4, SEND(KC_BSPC));
|
||||
|
||||
// Thumb Chords
|
||||
P( LA | LO | RE | RU, SEND(KC_CAPS));
|
||||
P( LA | RU, SEND(KC_ESC));
|
||||
PJ( LO | RE, SEND(KC_LCTL));
|
||||
PJ( NUM | LA | RU, SEND(KC_LCTL); SEND(KC_LSFT));
|
||||
PJ( NUM | LA | RE, SEND(KC_LCTL); SEND(KC_LSFT); SEND(KC_LALT));
|
||||
|
||||
// Mods
|
||||
PJ( RT | RD | RS | RZ, SEND(KC_LGUI));
|
||||
PJ( RT | RD, SEND(KC_LCTL));
|
||||
PJ( RS | RZ, SEND(KC_LALT));
|
||||
PJ( LA | NUM, SEND(KC_LCTL));
|
||||
PJ( LA | LO, SEND(KC_LALT));
|
||||
PJ( LO, SEND(KC_LSFT));
|
||||
|
||||
// Function Layer
|
||||
P( FUNCT | RF | RR, SEND(KC_F5));
|
||||
P( FUNCT | RP | RB, SEND(KC_F6));
|
||||
P( FUNCT | RL | RG, SEND(KC_F7));
|
||||
P( FUNCT | RT | RS, SEND(KC_F8));
|
||||
P( FUNCT | RF, SEND(KC_F1));
|
||||
P( FUNCT | RP, SEND(KC_F2));
|
||||
P( FUNCT | RL, SEND(KC_F3));
|
||||
P( FUNCT | RT, SEND(KC_F4));
|
||||
P( FUNCT | RR, SEND(KC_F9));
|
||||
P( FUNCT | RG, SEND(KC_F10));
|
||||
P( FUNCT | RB, SEND(KC_F11));
|
||||
P( FUNCT | RS, SEND(KC_F12));
|
||||
|
||||
// Movement Layer
|
||||
P( MOVE | RF, SEND(KC_LEFT));
|
||||
P( MOVE | RP, SEND(KC_DOWN));
|
||||
P( MOVE | RL, SEND(KC_UP));
|
||||
P( MOVE | RT, SEND(KC_RIGHT));
|
||||
P( MOVE | ST3, SEND(KC_PGUP));
|
||||
P( MOVE | ST4, SEND(KC_PGDN));
|
||||
|
||||
// Media Layer
|
||||
P( MEDIA | RF, SEND(KC_MPRV));
|
||||
P( MEDIA | RP, SEND(KC_MPLY));
|
||||
P( MEDIA | RL, SEND(KC_MPLY));
|
||||
P( MEDIA | RT, SEND(KC_MNXT));
|
||||
P( MEDIA | RD, SEND(KC_VOLU));
|
||||
P( MEDIA | RZ, SEND(KC_VOLD));
|
||||
P( MEDIA | RS, SEND(KC_MUTE));
|
||||
|
||||
// Mouse Keys
|
||||
P( LP | LH, clickMouse(KC_MS_BTN1));
|
||||
P( LW | LR, clickMouse(KC_MS_BTN2));
|
||||
|
||||
// Number Row
|
||||
P( NUM | LSU, SEND(KC_1));
|
||||
P( NUM | LFT, SEND(KC_2));
|
||||
P( NUM | LP, SEND(KC_3));
|
||||
P( NUM | LH, SEND(KC_4));
|
||||
P( NUM | ST1, SEND(KC_5));
|
||||
P( NUM | ST3, SEND(KC_6));
|
||||
P( NUM | RF, SEND(KC_7));
|
||||
P( NUM | RP, SEND(KC_8));
|
||||
P( NUM | RL, SEND(KC_9));
|
||||
P( NUM | RT, SEND(KC_0));
|
||||
P( NUM | LA, SEND(KC_5));
|
||||
P( NUM | RT, SEND(KC_0));
|
||||
|
||||
// Specials
|
||||
P( LA | NUM, SEND(KC_ESC));
|
||||
P( RU | NUM, SEND(KC_TAB));
|
||||
P( RE | RU, SEND(KC_BSPC));
|
||||
P( RD | RZ, SEND(KC_ENT));
|
||||
P( RE, SEND(KC_ENT));
|
||||
P( RD, SEND(KC_BSPC));
|
||||
P( NUM, SEND(KC_BSPC));
|
||||
P( LA, SEND(KC_SPC));
|
||||
P( RU, SEND(KC_SPC));
|
||||
P( RZ, SEND(KC_ESC));
|
||||
|
||||
// Letters
|
||||
P( LSU | LSD, SEND(KC_A));
|
||||
P( LFT | LK, SEND(KC_S));
|
||||
P( LP | LW, SEND(KC_D));
|
||||
P( LH | LR, SEND(KC_F));
|
||||
P( ST1 | ST2, SEND(KC_G));
|
||||
P( ST3 | ST4, SEND(KC_H));
|
||||
P( RF | RR, SEND(KC_J));
|
||||
P( RT | RS, SEND(KC_SCLN))
|
||||
P( RG | RL, SEND(KC_L));
|
||||
P( RP | RB, SEND(KC_K));
|
||||
P( LSU, SEND(KC_Q));
|
||||
P( LSD, SEND(KC_Z));
|
||||
P( LFT, SEND(KC_W));
|
||||
P( LK, SEND(KC_X));
|
||||
P( LP, SEND(KC_E));
|
||||
P( LW, SEND(KC_C));
|
||||
P( LH, SEND(KC_R));
|
||||
P( LR, SEND(KC_V));
|
||||
P( ST1, SEND(KC_T));
|
||||
P( ST2, SEND(KC_B));
|
||||
P( ST3, SEND(KC_Y));
|
||||
P( ST4, SEND(KC_N));
|
||||
P( RF, SEND(KC_U));
|
||||
P( RR, SEND(KC_M));
|
||||
P( RP, SEND(KC_I));
|
||||
P( RB, SEND(KC_COMM));
|
||||
P( RL, SEND(KC_O));
|
||||
P( RG, SEND(KC_DOT));
|
||||
P( RT, SEND(KC_P));
|
||||
P( RS, SEND(KC_SLSH));
|
||||
|
||||
// Symbols and Numbers
|
||||
P( PWR | RE | RU, SEND(KC_ENT));
|
||||
P( PWR | LA | LO, SEND(KC_SPC));
|
||||
P( PWR | LP | LW, SEND(KC_LSFT); SEND(KC_9)); // (
|
||||
P( PWR | LH | LR, SEND(KC_LSFT); SEND(KC_0)); // )
|
||||
P( PWR | ST1 | ST2, SEND(KC_GRV)); // `
|
||||
P( PWR | RD | RZ, SEND(KC_ESC));
|
||||
P( PWR | LSU | LSD, SEND(KC_LSFT); SEND(KC_3)); // #
|
||||
P( PWR | LFT | LK, SEND(KC_LSFT); SEND(KC_4)); // $
|
||||
P( PWR | LSU, SEND(KC_LSFT); SEND(KC_1)); // !
|
||||
P( PWR | LSD, SEND(KC_LSFT); SEND(KC_5)); // %
|
||||
P( PWR | LFT, SEND(KC_LSFT); SEND(KC_2)); // @
|
||||
P( PWR | LK, SEND(KC_LSFT); SEND(KC_6)); // ^
|
||||
P( PWR | LP, SEND(KC_LSFT); SEND(KC_LBRC)); // {
|
||||
P( PWR | LW, SEND(KC_LBRC));
|
||||
P( PWR | LH, SEND(KC_LSFT); SEND(KC_RBRC)); // }
|
||||
P( PWR | LR, SEND(KC_RBRC));
|
||||
P( PWR | ST1, SEND(KC_LSFT); SEND(KC_BSLS)); // |
|
||||
P( PWR | ST2, SEND(KC_LSFT); SEND(KC_GRV)); // ~
|
||||
P( PWR | ST3, SEND(KC_QUOT));
|
||||
P( PWR | ST4, SEND(KC_LSFT); SEND(KC_QUOT)); // "
|
||||
P( PWR | RF, SEND(KC_KP_PLUS));
|
||||
P( PWR | RR, SEND(KC_LSFT); SEND(KC_7)); // &
|
||||
P( PWR | RP, SEND(KC_MINS));
|
||||
P( PWR | RB, SEND(KC_EQL));
|
||||
P( PWR | RL, SEND(KC_SLSH));
|
||||
P( PWR | RG, SEND(KC_COMM));
|
||||
P( PWR | RT, SEND(KC_PAST));
|
||||
P( PWR | RS, SEND(KC_DOT));
|
||||
P( PWR | RD, SEND(KC_TAB));
|
||||
P( PWR | LA, SEND(KC_SCLN));
|
||||
P( PWR | LO, SEND(KC_SLSH));
|
||||
P( PWR | RE, SEND(KC_SCLN));
|
||||
P( PWR | RU, SEND(KC_SLSH));
|
||||
|
||||
|
||||
// If we make here, send as a steno chord
|
||||
// If plover is running we can hook that host side
|
||||
return false;
|
||||
}
|
||||
|
||||
#define STENO_LAYER 0
|
||||
|
||||
// "Layers"
|
||||
// Steno layer should be first in your map.
|
||||
// When PWR | FN | RR | RG | RB | RS is pressed, the layer is increased to the next map. You must return to STENO_LAYER at the end.
|
||||
// If you have only a single layer, you must set SINGLELAYER = yes in your rules.mk, otherwise you may experince undefined behaviour
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
// Main layer, everything goes through here
|
||||
[STENO_LAYER] = LAYOUT_georgi(
|
||||
STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
|
||||
STN_PWR, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
|
||||
STN_N1, STN_A, STN_O, STN_E, STN_U, STN_N1)
|
||||
};
|
||||
|
||||
int getKeymapCount(void) {
|
||||
return sizeof(keymaps)/sizeof(keymaps[0]);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
# Georgi QWERTY/Steno firmware
|
||||
|
||||
This is a blank template configured with 5K of free space for your onboard dictionary!
|
||||
Read the docs over at [gBoards](http://docs.gboards.ca)
|
||||
|
||||
Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
|
||||
@@ -1,27 +0,0 @@
|
||||
#----------------------------------------------------------------------------
|
||||
# make georgi:extrakey:dfu
|
||||
# Make sure you have dfu-programmer installed!
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
#Debug options
|
||||
VERBOSE = yes
|
||||
CONSOLE_ENABLE = yes
|
||||
DEBUG_MATRIX_SCAN_RATE = no
|
||||
DEBUG_MATRIX = no
|
||||
KEYBOARD_SHARED_EP = yes
|
||||
CUSTOM_MATRIX = yes
|
||||
MOUSEKEY_ENABLE = no
|
||||
SINGLE_LAYER = no
|
||||
|
||||
|
||||
# A bunch of stuff that you shouldn't touch unless you
|
||||
# know what you're doing.
|
||||
#
|
||||
# No touchy, capiche?
|
||||
SRC += matrix.c i2c_master.c
|
||||
ifeq ($(strip $(DEBUG_MATRIX)), yes)
|
||||
OPT_DEFS += -DDEBUG_MATRIX
|
||||
endif
|
||||
ifeq ($(strip $(SINGLE_LAYER)), yes)
|
||||
OPT_DEFS += -DSINGLE_LAYER
|
||||
endif
|
||||
@@ -2,7 +2,7 @@
|
||||
"keyboard_name": "kbd4x",
|
||||
"url": "",
|
||||
"maintainer": "qmk",
|
||||
"width": 14,
|
||||
"width": 12,
|
||||
"height": 4,
|
||||
"layouts": {
|
||||
"LAYOUT_planck_mit": {
|
||||
|
||||
@@ -10,6 +10,7 @@ enum layers_keymap {
|
||||
};
|
||||
|
||||
void eeconfig_init_keymap(void) {
|
||||
rgblight_sethsv(MODERN_DOLCH_RED.h, MODERN_DOLCH_RED.s, MODERN_DOLCH_RED.v);
|
||||
rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
|
||||
}
|
||||
|
||||
@@ -81,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
|
||||
* │ │Mv←│Mv↓│Mv→│TNx│ │ │ │ │ │ │ │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤
|
||||
* │ │RTg│RV-│RV+│ │ │ │ │M4 │M5 │ │ │ │
|
||||
* │ │RTg│RV-│RV+│RMd│ │ │ │M4 │M5 │ │ │ │
|
||||
* └─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┘
|
||||
* │DPR│DstNA│ │ │ │
|
||||
* └───┴─────┴───────────────────────────┴─────┴───┘
|
||||
@@ -90,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CLEAR,
|
||||
_______, TOP, MV_UP, BOTTOM, TAB_PRV, _______, _______, _______, _______, _______, _______, _______, _______, DEL_NXT,
|
||||
_______, MV_LEFT, MV_DOWN, MV_RGHT, TAB_NXT, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, RGB_TOG, RGB_VAD, RGB_VAI, _______, _______, _______, _______, KC_BTN4, KC_BTN5, _______, _______, _______,
|
||||
_______, RGB_TOG, RGB_VAD, RGB_VAI, RGB_MOD, _______, _______, _______, KC_BTN4, KC_BTN5, _______, _______, _______,
|
||||
XXXXXXX, DST_P_R, DST_N_A, _______, _______, _______, XXXXXXX
|
||||
),
|
||||
};
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"keyboard_name": "Iris",
|
||||
"url": "https://keeb.io",
|
||||
"maintainer": "Keebio",
|
||||
"width": 14.5,
|
||||
"height": 5,
|
||||
"width": 15,
|
||||
"height": 5.75,
|
||||
"layouts": {
|
||||
"LAYOUT": {
|
||||
"layout": [
|
||||
|
||||
@@ -35,15 +35,15 @@
|
||||
#define LAYOUT_numpad_5x4( \
|
||||
k00, k01, k02, k03, \
|
||||
k10, k11, k12, \
|
||||
k20, k21, k22, k13, \
|
||||
k20, k21, k22, k23, \
|
||||
k30, k31, k32, \
|
||||
k40, k42, k33 \
|
||||
k41, k42, k43 \
|
||||
) { \
|
||||
{ k00, k01, k02, k03 }, \
|
||||
{ k10, k11, k12, k13 }, \
|
||||
{ k20, k21, k22, KC_NO }, \
|
||||
{ k30, k31, k32, k33 }, \
|
||||
{ k40, KC_NO, k42, KC_NO } \
|
||||
{ k10, k11, k12, KC_NO }, \
|
||||
{ k20, k21, k22, k23 }, \
|
||||
{ k30, k31, k32, KC_NO }, \
|
||||
{ KC_NO, k41, k42, k43 } \
|
||||
}
|
||||
|
||||
#define LAYOUT_ortho_5x4( \
|
||||
|
||||
@@ -54,7 +54,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define SR_EXP_OE_N_PIN 15
|
||||
/* SERCOM port to use for Shift Register SPI */
|
||||
/* DATAOUT and SCLK must be configured to use hardware pins of this port */
|
||||
#define SR_EXP_SERCOM_NUM 2
|
||||
#define SR_EXP_SERCOM SERCOM2
|
||||
/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */
|
||||
#define SR_EXP_DATAOUT_PORT PA
|
||||
#define SR_EXP_DATAOUT_PIN 12
|
||||
@@ -94,9 +94,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
|
||||
#define BOOTKEY_HOLD_MS 2000
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
//#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//ADC configuration table column indices
|
||||
#define ADC_PORT 0
|
||||
#define ADC_PIN 1
|
||||
#define ADC_MUX 2
|
||||
#define ADC_INDEX 3
|
||||
#define ADC_MUXPOS 4
|
||||
#define ADC_REFSEL 5
|
||||
#define ADC_SAMPLENUM 6
|
||||
#define ADC_SAMPLEN 7
|
||||
|
||||
//ADC configuration table row indices
|
||||
#define ADC_5V 0 //5V bus voltage
|
||||
#define ADC_C1A5 1 //Connector 1 A5 CC voltage
|
||||
#define ADC_C1B5 2 //Connector 1 B5 CC voltage
|
||||
#define ADC_C2A5 3 //Connector 2 A5 CC voltage
|
||||
#define ADC_C2B5 4 //Connector 2 B5 CC voltage
|
||||
#define ADC_C1I 5 //Connector 1 current
|
||||
#define ADC_C2I 6 //Connector 2 current
|
||||
|
||||
//ADC_PORT: PORT of the PIN on the MCU (Ex: 0 = PA, 1 = PB, ...)
|
||||
// Set ADC_PORT to ADC_NA if it is not available for use
|
||||
//ADC_PIN: PIN on the MCU (Ex: 0 = 00, 1 = 01, 12 = 12, ...)
|
||||
//ADC_MUX: PMUX setting for the MCU PIN (Ex: 0 = A, 1 = B, 2 = C, ...)
|
||||
//ADC_INDEX: ADC to use (Ex: 0 = ADC0, 1 = ADC1, ...)
|
||||
//ADC_MUXPOS: MUXPOS setting to read on the ADC (Use macros from Atmel library adc.h ADC_INPUTCTRL_MUXPOS_AIN*_Val)
|
||||
//ADC_REFSEL: Reference the ADC is to use (Use macros from Atmel library adc.h ADC_REFCTRL_REFSEL_*_Val)
|
||||
//ADC_SAMPLENUM: Number of samples to average for output (Use macros from Atmel library adc.h ADC_AVGCTRL_SAMPLENUM_*_Val)
|
||||
//ADC_SAMPLEN: Sampling time for each sample in units of CLK_ADC cycles depending on the ADC clock frequency
|
||||
// ADC_PORT ADC_MUX
|
||||
// | ADC_PIN | ADC_INDEX
|
||||
// | | | | ADC_MUXPOS ADC_REFSEL ADC_SAMPLENUM ADC_SAMPLEN
|
||||
#define ADC_CONFIG_5V 1, 0, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN12_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C1A5 1, 2, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN14_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_16_Val, 63
|
||||
#define ADC_CONFIG_C1B5 ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C2A5 1, 1, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN13_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_16_Val, 63
|
||||
#define ADC_CONFIG_C2B5 ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C1I ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C2I ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
|
||||
//Conversion values dependant upon the circuitry
|
||||
#define ADC_5V_VOLTS_PER_COUNT 0.001904297f
|
||||
#define ADC_5V_VOLTS_OFFSET 0.0f
|
||||
#define ADC_5V_NOMINAL 5.0f
|
||||
#define ADC_5V_NOMINAL_COUNTS (ADC_5V_NOMINAL / ADC_5V_VOLTS_PER_COUNT)
|
||||
|
||||
//Conversion macros
|
||||
#define ADC_5V_C2V(icounts) ((float)icounts * ADC_5V_VOLTS_PER_COUNT + ADC_5V_VOLTS_OFFSET) //Converts 5V Bus counts to volts
|
||||
#define ADC_5V_V2C(v) (((float)v - ADC_5V_VOLTS_OFFSET) / ADC_5V_VOLTS_PER_COUNT) //Converts 5V Bus volts to counts
|
||||
#define ADC_CC_5VCOR(v5counts, cc) ((float)v5counts == 0 ? 0 : ADC_5V_NOMINAL_COUNTS / (float)v5counts * (float)cc) //Corrects CC counts to nominal 5V value
|
||||
|
||||
#define ADC_USBC_EXTRA_NOMINAL 850 //Nominal ADC value for detection of connected device
|
||||
#define ADC_USBC_EXTRA_NOMINAL_P1 1250 //Nominal ADC value for detection of connected device
|
||||
|
||||
//Note: Due to assembly error, USBC-1 J2 CC readings are wrong so we must check for special cases
|
||||
#define USBC_IS_SINK(a5, b5) (USB_HOST_IS_2(g_usb_host_port) ? \
|
||||
(a5 < ADC_USBC_EXTRA_NOMINAL_P1 || b5 < ADC_USBC_EXTRA_NOMINAL_P1) \
|
||||
: \
|
||||
(a5 < ADC_USBC_EXTRA_NOMINAL || b5 < ADC_USBC_EXTRA_NOMINAL) \
|
||||
)
|
||||
|
||||
#define POWER_CHECK_INTERVAL 1 //How often to check power usage for adjustment and safety (ms)
|
||||
#define V_5V_AVGS 50 //Number of 5V readings to average for algorithms wanting stable readings rather than instantaneous
|
||||
@@ -8,14 +8,10 @@
|
||||
// This table can be almost-automatically derived from ISSI3733_LED_MAP that is
|
||||
// defined in config_led.h
|
||||
|
||||
// scan in the following equations refers to the scan variable of ISSI3733_LED_MAP
|
||||
// col = (uint8_t)(scan / 8)
|
||||
// row = (uint8_t)(scan % 8)
|
||||
//
|
||||
// You can calculate the (0-244, 0-64) x/y values from the x/y values defined in
|
||||
// ISSI3733_LED_MAP with the following formula:
|
||||
// uint8_t rgb_x = ((ISSI3733_LED_MAP[i].x - MIN_X) / (MAX_X - MIN_X)) * 224;
|
||||
// uint8_t rgb_y = ((ISSI3733_LED_MAP[i].y - MIN_Y) / (MAX_Y - MIN_Y)) * 64; //TODO: 64 - this?
|
||||
// uint8_t rgb_y = ((ISSI3733_LED_MAP[i].y - MIN_Y) / (MAX_Y - MIN_Y)) * 64;
|
||||
// Where the min/max vars are the minimum and maximum "bounds" of x/y values
|
||||
// present in ISSI3733_LED_MAP
|
||||
//
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
Copyright 2018 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
//Define number of IS31FL3733 drivers being used (1...16)
|
||||
//Define number of ISSI3733 drivers being used (1...16)
|
||||
#define ISSI3733_DRIVER_COUNT 2
|
||||
#define DRIVER_LED_TOTAL ISSI3733_LED_COUNT
|
||||
|
||||
//Hardware address of each driver (Refer to IS31FL3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
//Hardware address of each driver (Refer to ISSI3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE }
|
||||
|
||||
//LED I2C bus speed
|
||||
@@ -45,9 +45,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define ISSI3733_GCR_DEFAULT LED_GCR_MAX
|
||||
|
||||
//Automatic power rollback and recovery
|
||||
#define V5_HIGH 2494 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2434 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2206 //5V catastrophic level (Host USB port potential to shut down)
|
||||
#define V5_HIGH 2540 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2480 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2200 //5V catastrophic level (Host USB port potential to shut down)
|
||||
|
||||
//LED Mapping - More practically generated from a spreadsheet program
|
||||
//id: ID of the LED (Sync with PCB callouts)
|
||||
@@ -58,7 +58,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//swr: Matrix wiring SW Red row (1-12)
|
||||
//swg: Matrix wiring SW Green row (1-12)
|
||||
//swb: Matrix wiring SW Blue row (1-12)
|
||||
//scan: Associated key matrix scancode (set 255 if none or 254 for LED to turn off in alternating mode)
|
||||
//scan: Associated key scancode if any
|
||||
//Note: Origin 0,0 may be located anywhere as the software will do the final layout
|
||||
#define ISSI3733_LED_MAP { \
|
||||
{ .id = 1, .x = 0, .y = 0, .adr = { .drv = 2, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 0 }, \
|
||||
@@ -129,45 +129,46 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
{ .id = 66, .x = 10.5, .y = -3, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 73 }, \
|
||||
{ .id = 67, .x = 11.25, .y = -3, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 74 }, \
|
||||
{ .id = 68, .x = -0.338, .y = -3.338, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 69, .x = 0.39, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 69, .x = 0.39, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 70, .x = 1.263, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 71, .x = 2.135, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 71, .x = 2.135, .y = -3.443, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 72, .x = 3.008, .y = -3.443, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 73, .x = 3.88, .y = -3.443, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 73, .x = 3.88, .y = -3.443, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 74, .x = 4.753, .y = -3.443, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 75, .x = 5.625, .y = -3.443, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 75, .x = 5.625, .y = -3.443, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 76, .x = 6.497, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 77, .x = 7.37, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 77, .x = 7.37, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 78, .x = 8.242, .y = -3.443, .adr = { .drv = 1, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 79, .x = 9.115, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 79, .x = 9.115, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 80, .x = 9.987, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 81, .x = 10.86, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 81, .x = 10.86, .y = -3.443, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 82, .x = 11.588, .y = -3.338, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 83, .x = 11.693, .y = -2.623, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 83, .x = 11.693, .y = -2.623, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 84, .x = 11.693, .y = -1.873, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 85, .x = 11.693, .y = -1.123, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 86, .x = 11.693, .y = -0.373, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 86, .x = 11.693, .y = -0.373, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 87, .x = 11.588, .y = 0.338, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 88, .x = 9.908, .y = 0.443, .adr = { .drv = 1, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 89, .x = 9.288, .y = 0.443, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 89, .x = 9.288, .y = 0.443, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 90, .x = 8.625, .y = 0.443, .adr = { .drv = 1, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 91, .x = 7.875, .y = 0.443, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 91, .x = 7.875, .y = 0.443, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 92, .x = 7.125, .y = 0.443, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 93, .x = 6.375, .y = 0.443, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 93, .x = 6.375, .y = 0.443, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 94, .x = 5.625, .y = 0.443, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 95, .x = 4.875, .y = 0.443, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 95, .x = 4.875, .y = 0.443, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 96, .x = 4.125, .y = 0.443, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 97, .x = 3.375, .y = 0.443, .adr = { .drv = 2, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 97, .x = 3.375, .y = 0.443, .adr = { .drv = 2, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 98, .x = 2.625, .y = 0.443, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 99, .x = 1.875, .y = 0.443, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 99, .x = 1.875, .y = 0.443, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 100, .x = 1.125, .y = 0.443, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 101, .x = -0.338, .y = 0.338, .adr = { .drv = 2, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 102, .x = -0.443, .y = -0.373, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 102, .x = -0.443, .y = -0.373, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 103, .x = -0.443, .y = -1.123, .adr = { .drv = 2, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 104, .x = -0.443, .y = -1.873, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 105, .x = -0.443, .y = -2.623, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 105, .x = -0.443, .y = -2.623, .adr = { .drv = 2, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
};
|
||||
|
||||
|
||||
#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality
|
||||
#ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable)
|
||||
#define USB_LED_NUM_LOCK_SCANCODE 255
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/* Data structure to define Shift Register output expander hardware */
|
||||
/* This structure gets shifted into registers LSB first */
|
||||
typedef union {
|
||||
struct {
|
||||
uint16_t RSVD4:1; /*!< bit: 0 */
|
||||
uint16_t RSVD3:1; /*!< bit: 1 */
|
||||
uint16_t RSVD2:1; /*!< bit: 2 */
|
||||
uint16_t RSVD1:1; /*!< bit: 3 */
|
||||
uint16_t SDB_N:1; /*!< bit: 4 SHUTDOWN IS31FL3733 CHIPS WHEN 0, RUN WHEN 1 */
|
||||
uint16_t IRST:1; /*!< bit: 5 RESET IS31FL3733 I2C WHEN 1, RUN WHEN 0 */
|
||||
uint16_t SRC_2:1; /*!< bit: 6 ADVERTISE A SOURCE TO USBC-2 CC */
|
||||
uint16_t SRC_1:1; /*!< bit: 7 ADVERTISE A SOURCE TO USBC-1 CC */
|
||||
uint16_t E_VBUS_2:1; /*!< bit: 8 ENABLE 5V OUT TO USBC-2 WHEN 1 */
|
||||
uint16_t E_VBUS_1:1; /*!< bit: 9 ENABLE 5V OUT TO USBC-1 WHEN 1 */
|
||||
uint16_t E_DN1_N:1; /*!< bit: 10 ENABLE DN1 1:2 MUX WHEN 0 */
|
||||
uint16_t S_DN1:1; /*!< bit: 11 SELECT DN1 PATH 0:USBC-1, 1:USBC-2 */
|
||||
uint16_t E_UP_N:1; /*!< bit: 12 ENABLE SUP 1:2 MUX WHEN 0 */
|
||||
uint16_t S_UP:1; /*!< bit: 13 SELECT UP PATH 0:USBC-1, 1:USBC-2 */
|
||||
uint16_t HUB_RESET_N:1; /*!< bit: 14 RESET USB HUB WHEN 0, RUN WHEN 1 */
|
||||
uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */
|
||||
} bit; /*!< Structure used for bit access */
|
||||
uint16_t reg; /*!< Type used for register access */
|
||||
} sr_exp_t;
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Macros to Enable, Disable, and Update USB 5V bus connections
|
||||
#define USBC_CFG_5V1_VAR sr_exp_data.bit.E_VBUS_1 //Variable storing USBC-1 5V Bus state
|
||||
#define USBC_CFG_5V1_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
#define USBC_CFG_5V2_VAR sr_exp_data.bit.E_VBUS_2 //Variable storing USBC-2 5V Bus state
|
||||
#define USBC_CFG_5V2_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
@@ -1,7 +1,8 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum alt_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
@@ -23,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, DBG_TOG, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
@@ -55,6 +56,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum alt_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
@@ -23,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, DBG_TOG, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
@@ -55,6 +56,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
@@ -84,7 +90,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
@@ -119,7 +125,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
{ .end = 1 }
|
||||
};
|
||||
|
||||
@@ -1,28 +1,24 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum alt_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase //Working
|
||||
L_BRD, //LED Brightness Decrease //Working
|
||||
L_PTN, //LED Pattern Select Next //Working
|
||||
L_PTP, //LED Pattern Select Previous //Working
|
||||
L_PSI, //LED Pattern Speed Increase //Working
|
||||
L_PSD, //LED Pattern Speed Decrease //Working
|
||||
L_T_MD, //LED Toggle Mode //Working
|
||||
L_T_ONF, //LED Toggle On / Off //Broken
|
||||
L_ON, //LED On //Broken
|
||||
L_OFF, //LED Off //Broken
|
||||
L_T_BR, //LED Toggle Breath Effect //Working
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction //Working
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control //Working
|
||||
DBG_TOG, //DEBUG Toggle On / Off //
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints //
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints //
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints //
|
||||
MD_BOOT //Restart into bootloader after hold timeout //Working
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
@@ -39,10 +35,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, DBG_FAC, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
@@ -69,7 +65,6 @@ void matrix_scan_user(void) {
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
@@ -86,26 +81,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
@@ -137,17 +112,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
led_enabled = !led_enabled;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
led_enabled = 1;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
led_enabled = 0;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
@@ -162,33 +140,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
@@ -196,17 +148,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
@@ -231,7 +172,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum alt_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
@@ -23,7 +24,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, DBG_TOG, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
@@ -55,6 +56,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
@@ -84,7 +90,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
@@ -119,7 +125,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
{ .end = 1 }
|
||||
};
|
||||
|
||||
@@ -1,28 +1,24 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum alt_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase //Working
|
||||
L_BRD, //LED Brightness Decrease //Working
|
||||
L_PTN, //LED Pattern Select Next //Working
|
||||
L_PTP, //LED Pattern Select Previous //Working
|
||||
L_PSI, //LED Pattern Speed Increase //Working
|
||||
L_PSD, //LED Pattern Speed Decrease //Working
|
||||
L_T_MD, //LED Toggle Mode //Working
|
||||
L_T_ONF, //LED Toggle On / Off //Broken
|
||||
L_ON, //LED On //Broken
|
||||
L_OFF, //LED Off //Broken
|
||||
L_T_BR, //LED Toggle Breath Effect //Working
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction //Working
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control //Working
|
||||
DBG_TOG, //DEBUG Toggle On / Off //
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints //
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints //
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints //
|
||||
MD_BOOT //Restart into bootloader after hold timeout //Working
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
@@ -39,10 +35,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, DBG_FAC, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLU, \
|
||||
_______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_PGUP, KC_VOLD, \
|
||||
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
@@ -69,7 +65,6 @@ void matrix_scan_user(void) {
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
@@ -86,26 +81,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
@@ -137,17 +112,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
led_enabled = !led_enabled;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
led_enabled = 1;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
led_enabled = 0;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
@@ -162,33 +140,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
@@ -196,17 +148,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
@@ -231,7 +172,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ enum alt_keycodes {
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction
|
||||
U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
@@ -37,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_MUTE, \
|
||||
_______, _______, _______, KC_UP, _______, _______, _______, _______, U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, _______, _______, KC_UP, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \
|
||||
_______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_VOLU, _______, \
|
||||
_______, _______, _______, KC_MPLY, MO(2), _______, KC_MRWD, KC_VOLD, KC_MFFD \
|
||||
@@ -145,6 +146,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
Copyright 2018 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "clks.h"
|
||||
#include <string.h>
|
||||
|
||||
#define MCU_PORTS_USED 2 //PA, PB
|
||||
|
||||
matrix_row_t mlatest[MATRIX_ROWS];
|
||||
matrix_row_t mlast[MATRIX_ROWS];
|
||||
matrix_row_t mdebounced[MATRIX_ROWS];
|
||||
@@ -32,7 +30,7 @@ uint8_t row_ports[] = { MATRIX_ROW_PORTS };
|
||||
uint8_t row_pins[] = { MATRIX_ROW_PINS };
|
||||
uint8_t col_ports[] = { MATRIX_COL_PORTS };
|
||||
uint8_t col_pins[] = { MATRIX_COL_PINS };
|
||||
uint32_t row_masks[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
uint32_t row_masks[2]; //NOTE: If more than PA PB used in the future, adjust code to accomodate
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_kb(void) {
|
||||
@@ -58,9 +56,9 @@ void matrix_init(void)
|
||||
memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
|
||||
memset(row_masks, 0, sizeof(row_masks));
|
||||
row_masks[PA] = 0;
|
||||
row_masks[PB] = 0;
|
||||
|
||||
//Inputs
|
||||
uint8_t row;
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
@@ -71,7 +69,6 @@ void matrix_init(void)
|
||||
row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask
|
||||
}
|
||||
|
||||
//Outputs
|
||||
uint8_t col;
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
@@ -83,28 +80,26 @@ void matrix_init(void)
|
||||
}
|
||||
|
||||
uint64_t mdebouncing = 0;
|
||||
bool debouncing = false;
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint64_t timer;
|
||||
uint8_t mchanged;
|
||||
uint8_t row;
|
||||
uint8_t col;
|
||||
uint32_t scans[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
uint32_t scans[2]; //PA PB
|
||||
|
||||
if (timer_read64() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active
|
||||
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer
|
||||
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
//Set output
|
||||
PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output
|
||||
|
||||
wait_us(1); //Delay for output
|
||||
|
||||
//Read input (add unique ports as needed, PA, PB, PC, etc)
|
||||
scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data
|
||||
scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PA row pins data
|
||||
scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data
|
||||
|
||||
//Clear output
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
@@ -115,26 +110,25 @@ uint8_t matrix_scan(void)
|
||||
}
|
||||
}
|
||||
|
||||
timer = timer_read64();
|
||||
mchanged = 0; //Default to no matrix change since last
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
if (mlast[row] != mlatest[row]) {
|
||||
debouncing = true;
|
||||
mdebouncing = timer + DEBOUNCE;
|
||||
}
|
||||
|
||||
if (mlast[row] != mlatest[row])
|
||||
mchanged = 1;
|
||||
mlast[row] = mlatest[row];
|
||||
}
|
||||
|
||||
if (debouncing && timer >= mdebouncing)
|
||||
if (!mchanged)
|
||||
{
|
||||
for (row = 0; row < MATRIX_ROWS; row++) {
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
mdebounced[row] = mlatest[row];
|
||||
}
|
||||
|
||||
mdebouncing = 0;
|
||||
debouncing = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Begin or extend debounce on change
|
||||
mdebouncing = timer_read64() + DEBOUNCE;
|
||||
}
|
||||
|
||||
matrix_scan_quantum();
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# project specific files
|
||||
SRC = matrix.c
|
||||
SRC += config_led.c
|
||||
SRC += spi.c
|
||||
SRC += usb.c
|
||||
|
||||
#For platform and packs
|
||||
ARM_ATSAM = SAMD51J18A
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void SR_EXP_Init_kb(void) {
|
||||
/* Initialize shift register */
|
||||
SR_EXP_OE_N_DIS;
|
||||
SR_EXP_RCLK_HI;
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DORD = 1; //Data Order - LSB is transferred first
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPOL = 1; //Clock Polarity - SCK high when idle. Leading edge of cycle is falling. Trailing rising.
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPHA = 1; //Clock Phase - Leading Edge Falling, change, Trailing Edge - Rising, sample
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DIPO = 3; //Data In Pinout - SERCOM PAD[3] is used as data input (Configure away from DOPO. Not using input.)
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DOPO = 0; //Data Output PAD[0], Serial Clock PAD[1]
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.MODE = 3; //Operating Mode - Master operation
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.ENABLE = 1; //Enable - Peripheral is enabled or being enabled
|
||||
while (SR_EXP_SERCOM->SPI.SYNCBUSY.bit.ENABLE) { DBGC(DC_SPI_EXP_SYNC_ENABLING); }
|
||||
|
||||
/* Set default shift register values */
|
||||
sr_exp_data.reg = 0; //Clear data register
|
||||
sr_exp_data.bit.HUB_CONNECT = 0; //USB Hub disconnected
|
||||
sr_exp_data.bit.HUB_RESET_N = 0; //USB Hub in reset state
|
||||
|
||||
sr_exp_data.bit.SRC_1 = 1; //Set CON1 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2 = 1; //Set CON2 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.S_UP = 0; //Default USB data to CON1
|
||||
sr_exp_data.bit.E_UP_N = 1; //Disable HOST
|
||||
sr_exp_data.bit.S_DN1 = 1; //Default EXTRA port to CON2
|
||||
sr_exp_data.bit.E_DN1_N = 1; //Disable EXTRA
|
||||
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
sr_exp_data.bit.IRST = 1; //LED drivers I2C in reset
|
||||
sr_exp_data.bit.SDB_N = 0; //LED drivers in shutdown
|
||||
|
||||
/* Write shift register data */
|
||||
SR_EXP_WriteData();
|
||||
|
||||
/* Enable shift register output */
|
||||
SR_EXP_OE_N_ENA;
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
//Note: rp_best_index not used
|
||||
void usb_set_host_kb(uint8_t con, uint8_t rp_best_index) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.S_UP = 0; //HOST to USBC-1
|
||||
sr_exp_data.bit.S_DN1 = 1; //EXTRA to USBC-2
|
||||
g_usb_host_port = USB_HOST_PORT_1; //Save host port
|
||||
sr_exp_data.bit.E_VBUS_1 = 1; //Enable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.S_DN1 = 0; //HOST to USBC-2
|
||||
sr_exp_data.bit.S_UP = 1; //EXTRA to USBC-1
|
||||
g_usb_host_port = USB_HOST_PORT_2; //Save host port
|
||||
sr_exp_data.bit.E_VBUS_2 = 1; //Enable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_set_extra_kb(uint8_t con) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.SRC_1 = 0; //Set CON1 CC A5/B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.SRC_2 = 0; //Set CON2 CC A5/B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_init_host_detection_kb(void) {
|
||||
//Disable 5V
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
|
||||
//Configure default paths
|
||||
sr_exp_data.bit.S_UP = 0; //HOST to USBC-1
|
||||
sr_exp_data.bit.S_DN1 = 1; //EXTRA to USBC-2
|
||||
|
||||
//Configure CC lines
|
||||
sr_exp_data.bit.SRC_1 = 1; //Set CON1 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2 = 1; //Set CON2 CC A5/B5 as Rd 5.1k
|
||||
|
||||
//Enable ports
|
||||
sr_exp_data.bit.E_UP_N = 0; //Enable HOST for use
|
||||
sr_exp_data.bit.E_DN1_N = 0; //Enable EXTRA for use
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
|
||||
//Return 1 if configuration successful
|
||||
//Return 0 otherwise
|
||||
uint8_t usb_attach_port_configure_kb(uint8_t g_usb_host_port, uint16_t usbc_cc_a5_v, uint16_t usbc_cc_b5_v) {
|
||||
if (USB_HOST_IS_1(g_usb_host_port)) { //If host is port 1
|
||||
//Set up port 2
|
||||
usb_set_extra_kb(2);
|
||||
return 1;
|
||||
} else if (USB_HOST_IS_2(g_usb_host_port)) { //If host is on port 2
|
||||
//Set up port 1
|
||||
usb_set_extra_kb(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -54,7 +54,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define SR_EXP_OE_N_PIN 15
|
||||
/* SERCOM port to use for Shift Register SPI */
|
||||
/* DATAOUT and SCLK must be configured to use hardware pins of this port */
|
||||
#define SR_EXP_SERCOM_NUM 2
|
||||
#define SR_EXP_SERCOM SERCOM2
|
||||
/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */
|
||||
#define SR_EXP_DATAOUT_PORT PA
|
||||
#define SR_EXP_DATAOUT_PIN 12
|
||||
@@ -94,9 +94,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
|
||||
#define BOOTKEY_HOLD_MS 2000
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
//#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//ADC configuration table column indices
|
||||
#define ADC_PORT 0
|
||||
#define ADC_PIN 1
|
||||
#define ADC_MUX 2
|
||||
#define ADC_INDEX 3
|
||||
#define ADC_MUXPOS 4
|
||||
#define ADC_REFSEL 5
|
||||
#define ADC_SAMPLENUM 6
|
||||
#define ADC_SAMPLEN 7
|
||||
|
||||
//ADC configuration table row indices
|
||||
#define ADC_5V 0 //5V bus voltage
|
||||
#define ADC_C1A5 1 //Connector 1 A5 CC voltage
|
||||
#define ADC_C1B5 2 //Connector 1 B5 CC voltage
|
||||
#define ADC_C2A5 3 //Connector 2 A5 CC voltage
|
||||
#define ADC_C2B5 4 //Connector 2 B5 CC voltage
|
||||
#define ADC_C1I 5 //Connector 1 current
|
||||
#define ADC_C2I 6 //Connector 2 current
|
||||
|
||||
//ADC_PORT: PORT of the PIN on the MCU (Ex: 0 = PA, 1 = PB, ...)
|
||||
// Set ADC_PORT to ADC_NA if it is not available for use
|
||||
//ADC_PIN: PIN on the MCU (Ex: 0 = 00, 1 = 01, 12 = 12, ...)
|
||||
//ADC_MUX: PMUX setting for the MCU PIN (Ex: 0 = A, 1 = B, 2 = C, ...)
|
||||
//ADC_INDEX: ADC to use (Ex: 0 = ADC0, 1 = ADC1, ...)
|
||||
//ADC_MUXPOS: MUXPOS setting to read on the ADC (Use macros from Atmel library adc.h ADC_INPUTCTRL_MUXPOS_AIN*_Val)
|
||||
//ADC_REFSEL: Reference the ADC is to use (Use macros from Atmel library adc.h ADC_REFCTRL_REFSEL_*_Val)
|
||||
//ADC_SAMPLENUM: Number of samples to average for output (Use macros from Atmel library adc.h ADC_AVGCTRL_SAMPLENUM_*_Val)
|
||||
//ADC_SAMPLEN: Sampling time for each sample in units of CLK_ADC cycles depending on the ADC clock frequency
|
||||
// ADC_PORT ADC_MUX
|
||||
// | ADC_PIN | ADC_INDEX
|
||||
// | | | | ADC_MUXPOS ADC_REFSEL ADC_SAMPLENUM ADC_SAMPLEN
|
||||
#define ADC_CONFIG_5V 1, 0, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN12_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C1A5 1, 2, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN14_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_16_Val, 63
|
||||
#define ADC_CONFIG_C1B5 ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C2A5 1, 1, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN13_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_16_Val, 63
|
||||
#define ADC_CONFIG_C2B5 ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C1I ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
#define ADC_CONFIG_C2I ADC_NA, 0, 0, 0, 0, 0, 0, 0
|
||||
|
||||
//Conversion values dependant upon the circuitry
|
||||
#define ADC_5V_VOLTS_PER_COUNT 0.001904297f
|
||||
#define ADC_5V_VOLTS_OFFSET 0.0f
|
||||
#define ADC_5V_NOMINAL 5.0f
|
||||
#define ADC_5V_NOMINAL_COUNTS (ADC_5V_NOMINAL / ADC_5V_VOLTS_PER_COUNT)
|
||||
|
||||
//Conversion macros
|
||||
#define ADC_5V_C2V(icounts) ((float)icounts * ADC_5V_VOLTS_PER_COUNT + ADC_5V_VOLTS_OFFSET) //Converts 5V Bus counts to volts
|
||||
#define ADC_5V_V2C(v) (((float)v - ADC_5V_VOLTS_OFFSET) / ADC_5V_VOLTS_PER_COUNT) //Converts 5V Bus volts to counts
|
||||
#define ADC_CC_5VCOR(v5counts, cc) ((float)v5counts == 0 ? 0 : ADC_5V_NOMINAL_COUNTS / (float)v5counts * (float)cc) //Corrects CC counts to nominal 5V value
|
||||
|
||||
#define ADC_USBC_EXTRA_NOMINAL 850 //Nominal ADC value for detection of connected device
|
||||
|
||||
#define USBC_IS_SINK(a5, b5) (a5 < ADC_USBC_EXTRA_NOMINAL || b5 < ADC_USBC_EXTRA_NOMINAL)
|
||||
|
||||
#define POWER_CHECK_INTERVAL 1 //How often to check power usage for adjustment and safety (ms)
|
||||
#define V_5V_AVGS 50 //Number of 5V readings to average for algorithms wanting stable readings rather than instantaneous
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
Copyright 2018 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
//Define number of IS31FL3733 drivers being used (1...16)
|
||||
//Define number of ISSI3733 drivers being used (1...16)
|
||||
#define ISSI3733_DRIVER_COUNT 2
|
||||
#define DRIVER_LED_TOTAL ISSI3733_LED_COUNT
|
||||
|
||||
//Hardware address of each driver (Refer to IS31FL3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
//Hardware address of each driver (Refer to ISSI3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE }
|
||||
|
||||
//LED I2C bus speed
|
||||
@@ -45,9 +45,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#define ISSI3733_GCR_DEFAULT LED_GCR_MAX
|
||||
|
||||
//Automatic power rollback and recovery
|
||||
#define V5_HIGH 2494 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2434 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2206 //5V catastrophic level (Host USB port potential to shut down)
|
||||
#define V5_HIGH 2540 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2480 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2200 //5V catastrophic level (Host USB port potential to shut down)
|
||||
|
||||
//LED Mapping - More practically generated from a spreadsheet program
|
||||
//id: ID of the LED (Sync with PCB callouts)
|
||||
@@ -58,7 +58,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
//swr: Matrix wiring SW Red row (1-12)
|
||||
//swg: Matrix wiring SW Green row (1-12)
|
||||
//swb: Matrix wiring SW Blue row (1-12)
|
||||
//scan: Associated key matrix scancode (set 255 if none or 254 for LED to turn off in alternating mode)
|
||||
//scan: Associated key scancode if any
|
||||
//Note: Origin 0,0 may be located anywhere as the software will do the final layout
|
||||
#define ISSI3733_LED_MAP { \
|
||||
{ .id = 1, .x = 0, .y = 0, .adr = { .drv = 2, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 0 }, \
|
||||
@@ -149,37 +149,37 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
{ .id = 86, .x = 12.375, .y = -4.125, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 85 }, \
|
||||
{ .id = 87, .x = 13.125, .y = -4.125, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 86 }, \
|
||||
{ .id = 88, .x = 13.433, .y = -4.43, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 89, .x = 12.285, .y = -4.535, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 89, .x = 12.285, .y = -4.535, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 90, .x = 11.14, .y = -4.535, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 91, .x = 9.995, .y = -4.535, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 91, .x = 9.995, .y = -4.535, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 92, .x = 8.85, .y = -4.535, .adr = { .drv = 1, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 93, .x = 7.705, .y = -4.535, .adr = { .drv = 1, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 93, .x = 7.705, .y = -4.535, .adr = { .drv = 1, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 94, .x = 6.56, .y = -4.535, .adr = { .drv = 2, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 95, .x = 5.415, .y = -4.535, .adr = { .drv = 2, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 95, .x = 5.415, .y = -4.535, .adr = { .drv = 2, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 96, .x = 4.27, .y = -4.535, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 97, .x = 3.125, .y = -4.535, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 97, .x = 3.125, .y = -4.535, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 98, .x = 1.98, .y = -4.535, .adr = { .drv = 2, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 99, .x = 0.835, .y = -4.535, .adr = { .drv = 2, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 99, .x = 0.835, .y = -4.535, .adr = { .drv = 2, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 100, .x = -0.307, .y = -4.43, .adr = { .drv = 2, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 101, .x = -0.41, .y = -3.245, .adr = { .drv = 2, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 101, .x = -0.41, .y = -3.245, .adr = { .drv = 2, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 102, .x = -0.41, .y = -2.06, .adr = { .drv = 2, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 103, .x = -0.41, .y = -0.875, .adr = { .drv = 2, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 103, .x = -0.41, .y = -0.875, .adr = { .drv = 2, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 104, .x = -0.308, .y = 0.31, .adr = { .drv = 2, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 105, .x = 0.835, .y = 0.415, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 105, .x = 0.835, .y = 0.415, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 106, .x = 1.98, .y = 0.415, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 107, .x = 3.125, .y = 0.415, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 107, .x = 3.125, .y = 0.415, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 108, .x = 4.27, .y = 0.415, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 109, .x = 5.415, .y = 0.415, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 109, .x = 5.415, .y = 0.415, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 110, .x = 6.56, .y = 0.415, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 111, .x = 7.705, .y = 0.415, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 111, .x = 7.705, .y = 0.415, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 112, .x = 8.85, .y = 0.415, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 113, .x = 9.995, .y = 0.415, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 113, .x = 9.995, .y = 0.415, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 114, .x = 11.14, .y = 0.415, .adr = { .drv = 1, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 115, .x = 12.285, .y = 0.415, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 115, .x = 12.285, .y = 0.415, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 116, .x = 13.432, .y = 0.31, .adr = { .drv = 1, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 117, .x = 13.535, .y = -0.875, .adr = { .drv = 1, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 117, .x = 13.535, .y = -0.875, .adr = { .drv = 1, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 118, .x = 13.535, .y = -2.06, .adr = { .drv = 1, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 119, .x = 13.535, .y = -3.245, .adr = { .drv = 1, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 119, .x = 13.535, .y = -3.245, .adr = { .drv = 1, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
};
|
||||
|
||||
#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/* Data structure to define Shift Register output expander hardware */
|
||||
/* This structure gets shifted into registers LSB first */
|
||||
typedef union {
|
||||
struct {
|
||||
uint16_t RSVD4:1; /*!< bit: 0 */
|
||||
uint16_t RSVD3:1; /*!< bit: 1 */
|
||||
uint16_t RSVD2:1; /*!< bit: 2 */
|
||||
uint16_t RSVD1:1; /*!< bit: 3 */
|
||||
uint16_t SDB_N:1; /*!< bit: 4 SHUTDOWN IS31FL3733 CHIPS WHEN 0, RUN WHEN 1 */
|
||||
uint16_t IRST:1; /*!< bit: 5 RESET IS31FL3733 I2C WHEN 1, RUN WHEN 0 */
|
||||
uint16_t SRC_2:1; /*!< bit: 6 ADVERTISE A SOURCE TO USBC-2 CC */
|
||||
uint16_t SRC_1:1; /*!< bit: 7 ADVERTISE A SOURCE TO USBC-1 CC */
|
||||
uint16_t E_VBUS_2:1; /*!< bit: 8 ENABLE 5V OUT TO USBC-2 WHEN 1 */
|
||||
uint16_t E_VBUS_1:1; /*!< bit: 9 ENABLE 5V OUT TO USBC-1 WHEN 1 */
|
||||
uint16_t E_DN1_N:1; /*!< bit: 10 ENABLE DN1 1:2 MUX WHEN 0 */
|
||||
uint16_t S_DN1:1; /*!< bit: 11 SELECT DN1 PATH 0:USBC-1, 1:USBC-2 */
|
||||
uint16_t E_UP_N:1; /*!< bit: 12 ENABLE SUP 1:2 MUX WHEN 0 */
|
||||
uint16_t S_UP:1; /*!< bit: 13 SELECT UP PATH 0:USBC-1, 1:USBC-2 */
|
||||
uint16_t HUB_RESET_N:1; /*!< bit: 14 RESET USB HUB WHEN 0, RUN WHEN 1 */
|
||||
uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */
|
||||
} bit; /*!< Structure used for bit access */
|
||||
uint16_t reg; /*!< Type used for register access */
|
||||
} sr_exp_t;
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Macros to Enable, Disable, and Update USB 5V bus connections
|
||||
#define USBC_CFG_5V1_VAR sr_exp_data.bit.E_VBUS_1 //Variable storing USBC-1 5V Bus state
|
||||
#define USBC_CFG_5V1_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
#define USBC_CFG_5V2_VAR sr_exp_data.bit.E_VBUS_2 //Variable storing USBC-2 5V Bus state
|
||||
#define USBC_CFG_5V2_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
@@ -1,7 +1,8 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum ctrl_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
@@ -25,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
@@ -36,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
@@ -58,6 +59,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
@@ -87,7 +93,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
@@ -122,15 +128,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 10, .id1 = 9, .r = 255, .g = 0, .b = 0 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_PATTERN, .id0 = 4, .id1 = 0, .pattern_id = 8 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 8, .id1 = 0, .r = 0, .g = 255, .b = 0 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_PATTERN, .id = 16, .id1 = 0, .pattern_id = 9 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 32, .id1 = 0, .r = 0, .g = 0, .b = 255 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_ROTATE_PATTERN, .id0 = 64, .id1 = 0},
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_ROTATE_PATTERN, .id0 = 262144, .id1 = 0, .layer = 0 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_ROTATE_PATTERN, .id = 16777216, .id1 = 0, .layer = 1 },
|
||||
{ .end = 1 }
|
||||
};
|
||||
|
||||
@@ -1,28 +1,24 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum ctrl_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase //Working
|
||||
L_BRD, //LED Brightness Decrease //Working
|
||||
L_PTN, //LED Pattern Select Next //Working
|
||||
L_PTP, //LED Pattern Select Previous //Working
|
||||
L_PSI, //LED Pattern Speed Increase //Working
|
||||
L_PSD, //LED Pattern Speed Decrease //Working
|
||||
L_T_MD, //LED Toggle Mode //Working
|
||||
L_T_ONF, //LED Toggle On / Off //Broken
|
||||
L_ON, //LED On //Broken
|
||||
L_OFF, //LED Off //Broken
|
||||
L_T_BR, //LED Toggle Breath Effect //Working
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction //Working
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control //Working
|
||||
DBG_TOG, //DEBUG Toggle On / Off //
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints //
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints //
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints //
|
||||
MD_BOOT //Restart into bootloader after hold timeout //Working
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
@@ -41,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, DBG_FAC, _______, _______, _______, _______, _______, _______, _______ \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
@@ -52,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
@@ -72,7 +68,6 @@ void matrix_scan_user(void) {
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
@@ -89,26 +84,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
@@ -140,17 +115,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
led_enabled = !led_enabled;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
led_enabled = 1;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
led_enabled = 0;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
@@ -165,33 +143,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
@@ -199,17 +151,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
@@ -234,7 +175,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum ctrl_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
@@ -25,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
@@ -36,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
@@ -58,6 +59,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
@@ -87,7 +93,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
@@ -122,7 +128,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
{ .end = 1 }
|
||||
};
|
||||
|
||||
@@ -1,28 +1,24 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum ctrl_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase //Working
|
||||
L_BRD, //LED Brightness Decrease //Working
|
||||
L_PTN, //LED Pattern Select Next //Working
|
||||
L_PTP, //LED Pattern Select Previous //Working
|
||||
L_PSI, //LED Pattern Speed Increase //Working
|
||||
L_PSD, //LED Pattern Speed Decrease //Working
|
||||
L_T_MD, //LED Toggle Mode //Working
|
||||
L_T_ONF, //LED Toggle On / Off //Broken
|
||||
L_ON, //LED On //Broken
|
||||
L_OFF, //LED Off //Broken
|
||||
L_T_BR, //LED Toggle Breath Effect //Working
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction //Working
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control //Working
|
||||
DBG_TOG, //DEBUG Toggle On / Off //
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints //
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints //
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints //
|
||||
MD_BOOT //Restart into bootloader after hold timeout //Working
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
@@ -41,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, DBG_FAC, _______, _______, _______, _______, _______, _______, _______ \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
@@ -52,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
@@ -72,7 +68,6 @@ void matrix_scan_user(void) {
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
@@ -89,26 +84,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
@@ -140,17 +115,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
led_enabled = !led_enabled;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
led_enabled = 1;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
led_enabled = 0;
|
||||
I2C3733_Control_Set(led_enabled);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
@@ -165,33 +143,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
@@ -199,17 +151,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
@@ -234,7 +175,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ void rgb_matrix_indicators_user(void)
|
||||
break;
|
||||
|
||||
case _FNC: {
|
||||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
HSV hsv = { rgb_matrix_config.hsv.h, rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v };
|
||||
HSV hui = hsv;
|
||||
HSV hud = hsv;
|
||||
HSV sai = hsv;
|
||||
|
||||
@@ -29,6 +29,7 @@ enum ctrl_keycodes {
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction
|
||||
U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
@@ -66,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, U_T_AGCR,_______, MO(2), _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, MO(2), _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
@@ -776,6 +777,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
led_animation_direction = !led_animation_direction;
|
||||
}
|
||||
return false;
|
||||
case U_T_AUTO:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
Copyright 2018 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -22,8 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "clks.h"
|
||||
#include <string.h>
|
||||
|
||||
#define MCU_PORTS_USED 2 //PA, PB
|
||||
|
||||
matrix_row_t mlatest[MATRIX_ROWS];
|
||||
matrix_row_t mlast[MATRIX_ROWS];
|
||||
matrix_row_t mdebounced[MATRIX_ROWS];
|
||||
@@ -32,7 +30,7 @@ uint8_t row_ports[] = { MATRIX_ROW_PORTS };
|
||||
uint8_t row_pins[] = { MATRIX_ROW_PINS };
|
||||
uint8_t col_ports[] = { MATRIX_COL_PORTS };
|
||||
uint8_t col_pins[] = { MATRIX_COL_PINS };
|
||||
uint32_t row_masks[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
uint32_t row_masks[2]; //NOTE: If more than PA PB used in the future, adjust code to accomodate
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_kb(void) {
|
||||
@@ -58,9 +56,9 @@ void matrix_init(void)
|
||||
memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
|
||||
memset(row_masks, 0, sizeof(row_masks));
|
||||
row_masks[PA] = 0;
|
||||
row_masks[PB] = 0;
|
||||
|
||||
//Inputs
|
||||
uint8_t row;
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
@@ -71,7 +69,6 @@ void matrix_init(void)
|
||||
row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask
|
||||
}
|
||||
|
||||
//Outputs
|
||||
uint8_t col;
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
@@ -83,28 +80,26 @@ void matrix_init(void)
|
||||
}
|
||||
|
||||
uint64_t mdebouncing = 0;
|
||||
bool debouncing = false;
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint64_t timer;
|
||||
uint8_t mchanged;
|
||||
uint8_t row;
|
||||
uint8_t col;
|
||||
uint32_t scans[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
uint32_t scans[2]; //PA PB
|
||||
|
||||
if (timer_read64() < mdebouncing) return 1; //mdebouncing == 0 when no debouncing active
|
||||
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer
|
||||
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
//Set output
|
||||
PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output
|
||||
|
||||
wait_us(1); //Delay for output
|
||||
|
||||
//Read input (add unique ports as needed, PA, PB, PC, etc)
|
||||
scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data
|
||||
scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PA row pins data
|
||||
scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PB row pins data
|
||||
|
||||
//Clear output
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
@@ -115,26 +110,25 @@ uint8_t matrix_scan(void)
|
||||
}
|
||||
}
|
||||
|
||||
timer = timer_read64();
|
||||
mchanged = 0; //Default to no matrix change since last
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
if (mlast[row] != mlatest[row]) {
|
||||
debouncing = true;
|
||||
mdebouncing = timer + DEBOUNCE;
|
||||
}
|
||||
|
||||
if (mlast[row] != mlatest[row])
|
||||
mchanged = 1;
|
||||
mlast[row] = mlatest[row];
|
||||
}
|
||||
|
||||
if (debouncing && timer >= mdebouncing)
|
||||
if (!mchanged)
|
||||
{
|
||||
for (row = 0; row < MATRIX_ROWS; row++) {
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
mdebounced[row] = mlatest[row];
|
||||
}
|
||||
|
||||
mdebouncing = 0;
|
||||
debouncing = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Begin or extend debounce on change
|
||||
mdebouncing = timer_read64() + DEBOUNCE;
|
||||
}
|
||||
|
||||
matrix_scan_quantum();
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# project specific files
|
||||
SRC = matrix.c
|
||||
SRC += config_led.c
|
||||
SRC += spi.c
|
||||
SRC += usb.c
|
||||
|
||||
#For platform and packs
|
||||
ARM_ATSAM = SAMD51J18A
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void SR_EXP_Init_kb(void) {
|
||||
/* Initialize shift register */
|
||||
SR_EXP_OE_N_DIS;
|
||||
SR_EXP_RCLK_HI;
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DORD = 1; //Data Order - LSB is transferred first
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPOL = 1; //Clock Polarity - SCK high when idle. Leading edge of cycle is falling. Trailing rising.
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPHA = 1; //Clock Phase - Leading Edge Falling, change, Trailing Edge - Rising, sample
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DIPO = 3; //Data In Pinout - SERCOM PAD[3] is used as data input (Configure away from DOPO. Not using input.)
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DOPO = 0; //Data Output PAD[0], Serial Clock PAD[1]
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.MODE = 3; //Operating Mode - Master operation
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.ENABLE = 1; //Enable - Peripheral is enabled or being enabled
|
||||
while (SR_EXP_SERCOM->SPI.SYNCBUSY.bit.ENABLE) { DBGC(DC_SPI_EXP_SYNC_ENABLING); }
|
||||
|
||||
/* Set default shift register values */
|
||||
sr_exp_data.reg = 0; //Clear data register
|
||||
sr_exp_data.bit.HUB_CONNECT = 0; //USB Hub disconnected
|
||||
sr_exp_data.bit.HUB_RESET_N = 0; //USB Hub in reset state
|
||||
|
||||
sr_exp_data.bit.SRC_1 = 1; //Set CON1 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2 = 1; //Set CON2 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.S_UP = 0; //Default USB data to CON1
|
||||
sr_exp_data.bit.E_UP_N = 1; //Disable HOST
|
||||
sr_exp_data.bit.S_DN1 = 1; //Default EXTRA port to CON2
|
||||
sr_exp_data.bit.E_DN1_N = 1; //Disable EXTRA
|
||||
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
sr_exp_data.bit.IRST = 1; //LED drivers I2C in reset
|
||||
sr_exp_data.bit.SDB_N = 0; //LED drivers in shutdown
|
||||
|
||||
/* Write shift register data */
|
||||
SR_EXP_WriteData();
|
||||
|
||||
/* Enable shift register output */
|
||||
SR_EXP_OE_N_ENA;
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
//Note: rp_best_index not used
|
||||
void usb_set_host_kb(uint8_t con, uint8_t rp_best_index) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.S_UP = 0; //HOST to USBC-1
|
||||
sr_exp_data.bit.S_DN1 = 1; //EXTRA to USBC-2
|
||||
g_usb_host_port = USB_HOST_PORT_1; //Save host port
|
||||
sr_exp_data.bit.E_VBUS_1 = 1; //Enable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.S_DN1 = 0; //HOST to USBC-2
|
||||
sr_exp_data.bit.S_UP = 1; //EXTRA to USBC-1
|
||||
g_usb_host_port = USB_HOST_PORT_2; //Save host port
|
||||
sr_exp_data.bit.E_VBUS_2 = 1; //Enable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_set_extra_kb(uint8_t con) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.SRC_1 = 0; //Set CON1 CC A5/B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.SRC_2 = 0; //Set CON2 CC A5/B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_init_host_detection_kb(void) {
|
||||
//Disable 5V
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
|
||||
//Configure default paths
|
||||
sr_exp_data.bit.S_UP = 0; //HOST to USBC-1
|
||||
sr_exp_data.bit.S_DN1 = 1; //EXTRA to USBC-2
|
||||
|
||||
//Configure CC lines
|
||||
sr_exp_data.bit.SRC_1 = 1; //Set CON1 CC A5/B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2 = 1; //Set CON2 CC A5/B5 as Rd 5.1k
|
||||
|
||||
//Enable ports
|
||||
sr_exp_data.bit.E_UP_N = 0; //Enable HOST for use
|
||||
sr_exp_data.bit.E_DN1_N = 0; //Enable EXTRA for use
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
|
||||
//Return 1 if configuration successful
|
||||
//Return 0 otherwise
|
||||
uint8_t usb_attach_port_configure_kb(uint8_t g_usb_host_port, uint16_t usbc_cc_a5_v, uint16_t usbc_cc_b5_v) {
|
||||
if (USB_HOST_IS_1(g_usb_host_port)) { //If host is port 1
|
||||
//Set up port 2
|
||||
usb_set_extra_kb(2);
|
||||
return 1;
|
||||
} else if (USB_HOST_IS_2(g_usb_host_port)) { //If host is on port 2
|
||||
//Set up port 1
|
||||
usb_set_extra_kb(1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
Copyright 2015 Jun Wako <wakojun@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0x04D8
|
||||
#define PRODUCT_ID 0xEE66
|
||||
#define DEVICE_VER 0x0100
|
||||
|
||||
#define MANUFACTURER "Massdrop Inc."
|
||||
#define PRODUCT "Massdrop x Zslane Mercury Rocketeer Keyboard"
|
||||
#define SERIAL_NUM "Unavailable"
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
#define MATRIX_COLS 14
|
||||
|
||||
/* MCU Port name definitions */
|
||||
#define PA 0
|
||||
#define PB 1
|
||||
|
||||
/* Port and Pin definition of key row hardware configuration */
|
||||
#define MATRIX_ROW_PORTS PB, PB, PB, PB, PA
|
||||
#define MATRIX_ROW_PINS 6, 7, 8, 9, 4
|
||||
|
||||
/* Port and Pin definition of key column hardware configuration */
|
||||
#define MATRIX_COL_PORTS PB, PA, PA, PA, PA, PB, PB, PA, PA, PA, PB, PB, PB, PB
|
||||
#define MATRIX_COL_PINS 3, 0, 1, 2, 3, 30, 31, 5, 6, 7, 10, 11, 12, 13
|
||||
|
||||
/* This Shift Register expands available hardware output lines to control additional peripherals */
|
||||
/* It uses four lines from the MCU to provide 16 output lines */
|
||||
/* Shift Register Clock configuration (MCU to ShiftRegister.RCLK) */
|
||||
#define SR_EXP_RCLK_PORT PB
|
||||
#define SR_EXP_RCLK_PIN 14
|
||||
/* Shift Register Output Enable configuration (MCU to ShiftRegister.OE_N) */
|
||||
#define SR_EXP_OE_N_PORT PB
|
||||
#define SR_EXP_OE_N_PIN 15
|
||||
/* SERCOM port to use for Shift Register SPI */
|
||||
/* DATAOUT and SCLK must be configured to use hardware pins of this port */
|
||||
#define SR_EXP_SERCOM_NUM 2
|
||||
/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */
|
||||
#define SR_EXP_DATAOUT_PORT PA
|
||||
#define SR_EXP_DATAOUT_PIN 12
|
||||
#define SR_EXP_DATAOUT_MUX 2
|
||||
/* Shift Register SPI Serial Clock configuration (MCU.SERCOMx.PAD[1] to ShiftRegister.SRCLK) */
|
||||
#define SR_EXP_SCLK_PORT PA
|
||||
#define SR_EXP_SCLK_PIN 13
|
||||
#define SR_EXP_SCLK_MUX 2
|
||||
|
||||
/* Debug LED (Small LED Located near MCU) */
|
||||
/* PCB D94 */
|
||||
#define DEBUG_LED_ENABLE 1
|
||||
#define DEBUG_LED_PORT PA
|
||||
#define DEBUG_LED_PIN 27
|
||||
|
||||
/* Additional debugging ports */
|
||||
/* PCB M25 */
|
||||
#define DEBUG_PORT1_ENABLE 1
|
||||
#define DEBUG_PORT1_PORT PA
|
||||
#define DEBUG_PORT1_PIN 20
|
||||
/* PCB M26 */
|
||||
#define DEBUG_PORT2_ENABLE 1
|
||||
#define DEBUG_PORT2_PORT PA
|
||||
#define DEBUG_PORT2_PIN 21
|
||||
/* PCB M23 */
|
||||
#define DEBUG_PORT3_ENABLE 1
|
||||
#define DEBUG_PORT3_PORT PB
|
||||
#define DEBUG_PORT3_PIN 17
|
||||
|
||||
/* Debug Boot Tracing - During boot sequence, ground this pin to halt and display debug code using Debug LED */
|
||||
/* This is useful in determining which hardware device may have malfunctioned or is improperly configured */
|
||||
/* Feature is automatically disabled after successful boot */
|
||||
/* PCB M27 */
|
||||
#define DEBUG_BOOT_TRACING_ENABLE 1
|
||||
#define DEBUG_BOOT_TRACING_PORT PB
|
||||
#define DEBUG_BOOT_TRACING_PIN 23
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
|
||||
#define BOOTKEY_HOLD_MS 2000
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
//#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
//#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* Force boot in NKRO mode */
|
||||
//#define FORCE_NKRO
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
* These options are also useful to firmware size reduction.
|
||||
*/
|
||||
|
||||
/* disable debug print */
|
||||
//#define NO_DEBUG
|
||||
|
||||
/* disable print */
|
||||
//#define NO_PRINT
|
||||
|
||||
/* disable action features */
|
||||
//#define NO_ACTION_LAYER
|
||||
//#define NO_ACTION_TAPPING
|
||||
//#define NO_ACTION_ONESHOT
|
||||
//#define NO_ACTION_MACRO
|
||||
//#define NO_ACTION_FUNCTION
|
||||
|
||||
#define RGB_MATRIX_KEYPRESSES
|
||||
#define RGB_MATRIX_LED_PROCESS_LIMIT 15
|
||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 10
|
||||
#define RGB_MATRIX_EXTRA_TOG
|
||||
|
||||
#include "config_led.h"
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//ADC configuration table column indices
|
||||
#define ADC_PORT 0
|
||||
#define ADC_PIN 1
|
||||
#define ADC_MUX 2
|
||||
#define ADC_INDEX 3
|
||||
#define ADC_MUXPOS 4
|
||||
#define ADC_REFSEL 5
|
||||
#define ADC_SAMPLENUM 6
|
||||
#define ADC_SAMPLEN 7
|
||||
|
||||
//ADC configuration table row indices
|
||||
#define ADC_5V 0 //5V bus voltage
|
||||
#define ADC_C1A5 1 //Connector 1 A5 CC voltage
|
||||
#define ADC_C1B5 2 //Connector 1 B5 CC voltage
|
||||
#define ADC_C2A5 3 //Connector 2 A5 CC voltage
|
||||
#define ADC_C2B5 4 //Connector 2 B5 CC voltage
|
||||
#define ADC_C1I 5 //Connector 1 current
|
||||
#define ADC_C2I 6 //Connector 2 current
|
||||
|
||||
//ADC_PORT: PORT of the PIN on the MCU (Ex: 0 = PA, 1 = PB, ...)
|
||||
// Set ADC_PORT to ADC_NA if it is not available for use
|
||||
//ADC_PIN: PIN on the MCU (Ex: 0 = 00, 1 = 01, 12 = 12, ...)
|
||||
//ADC_MUX: PMUX setting for the MCU PIN (Ex: 0 = A, 1 = B, 2 = C, ...)
|
||||
//ADC_INDEX: ADC to use (Ex: 0 = ADC0, 1 = ADC1, ...)
|
||||
//ADC_MUXPOS: MUXPOS setting to read on the ADC (Use macros from Atmel library adc.h ADC_INPUTCTRL_MUXPOS_AIN*_Val)
|
||||
//ADC_REFSEL: Reference the ADC is to use (Use macros from Atmel library adc.h ADC_REFCTRL_REFSEL_*_Val)
|
||||
//ADC_SAMPLENUM: Number of samples to average for output (Use macros from Atmel library adc.h ADC_AVGCTRL_SAMPLENUM_*_Val)
|
||||
//ADC_SAMPLEN: Sampling time for each sample in units of CLK_ADC cycles depending on the ADC clock frequency
|
||||
// ADC_PORT ADC_MUX
|
||||
// | ADC_PIN | ADC_INDEX
|
||||
// | | | | ADC_MUXPOS ADC_REFSEL ADC_SAMPLENUM ADC_SAMPLEN
|
||||
#define ADC_CONFIG_5V 1, 0, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN12_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C1A5 1, 2, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN14_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C1B5 1, 4, 1, 1, ADC_INPUTCTRL_MUXPOS_AIN6_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C2A5 1, 1, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN13_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C2B5 1, 5, 1, 1, ADC_INPUTCTRL_MUXPOS_AIN7_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C1I 0, 10, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN10_Val, ADC_REFCTRL_REFSEL_INTVCC1_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C2I 0, 11, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN11_Val, ADC_REFCTRL_REFSEL_INTVCC1_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
|
||||
//Conversion values dependant upon the circuitry
|
||||
#define ADC_I_MILLIAMPS_PER_COUNT -0.000980472f
|
||||
#define ADC_I_MILLIAMPS_OFFSET 1.979711769f
|
||||
#define ADC_5V_VOLTS_PER_COUNT 0.001904297f
|
||||
#define ADC_5V_VOLTS_OFFSET 0.0f
|
||||
#define ADC_5V_NOMINAL 5.0f
|
||||
#define ADC_5V_NOMINAL_COUNTS (ADC_5V_NOMINAL / ADC_5V_VOLTS_PER_COUNT)
|
||||
|
||||
//Conversion macros
|
||||
#define ADC_CI_C2I(macounts) ((float)macounts * ADC_I_MILLIAMPS_PER_COUNT + ADC_I_MILLIAMPS_OFFSET) //Converts connector current counts to milliamps
|
||||
#define ADC_CI_I2C(ma) (uint16_t)((((float)ma - ADC_I_MILLIAMPS_OFFSET) / ADC_I_MILLIAMPS_PER_COUNT)) //Converts milliamps to connector current counts
|
||||
#define ADC_5V_C2V(icounts) ((float)icounts * ADC_5V_VOLTS_PER_COUNT + ADC_5V_VOLTS_OFFSET) //Converts 5V Bus counts to volts
|
||||
#define ADC_5V_V2C(v) (uint16_t)((((float)v - ADC_5V_VOLTS_OFFSET) / ADC_5V_VOLTS_PER_COUNT)) //Converts 5V Bus volts to counts
|
||||
#define ADC_CC_5VCOR(v5counts, cc) ((float)v5counts == 0 ? 0 : (uint16_t)(ADC_5V_NOMINAL_COUNTS / (float)v5counts * (float)cc)) //Corrects CC counts to nominal 5V value
|
||||
|
||||
//Note: The extra port's onboard/external range is not reliable for onboard/external detection due to varying device implementations,
|
||||
// so instead the extra port will follow the host port connection of onboard or external. We will still use
|
||||
// a nominal value for device detection with a wider range though.
|
||||
#define ADC_USBC_ONBOARD 951 //ADC value indicating the USB-C Connector is on main PCB
|
||||
#define ADC_USBC_EXTERNAL 881 //ADC value indicating the USB-C Connector is on external PCB
|
||||
#define ADC_USBC_RANGE ((ADC_USBC_ONBOARD - ADC_USBC_EXTERNAL) / 2) //Range of detection for extra port Rd
|
||||
#define ADC_USBC_EXTRA_NOMINAL ((ADC_USBC_ONBOARD + ADC_USBC_EXTERNAL) / 2) //Nominal ADC value for detection of connected device
|
||||
#define ADC_USBC_EXTRA_TOLERANCE (0.20f) //Tolerance for Rd
|
||||
#define ADC_USBC_EXTRA_ADC_MAX ((float)ADC_USBC_EXTRA_NOMINAL + ((float)ADC_USBC_EXTRA_NOMINAL * ADC_USBC_EXTRA_TOLERANCE)) //Rd ADC max counts
|
||||
#define ADC_USBC_EXTRA_ADC_MIN ((float)ADC_USBC_EXTRA_NOMINAL - ((float)ADC_USBC_EXTRA_NOMINAL * ADC_USBC_EXTRA_TOLERANCE)) //Rd ADC min counts
|
||||
|
||||
#define USBC_IS_SINK(a5, b5) ((a5 > ADC_USBC_EXTRA_ADC_MIN && a5 < ADC_USBC_EXTRA_ADC_MAX) || \
|
||||
(b5 > ADC_USBC_EXTRA_ADC_MIN && b5 < ADC_USBC_EXTRA_ADC_MAX))
|
||||
|
||||
#define ADC_USBC_RP_DELTA_MAX 400 //Amount of noise to tolerate for Rp detection (this can be very generous as long as ranges do not overlap)
|
||||
|
||||
#define ADC_USBC_RP_TYPES 3 //56k, 22k, 10k
|
||||
#define ADC_USBC_CON_TYPES 2 //Onboard, External
|
||||
#define ADC_USBC_TYPES (ADC_USBC_RP_TYPES * ADC_USBC_CON_TYPES)
|
||||
|
||||
//These are the indices for ADC_USBC_RP_NOM
|
||||
//xxK is a ADC_USBC_RP_TYPES
|
||||
//ONB is for the onboard USB-C Connector and must have an even index number
|
||||
//EXT is for the external USB-C Connector and must have an odd index number
|
||||
#define ADC_USBC_56K_ONB 0
|
||||
#define ADC_USBC_56K_EXT 1
|
||||
#define ADC_USBC_22K_ONB 2
|
||||
#define ADC_USBC_22K_EXT 3
|
||||
#define ADC_USBC_10K_ONB 4
|
||||
#define ADC_USBC_10K_EXT 5
|
||||
|
||||
#define ADC_USBC_IS_ONB(a) (a % 2 == 0) //Given a ADC_USBC_RP_NOM index, return true if the index refers to an onboard connector
|
||||
#define ADC_USBC_IS_EXT(a) (a % 2 == 1) //Given a ADC_USBC_RP_NOM index, return true if the index refers to an external connector
|
||||
|
||||
//These values are for detecting whether or not the host is connected through the onboard USB or external USB
|
||||
//The counts are calculated from a nominal 5V bus, then scaled depending on the measured 5V bus
|
||||
//External connectors are detected through addition of a resistor to slightly drop readings while remaining within USB-C CC tolerances
|
||||
//Set a value to -1 if it is not supported
|
||||
//Source Rp 56k-Onb 56k-Ext 22k-Onb 22k-Ext 10k-Onb 10k-Ext
|
||||
#define ADC_USBC_RP_NOM 999, 852, 2232, 1940, 3955, 3528
|
||||
|
||||
extern uint16_t adc_usbc_rp_nominal[ADC_USBC_TYPES];
|
||||
|
||||
#define POWER_CHECK_INTERVAL 1 //How often to check power usage for adjustment and safety (ms)
|
||||
#define V_5V_AVGS 20 //Number of 5V readings to average for algorithms wanting stable readings rather than instantaneous
|
||||
@@ -1,139 +0,0 @@
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
#include "rocketeer.h"
|
||||
|
||||
#include "led_matrix.h"
|
||||
#include "rgb_matrix.h"
|
||||
#include "config_led.h"
|
||||
|
||||
led_config_t g_led_config = {
|
||||
{
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
|
||||
{ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 },
|
||||
{ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, NO_LED, 40 },
|
||||
{ 41, NO_LED, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NO_LED, 52 },
|
||||
{ 53, 54, 55, NO_LED, NO_LED, NO_LED, 56, NO_LED, NO_LED, NO_LED, 57, 58, 59, 60 }
|
||||
},
|
||||
{
|
||||
{ 8, 56 },
|
||||
{ 22, 56 },
|
||||
{ 35, 56 },
|
||||
{ 49, 56 },
|
||||
{ 63, 56 },
|
||||
{ 77, 56 },
|
||||
{ 91, 56 },
|
||||
{ 105, 56 },
|
||||
{ 118, 56 },
|
||||
{ 132, 56 },
|
||||
{ 146, 56 },
|
||||
{ 160, 56 },
|
||||
{ 174, 56 },
|
||||
{ 195, 56 },
|
||||
|
||||
{ 11, 44 },
|
||||
{ 28, 44 },
|
||||
{ 42, 44 },
|
||||
{ 56, 44 },
|
||||
{ 70, 44 },
|
||||
{ 84, 44 },
|
||||
{ 98, 44 },
|
||||
{ 112, 44 },
|
||||
{ 125, 44 },
|
||||
{ 139, 44 },
|
||||
{ 153, 44 },
|
||||
{ 167, 44 },
|
||||
{ 181, 44 },
|
||||
{ 198, 44 },
|
||||
|
||||
{ 13, 32 },
|
||||
{ 32, 32 },
|
||||
{ 46, 32 },
|
||||
{ 60, 32 },
|
||||
{ 73, 32 },
|
||||
{ 87, 32 },
|
||||
{ 101, 32 },
|
||||
{ 115, 32 },
|
||||
{ 129, 32 },
|
||||
{ 143, 32 },
|
||||
{ 156, 32 },
|
||||
{ 170, 32 },
|
||||
// ___
|
||||
{ 193, 32 },
|
||||
|
||||
{ 16, 19 },
|
||||
{ 39, 19 },
|
||||
{ 53, 19 },
|
||||
{ 67, 19 },
|
||||
{ 80, 19 },
|
||||
{ 94, 19 },
|
||||
{ 108, 19 },
|
||||
{ 122, 19 },
|
||||
{ 136, 19 },
|
||||
{ 150, 19 },
|
||||
{ 163, 19 },
|
||||
// ___
|
||||
{ 182, 19 },
|
||||
|
||||
{ 9, 7 },
|
||||
{ 27, 7 },
|
||||
{ 44, 7 },
|
||||
// ___
|
||||
// ___
|
||||
// ___
|
||||
{ 96, 7 },
|
||||
// ___
|
||||
// ___
|
||||
// ___
|
||||
{ 148, 7 },
|
||||
{ 165, 7 },
|
||||
{ 188, 7 },
|
||||
{ 201, 7 },
|
||||
|
||||
// Underglow
|
||||
{ 15, 49 },
|
||||
{ 35, 49 },
|
||||
{ 53, 49 },
|
||||
{ 70, 49 },
|
||||
{ 88, 49 },
|
||||
{ 106, 49 },
|
||||
{ 124, 49 },
|
||||
{ 142, 49 },
|
||||
{ 161, 49 },
|
||||
{ 179, 49 },
|
||||
{ 197, 49 },
|
||||
{ 15, 12 },
|
||||
{ 35, 12 },
|
||||
{ 53, 12 },
|
||||
{ 70, 12 },
|
||||
{ 88, 12 },
|
||||
{ 106, 12 },
|
||||
{ 124, 12 },
|
||||
{ 142, 12 },
|
||||
{ 161, 12 },
|
||||
{ 176, 12 },
|
||||
{ 194, 12 },
|
||||
{ 15, 37 },
|
||||
{ 15, 25 },
|
||||
{ 197, 37 },
|
||||
{ 197, 25 }
|
||||
},
|
||||
{
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
1, 1, 1, 4, 1, 1, 1, 1,
|
||||
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef USB_LED_INDICATOR_ENABLE
|
||||
void rgb_matrix_indicators_kb(void)
|
||||
{
|
||||
led_matrix_indicators();
|
||||
}
|
||||
#endif // USB_LED_INDICATOR_ENABLE
|
||||
|
||||
#endif
|
||||
@@ -1,160 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Define number of IS31FL3733 drivers being used (1...16)
|
||||
#define ISSI3733_DRIVER_COUNT 2
|
||||
#define DRIVER_LED_TOTAL ISSI3733_LED_COUNT
|
||||
|
||||
//Hardware address of each driver (Refer to IS31FL3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE }
|
||||
|
||||
//LED I2C bus speed
|
||||
#define I2C_HZ 580000
|
||||
|
||||
//Count of LED bodies
|
||||
#define ISSI3733_LED_COUNT 87
|
||||
|
||||
#define LED_GCR_MAX 165 //Max GCR value (0 - 255) WARNING: Raising this value may overload the LED drivers and USB bus
|
||||
#define LED_GCR_STEP 10 //GCR increment/decrement value
|
||||
|
||||
#ifdef USE_MASSDROP_CONFIGURATOR
|
||||
#define ANIMATION_SPEED_STEP 1
|
||||
|
||||
#define BREATHE_STEP 1
|
||||
#define BREATHE_MIN_STEP 0
|
||||
#define BREATHE_MAX_STEP 255
|
||||
#endif
|
||||
|
||||
//Default Global Current Register value (Default brightness 0 - 255)
|
||||
#define ISSI3733_GCR_DEFAULT LED_GCR_MAX
|
||||
|
||||
//Automatic power rollback and recovery
|
||||
#define V5_HIGH 2494 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2434 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2206 //5V catastrophic level (Host USB port potential to shut down)
|
||||
|
||||
//LED Mapping - More practically generated from a spreadsheet program
|
||||
//id: ID of the LED (Sync with PCB callouts)
|
||||
//x: Physical X coordinate of LED (units do not matter)
|
||||
//y: Physical Y coordinate of LED (units do not matter)
|
||||
//drv: 1-Based index of ISSI3773_DRIVER_ADDRESSES
|
||||
//cs: Matrix wiring CS col (1-16)
|
||||
//swr: Matrix wiring SW Red row (1-12)
|
||||
//swg: Matrix wiring SW Green row (1-12)
|
||||
//swb: Matrix wiring SW Blue row (1-12)
|
||||
//scan: Associated key matrix scancode (set 255 if none or 254 for LED to turn off in alternating mode)
|
||||
//Note: Origin 0,0 may be located anywhere as the software will do the final layout
|
||||
#define ISSI3733_LED_MAP { \
|
||||
{ .id = 1, .x = 0.36, .y = 3.362, .adr = { .drv = 2, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 0 }, \
|
||||
{ .id = 2, .x = 1.11, .y = 3.362, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 1 }, \
|
||||
{ .id = 3, .x = 1.86, .y = 3.362, .adr = { .drv = 2, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 2 }, \
|
||||
{ .id = 4, .x = 2.61, .y = 3.362, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 3 }, \
|
||||
{ .id = 5, .x = 3.36, .y = 3.362, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 4 }, \
|
||||
{ .id = 6, .x = 4.11, .y = 3.362, .adr = { .drv = 2, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 5 }, \
|
||||
{ .id = 7, .x = 4.86, .y = 3.362, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 6 }, \
|
||||
{ .id = 8, .x = 5.61, .y = 3.362, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 7 }, \
|
||||
{ .id = 9, .x = 6.36, .y = 3.362, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 8 }, \
|
||||
{ .id = 10, .x = 7.11, .y = 3.362, .adr = { .drv = 1, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 9 }, \
|
||||
{ .id = 11, .x = 7.86, .y = 3.362, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 10 }, \
|
||||
{ .id = 12, .x = 8.61, .y = 3.362, .adr = { .drv = 1, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 11 }, \
|
||||
{ .id = 13, .x = 9.36, .y = 3.362, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 12 }, \
|
||||
{ .id = 14, .x = 10.485, .y = 3.362, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 13 }, \
|
||||
{ .id = 15, .x = 0.548, .y = 2.612, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 14 }, \
|
||||
{ .id = 16, .x = 1.485, .y = 2.612, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 15 }, \
|
||||
{ .id = 17, .x = 2.235, .y = 2.612, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 16 }, \
|
||||
{ .id = 18, .x = 2.985, .y = 2.612, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 17 }, \
|
||||
{ .id = 19, .x = 3.735, .y = 2.612, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 18 }, \
|
||||
{ .id = 20, .x = 4.485, .y = 2.612, .adr = { .drv = 2, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 19 }, \
|
||||
{ .id = 21, .x = 5.235, .y = 2.612, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 20 }, \
|
||||
{ .id = 22, .x = 5.985, .y = 2.612, .adr = { .drv = 1, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 21 }, \
|
||||
{ .id = 23, .x = 6.735, .y = 2.612, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 22 }, \
|
||||
{ .id = 24, .x = 7.485, .y = 2.612, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 23 }, \
|
||||
{ .id = 25, .x = 8.235, .y = 2.612, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 24 }, \
|
||||
{ .id = 26, .x = 8.985, .y = 2.612, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 25 }, \
|
||||
{ .id = 27, .x = 9.735, .y = 2.612, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 26 }, \
|
||||
{ .id = 28, .x = 10.673, .y = 2.612, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 27 }, \
|
||||
{ .id = 29, .x = 0.641, .y = 1.862, .adr = { .drv = 2, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 28 }, \
|
||||
{ .id = 30, .x = 1.673, .y = 1.862, .adr = { .drv = 2, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 29 }, \
|
||||
{ .id = 31, .x = 2.423, .y = 1.862, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 30 }, \
|
||||
{ .id = 32, .x = 3.173, .y = 1.862, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 31 }, \
|
||||
{ .id = 33, .x = 3.923, .y = 1.862, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 32 }, \
|
||||
{ .id = 34, .x = 4.673, .y = 1.862, .adr = { .drv = 2, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 33 }, \
|
||||
{ .id = 35, .x = 5.423, .y = 1.862, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 34 }, \
|
||||
{ .id = 36, .x = 6.173, .y = 1.862, .adr = { .drv = 1, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 35 }, \
|
||||
{ .id = 37, .x = 6.923, .y = 1.862, .adr = { .drv = 1, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 36 }, \
|
||||
{ .id = 38, .x = 7.673, .y = 1.862, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 37 }, \
|
||||
{ .id = 39, .x = 8.423, .y = 1.862, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 38 }, \
|
||||
{ .id = 40, .x = 9.173, .y = 1.862, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 39 }, \
|
||||
{ .id = 41, .x = 10.391, .y = 1.862, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 41 }, \
|
||||
{ .id = 42, .x = 0.829, .y = 1.112, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 42 }, \
|
||||
{ .id = 43, .x = 2.048, .y = 1.112, .adr = { .drv = 2, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 44 }, \
|
||||
{ .id = 44, .x = 2.798, .y = 1.112, .adr = { .drv = 2, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 45 }, \
|
||||
{ .id = 45, .x = 3.548, .y = 1.112, .adr = { .drv = 2, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 46 }, \
|
||||
{ .id = 46, .x = 4.298, .y = 1.112, .adr = { .drv = 2, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 47 }, \
|
||||
{ .id = 47, .x = 5.048, .y = 1.112, .adr = { .drv = 2, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 48 }, \
|
||||
{ .id = 48, .x = 5.798, .y = 1.112, .adr = { .drv = 1, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 49 }, \
|
||||
{ .id = 49, .x = 6.548, .y = 1.112, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 50 }, \
|
||||
{ .id = 50, .x = 7.298, .y = 1.112, .adr = { .drv = 1, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 51 }, \
|
||||
{ .id = 51, .x = 8.048, .y = 1.112, .adr = { .drv = 1, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 52 }, \
|
||||
{ .id = 52, .x = 8.798, .y = 1.112, .adr = { .drv = 1, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 53 }, \
|
||||
{ .id = 53, .x = 10.204, .y = 1.112, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 55 }, \
|
||||
{ .id = 54, .x = 0.454, .y = 0.362, .adr = { .drv = 2, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 56 }, \
|
||||
{ .id = 55, .x = 1.391, .y = 0.362, .adr = { .drv = 2, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 57 }, \
|
||||
{ .id = 56, .x = 2.329, .y = 0.362, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 58 }, \
|
||||
{ .id = 57, .x = 5.141, .y = 0.362, .adr = { .drv = 2, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 62 }, \
|
||||
{ .id = 58, .x = 7.954, .y = 0.362, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 66 }, \
|
||||
{ .id = 59, .x = 8.891, .y = 0.362, .adr = { .drv = 1, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 67 }, \
|
||||
{ .id = 60, .x = 9.829, .y = 0.362, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 68 }, \
|
||||
{ .id = 61, .x = 10.766, .y = 0.362, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 69 }, \
|
||||
{ .id = 62, .x = 0.74, .y = 3, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 63, .x = 1.714, .y = 3, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 64, .x = 2.688, .y = 3, .adr = { .drv = 2, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 65, .x = 3.662, .y = 3, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 66, .x = 4.636, .y = 3, .adr = { .drv = 2, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 67, .x = 5.61, .y = 3, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 68, .x = 6.584, .y = 3, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 69, .x = 7.558, .y = 3, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 70, .x = 8.532, .y = 3, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 71, .x = 9.506, .y = 3, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 72, .x = 10.48, .y = 3, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 73, .x = 0.74, .y = 0.74, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 74, .x = 1.714, .y = 0.74, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 75, .x = 2.688, .y = 0.74, .adr = { .drv = 2, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 76, .x = 3.662, .y = 0.74, .adr = { .drv = 2, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 77, .x = 4.636, .y = 0.74, .adr = { .drv = 2, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 78, .x = 5.61, .y = 0.74, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 79, .x = 6.584, .y = 0.74, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 80, .x = 7.558, .y = 0.74, .adr = { .drv = 1, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 81, .x = 8.532, .y = 0.74, .adr = { .drv = 1, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 82, .x = 9.506, .y = 0.74, .adr = { .drv = 1, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 83, .x = 10.48, .y = 0.74, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 84, .x = 0.74, .y = 2.25, .adr = { .drv = 2, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 85, .x = 0.74, .y = 1.5, .adr = { .drv = 2, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 86, .x = 10.48, .y = 2.25, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 87, .x = 10.48, .y = 1.5, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
};
|
||||
|
||||
#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality
|
||||
#ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable)
|
||||
#define USB_LED_NUM_LOCK_SCANCODE 255
|
||||
#define USB_LED_CAPS_LOCK_SCANCODE 28
|
||||
#define USB_LED_SCROLL_LOCK_SCANCODE 21
|
||||
#define USB_LED_COMPOSE_SCANCODE 255
|
||||
#define USB_LED_KANA_SCANCODE 255
|
||||
#endif //USB_LED_INDICATOR_ENABLE
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/* Data structure to define Shift Register output expander hardware */
|
||||
/* This structure gets shifted into registers LSB first */
|
||||
typedef union {
|
||||
struct {
|
||||
uint16_t RSVD4:1; /*!< bit: 0 */
|
||||
uint16_t SRC_2_B5:1; /*!< bit: 1 USBC-2 CC B5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t SRC_1_B5:1; /*!< bit: 2 USBC-1 CC B5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t S_B_EXT:1; /*!< bit: 3 B TO EX-1 WHEN 0, B TO USBC-1 WHEN 1 */
|
||||
uint16_t SDB_N:1; /*!< bit: 4 SHUTDOWN IS31FL3733 CHIPS WHEN 0, RUN WHEN 1 */
|
||||
uint16_t IRST:1; /*!< bit: 5 RESET IS31FL3733 I2C WHEN 1, RUN WHEN 0 */
|
||||
uint16_t SRC_2_A5:1; /*!< bit: 6 USBC-2 CC A5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t SRC_1_A5:1; /*!< bit: 7 USBC-1 CC A5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t E_VBUS_2:1; /*!< bit: 8 ENABLE 5V TO USBC-2/EX-2 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t E_VBUS_1:1; /*!< bit: 9 ENABLE 5V TO USBC-1/EX-1 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t ENB:1; /*!< bit: 10 ENABLE CHANNEL B USBC-1/EX-1 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t S_A_EXT:1; /*!< bit: 11 A TO USBC-2 WHEN 0, A TO EX-2 WHEN 1 */
|
||||
uint16_t ENA:1; /*!< bit: 12 ENABLE CHANNEL A USBC-2/EX-2 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t S_A_UP:1; /*!< bit: 13 DN1 TO A & UP TO B WHEN 1, DN1 TO B & UP TO A WHEN 0 */
|
||||
uint16_t HUB_RESET_N:1; /*!< bit: 14 RESET USB HUB WHEN 0, RUN WHEN 1 */
|
||||
uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */
|
||||
} bit; /*!< Structure used for bit access */
|
||||
uint16_t reg; /*!< Type used for register access */
|
||||
} sr_exp_t;
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Macros to Enable, Disable, and Update USB 5V bus connections
|
||||
#define USBC_CFG_5V1_VAR sr_exp_data.bit.E_VBUS_1 //Variable storing USBC-1 5V Bus state
|
||||
#define USBC_CFG_5V1_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
#define USBC_CFG_5V2_VAR sr_exp_data.bit.E_VBUS_2 //Variable storing USBC-2 5V Bus state
|
||||
#define USBC_CFG_5V2_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
@@ -1,286 +0,0 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum rocketeer_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL \
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_UP, _______, _______, U_T_AGCR,\
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, KC_INS, KC_HOME, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, KC_END, KC_PGDN, KC_VOLD, KC_VOLU, _______, \
|
||||
_______, _______, _______, DBG_FAC, KC_MUTE, _______, KC_APP, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
_______ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
};
|
||||
|
||||
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
|
||||
else gcr_desired += LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_BRD:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
|
||||
else gcr_desired -= LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
else led_animation_id++;
|
||||
}
|
||||
return false;
|
||||
case L_PTP:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == 0) led_animation_id = led_setups_count - 1;
|
||||
else led_animation_id--;
|
||||
}
|
||||
return false;
|
||||
case L_PSI:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed += ANIMATION_SPEED_STEP;
|
||||
}
|
||||
return false;
|
||||
case L_PSD:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed -= ANIMATION_SPEED_STEP;
|
||||
if (led_animation_speed < 0) led_animation_speed = 0;
|
||||
}
|
||||
return false;
|
||||
case L_T_MD:
|
||||
if (record->event.pressed) {
|
||||
led_lighting_mode++;
|
||||
if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL;
|
||||
}
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
if (record->event.pressed) {
|
||||
led_animation_breathing = !led_animation_breathing;
|
||||
if (led_animation_breathing) {
|
||||
gcr_breathe = gcr_desired;
|
||||
led_animation_breathe_cur = BREATHE_MIN_STEP;
|
||||
breathe_dir = 1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_MTRX:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
|
||||
}
|
||||
return false;
|
||||
case DBG_KBD:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
|
||||
}
|
||||
return false;
|
||||
case DBG_MOU:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
|
||||
}
|
||||
return false;
|
||||
case MD_BOOT:
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
void rgb_matrix_init_user(void) {
|
||||
led_lighting_mode = LED_MODE_INDICATORS_ONLY; //Start Rocketeer with only indicator lights
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
//LEDs are normally inactive, no processing is performed on them
|
||||
//Flags are used in matching criteria for an LED to be active and indicate how to color it
|
||||
//Flags can be found in tmk_core/protocol/arm_atsam/led_matrix.h (prefixed with LED_FLAG_)
|
||||
//LED IDs can be found in config_led.h in the keyboard's directory
|
||||
//Examples are below
|
||||
|
||||
//All LEDs use the user's selected pattern (this is the factory default)
|
||||
{ .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
|
||||
//Specific LEDs use the user's selected pattern while all others are off
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_ROTATE_PATTERN, .id0 = 0xFFFFFFFF, .id1 = 0xAAAAAAAA, .id2 = 0x55555555, .id3 = 0x11111111 },
|
||||
|
||||
//Specific LEDs use specified RGB values while all others are off
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 0xFF, .id1 = 0x00FF, .id2 = 0x0000FF00, .id3 = 0xFF000000, .r = 75, .g = 150, .b = 225 },
|
||||
|
||||
//All LEDs use the user's selected pattern
|
||||
//On layer 1, all key LEDs (except the top row which keeps active pattern) are red while all edge LEDs are green
|
||||
//When layer 1 is active, key LEDs use red (id0 32 - 17: 1111 1111 1111 1111 0000 0000 0000 0000 = 0xFFFF0000) (except top row 16 - 1)
|
||||
//When layer 1 is active, key LEDs use red (id1 64 - 33: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//When layer 1 is active, key LEDs use red (id2 87 - 65: 0000 0000 0111 1111 1111 1111 1111 1111 = 0x007FFFFF)
|
||||
//When layer 1 is active, edge LEDs use green (id2 95 - 88: 1111 1111 1000 0000 0000 0000 0000 0000 = 0xFF800000)
|
||||
//When layer 1 is active, edge LEDs use green (id3 119 - 96: 0000 0000 1111 1111 1111 1111 1111 1111 = 0x00FFFFFF)
|
||||
// { .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id0 = 0xFFFF0000, .id1 = 0xFFFFFFFF, .id2 = 0x007FFFFF, .r = 255, .layer = 1 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id2 = 0xFF800000, .id3 = 0x00FFFFFF, .g = 127, .layer = 1 },
|
||||
|
||||
//All key LEDs use red while edge LEDs use the active pattern
|
||||
//All key LEDs use red (id0 32 - 1: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//All key LEDs use red (id1 64 - 33: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//All key LEDs use red (id2 87 - 65: 0000 0000 0111 1111 1111 1111 1111 1111 = 0x007FFFFF)
|
||||
//Edge uses active pattern (id2 95 - 88: 1111 1111 1000 0000 0000 0000 0000 0000 = 0xFF800000)
|
||||
//Edge uses active pattern (id3 119 - 96: 0000 0000 1111 1111 1111 1111 1111 1111 = 0x00FFFFFF)
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 0xFFFFFFFF, .id1 = 0xFFFFFFFF, .id2 = 0x007FFFFF, .r = 255 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_ROTATE_PATTERN , .id2 = 0xFF800000, .id3 = 0x00FFFFFF },
|
||||
|
||||
//end must be set to 1 to indicate end of instruction set
|
||||
{ .end = 1 }
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
# This keymap requires Massdrop Configurator support
|
||||
OPT_DEFS += -DUSE_MASSDROP_CONFIGURATOR
|
||||
@@ -1,256 +0,0 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum rocketeer_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
|
||||
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL \
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_UP, _______, _______, U_T_AGCR,\
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, KC_INS, KC_HOME, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, KC_END, KC_PGDN, KC_VOLD, KC_VOLU, _______, \
|
||||
_______, _______, _______, DBG_FAC, KC_MUTE, _______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
_______ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
};
|
||||
|
||||
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
|
||||
else gcr_desired += LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_BRD:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
|
||||
else gcr_desired -= LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
else led_animation_id++;
|
||||
}
|
||||
return false;
|
||||
case L_PTP:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == 0) led_animation_id = led_setups_count - 1;
|
||||
else led_animation_id--;
|
||||
}
|
||||
return false;
|
||||
case L_PSI:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed += ANIMATION_SPEED_STEP;
|
||||
}
|
||||
return false;
|
||||
case L_PSD:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed -= ANIMATION_SPEED_STEP;
|
||||
if (led_animation_speed < 0) led_animation_speed = 0;
|
||||
}
|
||||
return false;
|
||||
case L_T_MD:
|
||||
if (record->event.pressed) {
|
||||
led_lighting_mode++;
|
||||
if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL;
|
||||
}
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
if (record->event.pressed) {
|
||||
led_animation_breathing = !led_animation_breathing;
|
||||
if (led_animation_breathing) {
|
||||
gcr_breathe = gcr_desired;
|
||||
led_animation_breathe_cur = BREATHE_MIN_STEP;
|
||||
breathe_dir = 1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_MTRX:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
|
||||
}
|
||||
return false;
|
||||
case DBG_KBD:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
|
||||
}
|
||||
return false;
|
||||
case DBG_MOU:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
|
||||
}
|
||||
return false;
|
||||
case MD_BOOT:
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
void rgb_matrix_init_user(void) {
|
||||
led_lighting_mode = LED_MODE_INDICATORS_ONLY; //Start Rocketeer with only indicator lights
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
//Please see ../default_md/keymap.c for examples
|
||||
|
||||
//All LEDs use the user's selected pattern (this is the factory default)
|
||||
{ .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
|
||||
//end must be set to 1 to indicate end of instruction set
|
||||
{ .end = 1 }
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
# This keymap requires Massdrop Configurator support
|
||||
OPT_DEFS += -DUSE_MASSDROP_CONFIGURATOR
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "rocketeer.h"
|
||||
|
||||
#include "d51_util.h"
|
||||
#include "debug.h"
|
||||
#include "clks.h"
|
||||
#include <string.h>
|
||||
|
||||
#define MCU_PORTS_USED 2 //PA, PB
|
||||
|
||||
matrix_row_t mlatest[MATRIX_ROWS];
|
||||
matrix_row_t mlast[MATRIX_ROWS];
|
||||
matrix_row_t mdebounced[MATRIX_ROWS];
|
||||
|
||||
uint8_t row_ports[] = { MATRIX_ROW_PORTS };
|
||||
uint8_t row_pins[] = { MATRIX_ROW_PINS };
|
||||
uint8_t col_ports[] = { MATRIX_COL_PORTS };
|
||||
uint8_t col_pins[] = { MATRIX_COL_PINS };
|
||||
uint32_t row_masks[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_kb(void) {
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_kb(void) {
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_user(void) {
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void matrix_init(void)
|
||||
{
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
|
||||
memset(row_masks, 0, sizeof(row_masks));
|
||||
|
||||
//Inputs
|
||||
uint8_t row;
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
PORT->Group[row_ports[row]].DIRCLR.reg = 1 << row_pins[row]; //Input
|
||||
PORT->Group[row_ports[row]].OUTCLR.reg = 1 << row_pins[row]; //Low
|
||||
PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.INEN = 1; //Input Enable,
|
||||
PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.PULLEN = 1; //Pull Enable
|
||||
row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask
|
||||
}
|
||||
|
||||
//Outputs
|
||||
uint8_t col;
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low
|
||||
}
|
||||
|
||||
matrix_init_quantum();
|
||||
}
|
||||
|
||||
uint64_t mdebouncing = 0;
|
||||
bool debouncing = false;
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint64_t timer;
|
||||
uint8_t row;
|
||||
uint8_t col;
|
||||
uint32_t scans[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer
|
||||
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
//Set output
|
||||
PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output
|
||||
wait_us(1); //Delay for output
|
||||
|
||||
//Read input (add unique ports as needed, PA, PB, PC, etc)
|
||||
scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data
|
||||
scans[PB] = PORT->Group[PB].IN.reg & row_masks[PB]; //Read PA row pins data
|
||||
|
||||
//Clear output
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
//Move scan bits from scans array into proper row bit locations
|
||||
if (scans[row_ports[row]] & (1 << row_pins[row]))
|
||||
mlatest[row] |= 1 << col;
|
||||
}
|
||||
}
|
||||
|
||||
timer = timer_read64();
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
if (mlast[row] != mlatest[row]) {
|
||||
debouncing = true;
|
||||
mdebouncing = timer + DEBOUNCE;
|
||||
}
|
||||
|
||||
mlast[row] = mlatest[row];
|
||||
}
|
||||
|
||||
if (debouncing && timer >= mdebouncing)
|
||||
{
|
||||
for (row = 0; row < MATRIX_ROWS; row++) {
|
||||
mdebounced[row] = mlatest[row];
|
||||
}
|
||||
|
||||
mdebouncing = 0;
|
||||
debouncing = false;
|
||||
}
|
||||
|
||||
matrix_scan_quantum();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
matrix_row_t matrix_get_row(uint8_t row)
|
||||
{
|
||||
return mdebounced[row];
|
||||
}
|
||||
|
||||
void matrix_print(void)
|
||||
{
|
||||
char buf[(MATRIX_COLS+8)*(MATRIX_ROWS+1)] = "R C";
|
||||
char *pbuf = buf+3;
|
||||
uint32_t cols;
|
||||
uint32_t rows;
|
||||
matrix_row_t row;
|
||||
|
||||
for (cols = 1; cols <= MATRIX_COLS; cols++)
|
||||
{
|
||||
*pbuf = (cols%10)+48;
|
||||
pbuf++;
|
||||
}
|
||||
*pbuf = '\r'; pbuf++;
|
||||
*pbuf = '\n'; pbuf++;
|
||||
|
||||
for (rows = 1; rows <= MATRIX_ROWS; rows++)
|
||||
{
|
||||
row = matrix_get_row(rows-1);
|
||||
if (rows < 10) { *pbuf = rows+48; pbuf++; *pbuf = ' '; pbuf++; *pbuf = ' '; pbuf++; }
|
||||
else { *pbuf = (rows/10)+48; pbuf++; *pbuf = (rows%10)+48; pbuf++; *pbuf = ' '; pbuf++; }
|
||||
for (cols = 0; cols < MATRIX_COLS; cols++)
|
||||
{
|
||||
if (row & 1 << cols) *pbuf = 'X';
|
||||
else *pbuf = '.';
|
||||
pbuf++;
|
||||
}
|
||||
*pbuf = '\r'; pbuf++;
|
||||
*pbuf = '\n'; pbuf++;
|
||||
}
|
||||
*pbuf = 0;
|
||||
dprint(buf);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
Copyright 2011 Jun Wako <wakojun@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
#ifndef MATRIX_H
|
||||
#define MATRIX_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "keyboard.h"
|
||||
|
||||
#if (MATRIX_COLS <= 8)
|
||||
typedef uint8_t matrix_row_t;
|
||||
#elif (MATRIX_COLS <= 16)
|
||||
typedef uint16_t matrix_row_t;
|
||||
#elif (MATRIX_COLS <= 32)
|
||||
typedef uint32_t matrix_row_t;
|
||||
#else
|
||||
#error "MATRIX_COLS: invalid value"
|
||||
#endif
|
||||
|
||||
#define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1<<col))
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* number of matrix rows */
|
||||
uint8_t matrix_rows(void);
|
||||
/* number of matrix columns */
|
||||
uint8_t matrix_cols(void);
|
||||
/* should be called at early stage of startup before matrix_init.(optional) */
|
||||
void matrix_setup(void);
|
||||
/* intialize matrix for scaning. */
|
||||
void matrix_init(void);
|
||||
/* scan all key states on matrix */
|
||||
uint8_t matrix_scan(void);
|
||||
/* whether modified from previous scan. used after matrix_scan. */
|
||||
bool matrix_is_modified(void) __attribute__ ((deprecated));
|
||||
/* whether a switch is on */
|
||||
bool matrix_is_on(uint8_t row, uint8_t col);
|
||||
/* matrix state on row */
|
||||
matrix_row_t matrix_get_row(uint8_t row);
|
||||
/* print matrix for debug */
|
||||
void matrix_print(void);
|
||||
|
||||
/* power control */
|
||||
void matrix_power_up(void);
|
||||
void matrix_power_down(void);
|
||||
|
||||
/* executes code for Quantum */
|
||||
void matrix_init_quantum(void);
|
||||
void matrix_scan_quantum(void);
|
||||
|
||||
void matrix_init_kb(void);
|
||||
void matrix_scan_kb(void);
|
||||
|
||||
void matrix_init_user(void);
|
||||
void matrix_scan_user(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,34 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
#include "config_led.h"
|
||||
#include "matrix.h"
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "led_matrix.h" //For led keycodes
|
||||
#include "usb/udi_cdc.h"
|
||||
#include "usb/usb2422.h"
|
||||
|
||||
#define LAYOUT( \
|
||||
K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, \
|
||||
K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, \
|
||||
K29, K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \
|
||||
K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, \
|
||||
K57, K58, K59, K60, K61 \
|
||||
) { \
|
||||
{ K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14 }, \
|
||||
{ K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28 }, \
|
||||
{ K29, K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, KC_NO, K41 }, \
|
||||
{ K42, KC_NO, K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, KC_NO, K53 }, \
|
||||
{ K54, K55, K56, KC_NO, KC_NO, KC_NO, K57, KC_NO, KC_NO, KC_NO, K58, K59, K60, K61 } \
|
||||
}
|
||||
|
||||
#define TOGGLE_FLAG_AND_PRINT(var, name) { \
|
||||
if (var) { \
|
||||
dprintf(name " disabled\r\n"); \
|
||||
var = !var; \
|
||||
} else { \
|
||||
var = !var; \
|
||||
dprintf(name " enabled\r\n"); \
|
||||
} \
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
# project specific files
|
||||
SRC = matrix.c
|
||||
SRC += config_led.c
|
||||
SRC += spi.c
|
||||
SRC += usb.c
|
||||
|
||||
#For platform and packs
|
||||
ARM_ATSAM = SAMD51J18A
|
||||
MCU = cortex-m4
|
||||
|
||||
CUSTOM_MATRIX = yes
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
VIRTSER_ENABLE = no # USB Serial Driver
|
||||
RAW_ENABLE = no # Raw device
|
||||
AUTO_SHIFT_ENABLE = no # Auto Shift
|
||||
|
||||
# Custom RGB matrix handling
|
||||
RGB_MATRIX_ENABLE = custom
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void SR_EXP_Init_kb(void) {
|
||||
/* Initialize shift register */
|
||||
SR_EXP_OE_N_DIS;
|
||||
SR_EXP_RCLK_HI;
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DORD = 1; //Data Order - LSB is transferred first
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPOL = 1; //Clock Polarity - SCK high when idle. Leading edge of cycle is falling. Trailing rising.
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPHA = 1; //Clock Phase - Leading Edge Falling, change, Trailing Edge - Rising, sample
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DIPO = 3; //Data In Pinout - SERCOM PAD[3] is used as data input (Configure away from DOPO. Not using input.)
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DOPO = 0; //Data Output PAD[0], Serial Clock PAD[1]
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.MODE = 3; //Operating Mode - Master operation
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.ENABLE = 1; //Enable - Peripheral is enabled or being enabled
|
||||
while (SR_EXP_SERCOM->SPI.SYNCBUSY.bit.ENABLE) { DBGC(DC_SPI_EXP_SYNC_ENABLING); }
|
||||
|
||||
/* Set default shift register values */
|
||||
sr_exp_data.reg = 0; //Clear data register
|
||||
sr_exp_data.bit.HUB_CONNECT = 0; //USB Hub disconnected
|
||||
sr_exp_data.bit.HUB_RESET_N = 0; //USB Hub in reset state
|
||||
|
||||
sr_exp_data.bit.SRC_1_A5 = 1; //Set CON1 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_1_B5 = 1; //Set CON1 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_A5 = 1; //Set CON2 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_B5 = 1; //Set CON2 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.S_A_UP = 0; //0 = DN1 to A and UP to B, 1 = DN1 to B and UP to A
|
||||
sr_exp_data.bit.S_A_EXT = 1; //0 = Onboard, 1 = Offboard
|
||||
sr_exp_data.bit.S_B_EXT = 0; //1 = Onboard, 0 = Offboard
|
||||
|
||||
sr_exp_data.bit.ENB = 0; //Disable CON1
|
||||
sr_exp_data.bit.ENA = 0; //Disable CON2
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
sr_exp_data.bit.IRST = 1; //LED drivers I2C in reset
|
||||
sr_exp_data.bit.SDB_N = 0; //LED drivers in shutdown
|
||||
|
||||
/* Write shift register data */
|
||||
SR_EXP_WriteData();
|
||||
|
||||
/* Enable shift register output */
|
||||
SR_EXP_OE_N_ENA;
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void usb_set_host_kb(uint8_t con, uint8_t rp_best_index) {
|
||||
if (con == 1) {
|
||||
//DN1 to A (CON2/EX2), UP to B (CON1/EX1)
|
||||
sr_exp_data.bit.S_A_UP = 1; //0 = DN1 to B and UP to A, 1 = DN1 to A and UP to B (SAI-SBI)
|
||||
|
||||
if (ADC_USBC_IS_ONB(rp_best_index)) { //Check if the port detected is onboard
|
||||
sr_exp_data.bit.S_B_EXT = 1; //Onboard port
|
||||
g_usb_host_port = USB_HOST_PORT_1; //Save host port
|
||||
} else { //Port is external
|
||||
sr_exp_data.bit.S_B_EXT = 0; //External port
|
||||
g_usb_host_port = USB_HOST_PORT_1_EXT; //Save host port
|
||||
}
|
||||
|
||||
sr_exp_data.bit.E_VBUS_1 = 1; //Enable CON1 5V
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
//DN1 to B (CON1/EX1), UP to A (CON2/EX2)
|
||||
sr_exp_data.bit.S_A_UP = 0; //0 = DN1 to B and UP to A, 1 = DN1 to A and UP to B (SAI-SBI)
|
||||
|
||||
if (ADC_USBC_IS_ONB(rp_best_index)) { //Check if the port detected is onboard
|
||||
sr_exp_data.bit.S_A_EXT = 0; //Onboard port
|
||||
g_usb_host_port = USB_HOST_PORT_2; //Save host port
|
||||
} else { //Port is external
|
||||
sr_exp_data.bit.S_A_EXT = 1; //External port
|
||||
g_usb_host_port = USB_HOST_PORT_2_EXT; //Save host port
|
||||
}
|
||||
|
||||
sr_exp_data.bit.E_VBUS_2 = 1; //Enable CON2 5V
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_set_extra_kb(uint8_t con) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.SRC_1_A5 = 0; //Set CON1 CC A5 as Rp 56k
|
||||
sr_exp_data.bit.SRC_1_B5 = 0; //Set CON1 CC B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.SRC_2_A5 = 0; //Set CON2 CC A5 as Rp 56k
|
||||
sr_exp_data.bit.SRC_2_B5 = 0; //Set CON2 CC B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_init_host_detection_kb(void) {
|
||||
//Disable 5V
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
|
||||
//Configure default paths
|
||||
sr_exp_data.bit.S_A_UP = 0; //DN1 TO A & UP TO B WHEN 1, DN1 TO B & UP TO A WHEN 0
|
||||
sr_exp_data.bit.S_A_EXT = 1; //0 = Onboard, 1 = Offboard (SAO)
|
||||
sr_exp_data.bit.S_B_EXT = 0; //1 = Onboard, 0 = Offboard (SBO)
|
||||
|
||||
//Configure CC lines
|
||||
sr_exp_data.bit.SRC_1_A5 = 1; //Set CON1 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_1_B5 = 1; //Set CON1 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_A5 = 1; //Set CON2 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_B5 = 1; //Set CON2 CC B5 as Rd 5.1k
|
||||
|
||||
//Enable ports
|
||||
sr_exp_data.bit.ENB = 1; //Enable CON1/EX1 for use
|
||||
sr_exp_data.bit.ENA = 1; //Enable CON2/EX2 for use
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
|
||||
//Return 1 if configuration successful
|
||||
//Return 0 otherwise
|
||||
uint8_t usb_attach_port_configure_kb(uint8_t g_usb_host_port, uint16_t usbc_cc_a5_v, uint16_t usbc_cc_b5_v) {
|
||||
if (USB_HOST_IS_1(g_usb_host_port)) { //If host is port 1
|
||||
//Set up port 2
|
||||
if (USBC_IS_SINK_ONB(usbc_cc_a5_v, usbc_cc_b5_v)) { //If onboard port detected
|
||||
sr_exp_data.bit.S_A_EXT = 0; //Set port 2 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
} else if (USBC_IS_SINK_EXT(usbc_cc_a5_v, usbc_cc_b5_v)) { //If external port detected
|
||||
sr_exp_data.bit.S_A_EXT = 1; //Set port 2 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
}
|
||||
} else if (USB_HOST_IS_2(g_usb_host_port)) { //If host is on port 2
|
||||
//Set up port 1
|
||||
if (USBC_IS_SINK_ONB(usbc_cc_a5_v, usbc_cc_b5_v)) { //If onboard port detected
|
||||
sr_exp_data.bit.S_B_EXT = 1; //Set port 1 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
} else if (USBC_IS_SINK_EXT(usbc_cc_a5_v, usbc_cc_b5_v)) { //If external port detected
|
||||
sr_exp_data.bit.S_B_EXT = 0; //Set port 1 as external port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,162 +0,0 @@
|
||||
/*
|
||||
Copyright 2015 Jun Wako <wakojun@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0x04D8
|
||||
#define PRODUCT_ID 0xEE65
|
||||
#define DEVICE_VER 0x0100
|
||||
|
||||
#define MANUFACTURER "Massdrop Inc."
|
||||
#define PRODUCT "Massdrop SHIFT Keyboard"
|
||||
#define SERIAL_NUM "Unavailable"
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 8
|
||||
#define MATRIX_COLS 13
|
||||
|
||||
/* MCU Port name definitions */
|
||||
#define PA 0
|
||||
#define PB 1
|
||||
|
||||
/* Shift register IDs for key matrix */
|
||||
/* SRBASE must be defined greater than MCU Port name definitions */
|
||||
#define SRBASE 10
|
||||
#define SRMAX (SRBASE + SERCOM_INST_NUM)
|
||||
#define S4 (SRBASE + 4)
|
||||
|
||||
/* Macros to differentiate between MCU and Shift Register usage */
|
||||
#define PORT_IS_MCU(x) (x < PORT_GROUPS)
|
||||
#define PORT_IS_SR(x) (x >= SRBASE && x < SRMAX)
|
||||
|
||||
/* Port and Pin definition of key row hardware configuration */
|
||||
#define MATRIX_ROW_PORTS PA, PA, PA, PA, PA, PA, PA, PA
|
||||
#define MATRIX_ROW_PINS 0, 1, 2, 3, 4, 5, 6, 7
|
||||
|
||||
/* Port and Pin definition of key column hardware configuration */
|
||||
#define MATRIX_COL_PORTS S4, S4, S4, S4, S4, S4, S4, S4, S4, S4, S4, S4, S4
|
||||
#define MATRIX_COL_PINS 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
|
||||
|
||||
/* This Shift Register expands available hardware output lines to control additional peripherals */
|
||||
/* It uses four lines from the MCU to provide 16 output lines */
|
||||
/* Shift Register Clock configuration (MCU to ShiftRegister.RCLK) */
|
||||
#define SR_EXP_RCLK_PORT PB
|
||||
#define SR_EXP_RCLK_PIN 14
|
||||
/* Shift Register Output Enable configuration (MCU to ShiftRegister.OE_N) */
|
||||
#define SR_EXP_OE_N_PORT PB
|
||||
#define SR_EXP_OE_N_PIN 15
|
||||
/* SERCOM port to use for Shift Register SPI */
|
||||
/* DATAOUT and SCLK must be configured to use hardware pins of this port */
|
||||
#define SR_EXP_SERCOM_NUM 2
|
||||
/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */
|
||||
#define SR_EXP_DATAOUT_PORT PA
|
||||
#define SR_EXP_DATAOUT_PIN 12
|
||||
#define SR_EXP_DATAOUT_MUX 2
|
||||
/* Shift Register SPI Serial Clock configuration (MCU.SERCOMx.PAD[1] to ShiftRegister.SRCLK) */
|
||||
#define SR_EXP_SCLK_PORT PA
|
||||
#define SR_EXP_SCLK_PIN 13
|
||||
#define SR_EXP_SCLK_MUX 2
|
||||
|
||||
/* This Shift Register is used as the Key Matrix Column Driver */
|
||||
/* It uses four lines from the MCU to provide 16 output lines */
|
||||
/* Shift Register Clock configuration (MCU to ShiftRegister.RCLK) */
|
||||
#define SR_KC_RCLK_PORT PB
|
||||
#define SR_KC_RCLK_PIN 6
|
||||
/* Shift Register Output Enable configuration (MCU to ShiftRegister.OE_N) */
|
||||
#define SR_KC_OE_N_PORT PB
|
||||
#define SR_KC_OE_N_PIN 7
|
||||
/* SERCOM port to use for Shift Register SPI */
|
||||
/* DATAOUT and SCLK must be configured to use hardware pins of this port */
|
||||
#define SR_KC_SERCOM_NUM 4
|
||||
/* Shift Register SPI Data Out configuration (MCU.SERCOMx.PAD[0] to ShiftRegister.SER) */
|
||||
#define SR_KC_DATAOUT_PORT PB
|
||||
#define SR_KC_DATAOUT_PIN 8
|
||||
#define SR_KC_DATAOUT_MUX 3
|
||||
/* Shift Register SPI Serial Clock configuration (MCU.SERCOMx.PAD[1] to ShiftRegister.SRCLK) */
|
||||
#define SR_KC_SCLK_PORT PB
|
||||
#define SR_KC_SCLK_PIN 9
|
||||
#define SR_KC_SCLK_MUX 3
|
||||
|
||||
/* Debug LED (Small LED Located near MCU) */
|
||||
/* PCB M15 */
|
||||
#define DEBUG_LED_ENABLE 1
|
||||
#define DEBUG_LED_PORT PA
|
||||
#define DEBUG_LED_PIN 27
|
||||
|
||||
/* Additional debugging ports */
|
||||
/* PCB M44 */
|
||||
#define DEBUG_PORT1_ENABLE 1
|
||||
#define DEBUG_PORT1_PORT PB
|
||||
#define DEBUG_PORT1_PIN 31
|
||||
/* PCB M45 */
|
||||
#define DEBUG_PORT2_ENABLE 1
|
||||
#define DEBUG_PORT2_PORT PB
|
||||
#define DEBUG_PORT2_PIN 10
|
||||
/* PCB M46 */
|
||||
#define DEBUG_PORT3_ENABLE 1
|
||||
#define DEBUG_PORT3_PORT PB
|
||||
#define DEBUG_PORT3_PIN 11
|
||||
|
||||
/* Debug Boot Tracing - During boot sequence, ground this pin to halt and display debug code using Debug LED */
|
||||
/* This is useful in determining which hardware device may have malfunctioned or is improperly configured */
|
||||
/* Feature is automatically disabled after successful boot */
|
||||
/* PCB M27 */
|
||||
#define DEBUG_BOOT_TRACING_ENABLE 1
|
||||
#define DEBUG_BOOT_TRACING_PORT PB
|
||||
#define DEBUG_BOOT_TRACING_PIN 23
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
// Required BOOT key hold time (in ms) for restarting to bootloader -PS081419
|
||||
#define BOOTKEY_HOLD_MS 2000
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
//#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
//#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* Force boot in NKRO mode */
|
||||
//#define FORCE_NKRO
|
||||
|
||||
/*
|
||||
* Feature disable options
|
||||
* These options are also useful to firmware size reduction.
|
||||
*/
|
||||
|
||||
/* disable debug print */
|
||||
//#define NO_DEBUG
|
||||
|
||||
/* disable print */
|
||||
//#define NO_PRINT
|
||||
|
||||
/* disable action features */
|
||||
//#define NO_ACTION_LAYER
|
||||
//#define NO_ACTION_TAPPING
|
||||
//#define NO_ACTION_ONESHOT
|
||||
//#define NO_ACTION_MACRO
|
||||
//#define NO_ACTION_FUNCTION
|
||||
|
||||
#define RGB_MATRIX_KEYPRESSES
|
||||
#define RGB_MATRIX_LED_PROCESS_LIMIT 15
|
||||
#define RGB_MATRIX_LED_FLUSH_LIMIT 10
|
||||
#define RGB_MATRIX_EXTRA_TOG
|
||||
|
||||
#include "config_led.h"
|
||||
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//ADC configuration table column indices
|
||||
#define ADC_PORT 0
|
||||
#define ADC_PIN 1
|
||||
#define ADC_MUX 2
|
||||
#define ADC_INDEX 3
|
||||
#define ADC_MUXPOS 4
|
||||
#define ADC_REFSEL 5
|
||||
#define ADC_SAMPLENUM 6
|
||||
#define ADC_SAMPLEN 7
|
||||
|
||||
//ADC configuration table row indices
|
||||
#define ADC_5V 0 //5V bus voltage
|
||||
#define ADC_C1A5 1 //Connector 1 A5 CC voltage
|
||||
#define ADC_C1B5 2 //Connector 1 B5 CC voltage
|
||||
#define ADC_C2A5 3 //Connector 2 A5 CC voltage
|
||||
#define ADC_C2B5 4 //Connector 2 B5 CC voltage
|
||||
#define ADC_C1I 5 //Connector 1 current
|
||||
#define ADC_C2I 6 //Connector 2 current
|
||||
|
||||
//ADC_PORT: PORT of the PIN on the MCU (Ex: 0 = PA, 1 = PB, ...)
|
||||
// Set ADC_PORT to ADC_NA if it is not available for use
|
||||
//ADC_PIN: PIN on the MCU (Ex: 0 = 00, 1 = 01, 12 = 12, ...)
|
||||
//ADC_MUX: PMUX setting for the MCU PIN (Ex: 0 = A, 1 = B, 2 = C, ...)
|
||||
//ADC_INDEX: ADC to use (Ex: 0 = ADC0, 1 = ADC1, ...)
|
||||
//ADC_MUXPOS: MUXPOS setting to read on the ADC (Use macros from Atmel library adc.h ADC_INPUTCTRL_MUXPOS_AIN*_Val)
|
||||
//ADC_REFSEL: Reference the ADC is to use (Use macros from Atmel library adc.h ADC_REFCTRL_REFSEL_*_Val)
|
||||
//ADC_SAMPLENUM: Number of samples to average for output (Use macros from Atmel library adc.h ADC_AVGCTRL_SAMPLENUM_*_Val)
|
||||
//ADC_SAMPLEN: Sampling time for each sample in units of CLK_ADC cycles depending on the ADC clock frequency
|
||||
// ADC_PORT ADC_MUX
|
||||
// | ADC_PIN | ADC_INDEX
|
||||
// | | | | ADC_MUXPOS ADC_REFSEL ADC_SAMPLENUM ADC_SAMPLEN
|
||||
#define ADC_CONFIG_5V 1, 0, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN12_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C1A5 1, 2, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN14_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C1B5 1, 4, 1, 1, ADC_INPUTCTRL_MUXPOS_AIN6_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C2A5 1, 1, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN13_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C2B5 1, 5, 1, 1, ADC_INPUTCTRL_MUXPOS_AIN7_Val, ADC_REFCTRL_REFSEL_INTREF_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 63
|
||||
#define ADC_CONFIG_C1I 0, 10, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN10_Val, ADC_REFCTRL_REFSEL_INTVCC1_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
#define ADC_CONFIG_C2I 0, 11, 1, 0, ADC_INPUTCTRL_MUXPOS_AIN11_Val, ADC_REFCTRL_REFSEL_INTVCC1_Val, ADC_AVGCTRL_SAMPLENUM_4_Val, 45
|
||||
|
||||
//Conversion values dependant upon the circuitry
|
||||
#define ADC_I_MILLIAMPS_PER_COUNT -0.000980472f
|
||||
#define ADC_I_MILLIAMPS_OFFSET 1.979711769f
|
||||
#define ADC_5V_VOLTS_PER_COUNT 0.001904297f
|
||||
#define ADC_5V_VOLTS_OFFSET 0.0f
|
||||
#define ADC_5V_NOMINAL 5.0f
|
||||
#define ADC_5V_NOMINAL_COUNTS (ADC_5V_NOMINAL / ADC_5V_VOLTS_PER_COUNT)
|
||||
|
||||
//Conversion macros
|
||||
#define ADC_CI_C2I(macounts) ((float)macounts * ADC_I_MILLIAMPS_PER_COUNT + ADC_I_MILLIAMPS_OFFSET) //Converts connector current counts to milliamps
|
||||
#define ADC_CI_I2C(ma) (uint16_t)((((float)ma - ADC_I_MILLIAMPS_OFFSET) / ADC_I_MILLIAMPS_PER_COUNT)) //Converts milliamps to connector current counts
|
||||
#define ADC_5V_C2V(icounts) ((float)icounts * ADC_5V_VOLTS_PER_COUNT + ADC_5V_VOLTS_OFFSET) //Converts 5V Bus counts to volts
|
||||
#define ADC_5V_V2C(v) (uint16_t)((((float)v - ADC_5V_VOLTS_OFFSET) / ADC_5V_VOLTS_PER_COUNT)) //Converts 5V Bus volts to counts
|
||||
#define ADC_CC_5VCOR(v5counts, cc) ((float)v5counts == 0 ? 0 : (uint16_t)(ADC_5V_NOMINAL_COUNTS / (float)v5counts * (float)cc)) //Corrects CC counts to nominal 5V value
|
||||
|
||||
//Note: The extra port's onboard/external range is not reliable for onboard/external detection due to varying device implementations,
|
||||
// so instead the extra port will follow the host port connection of onboard or external. We will still use
|
||||
// a nominal value for device detection with a wider range though.
|
||||
#define ADC_USBC_ONBOARD 951 //ADC value indicating the USB-C Connector is on main PCB
|
||||
#define ADC_USBC_EXTERNAL 881 //ADC value indicating the USB-C Connector is on external PCB
|
||||
#define ADC_USBC_RANGE ((ADC_USBC_ONBOARD - ADC_USBC_EXTERNAL) / 2) //Range of detection for extra port Rd
|
||||
#define ADC_USBC_EXTRA_NOMINAL ((ADC_USBC_ONBOARD + ADC_USBC_EXTERNAL) / 2) //Nominal ADC value for detection of connected device
|
||||
#define ADC_USBC_EXTRA_TOLERANCE (0.20f) //Tolerance for Rd
|
||||
#define ADC_USBC_EXTRA_ADC_MAX ((float)ADC_USBC_EXTRA_NOMINAL + ((float)ADC_USBC_EXTRA_NOMINAL * ADC_USBC_EXTRA_TOLERANCE)) //Rd ADC max counts
|
||||
#define ADC_USBC_EXTRA_ADC_MIN ((float)ADC_USBC_EXTRA_NOMINAL - ((float)ADC_USBC_EXTRA_NOMINAL * ADC_USBC_EXTRA_TOLERANCE)) //Rd ADC min counts
|
||||
|
||||
#define USBC_IS_SINK(a5, b5) ((a5 > ADC_USBC_EXTRA_ADC_MIN && a5 < ADC_USBC_EXTRA_ADC_MAX) || \
|
||||
(b5 > ADC_USBC_EXTRA_ADC_MIN && b5 < ADC_USBC_EXTRA_ADC_MAX))
|
||||
|
||||
#define ADC_USBC_RP_DELTA_MAX 400 //Amount of noise to tolerate for Rp detection (this can be very generous as long as ranges do not overlap)
|
||||
|
||||
#define ADC_USBC_RP_TYPES 3 //56k, 22k, 10k
|
||||
#define ADC_USBC_CON_TYPES 2 //Onboard, External
|
||||
#define ADC_USBC_TYPES (ADC_USBC_RP_TYPES * ADC_USBC_CON_TYPES)
|
||||
|
||||
//These are the indices for ADC_USBC_RP_NOM
|
||||
//xxK is a ADC_USBC_RP_TYPES
|
||||
//ONB is for the onboard USB-C Connector and must have an even index number
|
||||
//EXT is for the external USB-C Connector and must have an odd index number
|
||||
#define ADC_USBC_56K_ONB 0
|
||||
#define ADC_USBC_56K_EXT 1
|
||||
#define ADC_USBC_22K_ONB 2
|
||||
#define ADC_USBC_22K_EXT 3
|
||||
#define ADC_USBC_10K_ONB 4
|
||||
#define ADC_USBC_10K_EXT 5
|
||||
|
||||
#define ADC_USBC_IS_ONB(a) (a % 2 == 0) //Given a ADC_USBC_RP_NOM index, return true if the index refers to an onboard connector
|
||||
#define ADC_USBC_IS_EXT(a) (a % 2 == 1) //Given a ADC_USBC_RP_NOM index, return true if the index refers to an external connector
|
||||
|
||||
//These values are for detecting whether or not the host is connected through the onboard USB or external USB
|
||||
//The counts are calculated from a nominal 5V bus, then scaled depending on the measured 5V bus
|
||||
//External connectors are detected through addition of a resistor to slightly drop readings while remaining within USB-C CC tolerances
|
||||
//Set a value to -1 if it is not supported
|
||||
//Source Rp 56k-Onb 56k-Ext 22k-Onb 22k-Ext 10k-Onb 10k-Ext
|
||||
#define ADC_USBC_RP_NOM 999, 852, 2232, 1940, 3955, 3528
|
||||
|
||||
extern uint16_t adc_usbc_rp_nominal[ADC_USBC_TYPES];
|
||||
|
||||
#define POWER_CHECK_INTERVAL 1 //How often to check power usage for adjustment and safety (ms)
|
||||
#define V_5V_AVGS 20 //Number of 5V readings to average for algorithms wanting stable readings rather than instantaneous
|
||||
@@ -1,232 +0,0 @@
|
||||
#ifdef RGB_MATRIX_ENABLE
|
||||
#include "shift.h"
|
||||
|
||||
#include "led_matrix.h"
|
||||
#include "rgb_matrix.h"
|
||||
#include "config_led.h"
|
||||
|
||||
// TODO: update after layout change
|
||||
led_config_t g_led_config = {
|
||||
{
|
||||
{ 1, 2, 3, 5, 6, 7, 8, 10, 12, 14, 15, 16, 17 },
|
||||
{ 22, 23, 4, 27, 29, 30, 9, 11, 13, 18, 19, 20, 21 },
|
||||
{ 40, 24, 25, 28, 46, 31, 32, 34, 35, 36, 37, 38, 39 },
|
||||
{ 58, 41, 26, 44, 47, 48, 33, 51, 52, 54, 55, 56, 57 },
|
||||
{ 75, 42, 43, 45, 64, 49, 50, 68, 53, 71, 72, 73, 74 },
|
||||
{ 92, 59, 61, 62, 65, 66, 67, 84, 69, 87, 88, 89, 91 },
|
||||
{ 93, 60, 77, 63, 80, 82, 83, 85, 70, 90, 102, 98, 99 },
|
||||
{ 94, 76, 78, 79, 95, 81, 96, 97, 86, 100, 101, NO_LED, NO_LED }
|
||||
},
|
||||
{
|
||||
{ 6, 5 },
|
||||
{ 29, 5 },
|
||||
{ 41, 5 },
|
||||
{ 52, 5 },
|
||||
{ 63, 5 },
|
||||
{ 81, 5 },
|
||||
{ 92, 5 },
|
||||
{ 103, 5 },
|
||||
{ 115, 5 },
|
||||
{ 132, 5 },
|
||||
{ 143, 5 },
|
||||
{ 155, 5 },
|
||||
{ 166, 5 },
|
||||
{ 183, 5 },
|
||||
{ 195, 5 },
|
||||
{ 206, 5 },
|
||||
{ 218, 5 },
|
||||
|
||||
{ 183, 13 },
|
||||
{ 195, 13 },
|
||||
{ 206, 13 },
|
||||
{ 218, 13 },
|
||||
|
||||
{ 6, 22 },
|
||||
{ 18, 22 },
|
||||
{ 29, 22 },
|
||||
{ 41, 22 },
|
||||
{ 52, 22 },
|
||||
{ 63, 22 },
|
||||
{ 75, 22 },
|
||||
{ 86, 22 },
|
||||
{ 98, 22 },
|
||||
{ 109, 22 },
|
||||
{ 121, 22 },
|
||||
{ 132, 22 },
|
||||
{ 143, 22 },
|
||||
{ 161, 22 },
|
||||
{ 183, 22 },
|
||||
{ 195, 22 },
|
||||
{ 206, 22 },
|
||||
{ 218, 22 },
|
||||
|
||||
{ 9, 31 },
|
||||
{ 23, 31 },
|
||||
{ 35, 31 },
|
||||
{ 46, 31 },
|
||||
{ 58, 31 },
|
||||
{ 69, 31 },
|
||||
{ 81, 31 },
|
||||
{ 92, 31 },
|
||||
{ 103, 31 },
|
||||
{ 115, 31 },
|
||||
{ 126, 31 },
|
||||
{ 138, 31 },
|
||||
{ 149, 31 },
|
||||
{ 163, 31 },
|
||||
{ 183, 31 },
|
||||
{ 195, 31 },
|
||||
{ 206, 31 },
|
||||
{ 218, 31 },
|
||||
|
||||
{ 11, 40 },
|
||||
{ 26, 40 },
|
||||
{ 38, 40 },
|
||||
{ 49, 40 },
|
||||
{ 61, 40 },
|
||||
{ 72, 40 },
|
||||
{ 83, 40 },
|
||||
{ 95, 40 },
|
||||
{ 106, 40 },
|
||||
{ 118, 40 },
|
||||
{ 129, 40 },
|
||||
{ 141, 40 },
|
||||
{ 159, 40 },
|
||||
{ 183, 40 },
|
||||
{ 195, 40 },
|
||||
{ 206, 40 },
|
||||
{ 218, 40 },
|
||||
|
||||
{ 13, 48 },
|
||||
{ 32, 48 },
|
||||
{ 43, 48 },
|
||||
{ 55, 48 },
|
||||
{ 66, 48 },
|
||||
{ 78, 48 },
|
||||
{ 89, 48 },
|
||||
{ 101, 48 },
|
||||
{ 112, 48 },
|
||||
{ 123, 48 },
|
||||
{ 135, 48 },
|
||||
{ 151, 48 },
|
||||
{ 183, 48 },
|
||||
{ 195, 48 },
|
||||
{ 206, 48 },
|
||||
|
||||
{ 169, 51 }, // up
|
||||
{ 218, 53 }, // numpad enter
|
||||
|
||||
{ 8, 57 },
|
||||
{ 22, 57 },
|
||||
{ 36, 57 },
|
||||
{ 79, 57 },
|
||||
{ 123, 57 },
|
||||
{ 141, 57 },
|
||||
{ 195, 57 },
|
||||
{ 206, 57 },
|
||||
|
||||
{ 158, 59 },
|
||||
{ 169, 59 },
|
||||
{ 181, 59 },
|
||||
|
||||
{ 2, 1 },
|
||||
{ 12, 0 },
|
||||
{ 32, 0 },
|
||||
{ 42, 0 },
|
||||
{ 52, 0 },
|
||||
{ 62, 0 },
|
||||
{ 72, 0 },
|
||||
{ 82, 0 },
|
||||
{ 92, 0 },
|
||||
{ 102, 0 },
|
||||
{ 112, 0 },
|
||||
{ 122, 0 },
|
||||
{ 132, 0 },
|
||||
{ 142, 0 },
|
||||
{ 152, 0 },
|
||||
{ 162, 0 },
|
||||
{ 172, 0 },
|
||||
{ 182, 0 },
|
||||
{ 192, 0 },
|
||||
{ 212, 0 },
|
||||
{ 222, 1 },
|
||||
{ 224, 9 },
|
||||
{ 224, 17 },
|
||||
{ 224, 24 },
|
||||
{ 224, 32 },
|
||||
{ 224, 40 },
|
||||
{ 224, 47 },
|
||||
{ 224, 55 },
|
||||
{ 222, 63 },
|
||||
{ 212, 64 },
|
||||
{ 202, 64 },
|
||||
{ 192, 64 },
|
||||
{ 182, 64 },
|
||||
{ 172, 64 },
|
||||
{ 162, 64 },
|
||||
{ 152, 64 },
|
||||
{ 142, 64 },
|
||||
{ 132, 64 },
|
||||
{ 122, 64 },
|
||||
{ 112, 64 },
|
||||
{ 102, 64 },
|
||||
{ 92, 64 },
|
||||
{ 82, 64 },
|
||||
{ 72, 64 },
|
||||
{ 62, 64 },
|
||||
{ 52, 64 },
|
||||
{ 42, 64 },
|
||||
{ 32, 64 },
|
||||
{ 22, 64 },
|
||||
{ 12, 64 },
|
||||
{ 2, 63 },
|
||||
{ 0, 55 },
|
||||
{ 0, 47 },
|
||||
{ 0, 40 },
|
||||
{ 0, 32 },
|
||||
{ 0, 24 },
|
||||
{ 0, 17 },
|
||||
{ 0, 9 }
|
||||
},
|
||||
{
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4,
|
||||
|
||||
4, 4, 4, 4,
|
||||
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
|
||||
4, 4, 4, 4,
|
||||
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4,
|
||||
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
|
||||
4, 4, 4, 4,
|
||||
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
|
||||
4, 4, 4,
|
||||
|
||||
4, // up
|
||||
4, // numpad enter
|
||||
|
||||
1, 1, 1, 4, 1, 1, 4, 4,
|
||||
|
||||
4, 4, 4,
|
||||
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef USB_LED_INDICATOR_ENABLE
|
||||
void rgb_matrix_indicators_kb(void)
|
||||
{
|
||||
led_matrix_indicators();
|
||||
}
|
||||
#endif // USB_LED_INDICATOR_ENABLE
|
||||
|
||||
#endif
|
||||
@@ -1,233 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Define number of IS31FL3733 drivers being used (1...16)
|
||||
#define ISSI3733_DRIVER_COUNT 3
|
||||
#define DRIVER_LED_TOTAL ISSI3733_LED_COUNT
|
||||
|
||||
//Hardware address of each driver (Refer to IS31FL3733 pdf "Table 1 Slave Address" and keyboard schematic)
|
||||
#define ISSI3773_DRIVER_ADDRESSES { 0xA0, 0xBE, 0xA6 }
|
||||
|
||||
//LED I2C bus speed
|
||||
#define I2C_HZ 870000
|
||||
|
||||
//Count of LED bodies
|
||||
#define ISSI3733_LED_COUNT 160
|
||||
|
||||
#define LED_GCR_MAX 165 //Max GCR value (0 - 255) WARNING: Raising this value may overload the LED drivers and USB bus
|
||||
#define LED_GCR_STEP 10 //GCR increment/decrement value
|
||||
|
||||
#ifdef USE_MASSDROP_CONFIGURATOR
|
||||
#define ANIMATION_SPEED_STEP 1
|
||||
|
||||
#define BREATHE_STEP 1
|
||||
#define BREATHE_MIN_STEP 0
|
||||
#define BREATHE_MAX_STEP 255
|
||||
#endif
|
||||
|
||||
//Default Global Current Register value (Default brightness 0 - 255)
|
||||
#define ISSI3733_GCR_DEFAULT LED_GCR_MAX
|
||||
|
||||
//Automatic power rollback and recovery
|
||||
#define V5_HIGH 2494 //5V high level (After low power detect, point at which LEDs are allowed to use more power )
|
||||
#define V5_LOW 2434 //5V low level (LED power rolled back to stay above this limit)
|
||||
#define V5_CAT 2206 //5V catastrophic level (Host USB port potential to shut down)
|
||||
|
||||
//LED Mapping - More practically generated from a spreadsheet program
|
||||
//id: ID of the LED (Sync with PCB callouts)
|
||||
//x: Physical X coordinate of LED (units do not matter)
|
||||
//y: Physical Y coordinate of LED (units do not matter)
|
||||
//drv: 1-Based index of ISSI3773_DRIVER_ADDRESSES
|
||||
//cs: Matrix wiring CS col (1-16)
|
||||
//swr: Matrix wiring SW Red row (1-12)
|
||||
//swg: Matrix wiring SW Green row (1-12)
|
||||
//swb: Matrix wiring SW Blue row (1-12)
|
||||
//scan: Associated key matrix scancode (set 255 if none or 254 for LED to turn off in alternating mode)
|
||||
//Note: Origin 0,0 may be located anywhere as the software will do the final layout
|
||||
#define ISSI3733_LED_MAP { \
|
||||
{ .id = 1, .x = 0.474, .y = 5.162, .adr = { .drv = 1, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 0 }, \
|
||||
{ .id = 2, .x = 1.974, .y = 5.162, .adr = { .drv = 1, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 1 }, \
|
||||
{ .id = 3, .x = 2.724, .y = 5.162, .adr = { .drv = 1, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 2 }, \
|
||||
{ .id = 4, .x = 3.474, .y = 5.162, .adr = { .drv = 1, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 18 }, \
|
||||
{ .id = 5, .x = 4.224, .y = 5.162, .adr = { .drv = 1, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 3 }, \
|
||||
{ .id = 6, .x = 5.349, .y = 5.162, .adr = { .drv = 1, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 4 }, \
|
||||
{ .id = 7, .x = 6.099, .y = 5.162, .adr = { .drv = 1, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 5 }, \
|
||||
{ .id = 8, .x = 6.849, .y = 5.162, .adr = { .drv = 1, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 6 }, \
|
||||
{ .id = 9, .x = 7.599, .y = 5.162, .adr = { .drv = 1, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 22 }, \
|
||||
{ .id = 10, .x = 8.724, .y = 5.162, .adr = { .drv = 2, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 7 }, \
|
||||
{ .id = 11, .x = 9.474, .y = 5.162, .adr = { .drv = 2, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 23 }, \
|
||||
{ .id = 12, .x = 10.224, .y = 5.162, .adr = { .drv = 2, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 8 }, \
|
||||
{ .id = 13, .x = 10.974, .y = 5.162, .adr = { .drv = 2, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 24 }, \
|
||||
{ .id = 14, .x = 12.099, .y = 5.162, .adr = { .drv = 2, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 9 }, \
|
||||
{ .id = 15, .x = 12.849, .y = 5.162, .adr = { .drv = 2, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 10 }, \
|
||||
{ .id = 16, .x = 13.599, .y = 5.162, .adr = { .drv = 2, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 11 }, \
|
||||
{ .id = 17, .x = 14.349, .y = 5.162, .adr = { .drv = 2, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 12 }, \
|
||||
{ .id = 18, .x = 12.099, .y = 4.412, .adr = { .drv = 2, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 25 }, \
|
||||
{ .id = 19, .x = 12.849, .y = 4.412, .adr = { .drv = 2, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 26 }, \
|
||||
{ .id = 20, .x = 13.599, .y = 4.412, .adr = { .drv = 2, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 27 }, \
|
||||
{ .id = 21, .x = 14.349, .y = 4.412, .adr = { .drv = 2, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 28 }, \
|
||||
{ .id = 22, .x = 0.474, .y = 3.662, .adr = { .drv = 1, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 16 }, \
|
||||
{ .id = 23, .x = 1.224, .y = 3.662, .adr = { .drv = 1, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 17 }, \
|
||||
{ .id = 24, .x = 1.974, .y = 3.662, .adr = { .drv = 1, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 33 }, \
|
||||
{ .id = 25, .x = 2.724, .y = 3.662, .adr = { .drv = 1, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 34 }, \
|
||||
{ .id = 26, .x = 3.474, .y = 3.662, .adr = { .drv = 1, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 50 }, \
|
||||
{ .id = 27, .x = 4.224, .y = 3.662, .adr = { .drv = 1, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 19 }, \
|
||||
{ .id = 28, .x = 4.974, .y = 3.662, .adr = { .drv = 1, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 35 }, \
|
||||
{ .id = 29, .x = 5.724, .y = 3.662, .adr = { .drv = 1, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 20 }, \
|
||||
{ .id = 30, .x = 6.474, .y = 3.662, .adr = { .drv = 1, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 21 }, \
|
||||
{ .id = 31, .x = 7.224, .y = 3.662, .adr = { .drv = 1, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 37 }, \
|
||||
{ .id = 32, .x = 7.974, .y = 3.662, .adr = { .drv = 1, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 38 }, \
|
||||
{ .id = 33, .x = 8.724, .y = 3.662, .adr = { .drv = 2, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 54 }, \
|
||||
{ .id = 34, .x = 9.474, .y = 3.662, .adr = { .drv = 2, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 39 }, \
|
||||
{ .id = 35, .x = 10.599, .y = 3.662, .adr = { .drv = 2, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 40 }, \
|
||||
{ .id = 36, .x = 12.099, .y = 3.662, .adr = { .drv = 2, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 41 }, \
|
||||
{ .id = 37, .x = 12.849, .y = 3.662, .adr = { .drv = 2, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 42 }, \
|
||||
{ .id = 38, .x = 13.599, .y = 3.662, .adr = { .drv = 2, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 43 }, \
|
||||
{ .id = 39, .x = 14.349, .y = 3.662, .adr = { .drv = 2, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 44 }, \
|
||||
{ .id = 40, .x = 0.662, .y = 2.912, .adr = { .drv = 1, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 32 }, \
|
||||
{ .id = 41, .x = 1.599, .y = 2.912, .adr = { .drv = 1, .cs = 2, .swr = 5, .swg = 4, .swb = 6 }, .scan = 49 }, \
|
||||
{ .id = 42, .x = 2.349, .y = 2.912, .adr = { .drv = 1, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 65 }, \
|
||||
{ .id = 43, .x = 3.099, .y = 2.912, .adr = { .drv = 1, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 66 }, \
|
||||
{ .id = 44, .x = 3.849, .y = 2.912, .adr = { .drv = 1, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 51 }, \
|
||||
{ .id = 45, .x = 4.599, .y = 2.912, .adr = { .drv = 1, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 67 }, \
|
||||
{ .id = 46, .x = 5.349, .y = 2.912, .adr = { .drv = 1, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 36 }, \
|
||||
{ .id = 47, .x = 6.099, .y = 2.912, .adr = { .drv = 1, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 52 }, \
|
||||
{ .id = 48, .x = 6.849, .y = 2.912, .adr = { .drv = 1, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 53 }, \
|
||||
{ .id = 49, .x = 7.599, .y = 2.912, .adr = { .drv = 1, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 69 }, \
|
||||
{ .id = 50, .x = 8.349, .y = 2.912, .adr = { .drv = 2, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 70 }, \
|
||||
{ .id = 51, .x = 9.099, .y = 2.912, .adr = { .drv = 2, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 55 }, \
|
||||
{ .id = 52, .x = 9.849, .y = 2.912, .adr = { .drv = 2, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 56 }, \
|
||||
{ .id = 53, .x = 10.787, .y = 2.912, .adr = { .drv = 2, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 72 }, \
|
||||
{ .id = 54, .x = 12.099, .y = 2.912, .adr = { .drv = 2, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 57 }, \
|
||||
{ .id = 55, .x = 12.849, .y = 2.912, .adr = { .drv = 2, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 58 }, \
|
||||
{ .id = 56, .x = 13.599, .y = 2.912, .adr = { .drv = 2, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 59 }, \
|
||||
{ .id = 57, .x = 14.349, .y = 2.912, .adr = { .drv = 2, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 60 }, \
|
||||
{ .id = 58, .x = 0.756, .y = 2.162, .adr = { .drv = 1, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 48 }, \
|
||||
{ .id = 59, .x = 1.787, .y = 2.162, .adr = { .drv = 1, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 81 }, \
|
||||
{ .id = 60, .x = 2.537, .y = 2.162, .adr = { .drv = 1, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 97 }, \
|
||||
{ .id = 61, .x = 3.287, .y = 2.162, .adr = { .drv = 1, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 82 }, \
|
||||
{ .id = 62, .x = 4.037, .y = 2.162, .adr = { .drv = 1, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 83 }, \
|
||||
{ .id = 63, .x = 4.787, .y = 2.162, .adr = { .drv = 1, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 99 }, \
|
||||
{ .id = 64, .x = 5.537, .y = 2.162, .adr = { .drv = 1, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 68 }, \
|
||||
{ .id = 65, .x = 6.287, .y = 2.162, .adr = { .drv = 1, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 84 }, \
|
||||
{ .id = 66, .x = 7.037, .y = 2.162, .adr = { .drv = 1, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 85 }, \
|
||||
{ .id = 67, .x = 7.787, .y = 2.162, .adr = { .drv = 1, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 86 }, \
|
||||
{ .id = 68, .x = 8.537, .y = 2.162, .adr = { .drv = 2, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 71 }, \
|
||||
{ .id = 69, .x = 9.287, .y = 2.162, .adr = { .drv = 2, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 88 }, \
|
||||
{ .id = 70, .x = 10.506, .y = 2.162, .adr = { .drv = 2, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 104 }, \
|
||||
{ .id = 71, .x = 12.099, .y = 2.162, .adr = { .drv = 2, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 73 }, \
|
||||
{ .id = 72, .x = 12.849, .y = 2.162, .adr = { .drv = 2, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 74 }, \
|
||||
{ .id = 73, .x = 13.599, .y = 2.162, .adr = { .drv = 2, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 75 }, \
|
||||
{ .id = 74, .x = 14.349, .y = 2.162, .adr = { .drv = 2, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 76 }, \
|
||||
{ .id = 75, .x = 0.943, .y = 1.412, .adr = { .drv = 1, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 64 }, \
|
||||
{ .id = 76, .x = 2.162, .y = 1.412, .adr = { .drv = 1, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 113 }, \
|
||||
{ .id = 77, .x = 2.912, .y = 1.412, .adr = { .drv = 1, .cs = 13, .swr = 2, .swg = 1, .swb = 3 }, .scan = 98 }, \
|
||||
{ .id = 78, .x = 3.662, .y = 1.412, .adr = { .drv = 1, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 114 }, \
|
||||
{ .id = 79, .x = 4.412, .y = 1.412, .adr = { .drv = 1, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 115 }, \
|
||||
{ .id = 80, .x = 5.162, .y = 1.412, .adr = { .drv = 1, .cs = 14, .swr = 2, .swg = 1, .swb = 3 }, .scan = 100 }, \
|
||||
{ .id = 81, .x = 5.912, .y = 1.412, .adr = { .drv = 1, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 117 }, \
|
||||
{ .id = 82, .x = 6.662, .y = 1.412, .adr = { .drv = 1, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 101 }, \
|
||||
{ .id = 83, .x = 7.414, .y = 1.41, .adr = { .drv = 1, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 102 }, \
|
||||
{ .id = 84, .x = 8.162, .y = 1.412, .adr = { .drv = 2, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 87 }, \
|
||||
{ .id = 85, .x = 8.912, .y = 1.412, .adr = { .drv = 2, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 103 }, \
|
||||
{ .id = 86, .x = 9.943, .y = 1.412, .adr = { .drv = 2, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 120 }, \
|
||||
{ .id = 87, .x = 12.099, .y = 1.412, .adr = { .drv = 2, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 89 }, \
|
||||
{ .id = 88, .x = 12.849, .y = 1.412, .adr = { .drv = 2, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 90 }, \
|
||||
{ .id = 89, .x = 13.599, .y = 1.412, .adr = { .drv = 2, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 91 }, \
|
||||
{ .id = 90, .x = 11.162, .y = 1.224, .adr = { .drv = 2, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 105 }, \
|
||||
{ .id = 91, .x = 14.349, .y = 1.037, .adr = { .drv = 2, .cs = 16, .swr = 8, .swg = 7, .swb = 9 }, .scan = 92 }, \
|
||||
{ .id = 92, .x = 0.568, .y = 0.662, .adr = { .drv = 1, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 80 }, \
|
||||
{ .id = 93, .x = 1.506, .y = 0.662, .adr = { .drv = 1, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 96 }, \
|
||||
{ .id = 94, .x = 2.443, .y = 0.662, .adr = { .drv = 1, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 112 }, \
|
||||
{ .id = 95, .x = 5.256, .y = 0.662, .adr = { .drv = 1, .cs = 14, .swr = 5, .swg = 4, .swb = 6 }, .scan = 116 }, \
|
||||
{ .id = 96, .x = 8.162, .y = 0.662, .adr = { .drv = 2, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 118 }, \
|
||||
{ .id = 97, .x = 9.287, .y = 0.662, .adr = { .drv = 2, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 119 }, \
|
||||
{ .id = 98, .x = 12.849, .y = 0.662, .adr = { .drv = 2, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 107 }, \
|
||||
{ .id = 99, .x = 13.599, .y = 0.662, .adr = { .drv = 2, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 108 }, \
|
||||
{ .id = 100, .x = 10.412, .y = 0.474, .adr = { .drv = 2, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 121 }, \
|
||||
{ .id = 101, .x = 11.162, .y = 0.474, .adr = { .drv = 2, .cs = 12, .swr = 8, .swg = 7, .swb = 9 }, .scan = 122 }, \
|
||||
{ .id = 102, .x = 11.912, .y = 0.474, .adr = { .drv = 2, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 106 }, \
|
||||
{ .id = 103, .x = 0.168, .y = 5.468, .adr = { .drv = 3, .cs = 1, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 104, .x = 0.827, .y = 5.571, .adr = { .drv = 3, .cs = 1, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 105, .x = 2.144, .y = 5.571, .adr = { .drv = 3, .cs = 2, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 106, .x = 2.802, .y = 5.571, .adr = { .drv = 3, .cs = 3, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 107, .x = 3.461, .y = 5.571, .adr = { .drv = 3, .cs = 3, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 108, .x = 4.119, .y = 5.571, .adr = { .drv = 3, .cs = 4, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 109, .x = 4.778, .y = 5.571, .adr = { .drv = 3, .cs = 4, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 110, .x = 5.436, .y = 5.571, .adr = { .drv = 3, .cs = 5, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 111, .x = 6.095, .y = 5.571, .adr = { .drv = 3, .cs = 5, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 112, .x = 6.753, .y = 5.571, .adr = { .drv = 3, .cs = 6, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 113, .x = 7.412, .y = 5.571, .adr = { .drv = 3, .cs = 6, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 114, .x = 8.07, .y = 5.571, .adr = { .drv = 3, .cs = 7, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 115, .x = 8.729, .y = 5.571, .adr = { .drv = 3, .cs = 7, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 116, .x = 9.387, .y = 5.571, .adr = { .drv = 3, .cs = 8, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 117, .x = 10.046, .y = 5.571, .adr = { .drv = 3, .cs = 8, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 118, .x = 10.704, .y = 5.571, .adr = { .drv = 3, .cs = 9, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 119, .x = 11.363, .y = 5.571, .adr = { .drv = 3, .cs = 9, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 120, .x = 12.021, .y = 5.571, .adr = { .drv = 3, .cs = 10, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 121, .x = 12.68, .y = 5.571, .adr = { .drv = 3, .cs = 10, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 122, .x = 13.997, .y = 5.571, .adr = { .drv = 3, .cs = 11, .swr = 5, .swg = 4, .swb = 6 }, .scan = 254 }, \
|
||||
{ .id = 123, .x = 14.656, .y = 5.468, .adr = { .drv = 3, .cs = 11, .swr = 2, .swg = 1, .swb = 3 }, .scan = 255 }, \
|
||||
{ .id = 124, .x = 14.759, .y = 4.806, .adr = { .drv = 3, .cs = 12, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 125, .x = 14.759, .y = 4.143, .adr = { .drv = 3, .cs = 12, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 126, .x = 14.759, .y = 3.481, .adr = { .drv = 3, .cs = 12, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 127, .x = 14.759, .y = 2.818, .adr = { .drv = 3, .cs = 13, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 128, .x = 14.759, .y = 2.156, .adr = { .drv = 3, .cs = 13, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 129, .x = 14.759, .y = 1.493, .adr = { .drv = 3, .cs = 13, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 130, .x = 14.759, .y = 0.831, .adr = { .drv = 3, .cs = 14, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 131, .x = 14.656, .y = 0.168, .adr = { .drv = 3, .cs = 14, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 132, .x = 13.997, .y = 0.065, .adr = { .drv = 3, .cs = 11, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 133, .x = 13.338, .y = 0.065, .adr = { .drv = 3, .cs = 11, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 134, .x = 12.68, .y = 0.065, .adr = { .drv = 3, .cs = 10, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 135, .x = 12.021, .y = 0.065, .adr = { .drv = 3, .cs = 10, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 136, .x = 11.363, .y = 0.065, .adr = { .drv = 3, .cs = 9, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 137, .x = 10.704, .y = 0.065, .adr = { .drv = 3, .cs = 9, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 138, .x = 10.046, .y = 0.065, .adr = { .drv = 3, .cs = 8, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 139, .x = 9.387, .y = 0.065, .adr = { .drv = 3, .cs = 8, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 140, .x = 8.729, .y = 0.065, .adr = { .drv = 3, .cs = 7, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 141, .x = 8.07, .y = 0.065, .adr = { .drv = 3, .cs = 7, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 142, .x = 7.412, .y = 0.065, .adr = { .drv = 3, .cs = 6, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 143, .x = 6.753, .y = 0.065, .adr = { .drv = 3, .cs = 6, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 144, .x = 6.095, .y = 0.065, .adr = { .drv = 3, .cs = 5, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 145, .x = 5.436, .y = 0.065, .adr = { .drv = 3, .cs = 5, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 146, .x = 4.778, .y = 0.065, .adr = { .drv = 3, .cs = 4, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 147, .x = 4.119, .y = 0.065, .adr = { .drv = 3, .cs = 4, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 148, .x = 3.461, .y = 0.065, .adr = { .drv = 3, .cs = 3, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 149, .x = 2.802, .y = 0.065, .adr = { .drv = 3, .cs = 3, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 150, .x = 2.144, .y = 0.065, .adr = { .drv = 3, .cs = 2, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 151, .x = 1.485, .y = 0.065, .adr = { .drv = 3, .cs = 2, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 152, .x = 0.827, .y = 0.065, .adr = { .drv = 3, .cs = 1, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 153, .x = 0.168, .y = 0.168, .adr = { .drv = 3, .cs = 1, .swr = 8, .swg = 7, .swb = 9 }, .scan = 255 }, \
|
||||
{ .id = 154, .x = 0.065, .y = 0.831, .adr = { .drv = 3, .cs = 15, .swr = 8, .swg = 7, .swb = 9 }, .scan = 254 }, \
|
||||
{ .id = 155, .x = 0.065, .y = 1.493, .adr = { .drv = 3, .cs = 15, .swr = 11, .swg = 10, .swb = 12 }, .scan = 255 }, \
|
||||
{ .id = 156, .x = 0.065, .y = 2.156, .adr = { .drv = 3, .cs = 15, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 }, \
|
||||
{ .id = 157, .x = 0.065, .y = 2.818, .adr = { .drv = 3, .cs = 15, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 158, .x = 0.065, .y = 3.481, .adr = { .drv = 3, .cs = 16, .swr = 11, .swg = 10, .swb = 12 }, .scan = 254 }, \
|
||||
{ .id = 159, .x = 0.065, .y = 4.143, .adr = { .drv = 3, .cs = 16, .swr = 5, .swg = 4, .swb = 6 }, .scan = 255 }, \
|
||||
{ .id = 160, .x = 0.065, .y = 4.806, .adr = { .drv = 3, .cs = 16, .swr = 2, .swg = 1, .swb = 3 }, .scan = 254 } \
|
||||
};
|
||||
|
||||
#define USB_LED_INDICATOR_ENABLE //Comment out to disable indicator functionality
|
||||
#ifdef USB_LED_INDICATOR_ENABLE //Scan codes refer to actual key matrix codes, not KC_* (255 to disable)
|
||||
#define USB_LED_NUM_LOCK_SCANCODE 41
|
||||
#define USB_LED_CAPS_LOCK_SCANCODE 48
|
||||
#define USB_LED_SCROLL_LOCK_SCANCODE 28
|
||||
#define USB_LED_COMPOSE_SCANCODE 255
|
||||
#define USB_LED_KANA_SCANCODE 255
|
||||
#endif //USB_LED_INDICATOR_ENABLE
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/* Data structure to define Shift Register output expander hardware */
|
||||
/* This structure gets shifted into registers LSB first */
|
||||
typedef union {
|
||||
struct {
|
||||
uint16_t RSVD4:1; /*!< bit: 0 */
|
||||
uint16_t SRC_2_B5:1; /*!< bit: 1 USBC-2 CC B5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t SRC_1_B5:1; /*!< bit: 2 USBC-1 CC B5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t S_B_EXT:1; /*!< bit: 3 B TO EX-1 WHEN 1, B TO USBC-1 WHEN 0 */
|
||||
uint16_t SDB_N:1; /*!< bit: 4 SHUTDOWN IS31FL3733 CHIPS WHEN 0, RUN WHEN 1 */
|
||||
uint16_t IRST:1; /*!< bit: 5 RESET IS31FL3733 I2C WHEN 1, RUN WHEN 0 */
|
||||
uint16_t SRC_2_A5:1; /*!< bit: 6 USBC-2 CC A5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t SRC_1_A5:1; /*!< bit: 7 USBC-1 CC A5 UFP Rd 5.1k WHEN 1, DFP Rp 56k WHEN 0 */
|
||||
uint16_t E_VBUS_2:1; /*!< bit: 8 ENABLE 5V TO USBC-2/EX-2 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t E_VBUS_1:1; /*!< bit: 9 ENABLE 5V TO USBC-1/EX-1 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t ENB:1; /*!< bit: 10 ENABLE CHANNEL B USBC-1/EX-1 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t S_A_EXT:1; /*!< bit: 11 A TO USBC-2 WHEN 1, A TO EX-2 WHEN 0 */
|
||||
uint16_t ENA:1; /*!< bit: 12 ENABLE CHANNEL A USBC-2/EX-2 WHEN 1, DISABLE WHEN 0 */
|
||||
uint16_t S_A_UP:1; /*!< bit: 13 DN1 TO A & UP TO B WHEN 1, DN1 TO B & UP TO A WHEN 0 */
|
||||
uint16_t HUB_RESET_N:1; /*!< bit: 14 RESET USB HUB WHEN 0, RUN WHEN 1 */
|
||||
uint16_t HUB_CONNECT:1; /*!< bit: 15 SIGNAL VBUS CONNECT TO USB HUB WHEN 1 */
|
||||
} bit; /*!< Structure used for bit access */
|
||||
uint16_t reg; /*!< Type used for register access */
|
||||
} sr_exp_t;
|
||||
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//Macros to Enable, Disable, and Update USB 5V bus connections
|
||||
#define USBC_CFG_5V1_VAR sr_exp_data.bit.E_VBUS_1 //Variable storing USBC-1 5V Bus state
|
||||
#define USBC_CFG_5V1_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V1_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
#define USBC_CFG_5V2_VAR sr_exp_data.bit.E_VBUS_2 //Variable storing USBC-2 5V Bus state
|
||||
#define USBC_CFG_5V2_ENA 1 //Value to enable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_DIS 0 //Value to disable USBC-1 5V Bus
|
||||
#define USBC_CFG_5V2_UPDATE SR_EXP_WriteData() //Command to run to update value
|
||||
@@ -1,107 +0,0 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum ctrl_keycodes {
|
||||
U_T_AGCR = SAFE_RANGE, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
MD_BOOT, //Restart into bootloader after hold timeout
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, KC_PAUS, \
|
||||
KC_DEL, KC_END, KC_PGDN, KC_SLCK, \
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PSCR, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_P1, KC_P2, KC_P3, \
|
||||
KC_UP, KC_PENT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_P0, KC_PDOT, \
|
||||
KC_LEFT, KC_DOWN, KC_RGHT \
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, KC_MUTE, \
|
||||
KC_MPRV, KC_MNXT, KC_VOLD, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, RGB_TOG, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
};
|
||||
|
||||
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
|
||||
switch (keycode) {
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_MTRX:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
|
||||
}
|
||||
return false;
|
||||
case DBG_KBD:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
|
||||
}
|
||||
return false;
|
||||
case DBG_MOU:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
|
||||
}
|
||||
return false;
|
||||
case MD_BOOT:
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= 500) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
@@ -1,294 +0,0 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum shift_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, KC_PAUS, \
|
||||
KC_DEL, KC_END, KC_PGDN, KC_SLCK, \
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PSCR, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_P1, KC_P2, KC_P3, \
|
||||
KC_UP, KC_PENT, \
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_P0, KC_PDOT, \
|
||||
KC_LEFT, KC_DOWN, KC_RGHT \
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, KC_MUTE, \
|
||||
KC_MPRV, KC_MNXT, KC_VOLD, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, DBG_FAC, KC_APP, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
};
|
||||
|
||||
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
|
||||
else gcr_desired += LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_BRD:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
|
||||
else gcr_desired -= LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
else led_animation_id++;
|
||||
}
|
||||
return false;
|
||||
case L_PTP:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == 0) led_animation_id = led_setups_count - 1;
|
||||
else led_animation_id--;
|
||||
}
|
||||
return false;
|
||||
case L_PSI:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed += ANIMATION_SPEED_STEP;
|
||||
}
|
||||
return false;
|
||||
case L_PSD:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed -= ANIMATION_SPEED_STEP;
|
||||
if (led_animation_speed < 0) led_animation_speed = 0;
|
||||
}
|
||||
return false;
|
||||
case L_T_MD:
|
||||
if (record->event.pressed) {
|
||||
led_lighting_mode++;
|
||||
if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL;
|
||||
}
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
if (record->event.pressed) {
|
||||
led_animation_breathing = !led_animation_breathing;
|
||||
if (led_animation_breathing) {
|
||||
gcr_breathe = gcr_desired;
|
||||
led_animation_breathe_cur = BREATHE_MIN_STEP;
|
||||
breathe_dir = 1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_MTRX:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
|
||||
}
|
||||
return false;
|
||||
case DBG_KBD:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
|
||||
}
|
||||
return false;
|
||||
case DBG_MOU:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
|
||||
}
|
||||
return false;
|
||||
case MD_BOOT:
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
//LEDs are normally inactive, no processing is performed on them
|
||||
//Flags are used in matching criteria for an LED to be active and indicate how to color it
|
||||
//Flags can be found in tmk_core/protocol/arm_atsam/led_matrix.h (prefixed with LED_FLAG_)
|
||||
//LED IDs can be found in config_led.h in the keyboard's directory
|
||||
//Examples are below
|
||||
|
||||
//All LEDs use the user's selected pattern (this is the factory default)
|
||||
{ .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
|
||||
//Specific LEDs use the user's selected pattern while all others are off
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_ROTATE_PATTERN, .id0 = 0xFFFFFFFF, .id1 = 0xAAAAAAAA, .id2 = 0x55555555, .id3 = 0x11111111 },
|
||||
|
||||
//Specific LEDs use specified RGB values while all others are off
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 0xFF, .id1 = 0x00FF, .id2 = 0x0000FF00, .id3 = 0xFF000000, .r = 75, .g = 150, .b = 225 },
|
||||
|
||||
//All LEDs use the user's selected pattern
|
||||
//On layer 1, all key LEDs (except the top row which keeps active pattern) are red while all edge LEDs are green
|
||||
//When layer 1 is active, key LEDs use red (id0 32 - 17: 1111 1111 1111 1111 0000 0000 0000 0000 = 0xFFFF0000) (except top row 16 - 1)
|
||||
//When layer 1 is active, key LEDs use red (id1 64 - 33: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//When layer 1 is active, key LEDs use red (id2 87 - 65: 0000 0000 0111 1111 1111 1111 1111 1111 = 0x007FFFFF)
|
||||
//When layer 1 is active, edge LEDs use green (id2 95 - 88: 1111 1111 1000 0000 0000 0000 0000 0000 = 0xFF800000)
|
||||
//When layer 1 is active, edge LEDs use green (id3 119 - 96: 0000 0000 1111 1111 1111 1111 1111 1111 = 0x00FFFFFF)
|
||||
// { .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id0 = 0xFFFF0000, .id1 = 0xFFFFFFFF, .id2 = 0x007FFFFF, .r = 255, .layer = 1 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_MATCH_LAYER | LED_FLAG_USE_RGB, .id2 = 0xFF800000, .id3 = 0x00FFFFFF, .g = 127, .layer = 1 },
|
||||
|
||||
//All key LEDs use red while edge LEDs use the active pattern
|
||||
//All key LEDs use red (id0 32 - 1: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//All key LEDs use red (id1 64 - 33: 1111 1111 1111 1111 1111 1111 1111 1111 = 0xFFFFFFFF)
|
||||
//All key LEDs use red (id2 87 - 65: 0000 0000 0111 1111 1111 1111 1111 1111 = 0x007FFFFF)
|
||||
//Edge uses active pattern (id2 95 - 88: 1111 1111 1000 0000 0000 0000 0000 0000 = 0xFF800000)
|
||||
//Edge uses active pattern (id3 119 - 96: 0000 0000 1111 1111 1111 1111 1111 1111 = 0x00FFFFFF)
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_RGB, .id0 = 0xFFFFFFFF, .id1 = 0xFFFFFFFF, .id2 = 0x007FFFFF, .r = 255 },
|
||||
// { .flags = LED_FLAG_MATCH_ID | LED_FLAG_USE_ROTATE_PATTERN , .id2 = 0xFF800000, .id3 = 0x00FFFFFF },
|
||||
|
||||
//end must be set to 1 to indicate end of instruction set
|
||||
{ .end = 1 }
|
||||
};
|
||||
@@ -1,2 +0,0 @@
|
||||
# This keymap requires Massdrop Configurator support
|
||||
OPT_DEFS += -DUSE_MASSDROP_CONFIGURATOR
|
||||
@@ -1,264 +0,0 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
enum shift_keycodes {
|
||||
L_BRI = SAFE_RANGE, //LED Brightness Increase
|
||||
L_BRD, //LED Brightness Decrease
|
||||
L_EDG_I, //LED Edge Brightness Increase
|
||||
L_EDG_D, //LED Edge Brightness Decrease
|
||||
L_EDG_M, //LED Edge lighting mode
|
||||
L_PTN, //LED Pattern Select Next
|
||||
L_PTP, //LED Pattern Select Previous
|
||||
L_PSI, //LED Pattern Speed Increase
|
||||
L_PSD, //LED Pattern Speed Decrease
|
||||
L_T_MD, //LED Toggle Mode
|
||||
L_T_ONF, //LED Toggle On / Off
|
||||
L_ON, //LED On
|
||||
L_OFF, //LED Off
|
||||
L_T_BR, //LED Toggle Breath Effect
|
||||
L_T_PTD, //LED Toggle Scrolling Pattern Direction and effect
|
||||
U_T_AGCR, //USB Toggle Automatic GCR control
|
||||
DBG_TOG, //DEBUG Toggle On / Off
|
||||
DBG_MTRX, //DEBUG Toggle Matrix Prints
|
||||
DBG_KBD, //DEBUG Toggle Keyboard Prints
|
||||
DBG_MOU, //DEBUG Toggle Mouse Prints
|
||||
DBG_FAC, //DEBUG Factory light testing (All on white)
|
||||
MD_BOOT //Restart into bootloader after hold timeout
|
||||
};
|
||||
|
||||
#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode
|
||||
|
||||
keymap_config_t keymap_config;
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
[0] = LAYOUT(
|
||||
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, KC_PAUS, \
|
||||
KC_DEL, KC_END, KC_PGDN, KC_SLCK, \
|
||||
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PSCR, \
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, \
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_P1, KC_P2, KC_P3, \
|
||||
KC_UP, KC_PENT, \
|
||||
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_P0, KC_PDOT, \
|
||||
KC_LEFT, KC_DOWN, KC_RGHT \
|
||||
),
|
||||
[1] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, KC_MUTE, \
|
||||
KC_MPRV, KC_MNXT, KC_VOLD, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
L_T_BR, L_PSD, L_BRI, L_PSI, L_EDG_I, _______, _______, _______, U_T_AGCR,_______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
L_T_PTD, L_PTP, L_BRD, L_PTN, L_EDG_D, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, L_T_MD, L_T_ONF, _______, L_EDG_M, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, DBG_FAC, KC_APP, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
/*
|
||||
[X] = LAYOUT(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, \
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, \
|
||||
_______, _______, _______ \
|
||||
),
|
||||
*/
|
||||
};
|
||||
|
||||
// Runs just one time when the keyboard initializes.
|
||||
void matrix_init_user(void) {
|
||||
};
|
||||
|
||||
// Runs constantly in the background, in a loop.
|
||||
void matrix_scan_user(void) {
|
||||
};
|
||||
|
||||
#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
|
||||
#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
|
||||
#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
static uint32_t key_timer;
|
||||
static uint8_t scroll_effect = 0;
|
||||
|
||||
switch (keycode) {
|
||||
case L_BRI:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX;
|
||||
else gcr_desired += LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_BRD:
|
||||
if (record->event.pressed) {
|
||||
if (LED_GCR_STEP > gcr_desired) gcr_desired = 0;
|
||||
else gcr_desired -= LED_GCR_STEP;
|
||||
if (led_animation_breathing) gcr_breathe = gcr_desired;
|
||||
}
|
||||
return false;
|
||||
case L_EDG_M:
|
||||
if (record->event.pressed) {
|
||||
led_edge_mode++;
|
||||
if (led_edge_mode > LED_EDGE_MODE_MAX) {
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_EDG_I:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness += 0.1;
|
||||
if (led_edge_brightness > 1) { led_edge_brightness = 1; }
|
||||
}
|
||||
return false;
|
||||
case L_EDG_D:
|
||||
if (record->event.pressed) {
|
||||
led_edge_brightness -= 0.1;
|
||||
if (led_edge_brightness < 0) { led_edge_brightness = 0; }
|
||||
}
|
||||
return false;
|
||||
case L_PTN:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == led_setups_count - 1) led_animation_id = 0;
|
||||
else led_animation_id++;
|
||||
}
|
||||
return false;
|
||||
case L_PTP:
|
||||
if (record->event.pressed) {
|
||||
if (led_animation_id == 0) led_animation_id = led_setups_count - 1;
|
||||
else led_animation_id--;
|
||||
}
|
||||
return false;
|
||||
case L_PSI:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed += ANIMATION_SPEED_STEP;
|
||||
}
|
||||
return false;
|
||||
case L_PSD:
|
||||
if (record->event.pressed) {
|
||||
led_animation_speed -= ANIMATION_SPEED_STEP;
|
||||
if (led_animation_speed < 0) led_animation_speed = 0;
|
||||
}
|
||||
return false;
|
||||
case L_T_MD:
|
||||
if (record->event.pressed) {
|
||||
led_lighting_mode++;
|
||||
if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL;
|
||||
}
|
||||
return false;
|
||||
case L_T_ONF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(!I2C3733_Control_Get());
|
||||
}
|
||||
return false;
|
||||
case L_ON:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case L_OFF:
|
||||
if (record->event.pressed) {
|
||||
I2C3733_Control_Set(0);
|
||||
}
|
||||
return false;
|
||||
case L_T_BR:
|
||||
if (record->event.pressed) {
|
||||
led_animation_breathing = !led_animation_breathing;
|
||||
if (led_animation_breathing) {
|
||||
gcr_breathe = gcr_desired;
|
||||
led_animation_breathe_cur = BREATHE_MIN_STEP;
|
||||
breathe_dir = 1;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case L_T_PTD:
|
||||
if (record->event.pressed) {
|
||||
scroll_effect++;
|
||||
if (scroll_effect == 1) { //Patterns with scroll move horizontal (Right to left)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 2) { //Patterns with scroll move vertical (Top to bottom)
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 3) { //Patterns with scroll move vertical (Bottom to top)
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 1;
|
||||
led_animation_circular = 0;
|
||||
} else if (scroll_effect == 4) { //Patterns with scroll explode from center
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else if (scroll_effect == 5) { //Patterns with scroll implode on center
|
||||
led_animation_direction = 1;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 1;
|
||||
} else { //Patterns with scroll move horizontal (Left to right)
|
||||
scroll_effect = 0;
|
||||
led_animation_direction = 0;
|
||||
led_animation_orientation = 0;
|
||||
led_animation_circular = 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
case U_T_AGCR:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_FAC:
|
||||
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
|
||||
led_lighting_mode = LED_MODE_NORMAL;
|
||||
led_edge_brightness = 1;
|
||||
led_edge_mode = LED_EDGE_MODE_ALL;
|
||||
led_animation_breathing = 0;
|
||||
led_animation_id = 7; //led_programs.c led_setups leds_white index
|
||||
gcr_desired = LED_GCR_MAX;
|
||||
I2C3733_Control_Set(1);
|
||||
}
|
||||
return false;
|
||||
case DBG_TOG:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
|
||||
}
|
||||
return false;
|
||||
case DBG_MTRX:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
|
||||
}
|
||||
return false;
|
||||
case DBG_KBD:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
|
||||
}
|
||||
return false;
|
||||
case DBG_MOU:
|
||||
if (record->event.pressed) {
|
||||
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
|
||||
}
|
||||
return false;
|
||||
case MD_BOOT:
|
||||
if (record->event.pressed) {
|
||||
key_timer = timer_read32();
|
||||
} else {
|
||||
if (timer_elapsed32(key_timer) >= BOOTKEY_HOLD_MS) {
|
||||
reset_keyboard();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
return true; //Process all other keycodes normally
|
||||
}
|
||||
}
|
||||
|
||||
led_instruction_t led_instructions[] = {
|
||||
//Please see ../default_md/keymap.c for examples
|
||||
|
||||
//All LEDs use the user's selected pattern (this is the factory default)
|
||||
{ .flags = LED_FLAG_USE_ROTATE_PATTERN },
|
||||
|
||||
//end must be set to 1 to indicate end of instruction set
|
||||
{ .end = 1 }
|
||||
};
|
||||
@@ -1,211 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "shift.h"
|
||||
|
||||
#include "d51_util.h"
|
||||
#include "debug.h"
|
||||
#include "clks.h"
|
||||
#include "spi.h"
|
||||
#include <string.h>
|
||||
|
||||
#define MCU_PORTS_USED 1 //PA
|
||||
|
||||
matrix_row_t mlatest[MATRIX_ROWS];
|
||||
matrix_row_t mlast[MATRIX_ROWS];
|
||||
matrix_row_t mdebounced[MATRIX_ROWS];
|
||||
|
||||
uint8_t row_ports[] = { MATRIX_ROW_PORTS };
|
||||
uint8_t row_pins[] = { MATRIX_ROW_PINS };
|
||||
uint8_t col_ports[] = { MATRIX_COL_PORTS };
|
||||
uint8_t col_pins[] = { MATRIX_COL_PINS };
|
||||
uint32_t row_masks[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_kb(void) {
|
||||
matrix_init_user();
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_kb(void) {
|
||||
matrix_scan_user();
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_init_user(void) {
|
||||
}
|
||||
|
||||
__attribute__ ((weak))
|
||||
void matrix_scan_user(void) {
|
||||
}
|
||||
|
||||
void matrix_init(void)
|
||||
{
|
||||
SR_KC_Init();
|
||||
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mlast, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
memset(mdebounced, 0, MATRIX_ROWS * sizeof(matrix_row_t));
|
||||
|
||||
memset(row_masks, 0, sizeof(row_masks));
|
||||
|
||||
//Inputs
|
||||
uint8_t row;
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
PORT->Group[row_ports[row]].DIRCLR.reg = 1 << row_pins[row]; //Input
|
||||
PORT->Group[row_ports[row]].OUTCLR.reg = 1 << row_pins[row]; //Low
|
||||
PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.INEN = 1; //Input Enable,
|
||||
PORT->Group[row_ports[row]].PINCFG[row_pins[row]].bit.PULLEN = 1; //Pull Enable
|
||||
row_masks[row_ports[row]] |= 1 << row_pins[row]; //Add pin to proper row mask
|
||||
}
|
||||
|
||||
//Outputs
|
||||
uint8_t col;
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
if (PORT_IS_MCU(col_ports[col])) //PORT_GROUPS from MCU's header file
|
||||
{
|
||||
PORT->Group[col_ports[col]].DIRSET.reg = 1 << col_pins[col]; //Output
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Low
|
||||
}
|
||||
else if (PORT_IS_SR(col_ports[col])) //Pins on Shift Register
|
||||
{
|
||||
//Outputs Low
|
||||
sr_kc_data.reg = 0;
|
||||
SR_KC_WriteData();
|
||||
}
|
||||
}
|
||||
|
||||
matrix_init_quantum();
|
||||
}
|
||||
|
||||
uint64_t mdebouncing = 0;
|
||||
bool debouncing = false;
|
||||
|
||||
uint8_t matrix_scan(void)
|
||||
{
|
||||
uint64_t timer;
|
||||
uint8_t row;
|
||||
uint8_t col;
|
||||
uint32_t scans[MCU_PORTS_USED]; //Array size must match number of unique MCU ports used for reads (PA, PB, PC, etc)
|
||||
|
||||
memset(mlatest, 0, MATRIX_ROWS * sizeof(matrix_row_t)); //Zero the result buffer
|
||||
|
||||
for (col = 0; col < MATRIX_COLS; col++)
|
||||
{
|
||||
//Set output
|
||||
if (PORT_IS_MCU(col_ports[col])) //Pin is on MCU
|
||||
{
|
||||
PORT->Group[col_ports[col]].OUTSET.reg = 1 << col_pins[col]; //Set col output
|
||||
wait_us(1); //Delay for output
|
||||
}
|
||||
else if (PORT_IS_SR(col_ports[col])) //Pin is on Shift Register
|
||||
{
|
||||
sr_kc_data.reg |= (1 << col_pins[col]); //Set col output in RAM
|
||||
SR_KC_WriteData(); //Write shift register update
|
||||
wait_us(1); //Delay for output
|
||||
}
|
||||
else continue; //Bad configuration
|
||||
|
||||
//Read input (add unique ports as needed, PA, PB, PC, etc)
|
||||
scans[PA] = PORT->Group[PA].IN.reg & row_masks[PA]; //Read PA row pins data
|
||||
|
||||
//Clear output
|
||||
if (PORT_IS_MCU(col_ports[col])) //Pin is on MCU
|
||||
{
|
||||
PORT->Group[col_ports[col]].OUTCLR.reg = 1 << col_pins[col]; //Clear col output
|
||||
}
|
||||
else if (PORT_IS_SR(col_ports[col])) //Pin is on Shift Register
|
||||
{
|
||||
sr_kc_data.reg &= ~(1 << col_pins[col]); //Clear col output in RAM
|
||||
SR_KC_WriteData(); //Write shift register update
|
||||
}
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
//Move scan bits from scans array into proper row bit locations
|
||||
if (scans[row_ports[row]] & (1 << row_pins[row]))
|
||||
mlatest[row] |= 1 << col;
|
||||
}
|
||||
}
|
||||
|
||||
timer = timer_read64();
|
||||
|
||||
for (row = 0; row < MATRIX_ROWS; row++)
|
||||
{
|
||||
if (mlast[row] != mlatest[row]) {
|
||||
debouncing = true;
|
||||
mdebouncing = timer + DEBOUNCE;
|
||||
}
|
||||
|
||||
mlast[row] = mlatest[row];
|
||||
}
|
||||
|
||||
if (debouncing && timer >= mdebouncing)
|
||||
{
|
||||
for (row = 0; row < MATRIX_ROWS; row++) {
|
||||
mdebounced[row] = mlatest[row];
|
||||
}
|
||||
|
||||
mdebouncing = 0;
|
||||
debouncing = false;
|
||||
}
|
||||
|
||||
matrix_scan_quantum();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
matrix_row_t matrix_get_row(uint8_t row)
|
||||
{
|
||||
return mdebounced[row];
|
||||
}
|
||||
|
||||
void matrix_print(void)
|
||||
{
|
||||
char buf[(MATRIX_COLS+8)*(MATRIX_ROWS+1)] = "R C";
|
||||
char *pbuf = buf+3;
|
||||
uint32_t cols;
|
||||
uint32_t rows;
|
||||
matrix_row_t row;
|
||||
|
||||
for (cols = 1; cols <= MATRIX_COLS; cols++)
|
||||
{
|
||||
*pbuf = (cols%10)+48;
|
||||
pbuf++;
|
||||
}
|
||||
*pbuf = '\r'; pbuf++;
|
||||
*pbuf = '\n'; pbuf++;
|
||||
|
||||
for (rows = 1; rows <= MATRIX_ROWS; rows++)
|
||||
{
|
||||
row = matrix_get_row(rows-1);
|
||||
if (rows < 10) { *pbuf = rows+48; pbuf++; *pbuf = ' '; pbuf++; *pbuf = ' '; pbuf++; }
|
||||
else { *pbuf = (rows/10)+48; pbuf++; *pbuf = (rows%10)+48; pbuf++; *pbuf = ' '; pbuf++; }
|
||||
for (cols = 0; cols < MATRIX_COLS; cols++)
|
||||
{
|
||||
if (row & 1 << cols) *pbuf = 'X';
|
||||
else *pbuf = '.';
|
||||
pbuf++;
|
||||
}
|
||||
*pbuf = '\r'; pbuf++;
|
||||
*pbuf = '\n'; pbuf++;
|
||||
}
|
||||
*pbuf = 0;
|
||||
dprint(buf);
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
/*
|
||||
Copyright 2011 Jun Wako <wakojun@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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/>.
|
||||
*/
|
||||
#ifndef MATRIX_H
|
||||
#define MATRIX_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "keyboard.h"
|
||||
|
||||
#if (MATRIX_COLS <= 8)
|
||||
typedef uint8_t matrix_row_t;
|
||||
#elif (MATRIX_COLS <= 16)
|
||||
typedef uint16_t matrix_row_t;
|
||||
#elif (MATRIX_COLS <= 32)
|
||||
typedef uint32_t matrix_row_t;
|
||||
#else
|
||||
#error "MATRIX_COLS: invalid value"
|
||||
#endif
|
||||
|
||||
#define MATRIX_IS_ON(row, col) (matrix_get_row(row) && (1<<col))
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* number of matrix rows */
|
||||
uint8_t matrix_rows(void);
|
||||
/* number of matrix columns */
|
||||
uint8_t matrix_cols(void);
|
||||
/* should be called at early stage of startup before matrix_init.(optional) */
|
||||
void matrix_setup(void);
|
||||
/* intialize matrix for scaning. */
|
||||
void matrix_init(void);
|
||||
/* scan all key states on matrix */
|
||||
uint8_t matrix_scan(void);
|
||||
/* whether modified from previous scan. used after matrix_scan. */
|
||||
bool matrix_is_modified(void) __attribute__ ((deprecated));
|
||||
/* whether a switch is on */
|
||||
bool matrix_is_on(uint8_t row, uint8_t col);
|
||||
/* matrix state on row */
|
||||
matrix_row_t matrix_get_row(uint8_t row);
|
||||
/* print matrix for debug */
|
||||
void matrix_print(void);
|
||||
|
||||
/* power control */
|
||||
void matrix_power_up(void);
|
||||
void matrix_power_down(void);
|
||||
|
||||
/* executes code for Quantum */
|
||||
void matrix_init_quantum(void);
|
||||
void matrix_scan_quantum(void);
|
||||
|
||||
void matrix_init_kb(void);
|
||||
void matrix_scan_kb(void);
|
||||
|
||||
void matrix_init_user(void);
|
||||
void matrix_scan_user(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,38 +0,0 @@
|
||||
# project specific files
|
||||
SRC = matrix.c
|
||||
SRC += config_led.c
|
||||
SRC += spi.c
|
||||
SRC += usb.c
|
||||
|
||||
#For platform and packs
|
||||
ARM_ATSAM = SAMD51J18A
|
||||
MCU = cortex-m4
|
||||
|
||||
CUSTOM_MATRIX = yes
|
||||
|
||||
# Build Options
|
||||
# comment out to disable the options.
|
||||
#
|
||||
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
|
||||
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
|
||||
CONSOLE_ENABLE = no # Console for debug(+400)
|
||||
COMMAND_ENABLE = no # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
|
||||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
|
||||
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
|
||||
UNICODE_ENABLE = no # Unicode
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
|
||||
AUDIO_ENABLE = no # Audio output on port C6
|
||||
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
|
||||
HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
|
||||
VIRTSER_ENABLE = no # USB Serial Driver
|
||||
RAW_ENABLE = no # Raw device
|
||||
AUTO_SHIFT_ENABLE = no # Auto Shift
|
||||
|
||||
# Custom RGB matrix handling
|
||||
RGB_MATRIX_ENABLE = custom
|
||||
@@ -1,40 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
#include "config_led.h"
|
||||
#include "matrix.h"
|
||||
|
||||
#include "i2c_master.h"
|
||||
#include "led_matrix.h" //For led keycodes
|
||||
#include "usb/udi_cdc.h"
|
||||
#include "usb/usb2422.h"
|
||||
|
||||
#define LAYOUT( \
|
||||
K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \
|
||||
K014, K015, K016, K017, K018, K019, K020, K021, K022, K023, K024, K025, K026, \
|
||||
K027, K028, K029, K030, K031, K032, K033, K034, K035, K036, K037, K038, K039, \
|
||||
K040, K041, K042, K043, K044, K045, K046, K047, K048, K049, K050, K051, K052, \
|
||||
K053, K054, K055, K056, K057, K058, K059, K060, K061, K062, K063, K064, K065, \
|
||||
K066, K067, K068, K069, K070, K071, K072, K073, K074, K075, K076, K077, K078, \
|
||||
K079, K080, K081, K082, K083, K084, K085, K086, K087, K088, K089, K090, K091, \
|
||||
K092, K093, K094, K095, K096, K097, K098, K099, K100, K101, K102 \
|
||||
) { \
|
||||
{ K001, K002, K003, K005, K006, K007, K008, K010, K012, K014, K015, K016, K017 }, \
|
||||
{ K022, K023, K004, K027, K029, K030, K009, K011, K013, K018, K019, K020, K021 }, \
|
||||
{ K040, K024, K025, K028, K046, K031, K032, K034, K035, K036, K037, K038, K039 }, \
|
||||
{ K058, K041, K026, K044, K047, K048, K033, K051, K052, K054, K055, K056, K057 }, \
|
||||
{ K075, K042, K043, K045, K064, K049, K050, K068, K053, K071, K072, K073, K074 }, \
|
||||
{ K092, K059, K061, K062, K065, K066, K067, K084, K069, K087, K088, K089, K091 }, \
|
||||
{ K093, K060, K077, K063, K080, K082, K083, K085, K070, K090, K102, K098, K099 }, \
|
||||
{ K094, K076, K078, K079, K095, K081, K096, K097, K086, K100, K101, KC_NO, KC_NO } \
|
||||
}
|
||||
|
||||
#define TOGGLE_FLAG_AND_PRINT(var, name) { \
|
||||
if (var) { \
|
||||
dprintf(name " disabled\r\n"); \
|
||||
var = !var; \
|
||||
} else { \
|
||||
var = !var; \
|
||||
dprintf(name " enabled\r\n"); \
|
||||
} \
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void SR_EXP_Init_kb(void) {
|
||||
/* Initialize shift register */
|
||||
SR_EXP_OE_N_DIS;
|
||||
SR_EXP_RCLK_HI;
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DORD = 1; //Data Order - LSB is transferred first
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPOL = 1; //Clock Polarity - SCK high when idle. Leading edge of cycle is falling. Trailing rising.
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.CPHA = 1; //Clock Phase - Leading Edge Falling, change, Trailing Edge - Rising, sample
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DIPO = 3; //Data In Pinout - SERCOM PAD[3] is used as data input (Configure away from DOPO. Not using input.)
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.DOPO = 0; //Data Output PAD[0], Serial Clock PAD[1]
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.MODE = 3; //Operating Mode - Master operation
|
||||
|
||||
SR_EXP_SERCOM->SPI.CTRLA.bit.ENABLE = 1; //Enable - Peripheral is enabled or being enabled
|
||||
while (SR_EXP_SERCOM->SPI.SYNCBUSY.bit.ENABLE) { DBGC(DC_SPI_EXP_SYNC_ENABLING); }
|
||||
|
||||
/* Set default shift register values */
|
||||
sr_exp_data.reg = 0; //Clear data register
|
||||
sr_exp_data.bit.HUB_CONNECT = 0; //USB Hub disconnected
|
||||
sr_exp_data.bit.HUB_RESET_N = 0; //USB Hub in reset state
|
||||
|
||||
sr_exp_data.bit.SRC_1_A5 = 1; //Set CON1 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_1_B5 = 1; //Set CON1 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_A5 = 1; //Set CON2 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_B5 = 1; //Set CON2 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.S_A_UP = 0; //0 = DN1 to A and UP to B, 1 = DN1 to B and UP to A
|
||||
sr_exp_data.bit.S_A_EXT = 1; //1 = Onboard, 0 = Offboard
|
||||
sr_exp_data.bit.S_B_EXT = 0; //0 = Onboard, 1 = Offboard
|
||||
|
||||
sr_exp_data.bit.ENB = 0; //Disable CON1
|
||||
sr_exp_data.bit.ENA = 0; //Disable CON2
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
sr_exp_data.bit.IRST = 1; //LED drivers I2C in reset
|
||||
sr_exp_data.bit.SDB_N = 0; //LED drivers in shutdown
|
||||
|
||||
/* Write shift register data */
|
||||
SR_EXP_WriteData();
|
||||
|
||||
/* Enable shift register output */
|
||||
SR_EXP_OE_N_ENA;
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 Massdrop Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
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 "arm_atsam_protocol.h"
|
||||
|
||||
void usb_set_host_kb(uint8_t con, uint8_t rp_best_index) {
|
||||
if (con == 1) {
|
||||
//DN1 to A (CON2/EX2), UP to B (CON1/EX1)
|
||||
sr_exp_data.bit.S_A_UP = 1; //0 = DN1 to B and UP to A, 1 = DN1 to A and UP to B (SAI-SBI)
|
||||
|
||||
if (ADC_USBC_IS_ONB(rp_best_index)) { //Check if the port detected is onboard
|
||||
sr_exp_data.bit.S_B_EXT = 0; //Onboard port
|
||||
g_usb_host_port = USB_HOST_PORT_1; //Save host port
|
||||
} else { //Port is external
|
||||
sr_exp_data.bit.S_B_EXT = 1; //External port
|
||||
g_usb_host_port = USB_HOST_PORT_1_EXT; //Save host port
|
||||
}
|
||||
|
||||
sr_exp_data.bit.E_VBUS_1 = 1; //Enable CON1 5V
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
//DN1 to B (CON1/EX1), UP to A (CON2/EX2)
|
||||
sr_exp_data.bit.S_A_UP = 0; //0 = DN1 to B and UP to A, 1 = DN1 to A and UP to B (SAI-SBI)
|
||||
|
||||
if (ADC_USBC_IS_ONB(rp_best_index)) { //Check if the port detected is onboard
|
||||
sr_exp_data.bit.S_A_EXT = 1; //Onboard port
|
||||
g_usb_host_port = USB_HOST_PORT_2; //Save host port
|
||||
} else { //Port is external
|
||||
sr_exp_data.bit.S_A_EXT = 0; //External port
|
||||
g_usb_host_port = USB_HOST_PORT_2_EXT; //Save host port
|
||||
}
|
||||
|
||||
sr_exp_data.bit.E_VBUS_2 = 1; //Enable CON2 5V
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_set_extra_kb(uint8_t con) {
|
||||
if (con == 1) {
|
||||
sr_exp_data.bit.SRC_1_A5 = 0; //Set CON1 CC A5 as Rp 56k
|
||||
sr_exp_data.bit.SRC_1_B5 = 0; //Set CON1 CC B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
} else if (con == 2) {
|
||||
sr_exp_data.bit.SRC_2_A5 = 0; //Set CON2 CC A5 as Rp 56k
|
||||
sr_exp_data.bit.SRC_2_B5 = 0; //Set CON2 CC B5 as Rp 56k
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
}
|
||||
|
||||
void usb_init_host_detection_kb(void) {
|
||||
//Disable 5V
|
||||
sr_exp_data.bit.E_VBUS_1 = 0; //Disable CON1 5V
|
||||
sr_exp_data.bit.E_VBUS_2 = 0; //Disable CON2 5V
|
||||
|
||||
//Configure default paths
|
||||
sr_exp_data.bit.S_A_UP = 0; //DN1 TO A & UP TO B WHEN 1, DN1 TO B & UP TO A WHEN 0
|
||||
sr_exp_data.bit.S_A_EXT = 1; //1 = Onboard, 0 = Offboard (SAO)
|
||||
sr_exp_data.bit.S_B_EXT = 0; //0 = Onboard, 1 = Offboard (SBO)
|
||||
|
||||
//Configure CC lines
|
||||
sr_exp_data.bit.SRC_1_A5 = 1; //Set CON1 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_1_B5 = 1; //Set CON1 CC B5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_A5 = 1; //Set CON2 CC A5 as Rd 5.1k
|
||||
sr_exp_data.bit.SRC_2_B5 = 1; //Set CON2 CC B5 as Rd 5.1k
|
||||
|
||||
//Enable ports
|
||||
sr_exp_data.bit.ENB = 1; //Enable CON1/EX1 for use
|
||||
sr_exp_data.bit.ENA = 1; //Enable CON2/EX2 for use
|
||||
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
}
|
||||
|
||||
//Return 1 if configuration successful
|
||||
//Return 0 otherwise
|
||||
uint8_t usb_attach_port_configure_kb(uint8_t g_usb_host_port, uint16_t usbc_cc_a5_v, uint16_t usbc_cc_b5_v) {
|
||||
if (USB_HOST_IS_1(g_usb_host_port)) { //If host is port 1
|
||||
//Set up port 2
|
||||
if (USBC_IS_SINK_ONB(usbc_cc_a5_v, usbc_cc_b5_v)) { //If onboard port detected
|
||||
sr_exp_data.bit.S_A_EXT = 1; //Set port 2 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
} else if (USBC_IS_SINK_EXT(usbc_cc_a5_v, usbc_cc_b5_v)) { //If external port detected
|
||||
sr_exp_data.bit.S_A_EXT = 0; //Set port 2 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
}
|
||||
} else if (USB_HOST_IS_2(g_usb_host_port)) { //If host is on port 2
|
||||
//Set up port 1
|
||||
if (USBC_IS_SINK_ONB(usbc_cc_a5_v, usbc_cc_b5_v)) { //If onboard port detected
|
||||
sr_exp_data.bit.S_B_EXT = 0; //Set port 1 as onboard port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
} else if (USBC_IS_SINK_EXT(usbc_cc_a5_v, usbc_cc_b5_v)) { //If external port detected
|
||||
sr_exp_data.bit.S_B_EXT = 1; //Set port 1 as external port
|
||||
SR_EXP_WriteData(); //Update port configuration
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
#include "konstantin.h"
|
||||
|
||||
static const hsv_t *colors[] = { &GODSPEED_BLUE, &GODSPEED_YELLOW };
|
||||
static const HSV *colors[] = { &GODSPEED_BLUE, &GODSPEED_YELLOW };
|
||||
static const size_t cnum = sizeof colors / sizeof *colors;
|
||||
static size_t cidx = 0;
|
||||
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL)))
|
||||
|
||||
#define LAYER_FN
|
||||
#define LAYER_NUMPAD
|
||||
|
||||
@@ -647,7 +647,6 @@ bool process_record_quantum(keyrecord_t *record) {
|
||||
#endif
|
||||
break;
|
||||
case MAGIC_TOGGLE_NKRO:
|
||||
clear_keyboard(); // clear first buffer to prevent stuck keys -PS080919
|
||||
keymap_config.nkro = !keymap_config.nkro;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -128,9 +128,7 @@ void eeconfig_update_rgb_matrix_default(void) {
|
||||
dprintf("eeconfig_update_rgb_matrix_default\n");
|
||||
rgb_matrix_config.enable = 1;
|
||||
rgb_matrix_config.mode = RGB_MATRIX_STARTUP_MODE;
|
||||
rgb_matrix_config.hue = 0;
|
||||
rgb_matrix_config.sat = UINT8_MAX;
|
||||
rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
|
||||
rgb_matrix_config.hsv = (HSV){ 0, UINT8_MAX, RGB_MATRIX_MAXIMUM_BRIGHTNESS };
|
||||
rgb_matrix_config.speed = UINT8_MAX / 2;
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
@@ -139,9 +137,9 @@ void eeconfig_debug_rgb_matrix(void) {
|
||||
dprintf("rgb_matrix_config eprom\n");
|
||||
dprintf("rgb_matrix_config.enable = %d\n", rgb_matrix_config.enable);
|
||||
dprintf("rgb_matrix_config.mode = %d\n", rgb_matrix_config.mode);
|
||||
dprintf("rgb_matrix_config.hue = %d\n", rgb_matrix_config.hue);
|
||||
dprintf("rgb_matrix_config.sat = %d\n", rgb_matrix_config.sat);
|
||||
dprintf("rgb_matrix_config.val = %d\n", rgb_matrix_config.val);
|
||||
dprintf("rgb_matrix_config.hsv.h = %d\n", rgb_matrix_config.hsv.h);
|
||||
dprintf("rgb_matrix_config.hsv.s = %d\n", rgb_matrix_config.hsv.s);
|
||||
dprintf("rgb_matrix_config.hsv.v = %d\n", rgb_matrix_config.hsv.v);
|
||||
dprintf("rgb_matrix_config.speed = %d\n", rgb_matrix_config.speed);
|
||||
}
|
||||
|
||||
@@ -492,34 +490,34 @@ void rgb_matrix_step_reverse(void) {
|
||||
}
|
||||
|
||||
void rgb_matrix_increase_hue(void) {
|
||||
rgb_matrix_config.hue += RGB_MATRIX_HUE_STEP;
|
||||
rgb_matrix_config.hsv.h += RGB_MATRIX_HUE_STEP;
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
void rgb_matrix_decrease_hue(void) {
|
||||
rgb_matrix_config.hue -= RGB_MATRIX_HUE_STEP;
|
||||
rgb_matrix_config.hsv.h -= RGB_MATRIX_HUE_STEP;
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
void rgb_matrix_increase_sat(void) {
|
||||
rgb_matrix_config.sat = qadd8(rgb_matrix_config.sat, RGB_MATRIX_SAT_STEP);
|
||||
rgb_matrix_config.hsv.s = qadd8(rgb_matrix_config.hsv.s, RGB_MATRIX_SAT_STEP);
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
void rgb_matrix_decrease_sat(void) {
|
||||
rgb_matrix_config.sat = qsub8(rgb_matrix_config.sat, RGB_MATRIX_SAT_STEP);
|
||||
rgb_matrix_config.hsv.s = qsub8(rgb_matrix_config.hsv.s, RGB_MATRIX_SAT_STEP);
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
void rgb_matrix_increase_val(void) {
|
||||
rgb_matrix_config.val = qadd8(rgb_matrix_config.val, RGB_MATRIX_VAL_STEP);
|
||||
if (rgb_matrix_config.val > RGB_MATRIX_MAXIMUM_BRIGHTNESS)
|
||||
rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
|
||||
rgb_matrix_config.hsv.v = qadd8(rgb_matrix_config.hsv.v, RGB_MATRIX_VAL_STEP);
|
||||
if (rgb_matrix_config.hsv.v > RGB_MATRIX_MAXIMUM_BRIGHTNESS)
|
||||
rgb_matrix_config.hsv.v = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
void rgb_matrix_decrease_val(void) {
|
||||
rgb_matrix_config.val = qsub8(rgb_matrix_config.val, RGB_MATRIX_VAL_STEP);
|
||||
rgb_matrix_config.hsv.v = qsub8(rgb_matrix_config.hsv.v, RGB_MATRIX_VAL_STEP);
|
||||
eeconfig_update_rgb_matrix(rgb_matrix_config.raw);
|
||||
}
|
||||
|
||||
@@ -561,9 +559,9 @@ void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val) {
|
||||
}
|
||||
|
||||
void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) {
|
||||
rgb_matrix_config.hue = hue;
|
||||
rgb_matrix_config.sat = sat;
|
||||
rgb_matrix_config.val = val;
|
||||
if (rgb_matrix_config.val > RGB_MATRIX_MAXIMUM_BRIGHTNESS)
|
||||
rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
|
||||
rgb_matrix_config.hsv.h = hue;
|
||||
rgb_matrix_config.hsv.s = sat;
|
||||
rgb_matrix_config.hsv.v = val;
|
||||
if (rgb_matrix_config.hsv.v > RGB_MATRIX_MAXIMUM_BRIGHTNESS)
|
||||
rgb_matrix_config.hsv.v = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ RGB_MATRIX_EFFECT(ALPHAS_MODS)
|
||||
bool ALPHAS_MODS(effect_params_t* params) {
|
||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
|
||||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
HSV hsv = rgb_matrix_config.hsv;
|
||||
RGB rgb1 = hsv_to_rgb(hsv);
|
||||
hsv.h += rgb_matrix_config.speed;
|
||||
RGB rgb2 = hsv_to_rgb(hsv);
|
||||
|
||||
@@ -5,9 +5,9 @@ RGB_MATRIX_EFFECT(BREATHING)
|
||||
bool BREATHING(effect_params_t* params) {
|
||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
|
||||
HSV hsv = rgb_matrix_config.hsv;
|
||||
uint16_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 8);
|
||||
uint8_t val = scale8(abs8(sin8(time) - 128) * 2, rgb_matrix_config.val);
|
||||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, val };
|
||||
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
for (uint8_t i = led_min; i < led_max; i++) {
|
||||
RGB_MATRIX_TEST_LED_FLAGS();
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(BAND_PINWHEEL_SAT)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_PINWHEEL_SAT_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv->s = scale8(rgb_matrix_config.sat - time - atan2_8(dy, dx) * 3, rgb_matrix_config.sat);
|
||||
static HSV BAND_PINWHEEL_SAT_math(HSV hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv.s = scale8(hsv.s - time - atan2_8(dy, dx) * 3, hsv.s);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_PINWHEEL_SAT(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(BAND_PINWHEEL_VAL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_PINWHEEL_VAL_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv->v = scale8(rgb_matrix_config.val - time - atan2_8(dy, dx) * 3, rgb_matrix_config.val);
|
||||
static HSV BAND_PINWHEEL_VAL_math(HSV hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv.v = scale8(hsv.v - time - atan2_8(dy, dx) * 3, hsv.v);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_PINWHEEL_VAL(effect_params_t* params) {
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
RGB_MATRIX_EFFECT(BAND_SAT)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_SAT_math(HSV* hsv, uint8_t i, uint8_t time) {
|
||||
int16_t s = rgb_matrix_config.sat - abs(scale8(g_led_config.point[i].x, 228) + 28 - time) * 8;
|
||||
hsv->s = scale8(s < 0 ? 0 : s, rgb_matrix_config.sat);
|
||||
static HSV BAND_SAT_math(HSV hsv, uint8_t i, uint8_t time) {
|
||||
int16_t s = hsv.s - abs(scale8(g_led_config.point[i].x, 228) + 28 - time) * 8;
|
||||
hsv.s = scale8(s < 0 ? 0 : s, hsv.s);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_SAT(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(BAND_SPIRAL_SAT)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_SPIRAL_SAT_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv->s = scale8(rgb_matrix_config.sat + dist - time - atan2_8(dy, dx), rgb_matrix_config.sat);
|
||||
static HSV BAND_SPIRAL_SAT_math(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv.s = scale8(hsv.s + dist - time - atan2_8(dy, dx), hsv.s);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_SPIRAL_SAT(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(BAND_SPIRAL_VAL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_SPIRAL_VAL_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv->v = scale8(rgb_matrix_config.val + dist - time - atan2_8(dy, dx), rgb_matrix_config.val);
|
||||
static HSV BAND_SPIRAL_VAL_math(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv.v = scale8(hsv.v + dist - time - atan2_8(dy, dx), hsv.v);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_SPIRAL_VAL(effect_params_t* params) {
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
RGB_MATRIX_EFFECT(BAND_VAL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void BAND_VAL_math(HSV* hsv, uint8_t i, uint8_t time) {
|
||||
int16_t v = rgb_matrix_config.val - abs(scale8(g_led_config.point[i].x, 228) + 28 - time) * 8;
|
||||
hsv->v = scale8(v < 0 ? 0 : v, rgb_matrix_config.val);
|
||||
static HSV BAND_VAL_math(HSV hsv, uint8_t i, uint8_t time) {
|
||||
int16_t v = hsv.v - abs(scale8(g_led_config.point[i].x, 228) + 28 - time) * 8;
|
||||
hsv.v = scale8(v < 0 ? 0 : v, hsv.v);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool BAND_VAL(effect_params_t* params) {
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_ALL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_ALL_math(HSV* hsv, uint8_t i, uint8_t time)
|
||||
{
|
||||
hsv->h = time;
|
||||
static HSV CYCLE_ALL_math(HSV hsv, uint8_t i, uint8_t time){
|
||||
hsv.h = time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_ALL(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_LEFT_RIGHT)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_LEFT_RIGHT_math(HSV* hsv, uint8_t i, uint8_t time) {
|
||||
hsv->h = g_led_config.point[i].x - time;
|
||||
static HSV CYCLE_LEFT_RIGHT_math(HSV hsv, uint8_t i, uint8_t time) {
|
||||
hsv.h = g_led_config.point[i].x - time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_LEFT_RIGHT(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_OUT_IN)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_OUT_IN_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv->h = 3 * dist / 2 + time;
|
||||
static HSV CYCLE_OUT_IN_math(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv.h = 3 * dist / 2 + time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_OUT_IN(effect_params_t* params) {
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_OUT_IN_DUAL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_OUT_IN_DUAL_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
static HSV CYCLE_OUT_IN_DUAL_math(HSV hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
dx = (k_rgb_matrix_center.x / 2) - abs8(dx);
|
||||
uint8_t dist = sqrt16(dx * dx + dy * dy);
|
||||
hsv->h = 3 * dist + time;
|
||||
hsv.h = 3 * dist + time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_OUT_IN_DUAL(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_PINWHEEL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_PINWHEEL_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv->h = atan2_8(dy, dx) + time;
|
||||
static HSV CYCLE_PINWHEEL_math(HSV hsv, int16_t dx, int16_t dy, uint8_t time) {
|
||||
hsv.h = atan2_8(dy, dx) + time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_PINWHEEL(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_SPIRAL)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_SPIRAL_math(HSV* hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv->h = dist - time - atan2_8(dy, dx);
|
||||
static HSV CYCLE_SPIRAL_math(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint8_t time) {
|
||||
hsv.h = dist - time - atan2_8(dy, dx);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_SPIRAL(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(CYCLE_UP_DOWN)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void CYCLE_UP_DOWN_math(HSV* hsv, uint8_t i, uint8_t time) {
|
||||
hsv->h = g_led_config.point[i].y - time;
|
||||
static HSV CYCLE_UP_DOWN_math(HSV hsv, uint8_t i, uint8_t time) {
|
||||
hsv.h = g_led_config.point[i].y - time;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool CYCLE_UP_DOWN(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(DUAL_BEACON)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void DUAL_BEACON_math(HSV* hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv->h = ((g_led_config.point[i].y - k_rgb_matrix_center.y) * cos + (g_led_config.point[i].x - k_rgb_matrix_center.x) * sin) / 128 + rgb_matrix_config.hue;
|
||||
static HSV DUAL_BEACON_math(HSV hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv.h += ((g_led_config.point[i].y - k_rgb_matrix_center.y) * cos + (g_led_config.point[i].x - k_rgb_matrix_center.x) * sin) / 128;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool DUAL_BEACON(effect_params_t* params) {
|
||||
|
||||
@@ -5,13 +5,13 @@ RGB_MATRIX_EFFECT(GRADIENT_UP_DOWN)
|
||||
bool GRADIENT_UP_DOWN(effect_params_t* params) {
|
||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
|
||||
HSV hsv = { 0, rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
HSV hsv = rgb_matrix_config.hsv;
|
||||
uint8_t scale = scale8(64, rgb_matrix_config.speed);
|
||||
for (uint8_t i = led_min; i < led_max; i++) {
|
||||
RGB_MATRIX_TEST_LED_FLAGS();
|
||||
// The y range will be 0..64, map this to 0..4
|
||||
// Relies on hue being 8-bit and wrapping
|
||||
hsv.h = rgb_matrix_config.hue + scale * (g_led_config.point[i].y >> 4);
|
||||
hsv.h = rgb_matrix_config.hsv.h + scale * (g_led_config.point[i].y >> 4);
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ RGB_MATRIX_EFFECT(JELLYBEAN_RAINDROPS)
|
||||
|
||||
static void jellybean_raindrops_set_color(int i, effect_params_t* params) {
|
||||
if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return;
|
||||
HSV hsv = { rand() & 0xFF , rand() & 0xFF, rgb_matrix_config.val };
|
||||
HSV hsv = { rand() & 0xFF , rand() & 0xFF, rgb_matrix_config.hsv.v };
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||
}
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(RAINBOW_BEACON)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void RAINBOW_BEACON_math(HSV* hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv->h = ((g_led_config.point[i].y - k_rgb_matrix_center.y) * 2 * cos + (g_led_config.point[i].x - k_rgb_matrix_center.x) * 2 * sin) / 128 + rgb_matrix_config.hue;
|
||||
static HSV RAINBOW_BEACON_math(HSV hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv.h += ((g_led_config.point[i].y - k_rgb_matrix_center.y) * 2 * cos + (g_led_config.point[i].x - k_rgb_matrix_center.x) * 2 * sin) / 128;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool RAINBOW_BEACON(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(RAINBOW_MOVING_CHEVRON)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void RAINBOW_MOVING_CHEVRON_math(HSV* hsv, uint8_t i, uint8_t time) {
|
||||
hsv->h = abs8(g_led_config.point[i].y - k_rgb_matrix_center.y) + (g_led_config.point[i].x - time) + rgb_matrix_config.hue;
|
||||
static HSV RAINBOW_MOVING_CHEVRON_math(HSV hsv, uint8_t i, uint8_t time) {
|
||||
hsv.h += abs8(g_led_config.point[i].y - k_rgb_matrix_center.y) + (g_led_config.point[i].x - time);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool RAINBOW_MOVING_CHEVRON(effect_params_t* params) {
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
RGB_MATRIX_EFFECT(PINWHEELS)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void PINWHEELS_math(HSV* hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv->h = ((g_led_config.point[i].y - k_rgb_matrix_center.y) * 3 * cos + (56 - abs8(g_led_config.point[i].x - k_rgb_matrix_center.x)) * 3 * sin) / 128 + rgb_matrix_config.hue;
|
||||
static HSV PINWHEELS_math(HSV hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t time) {
|
||||
hsv.h += ((g_led_config.point[i].y - k_rgb_matrix_center.y) * 3 * cos + (56 - abs8(g_led_config.point[i].x - k_rgb_matrix_center.x)) * 3 * sin) / 128;
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool PINWHEELS(effect_params_t* params) {
|
||||
|
||||
@@ -4,17 +4,17 @@ RGB_MATRIX_EFFECT(RAINDROPS)
|
||||
|
||||
static void raindrops_set_color(int i, effect_params_t* params) {
|
||||
if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) return;
|
||||
HSV hsv = { 0 , rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
HSV hsv = { 0 , rgb_matrix_config.hsv.s, rgb_matrix_config.hsv.v };
|
||||
|
||||
// Take the shortest path between hues
|
||||
int16_t deltaH = ((rgb_matrix_config.hue + 180) % 360 - rgb_matrix_config.hue) / 4;
|
||||
int16_t deltaH = ((rgb_matrix_config.hsv.h + 180) % 360 - rgb_matrix_config.hsv.h) / 4;
|
||||
if (deltaH > 127) {
|
||||
deltaH -= 256;
|
||||
} else if (deltaH < -127) {
|
||||
deltaH += 256;
|
||||
}
|
||||
|
||||
hsv.h = rgb_matrix_config.hue + (deltaH * (rand() & 0x03));
|
||||
hsv.h = rgb_matrix_config.hsv.h + (deltaH * (rand() & 0x03));
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||
}
|
||||
|
||||
@@ -4,8 +4,7 @@ RGB_MATRIX_EFFECT(SOLID_COLOR)
|
||||
bool SOLID_COLOR(effect_params_t* params) {
|
||||
RGB_MATRIX_USE_LIMITS(led_min, led_max);
|
||||
|
||||
HSV hsv = { rgb_matrix_config.hue, rgb_matrix_config.sat, rgb_matrix_config.val };
|
||||
RGB rgb = hsv_to_rgb(hsv);
|
||||
RGB rgb = hsv_to_rgb(rgb_matrix_config.hsv);
|
||||
for (uint8_t i = led_min; i < led_max; i++) {
|
||||
RGB_MATRIX_TEST_LED_FLAGS();
|
||||
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
RGB_MATRIX_EFFECT(SOLID_REACTIVE)
|
||||
#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
|
||||
|
||||
static void SOLID_REACTIVE_math(HSV* hsv, uint16_t offset) {
|
||||
hsv->h = rgb_matrix_config.hue + qsub8(130, offset);
|
||||
static HSV SOLID_REACTIVE_math(HSV hsv, uint16_t offset) {
|
||||
hsv.h += qsub8(130, offset);
|
||||
return hsv;
|
||||
}
|
||||
|
||||
bool SOLID_REACTIVE(effect_params_t* params) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user