From 6c5e5402cd51e1bb6f30ad683068f7f39cc1a0ae Mon Sep 17 00:00:00 2001 From: Franco Rosi Date: Tue, 9 Feb 2021 21:47:37 -0300 Subject: [PATCH] Se borra carpeta /rev2_latam, para dejar todo enlatado y andando desde /rev2. Esto para que el PR solo sea agregar el keymap "fraanrosi". --- .../latam => rev2/keymaps/fraanrosi}/config.h | 2 + .../fraanrosi}/franco_rosi_latinoamerica.json | 0 .../latam => rev2/keymaps/fraanrosi}/keymap.c | 3 - .../keymaps/fraanrosi}/readme.md | 0 .../latam => rev2/keymaps/fraanrosi}/rules.mk | 2 +- keyboards/helix/rev2_latam/back/oled/rules.mk | 1 - keyboards/helix/rev2_latam/back/rules.mk | 1 - keyboards/helix/rev2_latam/config.h | 162 ----- keyboards/helix/rev2_latam/info.json | 86 --- .../helix/rev2_latam/keymaps/default/config.h | 38 -- .../helix/rev2_latam/keymaps/default/keymap.c | 631 ------------------ .../rev2_latam/keymaps/default/readme.md | 165 ----- .../rev2_latam/keymaps/default/readme_jp.md | 135 ---- .../helix/rev2_latam/keymaps/default/rules.mk | 23 - .../keymaps/latam/helix-keyboard.png | Bin 56469 -> 0 bytes keyboards/helix/rev2_latam/local_features.mk | 125 ---- keyboards/helix/rev2_latam/matrix.c | 356 ---------- keyboards/helix/rev2_latam/oled/back/rules.mk | 1 - keyboards/helix/rev2_latam/oled/rules.mk | 1 - .../helix/rev2_latam/oled/under/rules.mk | 1 - keyboards/helix/rev2_latam/post_config.h | 7 - keyboards/helix/rev2_latam/rev2_latam.c | 41 -- keyboards/helix/rev2_latam/rev2_latam.h | 127 ---- keyboards/helix/rev2_latam/rules.mk | 11 - keyboards/helix/rev2_latam/sc/back/rules.mk | 1 - keyboards/helix/rev2_latam/sc/oled/rules.mk | 1 - .../helix/rev2_latam/sc/oledback/rules.mk | 2 - .../helix/rev2_latam/sc/oledunder/rules.mk | 2 - keyboards/helix/rev2_latam/sc/rules.mk | 1 - keyboards/helix/rev2_latam/sc/under/rules.mk | 1 - .../rev2_latam/serial_config_simpleapi.h | 8 - keyboards/helix/rev2_latam/split_scomm.c | 92 --- keyboards/helix/rev2_latam/split_scomm.h | 24 - keyboards/helix/rev2_latam/split_util.c | 109 --- keyboards/helix/rev2_latam/split_util.h | 19 - .../helix/rev2_latam/under/oled/rules.mk | 1 - keyboards/helix/rev2_latam/under/rules.mk | 1 - 37 files changed, 3 insertions(+), 2178 deletions(-) rename keyboards/helix/{rev2_latam/keymaps/latam => rev2/keymaps/fraanrosi}/config.h (98%) rename keyboards/helix/{rev2_latam/keymaps/latam => rev2/keymaps/fraanrosi}/franco_rosi_latinoamerica.json (100%) rename keyboards/helix/{rev2_latam/keymaps/latam => rev2/keymaps/fraanrosi}/keymap.c (99%) rename keyboards/helix/{rev2_latam/keymaps/latam => rev2/keymaps/fraanrosi}/readme.md (100%) rename keyboards/helix/{rev2_latam/keymaps/latam => rev2/keymaps/fraanrosi}/rules.mk (96%) delete mode 100644 keyboards/helix/rev2_latam/back/oled/rules.mk delete mode 100644 keyboards/helix/rev2_latam/back/rules.mk delete mode 100644 keyboards/helix/rev2_latam/config.h delete mode 100644 keyboards/helix/rev2_latam/info.json delete mode 100644 keyboards/helix/rev2_latam/keymaps/default/config.h delete mode 100644 keyboards/helix/rev2_latam/keymaps/default/keymap.c delete mode 100644 keyboards/helix/rev2_latam/keymaps/default/readme.md delete mode 100644 keyboards/helix/rev2_latam/keymaps/default/readme_jp.md delete mode 100644 keyboards/helix/rev2_latam/keymaps/default/rules.mk delete mode 100644 keyboards/helix/rev2_latam/keymaps/latam/helix-keyboard.png delete mode 100644 keyboards/helix/rev2_latam/local_features.mk delete mode 100644 keyboards/helix/rev2_latam/matrix.c delete mode 100644 keyboards/helix/rev2_latam/oled/back/rules.mk delete mode 100644 keyboards/helix/rev2_latam/oled/rules.mk delete mode 100644 keyboards/helix/rev2_latam/oled/under/rules.mk delete mode 100644 keyboards/helix/rev2_latam/post_config.h delete mode 100644 keyboards/helix/rev2_latam/rev2_latam.c delete mode 100644 keyboards/helix/rev2_latam/rev2_latam.h delete mode 100644 keyboards/helix/rev2_latam/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/back/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/oled/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/oledback/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/oledunder/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/rules.mk delete mode 100644 keyboards/helix/rev2_latam/sc/under/rules.mk delete mode 100644 keyboards/helix/rev2_latam/serial_config_simpleapi.h delete mode 100644 keyboards/helix/rev2_latam/split_scomm.c delete mode 100644 keyboards/helix/rev2_latam/split_scomm.h delete mode 100644 keyboards/helix/rev2_latam/split_util.c delete mode 100644 keyboards/helix/rev2_latam/split_util.h delete mode 100644 keyboards/helix/rev2_latam/under/oled/rules.mk delete mode 100644 keyboards/helix/rev2_latam/under/rules.mk diff --git a/keyboards/helix/rev2_latam/keymaps/latam/config.h b/keyboards/helix/rev2/keymaps/fraanrosi/config.h similarity index 98% rename from keyboards/helix/rev2_latam/keymaps/latam/config.h rename to keyboards/helix/rev2/keymaps/fraanrosi/config.h index e4a6a58f48e..c88c5c876d3 100644 --- a/keyboards/helix/rev2_latam/keymaps/latam/config.h +++ b/keyboards/helix/rev2/keymaps/fraanrosi/config.h @@ -24,6 +24,8 @@ along with this program. If not, see . // If you need more program area, try select and reduce rgblight modes to use. +#define RGBLIGHT_ANIMATIONS + // Selection of RGBLIGHT MODE to use. #if defined(LED_ANIMATIONS) #define RGBLIGHT_EFFECT_BREATHING diff --git a/keyboards/helix/rev2_latam/keymaps/latam/franco_rosi_latinoamerica.json b/keyboards/helix/rev2/keymaps/fraanrosi/franco_rosi_latinoamerica.json similarity index 100% rename from keyboards/helix/rev2_latam/keymaps/latam/franco_rosi_latinoamerica.json rename to keyboards/helix/rev2/keymaps/fraanrosi/franco_rosi_latinoamerica.json diff --git a/keyboards/helix/rev2_latam/keymaps/latam/keymap.c b/keyboards/helix/rev2/keymaps/fraanrosi/keymap.c similarity index 99% rename from keyboards/helix/rev2_latam/keymaps/latam/keymap.c rename to keyboards/helix/rev2/keymaps/fraanrosi/keymap.c index 8add4193424..e316f8f86a7 100644 --- a/keyboards/helix/rev2_latam/keymaps/latam/keymap.c +++ b/keyboards/helix/rev2/keymaps/fraanrosi/keymap.c @@ -141,9 +141,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #endif return false; break; - // Estos faltan agregar... - // RGB_SPI,RGB_VAI,RGB_SAI, - // RGB_SPD,RGB_VAD,RGB_SAD, case RGB_M_R: #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { diff --git a/keyboards/helix/rev2_latam/keymaps/latam/readme.md b/keyboards/helix/rev2/keymaps/fraanrosi/readme.md similarity index 100% rename from keyboards/helix/rev2_latam/keymaps/latam/readme.md rename to keyboards/helix/rev2/keymaps/fraanrosi/readme.md diff --git a/keyboards/helix/rev2_latam/keymaps/latam/rules.mk b/keyboards/helix/rev2/keymaps/fraanrosi/rules.mk similarity index 96% rename from keyboards/helix/rev2_latam/keymaps/latam/rules.mk rename to keyboards/helix/rev2/keymaps/fraanrosi/rules.mk index f67f40093a4..ee118875f36 100644 --- a/keyboards/helix/rev2_latam/keymaps/latam/rules.mk +++ b/keyboards/helix/rev2/keymaps/fraanrosi/rules.mk @@ -16,7 +16,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control # LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" # LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) # LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations +LED_ANIMATIONS = yes # LED animations # IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) # convert Helix-specific options (that represent combinations of standard options) diff --git a/keyboards/helix/rev2_latam/back/oled/rules.mk b/keyboards/helix/rev2_latam/back/oled/rules.mk deleted file mode 100644 index dd68e9d3b09..00000000000 --- a/keyboards/helix/rev2_latam/back/oled/rules.mk +++ /dev/null @@ -1 +0,0 @@ -OLED_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/back/rules.mk b/keyboards/helix/rev2_latam/back/rules.mk deleted file mode 100644 index 7e05954fae4..00000000000 --- a/keyboards/helix/rev2_latam/back/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes \ No newline at end of file diff --git a/keyboards/helix/rev2_latam/config.h b/keyboards/helix/rev2_latam/config.h deleted file mode 100644 index c864338876e..00000000000 --- a/keyboards/helix/rev2_latam/config.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#pragma once - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0x3265 -#define PRODUCT_ID 0x0000 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Yushakobo -#define PRODUCT Helix Beta -#define DESCRIPTION A split keyboard for the cheap makers - -#define TAPPING_FORCE_HOLD -#define TAPPING_TERM 100 - -/* Use I2C or Serial */ -#define USE_SERIAL -//#define USE_MATRIX_I2C - -/* Soft Serial defines */ -#define SOFT_SERIAL_PIN D2 -#define SERIAL_USE_MULTI_TRANSACTION - -/* Select hand configuration */ -#define MASTER_LEFT -// #define MASTER_RIGHT -// #define EE_HANDS - -// Helix keyboard OLED support -// see ./rules.mk: OLED_ENABLE=yes or no -#ifdef OLED_ENABLE - #define SSD1306OLED -#endif - -/* Select rows configuration */ -// Rows are 4 or 5 -// #define HELIX_ROWS 5 see ./rules.mk - -/* key matrix size */ -// Rows are doubled-up -#if HELIX_ROWS == 4 - #define MATRIX_ROWS 8 - #define MATRIX_ROW_PINS { D4, C6, D7, E6 } -#else - #define MATRIX_ROWS 10 - #define MATRIX_ROW_PINS { D4, C6, D7, E6, B4 } -#endif - -// wiring of each half -#define MATRIX_COLS 7 -#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 } -// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order - -/* COL2ROW, ROW2COL*/ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCE 5 - -/* 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 - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D3 - -//#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h - -// Helix keyboard RGB LED support -#define RGBLIGHT_ANIMATIONS //: see ./rules.mk: LED_ANIMATIONS = yes or no -// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes -#ifdef RGBLED_BACK - #if MATRIX_ROWS == 8 // HELIX_ROWS == 4 - #define RGBLED_NUM 25 - #else - #define RGBLED_NUM 32 - #endif -#else - #define RGBLED_NUM 6 -#endif - -#ifndef IOS_DEVICE_ENABLE - #if RGBLED_NUM <= 6 - #define RGBLIGHT_LIMIT_VAL 255 - #else - #if MATRIX_ROWS == 8 // HELIX_ROWS == 4 - #define RGBLIGHT_LIMIT_VAL 130 - #else - #define RGBLIGHT_LIMIT_VAL 140 - #endif - #endif - #define RGBLIGHT_VAL_STEP 17 -#else - #if RGBLED_NUM <= 6 - #define RGBLIGHT_LIMIT_VAL 90 - #else - #if MATRIX_ROWS == 8 // HELIX_ROWS == 4 - #define RGBLIGHT_LIMIT_VAL 45 - #else - #define RGBLIGHT_LIMIT_VAL 35 - #endif - #endif - #define RGBLIGHT_VAL_STEP 4 -#endif -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 - -#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) -// USB_MAX_POWER_CONSUMPTION value for Helix keyboard -// 120 RGBoff, OLEDoff -// 120 OLED -// 330 RGB 6 -// 300 RGB 32 -// 310 OLED & RGB 32 - #define USB_MAX_POWER_CONSUMPTION 400 -#else - // fix iPhone and iPad power adapter issue - // iOS device need lessthan 100 - #define USB_MAX_POWER_CONSUMPTION 100 -#endif - -/* - * 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 - diff --git a/keyboards/helix/rev2_latam/info.json b/keyboards/helix/rev2_latam/info.json deleted file mode 100644 index 7d9341c58b5..00000000000 --- a/keyboards/helix/rev2_latam/info.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "keyboard_name": "Helix rev. 2", - "url": "https://github.com/MakotoKurauchi/helix", - "maintainer": "MakotoKurauchi", - "width": 15, - "height": 5, - "layouts": { - "LAYOUT": { - "layout": [ - {"x": 0, "y": 0}, - {"x": 1, "y": 0}, - {"x": 2, "y": 0}, - {"x": 3, "y": 0}, - {"x": 4, "y": 0}, - {"x": 5, "y": 0}, - - {"x": 9, "y": 0}, - {"x": 10, "y": 0}, - {"x": 11, "y": 0}, - {"x": 12, "y": 0}, - {"x": 13, "y": 0}, - {"x": 14, "y": 0}, - - {"x": 0, "y": 1}, - {"x": 1, "y": 1}, - {"x": 2, "y": 1}, - {"x": 3, "y": 1}, - {"x": 4, "y": 1}, - {"x": 5, "y": 1}, - - {"x": 9, "y": 1}, - {"x": 10, "y": 1}, - {"x": 11, "y": 1}, - {"x": 12, "y": 1}, - {"x": 13, "y": 1}, - {"x": 14, "y": 1}, - - {"x": 0, "y": 2}, - {"x": 1, "y": 2}, - {"x": 2, "y": 2}, - {"x": 3, "y": 2}, - {"x": 4, "y": 2}, - {"x": 5, "y": 2}, - - {"x": 9, "y": 2}, - {"x": 10, "y": 2}, - {"x": 11, "y": 2}, - {"x": 12, "y": 2}, - {"x": 13, "y": 2}, - {"x": 14, "y": 2}, - - {"x": 0, "y": 3}, - {"x": 1, "y": 3}, - {"x": 2, "y": 3}, - {"x": 3, "y": 3}, - {"x": 4, "y": 3}, - {"x": 5, "y": 3}, - {"x": 6, "y": 3}, - - {"x": 8, "y": 3}, - {"x": 9, "y": 3}, - {"x": 10, "y": 3}, - {"x": 11, "y": 3}, - {"x": 12, "y": 3}, - {"x": 13, "y": 3}, - {"x": 14, "y": 3}, - - {"x": 0, "y": 4}, - {"x": 1, "y": 4}, - {"x": 2, "y": 4}, - {"x": 3, "y": 4}, - {"x": 4, "y": 4}, - {"x": 5, "y": 4}, - {"x": 6, "y": 4}, - - {"x": 8, "y": 4}, - {"x": 9, "y": 4}, - {"x": 10, "y": 4}, - {"x": 11, "y": 4}, - {"x": 12, "y": 4}, - {"x": 13, "y": 4}, - {"x": 14, "y": 4} - ] - } - } -} diff --git a/keyboards/helix/rev2_latam/keymaps/default/config.h b/keyboards/helix/rev2_latam/keymaps/default/config.h deleted file mode 100644 index b8c1041cdc7..00000000000 --- a/keyboards/helix/rev2_latam/keymaps/default/config.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -This is the c configuration file for the keymap - -Copyright 2012 Jun Wako -Copyright 2015 Jack Humbert - -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 . -*/ - -#pragma once - -// place overrides here - -// If you need more program area, try select and reduce rgblight modes to use. - -// Selection of RGBLIGHT MODE to use. -#if defined(LED_ANIMATIONS) - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_CHRISTMAS - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - //#define RGBLIGHT_EFFECT_RGB_TEST - //#define RGBLIGHT_EFFECT_ALTERNATING -#endif diff --git a/keyboards/helix/rev2_latam/keymaps/default/keymap.c b/keyboards/helix/rev2_latam/keymaps/default/keymap.c deleted file mode 100644 index c575287ee6d..00000000000 --- a/keyboards/helix/rev2_latam/keymaps/default/keymap.c +++ /dev/null @@ -1,631 +0,0 @@ -#include QMK_KEYBOARD_H -#include "bootloader.h" -#ifdef PROTOCOL_LUFA -#include "lufa.h" -#include "split_util.h" -#endif -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif -#ifdef SSD1306OLED - #include "ssd1306.h" -#endif - - -#ifdef RGBLIGHT_ENABLE -//Following line allows macro to read current RGB settings -extern rgblight_config_t rgblight_config; -#endif - -extern uint8_t is_master; - -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. -enum layer_number { - _QWERTY = 0, - _COLEMAK, - _DVORAK, - _LOWER, - _RAISE, - _ADJUST -}; - -enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - LOWER, - RAISE, - ADJUST, - BACKLIT, - EISU, - KANA, - RGBRST -}; - -enum macro_keycodes { - KC_SAMPLEMACRO, -}; - -//Macros -#define M_SAMPLE M(KC_SAMPLEMACRO) - -#if MATRIX_ROWS == 10 // HELIX_ROWS == 5 -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_COLEMAK] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_RBRC, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_DVORAK] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \ - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LBRC, KC_RBRC, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | CAPS | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - KC_CAPS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | Reset|RGBRST| | | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( \ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ - _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ - ) -}; - -#elif MATRIX_ROWS == 8 // HELIX_ROWS == 4 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - /* Qwerty - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_QWERTY] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Colemak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_COLEMAK] = LAYOUT( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Dvorak - * ,-----------------------------------------. ,-----------------------------------------. - * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right | - * `-------------------------------------------------------------------------------------------------' - */ - [_DVORAK] = LAYOUT( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \ - KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \ - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \ - ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ - ), - - /* Lower - * ,-----------------------------------------. ,-----------------------------------------. - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | Home | End | | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_LOWER] = LAYOUT( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_HOME, KC_END, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ - ), - - /* Raise - * ,-----------------------------------------. ,-----------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | | F12 | | |PageDn|PageUp| | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-------------------------------------------------------------------------------------------------' - */ - [_RAISE] = LAYOUT( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PGDN, KC_PGUP, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ - ), - - /* Adjust (Lower + Raise) - * ,-----------------------------------------. ,-----------------------------------------. - * | | Reset|RGBRST| | | | | | | | | | Del | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ | - * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| - * | | | | | | | | | | | MODE | HUE- | SAT- | VAL- | - * `-------------------------------------------------------------------------------------------------' - */ - [_ADJUST] = LAYOUT( \ - _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ - ) -}; - -#else -#error "undefined keymaps" -#endif - - -#ifdef AUDIO_ENABLE - -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -float tone_dvorak[][2] = SONG(DVORAK_SOUND); -float tone_colemak[][2] = SONG(COLEMAK_SOUND); -float tone_plover[][2] = SONG(PLOVER_SOUND); -float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); -float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); -#endif - -// define variables for reactive RGB -bool TOG_STATUS = false; -int RGB_current_mode; - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - -// Setting ADJUST layer RGB back to default -void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { - if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); - #endif - layer_on(layer3); - } else { - layer_off(layer3); - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_qwerty); - #endif - persistent_default_layer_set(1UL<<_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_colemak); - #endif - persistent_default_layer_set(1UL<<_COLEMAK); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_SONG(tone_dvorak); - #endif - persistent_default_layer_set(1UL<<_DVORAK); - } - return false; - break; - case LOWER: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); - #endif - } - layer_on(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - TOG_STATUS = false; - layer_off(_LOWER); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case RAISE: - if (record->event.pressed) { - //not sure how to have keyboard check mode and set it to a variable, so my work around - //uses another variable that would be set to true after the first time a reactive key is pressed. - if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false - } else { - TOG_STATUS = !TOG_STATUS; - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGBLIGHT_MODE_SNAKE); - #endif - } - layer_on(_RAISE); - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } else { - #ifdef RGBLIGHT_ENABLE - //rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change - #endif - layer_off(_RAISE); - TOG_STATUS = false; - update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); - } - return false; - break; - case ADJUST: - if (record->event.pressed) { - layer_on(_ADJUST); - } else { - layer_off(_ADJUST); - } - return false; - break; - //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released - case RGB_MOD: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - #endif - return false; - break; - case EISU: - if (record->event.pressed) { - if(keymap_config.swap_lalt_lgui==false){ - register_code(KC_LANG2); - }else{ - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LANG2); - } - return false; - break; - case KANA: - if (record->event.pressed) { - if(keymap_config.swap_lalt_lgui==false){ - register_code(KC_LANG1); - }else{ - SEND_STRING(SS_LALT("`")); - } - } else { - unregister_code(KC_LANG1); - } - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - #endif - break; - } - return true; -} - -void matrix_init_user(void) { - #ifdef AUDIO_ENABLE - startup_user(); - #endif - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif - //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h - #ifdef SSD1306OLED - iota_gfx_init(!has_usb()); // turns on the display - #endif -} - - -#ifdef AUDIO_ENABLE - -void startup_user() -{ - _delay_ms(20); // gets rid of tick -} - -void shutdown_user() -{ - _delay_ms(150); - stop_all_notes(); -} - -void music_on_user(void) -{ - music_scale_user(); -} - -void music_scale_user(void) -{ - PLAY_SONG(music_scale); -} - -#endif - - -//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h -#ifdef SSD1306OLED - -void matrix_scan_user(void) { - iota_gfx_task(); // this is what updates the display continuously -} - -void matrix_update(struct CharacterMatrix *dest, - const struct CharacterMatrix *source) { - if (memcmp(dest->display, source->display, sizeof(dest->display))) { - memcpy(dest->display, source->display, sizeof(dest->display)); - dest->dirty = true; - } -} - -//assign the right code to your layers for OLED display -#define L_BASE 0 -#define L_LOWER (1<<_LOWER) -#define L_RAISE (1<<_RAISE) -#define L_ADJUST (1<<_ADJUST) -#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER) - -static void render_logo(struct CharacterMatrix *matrix) { - - static const char helix_logo[] PROGMEM ={ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, - 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, - 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, - 0}; - matrix_write_P(matrix, helix_logo); - //matrix_write_P(&matrix, PSTR(" Split keyboard kit")); -} - -static void render_rgbled_status(bool full, struct CharacterMatrix *matrix) { -#ifdef RGBLIGHT_ENABLE - char buf[30]; - if (RGBLIGHT_MODES > 1 && rgblight_config.enable) { - if (full) { - snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ", - rgblight_config.mode, - rgblight_config.hue/RGBLIGHT_HUE_STEP, - rgblight_config.sat/RGBLIGHT_SAT_STEP, - rgblight_config.val/RGBLIGHT_VAL_STEP); - } else { - snprintf(buf, sizeof(buf), "[%2d] ",rgblight_config.mode); - } - matrix_write(matrix, buf); - } -#endif -} - -static void render_layer_status(struct CharacterMatrix *matrix) { - // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below - char buf[10]; - matrix_write_P(matrix, PSTR("Layer: ")); - switch (layer_state) { - case L_BASE: - matrix_write_P(matrix, PSTR("Default")); - break; - case L_RAISE: - matrix_write_P(matrix, PSTR("Raise")); - break; - case L_LOWER: - matrix_write_P(matrix, PSTR("Lower")); - break; - case L_ADJUST: - case L_ADJUST_TRI: - matrix_write_P(matrix, PSTR("Adjust")); - break; - default: - matrix_write_P(matrix, PSTR("Undef-")); - snprintf(buf,sizeof(buf), "%ld", layer_state); - matrix_write(matrix, buf); - } -} - -void render_status(struct CharacterMatrix *matrix) { - - // Render to mode icon - static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if(keymap_config.swap_lalt_lgui==false){ - matrix_write_P(matrix, os_logo[0][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write_P(matrix, os_logo[0][1]); - }else{ - matrix_write_P(matrix, os_logo[1][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write_P(matrix, os_logo[1][1]); - } - - matrix_write_P(matrix, PSTR(" ")); - render_layer_status(matrix); - matrix_write_P(matrix, PSTR("\n")); - - // Host Keyboard LED Status - matrix_write_P(matrix, (host_keyboard_leds() & (1<:<キーマップ名>`という指定で行います。 - -``` -$ make helix:default -``` - -キーボードへの書き込みまで同時に行うには下記のように`:flash`を付けます。 - -``` -$ make helix:default:flash -``` - -コンパイル結果と中間生成物を消去したい場合は以下のようにします。 - -``` -$ make helix:default:clean -``` - -上記の、rules.mk によるカスタマイズ項目の一部は下記のようにコマンド上で直接指定することも可能です。 - -OLED を有効にしてコンパイルしてキーボードへの書き込む。 -``` -$ make helix/rev2/oled:default:flash -``` - -RGB バックライトを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/back:default:flash -``` - -RGB Underglow を有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/under:default:flash -``` - -OLED とRGB バックライトを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/oled/back:default:flash -``` - -OLED とRGB Underglowを有効にしてコンパイルしてキーボードへ書き込む。 -``` -$ make helix/rev2/oled/under:default:flash -``` - -## リンク - -* さらに詳細は、[こちら helix/Doc/firmware_jp.md](https://github.com/MakotoKurauchi/helix/blob/master/Doc/firmware_jp.md)をご覧ください。 -* [Helix top](https://github.com/MakotoKurauchi/helix) diff --git a/keyboards/helix/rev2_latam/keymaps/default/rules.mk b/keyboards/helix/rev2_latam/keymaps/default/rules.mk deleted file mode 100644 index 9801648decf..00000000000 --- a/keyboards/helix/rev2_latam/keymaps/default/rules.mk +++ /dev/null @@ -1,23 +0,0 @@ -# QMK Standard Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -# See TOP/keyboards/helix/rules.mk for a list of options that can be set. -# See TOP/docs/config_options.md for more information. -# -LTO_ENABLE = no # if firmware size over limit, try this option - -# Helix Spacific Build Options -# you can uncomment and edit follows 7 Variables -# jp: 以下の7つの変数を必要に応じて編集し、コメントアウトをはずします。 -# HELIX_ROWS = 5 # Helix Rows is 4 or 5 -# OLED_ENABLE = no # OLED_ENABLE -# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -# LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -# LED_ANIMATIONS = yes # LED animations -# IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) - -# convert Helix-specific options (that represent combinations of standard options) -# into QMK standard options. -include $(strip $(KEYBOARD_LOCAL_FEATURES_MK)) diff --git a/keyboards/helix/rev2_latam/keymaps/latam/helix-keyboard.png b/keyboards/helix/rev2_latam/keymaps/latam/helix-keyboard.png deleted file mode 100644 index 2b2bb3168837004ce66fb49e73d27017b2bf3b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56469 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

-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 helix: - ## option= oled | back | under | na | ios - ## ex. - ## make HELIX=oled helix: - ## make HELIX=oled,back helix: - ## make HELIX=oled,under helix: - ## make HELIX=oled,back,na helix: - ## make HELIX=oled,back,ios helix: - ## - ifeq ($(findstring oled,$(HELIX)), oled) - OLED_ENABLE = yes - endif - ifeq ($(findstring back,$(HELIX)), back) - LED_BACK_ENABLE = yes - else ifeq ($(findstring under,$(HELIX)), under) - LED_UNDERGLOW_ENABLE = yes - endif - ifeq ($(findstring na,$(HELIX)), na) - LED_ANIMATIONS = no - endif - ifeq ($(findstring no_ani,$(HELIX)), no_ani) - LED_ANIMATIONS = no - endif - ifeq ($(findstring ios,$(HELIX)), ios) - IOS_DEVICE_ENABLE = yes - endif - ifeq ($(findstring scan,$(HELIX)), scan) - # use DEBUG_MATRIX_SCAN_RATE - # see docs/newbs_testing_debugging.md - OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE - CONSOLE_ENABLE = yes - SHOW_VERBOSE_INFO = yes - endif - ifeq ($(findstring verbose,$(HELIX)), verbose) - SHOW_VERBOSE_INFO = yes - endif - SHOW_HELIX_OPTIONS = yes - endif - -ifneq ($(strip $(SPLIT_KEYBOARD)), yes) - SRC += local_drivers/serial.c - KEYBOARD_PATHS += $(HELIX_TOP_DIR)/local_drivers - - # A workaround until #7089 is merged. - # serial.c must not be compiled with the -lto option. - # The current LIB_SRC has a side effect with the -fno-lto option, so use it. - LIB_SRC += local_drivers/serial.c - - CUSTOM_MATRIX = yes - - SRC += rev2/matrix.c - SRC += rev2/split_util.c - SRC += rev2/split_scomm.c -endif - -######## -# convert Helix-specific options (that represent combinations of standard options) -# into QMK standard options. - -ifneq ($(strip $(HELIX_ROWS)), 4) - ifneq ($(strip $(HELIX_ROWS)), 5) - $(error HELIX_ROWS = $(strip $(HELIX_ROWS)) is unexpected value) - endif -endif -OPT_DEFS += -DHELIX_ROWS=$(strip $(HELIX_ROWS)) - -ifeq ($(strip $(LED_BACK_ENABLE)), yes) - RGBLIGHT_ENABLE = yes - OPT_DEFS += -DRGBLED_BACK - ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - $(eval $(call HELIX_CUSTOMISE_MSG)) - $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') - endif -else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) - RGBLIGHT_ENABLE = yes -endif - -ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) - OPT_DEFS += -DIOS_DEVICE_ENABLE -endif - -ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DLED_ANIMATIONS -endif - -ifeq ($(strip $(OLED_ENABLE)), yes) - SRC += local_drivers/i2c.c - SRC += local_drivers/ssd1306.c - KEYBOARD_PATHS += $(HELIX_TOP_DIR)/local_drivers - OPT_DEFS += -DOLED_ENABLE - ifeq ($(strip $(LOCAL_GLCDFONT)), yes) - OPT_DEFS += -DLOCAL_GLCDFONT - endif -endif - -ifneq ($(strip $(SHOW_HELIX_OPTIONS)),) - $(eval $(call HELIX_CUSTOMISE_MSG)) - ifneq ($(strip $(SHOW_VERBOSE_INFO)),) - $(info -- RGBLIGHT_ENABLE = $(RGBLIGHT_ENABLE)) - $(info -- OLED_DRIVER_ENABLE = $(OLED_DRIVER_ENABLE)) - $(info -- CONSOLE_ENABLE = $(CONSOLE_ENABLE)) - $(info -- OPT_DEFS = $(OPT_DEFS)) - $(info -- LTO_ENABLE = $(LTO_ENABLE)) - $(info ) - endif -endif diff --git a/keyboards/helix/rev2_latam/matrix.c b/keyboards/helix/rev2_latam/matrix.c deleted file mode 100644 index 8ea070aa3a4..00000000000 --- a/keyboards/helix/rev2_latam/matrix.c +++ /dev/null @@ -1,356 +0,0 @@ -/* -Copyright 2012 Jun Wako - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include -#include -#include -#include -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "quantum.h" - -#ifdef USE_MATRIX_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "split_scomm.h" -#endif - -#ifndef DEBOUNCE -# define DEBOUNCE 5 -#endif - -#define ERROR_DISCONNECT_COUNT 5 - -static uint8_t debouncing = DEBOUNCE; -static const int ROWS_PER_HAND = MATRIX_ROWS/2; -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -static matrix_row_t read_cols(void); -static void init_cols(void); -static void unselect_rows(void); -static void select_row(uint8_t row); -static uint8_t matrix_master_scan(void); - - -__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) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - split_keyboard_setup(); - - // initialize row and col - unselect_rows(); - init_cols(); - - setPinOutput(B0); - setPinOutput(D5); - writePinHigh(B0); - writePinHigh(D5); - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } - - matrix_init_quantum(); -} - -uint8_t _matrix_scan(void) -{ - // Right hand is stored after the left in the matirx so, we need to offset it - int offset = isLeftHand ? 0 : (ROWS_PER_HAND); - - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - select_row(i); - _delay_us(30); // without this wait read unstable value. - matrix_row_t cols = read_cols(); - if (matrix_debouncing[i+offset] != cols) { - matrix_debouncing[i+offset] = cols; - debouncing = DEBOUNCE; - } - unselect_rows(); - } - - if (debouncing) { - if (--debouncing) { - _delay_ms(1); - } else { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - } - } - - return 1; -} - -#ifdef USE_MATRIX_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(int master_changed) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; -#ifdef SERIAL_USE_MULTI_TRANSACTION - int ret=serial_update_buffers(master_changed); -#else - int ret=serial_update_buffers(); -#endif - if (ret ) { - if(ret==2) writePinLow(B0); - return 1; - } - writePinHigh(B0); - memcpy(&matrix[slaveOffset], - (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - if (is_helix_master()) { - matrix_master_scan(); - }else{ - matrix_slave_scan(); - int offset = (isLeftHand) ? ROWS_PER_HAND : 0; - memcpy(&matrix[offset], - (void *)serial_master_buffer, sizeof(serial_master_buffer)); - matrix_scan_quantum(); - } - return 1; -} - - -uint8_t matrix_master_scan(void) { - - int ret = _matrix_scan(); - int mchanged = 1; - -#ifndef KEYBOARD_helix_rev1 - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_MATRIX_I2C -// for (int i = 0; i < ROWS_PER_HAND; ++i) { - /* i2c_slave_buffer[i] = matrix[offset+i]; */ -// i2c_slave_buffer[i] = matrix[offset+i]; -// } -#else // USE_SERIAL - #ifdef SERIAL_USE_MULTI_TRANSACTION - mchanged = memcmp((void *)serial_master_buffer, - &matrix[offset], sizeof(serial_master_buffer)); - #endif - memcpy((void *)serial_master_buffer, - &matrix[offset], sizeof(serial_master_buffer)); -#endif -#endif - -#ifdef USE_MATRIX_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction(mchanged) ) { -#endif - // turn on the indicator led when halves are disconnected - writePinLow(D5); - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - writePinHigh(D5); - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_MATRIX_I2C - for (int i = 0; i < ROWS_PER_HAND; ++i) { - /* i2c_slave_buffer[i] = matrix[offset+i]; */ - i2c_slave_buffer[i] = matrix[offset+i]; - } -#else // USE_SERIAL - #ifdef SERIAL_USE_MULTI_TRANSACTION - int change = 0; - #endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - #ifdef SERIAL_USE_MULTI_TRANSACTION - if( serial_slave_buffer[i] != matrix[offset+i] ) - change = 1; - #endif - serial_slave_buffer[i] = matrix[offset+i]; - } - #ifdef SERIAL_USE_MULTI_TRANSACTION - slave_buffer_change_count += change; - #endif -#endif -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); - _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); - } -} - -static matrix_row_t read_cols(void) -{ - matrix_row_t result = 0; - for(int x = 0; x < MATRIX_COLS; x++) { - result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); - } - return result; -} - -static void unselect_rows(void) -{ - for(int x = 0; x < ROWS_PER_HAND; x++) { - _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); - _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); - } -} - -static void select_row(uint8_t row) -{ - _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); - _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); -} diff --git a/keyboards/helix/rev2_latam/oled/back/rules.mk b/keyboards/helix/rev2_latam/oled/back/rules.mk deleted file mode 100644 index 066fffb74af..00000000000 --- a/keyboards/helix/rev2_latam/oled/back/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/oled/rules.mk b/keyboards/helix/rev2_latam/oled/rules.mk deleted file mode 100644 index dd68e9d3b09..00000000000 --- a/keyboards/helix/rev2_latam/oled/rules.mk +++ /dev/null @@ -1 +0,0 @@ -OLED_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/oled/under/rules.mk b/keyboards/helix/rev2_latam/oled/under/rules.mk deleted file mode 100644 index a37aa6fab37..00000000000 --- a/keyboards/helix/rev2_latam/oled/under/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_UNDERGLOW_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/post_config.h b/keyboards/helix/rev2_latam/post_config.h deleted file mode 100644 index dda73d5d22b..00000000000 --- a/keyboards/helix/rev2_latam/post_config.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#if defined(SPLIT_KEYBOARD) /* if use split_common */ -# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_SPLIT) -# define RGBLIGHT_SPLIT /* helix hardware need this */ -# endif -#endif diff --git a/keyboards/helix/rev2_latam/rev2_latam.c b/keyboards/helix/rev2_latam/rev2_latam.c deleted file mode 100644 index 12b8ae9efa9..00000000000 --- a/keyboards/helix/rev2_latam/rev2_latam.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "helix.h" - -// Each keymap.c should use is_keyboard_master() instead of 'is_master'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -uint8_t is_master = false; - -#ifdef SSD1306OLED -#include "ssd1306.h" - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_gfx(keycode,record) && process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - //led_set_user(usb_led); -} -#endif - -void matrix_init_kb(void) { - // Each keymap.c should use is_keyboard_master() instead of is_master. - // But keep is_master for a while for backwards compatibility - // for the old keymap.c. - is_master = is_keyboard_master(); - - matrix_init_user(); -}; - -void keyboard_post_init_kb(void) { -#if defined(DEBUG_MATRIX_SCAN_RATE) - debug_enable = true; -#endif - keyboard_post_init_user(); -} - -#if defined(SPLIT_KEYBOARD) && defined(SSD1306OLED) -void matrix_slave_scan_user(void) { - matrix_scan_user(); -} -#endif diff --git a/keyboards/helix/rev2_latam/rev2_latam.h b/keyboards/helix/rev2_latam/rev2_latam.h deleted file mode 100644 index 42f215fdf4c..00000000000 --- a/keyboards/helix/rev2_latam/rev2_latam.h +++ /dev/null @@ -1,127 +0,0 @@ -#pragma once - -#include "helix.h" - -#ifndef SPLIT_KEYBOARD - extern bool is_helix_master(void); - #define is_keyboard_master() is_helix_master() -#endif - -// Each keymap.c should use is_keyboard_master() instead of 'is_master', 'has_usb()'. -// But keep 'is_master' for a while for backwards compatibility -// for the old keymap.c. -extern uint8_t is_master; // 'is_master' will be obsolete, it is recommended to use 'is_keyboard_master ()' instead. -#define has_usb() is_keyboard_master() - -#if MATRIX_ROWS == 8 // HELIX_ROWS == 4 - #ifndef FLIP_HALF - // Standard Keymap - // (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) - #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35 \ - ) { \ - { L00, L01, L02, L03, L04, L05, KC_NO }, \ - { L10, L11, L12, L13, L14, L15, KC_NO }, \ - { L20, L21, L22, L23, L24, L25, KC_NO }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { R05, R04, R03, R02, R01, R00, KC_NO }, \ - { R15, R14, R13, R12, R11, R10, KC_NO }, \ - { R25, R24, R23, R22, R21, R20, KC_NO }, \ - { R35, R34, R33, R32, R31, R30, R36 } \ - } - #else - // Keymap with right side flipped - // (TRRS jack on both halves are to the right) - #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35 \ - ) { \ - { L00, L01, L02, L03, L04, L05, KC_NO }, \ - { L10, L11, L12, L13, L14, L15, KC_NO }, \ - { L20, L21, L22, L23, L24, L25, KC_NO }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { KC_NO, R00, R01, R02, R03, R04, R05 }, \ - { KC_NO, R10, R11, R12, R13, R14, R15 }, \ - { KC_NO, R20, R21, R22, R23, R24, R25 }, \ - { R36, R30, R31, R32, R33, R34, R35 } \ - } - #endif -#else // HELIX_ROWS == 5 - #ifndef FLIP_HALF - // Standard Keymap - // (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) -#define LAYOUT( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35, \ - L40, L41, L42, L43, L44, L45, L46, R46, R40, R41, R42, R43, R44, R45 \ -) { \ - { L00, L01, L02, L03, L04, L05, KC_NO }, \ - { L10, L11, L12, L13, L14, L15, KC_NO }, \ - { L20, L21, L22, L23, L24, L25, KC_NO }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { R05, R04, R03, R02, R01, R00, KC_NO }, \ - { R15, R14, R13, R12, R11, R10, KC_NO }, \ - { R25, R24, R23, R22, R21, R20, KC_NO }, \ - { R35, R34, R33, R32, R31, R30, R36 }, \ - { R45, R44, R43, R42, R41, R40, R46 } \ -} - #else - // Keymap with right side flipped - // (TRRS jack on both halves are to the right) - #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35, \ - L40, L41, L42, L43, L44, L45, L46, R46, R40, R41, R42, R43, R44, R45 \ - ) { \ - { L00, L01, L02, L03, L04, L05, KC_NO }, \ - { L10, L11, L12, L13, L14, L15, KC_NO }, \ - { L20, L21, L22, L23, L24, L25, KC_NO }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { KC_NO, R00, R01, R02, R03, R04, R05 }, \ - { KC_NO, R10, R11, R12, R13, R14, R15 }, \ - { KC_NO, R20, R21, R22, R23, R24, R25 }, \ - { R36, R30, R31, R32, R33, R34, R35 }, \ - { R46, R40, R41, R42, R43, R44, R45 } \ - } - #endif -#endif - -// Used to create a keymap using only KC_ prefixed keys -#if MATRIX_ROWS == 8 // HELIX_ROWS == 4 - #define LAYOUT_kc( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35 \ - ) LAYOUT( \ - KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ - KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ - KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ - KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ - ) -#else // HELIX_ROWS == 5 - #define LAYOUT_kc( \ - L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ - L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ - L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ - L30, L31, L32, L33, L34, L35, L36, R36, R30, R31, R32, R33, R34, R35, \ - L40, L41, L42, L43, L44, L45, L46, R46, R40, R41, R42, R43, R44, R45 \ - ) LAYOUT( \ - KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, \ - KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, \ - KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, \ - KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, \ - KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##L46, KC_##R46, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45 \ - ) -#endif diff --git a/keyboards/helix/rev2_latam/rules.mk b/keyboards/helix/rev2_latam/rules.mk deleted file mode 100644 index 23203ab7325..00000000000 --- a/keyboards/helix/rev2_latam/rules.mk +++ /dev/null @@ -1,11 +0,0 @@ -KEYBOARD_LOCAL_FEATURES_MK := $(dir $(lastword $(MAKEFILE_LIST)))local_features.mk - -# Helix Spacific Build Options default values -HELIX_ROWS = 5 # Helix Rows is 4 or 5 -OLED_ENABLE = no # OLED_ENABLE -LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c" -LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.) -LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight.) -LED_ANIMATIONS = yes # LED animations -IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) -EXTRAKEY_ENABLE = yes # Audio control and System control \ No newline at end of file diff --git a/keyboards/helix/rev2_latam/sc/back/rules.mk b/keyboards/helix/rev2_latam/sc/back/rules.mk deleted file mode 100644 index 066fffb74af..00000000000 --- a/keyboards/helix/rev2_latam/sc/back/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/sc/oled/rules.mk b/keyboards/helix/rev2_latam/sc/oled/rules.mk deleted file mode 100644 index dd68e9d3b09..00000000000 --- a/keyboards/helix/rev2_latam/sc/oled/rules.mk +++ /dev/null @@ -1 +0,0 @@ -OLED_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/sc/oledback/rules.mk b/keyboards/helix/rev2_latam/sc/oledback/rules.mk deleted file mode 100644 index 645984f865a..00000000000 --- a/keyboards/helix/rev2_latam/sc/oledback/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -OLED_ENABLE = yes -LED_BACK_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/sc/oledunder/rules.mk b/keyboards/helix/rev2_latam/sc/oledunder/rules.mk deleted file mode 100644 index e415cbd4920..00000000000 --- a/keyboards/helix/rev2_latam/sc/oledunder/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -OLED_ENABLE = yes -LED_UNDERGLOW_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/sc/rules.mk b/keyboards/helix/rev2_latam/sc/rules.mk deleted file mode 100644 index d38a6180907..00000000000 --- a/keyboards/helix/rev2_latam/sc/rules.mk +++ /dev/null @@ -1 +0,0 @@ -SPLIT_KEYBOARD = yes diff --git a/keyboards/helix/rev2_latam/sc/under/rules.mk b/keyboards/helix/rev2_latam/sc/under/rules.mk deleted file mode 100644 index a37aa6fab37..00000000000 --- a/keyboards/helix/rev2_latam/sc/under/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_UNDERGLOW_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/serial_config_simpleapi.h b/keyboards/helix/rev2_latam/serial_config_simpleapi.h deleted file mode 100644 index e2d22a41e7b..00000000000 --- a/keyboards/helix/rev2_latam/serial_config_simpleapi.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef SERIAL_CONFIG_SIMPLEAPI_H -#define SERIAL_CONFIG_SIMPLEAPI_H - -#undef SERIAL_USE_MULTI_TRANSACTION -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/helix/rev2_latam/split_scomm.c b/keyboards/helix/rev2_latam/split_scomm.c deleted file mode 100644 index ada7867960b..00000000000 --- a/keyboards/helix/rev2_latam/split_scomm.c +++ /dev/null @@ -1,92 +0,0 @@ -#ifdef USE_SERIAL -#ifdef SERIAL_USE_MULTI_TRANSACTION -/* --- USE flexible API (using multi-type transaction function) --- */ - -#include -#include -#include -#include -#include "serial.h" -#ifdef CONSOLE_ENABLE - #include -#endif - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; -uint8_t volatile status_com = 0; -uint8_t volatile status1 = 0; -uint8_t slave_buffer_change_count = 0; -uint8_t s_change_old = 0xff; -uint8_t s_change_new = 0xff; - -SSTD_t transactions[] = { -#define GET_SLAVE_STATUS 0 - /* master buffer not changed, only recive slave_buffer_change_count */ - { (uint8_t *)&status_com, - 0, NULL, - sizeof(slave_buffer_change_count), &slave_buffer_change_count, - }, -#define PUT_MASTER_GET_SLAVE_STATUS 1 - /* master buffer changed need send, and recive slave_buffer_change_count */ - { (uint8_t *)&status_com, - sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, - sizeof(slave_buffer_change_count), &slave_buffer_change_count, - }, -#define GET_SLAVE_BUFFER 2 - /* recive serial_slave_buffer */ - { (uint8_t *)&status1, - 0, NULL, - sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer - } -}; - -void serial_master_init(void) -{ - soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); -} - -void serial_slave_init(void) -{ - soft_serial_target_init(transactions, TID_LIMIT(transactions)); -} - -// 0 => no error -// 1 => slave did not respond -// 2 => checksum error -int serial_update_buffers(int master_update) -{ - int status, smatstatus; - static int need_retry = 0; - - if( s_change_old != s_change_new ) { - smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); - if( smatstatus == TRANSACTION_END ) { - s_change_old = s_change_new; -#ifdef CONSOLE_ENABLE - uprintf("slave matrix = %b %b %b %b %b\n", - serial_slave_buffer[0], serial_slave_buffer[1], - serial_slave_buffer[2], serial_slave_buffer[3], - serial_slave_buffer[4] ); -#endif - } - } else { - // serial_slave_buffer dosen't change - smatstatus = TRANSACTION_END; // dummy status - } - - if( !master_update && !need_retry) { - status = soft_serial_transaction(GET_SLAVE_STATUS); - } else { - status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); - } - if( status == TRANSACTION_END ) { - s_change_new = slave_buffer_change_count; - need_retry = 0; - } else { - need_retry = 1; - } - return smatstatus; -} - -#endif // SERIAL_USE_MULTI_TRANSACTION -#endif /* USE_SERIAL */ diff --git a/keyboards/helix/rev2_latam/split_scomm.h b/keyboards/helix/rev2_latam/split_scomm.h deleted file mode 100644 index 873d8939d81..00000000000 --- a/keyboards/helix/rev2_latam/split_scomm.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef SPLIT_COMM_H -#define SPLIT_COMM_H - -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ -#include "serial.h" - -#else -/* --- USE flexible API (using multi-type transaction function) --- */ -// Buffers for master - slave communication -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -extern uint8_t slave_buffer_change_count; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(int master_changed); - -#endif - -#endif /* SPLIT_COMM_H */ diff --git a/keyboards/helix/rev2_latam/split_util.c b/keyboards/helix/rev2_latam/split_util.c deleted file mode 100644 index ab40315487f..00000000000 --- a/keyboards/helix/rev2_latam/split_util.c +++ /dev/null @@ -1,109 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "wait.h" - -#ifdef USE_MATRIX_I2C -# include "i2c.h" -#else -# include "split_scomm.h" -#endif - -#ifdef EE_HANDS -# include "eeconfig.h" -#endif - -#ifndef SPLIT_USB_TIMEOUT -# define SPLIT_USB_TIMEOUT 2000 -#endif - -#ifndef SPLIT_USB_TIMEOUT_POLL -# define SPLIT_USB_TIMEOUT_POLL 10 -#endif - -volatile bool isLeftHand = true; - -bool waitForUsb(void) { - for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) { - // This will return true if a USB connection has been established - if (UDADDR & _BV(ADDEN)) { - return true; - } - wait_ms(SPLIT_USB_TIMEOUT_POLL); - } - - // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow - (USBCON &= ~(_BV(USBE) | _BV(OTGPADE))); - - return false; -} - - -bool is_keyboard_left(void) { -#if defined(SPLIT_HAND_PIN) - // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand - setPinInput(SPLIT_HAND_PIN); - return readPin(SPLIT_HAND_PIN); -#elif defined(EE_HANDS) - return eeconfig_read_handedness(); -#elif defined(MASTER_RIGHT) - return !is_helix_master(); -#endif - - return is_helix_master(); -} - -bool is_helix_master(void) { - static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN; - - // only check once, as this is called often - if (usbstate == UNKNOWN) { -#if defined(SPLIT_USB_DETECT) - usbstate = waitForUsb() ? MASTER : SLAVE; -#elif defined(__AVR__) - USBCON |= (1 << OTGPADE); // enables VBUS pad - wait_us(5); - - usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS -#else - usbstate = MASTER; -#endif - } - - return (usbstate == MASTER); -} - -static void keyboard_master_setup(void) { - -#ifdef USE_MATRIX_I2C - i2c_master_init(); -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - -#ifdef USE_MATRIX_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -void split_keyboard_setup(void) { - isLeftHand = is_keyboard_left(); - - if (is_helix_master()) { - keyboard_master_setup(); - } else { - keyboard_slave_setup(); - } - sei(); -} diff --git a/keyboards/helix/rev2_latam/split_util.h b/keyboards/helix/rev2_latam/split_util.h deleted file mode 100644 index c0ecdb09741..00000000000 --- a/keyboards/helix/rev2_latam/split_util.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef SPLIT_KEYBOARD_UTIL_H -#define SPLIT_KEYBOARD_UTIL_H - -#include -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool is_helix_master(void); - -void matrix_master_OLED_init (void); - -#endif diff --git a/keyboards/helix/rev2_latam/under/oled/rules.mk b/keyboards/helix/rev2_latam/under/oled/rules.mk deleted file mode 100644 index dd68e9d3b09..00000000000 --- a/keyboards/helix/rev2_latam/under/oled/rules.mk +++ /dev/null @@ -1 +0,0 @@ -OLED_ENABLE = yes diff --git a/keyboards/helix/rev2_latam/under/rules.mk b/keyboards/helix/rev2_latam/under/rules.mk deleted file mode 100644 index a37aa6fab37..00000000000 --- a/keyboards/helix/rev2_latam/under/rules.mk +++ /dev/null @@ -1 +0,0 @@ -LED_UNDERGLOW_ENABLE = yes