From ac93f79f63d23fe104dbb73cb32d21c4f6cbd802 Mon Sep 17 00:00:00 2001 From: MichaelDavidGK <39009683+MichaelDavidGK@users.noreply.github.com> Date: Sun, 11 Sep 2022 01:00:26 +0100 Subject: [PATCH] updated --- FLASH.BIN-last | Bin 0 -> 26624 bytes FLASH.BIN-nnnn | Bin 0 -> 26624 bytes FLASH.BIN-rn | Bin 0 -> 26624 bytes FLASH.BIN-why | Bin 0 -> 26624 bytes builddefs/common_features.mk | 9 + builddefs/show_options.mk | 3 +- ...-v2_1-dztech_dz60rgb_v2_1_layout_mine.json | 1 + keyboards/dztech/dz60rgb/dz60rgb.c | 8 +- .../dztech/dz60rgb/keymaps/openrgb/keymap.c | 53 +++ .../dztech/dz60rgb/keymaps/openrgb/rules.mk | 1 + quantum/openrgb.c | 368 ++++++++++++++++++ quantum/openrgb.h | 55 +++ quantum/quantum.h | 4 + .../animations/openrgb_direct_anim.h | 29 ++ .../animations/rgb_matrix_effects.inc | 1 + quantum/rgb_matrix/rgb_matrix.c | 12 +- .../arm_atsam/usb/udi_device_epsize.h | 2 +- tmk_core/protocol/usb_descriptor.h | 2 +- 18 files changed, 537 insertions(+), 11 deletions(-) create mode 100644 FLASH.BIN-last create mode 100644 FLASH.BIN-nnnn create mode 100644 FLASH.BIN-rn create mode 100644 FLASH.BIN-why create mode 100644 dztech-dz60rgb-v2_1-dztech_dz60rgb_v2_1_layout_mine.json create mode 100644 keyboards/dztech/dz60rgb/keymaps/openrgb/keymap.c create mode 100644 keyboards/dztech/dz60rgb/keymaps/openrgb/rules.mk create mode 100644 quantum/openrgb.c create mode 100644 quantum/openrgb.h create mode 100644 quantum/rgb_matrix/animations/openrgb_direct_anim.h diff --git a/FLASH.BIN-last b/FLASH.BIN-last new file mode 100644 index 0000000000000000000000000000000000000000..63c3920ff289f1a3ca4523f3e7b79a557a414568 GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/FLASH.BIN-nnnn b/FLASH.BIN-nnnn new file mode 100644 index 0000000000000000000000000000000000000000..e3d1d697614fa2431d54f5591f4f64e954bd6bf0 GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/FLASH.BIN-rn b/FLASH.BIN-rn new file mode 100644 index 0000000000000000000000000000000000000000..e3d1d697614fa2431d54f5591f4f64e954bd6bf0 GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/FLASH.BIN-why b/FLASH.BIN-why new file mode 100644 index 0000000000000000000000000000000000000000..f8175457c5893e07bf1f544184ad255efea1e75f GIT binary patch literal 26624 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 literal 0 HcmV?d00001 diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk index a23b5e82b9..8274c23ebc 100644 --- a/builddefs/common_features.mk +++ b/builddefs/common_features.mk @@ -614,6 +614,15 @@ ifeq ($(strip $(VIA_ENABLE)), yes) OPT_DEFS += -DVIA_ENABLE endif +ifeq ($(strip $(OPENRGB_ENABLE)), yes) + ifeq ($(strip $(VIA_ENABLE)), yes) + $(error OPENRGB_ENABLE and VIA_ENABLE cannot currently be enabled simultaneously) + endif + RAW_ENABLE := yes + SRC += $(QUANTUM_DIR)/openrgb.c + OPT_DEFS += -DOPENRGB_ENABLE +endif + VALID_MAGIC_TYPES := yes BOOTMAGIC_ENABLE ?= no ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk index 98537e6da2..815222c57a 100644 --- a/builddefs/show_options.mk +++ b/builddefs/show_options.mk @@ -10,7 +10,8 @@ BUILD_OPTION_NAMES = \ SPLIT_KEYBOARD \ DYNAMIC_KEYMAP_ENABLE \ USB_HID_ENABLE \ - VIA_ENABLE + VIA_ENABLE \ + OPENRGB_ENABLE HARDWARE_OPTION_NAMES = \ SLEEP_LED_ENABLE \ diff --git a/dztech-dz60rgb-v2_1-dztech_dz60rgb_v2_1_layout_mine.json b/dztech-dz60rgb-v2_1-dztech_dz60rgb_v2_1_layout_mine.json new file mode 100644 index 0000000000..e56da287c2 --- /dev/null +++ b/dztech-dz60rgb-v2_1-dztech_dz60rgb_v2_1_layout_mine.json @@ -0,0 +1 @@ +{"version": 1, "notes": "", "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.\n\nTo setup your QMK environment check out the tutorial: \n\nYou can convert this file to a keymap.c using this command: `qmk json2c {keymap}`\n\nYou can compile this keymap using this command: `qmk compile {keymap}`\"\n", "keyboard": "dztech/dz60rgb/v2_1", "keymap": "dztech_dz60rgb_v2_1_layout_mine", "layout": "LAYOUT", "layers": [["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", "TT(1)", "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", "RSFT_T(KC_SLSH)", "KC_UP", "KC_DEL", "KC_LCTL", "KC_LGUI", "KC_LALT", "KC_SPC", "KC_RALT", "KC_RCTL", "KC_LEFT", "KC_DOWN", "KC_RGHT"], ["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", "TG(2)", "KC_F13", "KC_F14", "KC_F15", "KC_F16", "KC_F17", "KC_F18", "KC_F19", "KC_F20", "KC_F21", "KC_F22", "KC_F23", "KC_F24", "QK_BOOT", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_CALC", "KC_PSCR", "KC_PAUS", "KC_HOME", "KC_PGUP", "EE_CLR", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "NK_TOGG", "KC_PWR", "KC_SLEP", "KC_END", "KC_PGDN", "KC_VOLU", "KC_INS", "KC_TRNS", "TG(3)", "KC_TRNS", "KC_TRNS", "KC_MUTE", "KC_MPLY", "KC_MPRV", "KC_VOLD", "KC_MNXT"], ["KC_TRNS", "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", "TG(2)", "RGB_TOG", "RGB_MOD", "RGB_RMOD", "RGB_M_P", "RGB_M_B", "RGB_M_R", "RGB_M_SW", "RGB_M_SN", "RGB_M_K", "RGB_M_X", "RGB_M_G", "RGB_M_T", "QK_BOOT", "KC_TRNS", "RGB_HUI", "RGB_HUD", "RGB_SAI", "RGB_SAD", "RGB_VAI", "RGB_VAD", "RGB_SPI", "RGB_SPD", "KC_TRNS", "KC_TRNS", "KC_TRNS", "EE_CLR", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"], ["KC_NUM", "KC_PSLS", "KC_PAST", "KC_PMNS", "KC_PPLS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_PMNS", "KC_PPLS", "KC_TRNS", "KC_TRNS", "KC_P7", "KC_P8", "KC_P9", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_P7", "KC_P8", "KC_P9", "KC_PSLS", "KC_PAST", "KC_TRNS", "KC_P4", "KC_P5", "KC_P6", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_P4", "KC_P5", "KC_P6", "KC_PENT", "KC_TRNS", "KC_P1", "KC_P2", "KC_P3", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_P1", "KC_P2", "KC_P3", "KC_TRNS", "KC_TRNS", "TG(3)", "KC_P0", "KC_PDOT", "KC_PENT", "KC_P0", "KC_PDOT", "KC_PCMM", "KC_TRNS", "KC_TRNS"]]} diff --git a/keyboards/dztech/dz60rgb/dz60rgb.c b/keyboards/dztech/dz60rgb/dz60rgb.c index 81f4846c2c..4aa648f0f8 100644 --- a/keyboards/dztech/dz60rgb/dz60rgb.c +++ b/keyboards/dztech/dz60rgb/dz60rgb.c @@ -79,11 +79,11 @@ led_config_t g_led_config = { { 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, NO_LED, 41 }, { 62, 61, 60, NO_LED, NO_LED, 59, NO_LED, NO_LED, 58, 57, 56, 55, NO_LED, 54 } }, { - { 216, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 }, { 0, 0 }, - { 220, 16 }, { 200, 16 }, { 184, 16 }, { 168, 16 }, { 152, 16 }, { 136, 16 }, { 120, 16 }, { 104, 16 }, { 88, 16 }, { 72, 16 }, { 56, 16 }, { 40, 16 }, { 24, 16 }, { 4, 16 }, + { 224, 0 }, { 192, 0 }, { 176, 0 }, { 160, 0 }, { 144, 0 }, { 128, 0 }, { 112, 0 }, { 96, 0 }, { 80, 0 }, { 64, 0 }, { 48, 0 }, { 32, 0 }, { 16, 0 }, { 0, 0 }, + { 4, 16 }, { 24, 16 }, { 40, 16 }, { 56, 16 }, { 72, 16 }, { 88, 16 }, { 104, 16 }, { 120, 16 }, { 136, 16 }, { 152, 16 }, { 168, 16 }, { 184, 16 }, { 200, 16 }, { 220, 16 }, { 214, 32 }, { 188, 32 }, { 172, 32 }, { 156, 32 }, { 140, 32 }, { 124, 32 }, { 108, 32 }, { 92, 32 }, { 76, 32 }, { 60, 32 }, { 44, 32 }, { 28, 32 }, { 6, 32 }, - { 224, 48 }, { 208, 48 }, { 186, 48 }, { 164, 48 }, { 148, 48 }, { 132, 48 }, { 116, 48 }, { 100, 48 }, { 84, 48 }, { 68, 48 }, { 52, 48 }, { 36, 48 }, { 9, 48 }, - { 224, 64 }, { 208, 64 }, { 192, 64 }, { 176, 64 }, { 160, 64 }, { 102, 64 }, { 42, 64 }, { 22, 64 }, { 2, 64 } + { 9, 48 }, { 36, 48 }, { 52, 48 }, { 68, 48 }, { 84, 48 }, { 100, 48 }, { 116, 48 }, { 132, 48 }, { 148, 48 }, { 164, 48 }, { 186, 48 }, { 208, 48 }, { 224, 48 }, + { 2, 64 }, { 22, 64 }, { 42, 64 }, { 102, 64 }, { 160, 64 }, { 176, 64 }, { 192, 64 }, { 208, 64 }, { 224, 64 } }, { 1, 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, 4, 1, diff --git a/keyboards/dztech/dz60rgb/keymaps/openrgb/keymap.c b/keyboards/dztech/dz60rgb/keymaps/openrgb/keymap.c new file mode 100644 index 0000000000..f8d59b5c79 --- /dev/null +++ b/keyboards/dztech/dz60rgb/keymaps/openrgb/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +enum custom_layer { + _LAYER0, + _LAYER1, + _LAYER2, + _LAYER3, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_LAYER0] = 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, + TT(1), 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, RSFT_T(KC_SLSH), KC_UP, KC_DEL, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + [_LAYER1] = 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, + TG(2), KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, QK_BOOT, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_PSCR, KC_PAUS, KC_HOME, KC_PGUP, EEP_RST, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, NK_TOGG, KC_PWR, KC_SLEP, KC_END, KC_PGDN, KC_VOLU, KC_INS, + KC_TRNS, TG(3), KC_TRNS, KC_TRNS, KC_MUTE, KC_MPLY, KC_MPRV, KC_VOLD, KC_MNXT + ), + [_LAYER2] = LAYOUT( + KC_TRNS, 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, + TG(2), RGB_TOG, RGB_MOD, RGB_RMOD, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, QK_BOOT, + KC_TRNS, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, EE_CLR, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + [_LAYER3] = LAYOUT( + KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PMNS, KC_PPLS, KC_TRNS, + KC_TRNS, KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_PAST, + KC_TRNS, KC_P4, KC_P5, KC_P6, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PENT, + KC_TRNS, KC_P1, KC_P2, KC_P3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_TRNS, KC_TRNS, + TG(3), KC_P0, KC_PDOT, KC_PENT, KC_P0, KC_PDOT, KC_PCMM, KC_TRNS, KC_TRNS + ) +}; +void matrix_init_user(void) +{ + //user initialization +} + +void matrix_scan_user(void) +{ + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + return true; +} \ No newline at end of file diff --git a/keyboards/dztech/dz60rgb/keymaps/openrgb/rules.mk b/keyboards/dztech/dz60rgb/keymaps/openrgb/rules.mk new file mode 100644 index 0000000000..5beb99f17a --- /dev/null +++ b/keyboards/dztech/dz60rgb/keymaps/openrgb/rules.mk @@ -0,0 +1 @@ +OPENRGB_ENABLE = yes \ No newline at end of file diff --git a/quantum/openrgb.c b/quantum/openrgb.c new file mode 100644 index 0000000000..d1888a3ae2 --- /dev/null +++ b/quantum/openrgb.c @@ -0,0 +1,368 @@ +/* Copyright 2020 Kasper + * + * 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 . + */ + +#ifndef RAW_ENABLE +# error "RAW_ENABLE is not enabled" +#endif + +#include "version.h" +#include "quantum.h" +#include "openrgb.h" +#include "raw_hid.h" +#include "string.h" +#include + +#if !defined(OPENRGB_DIRECT_MODE_STARTUP_RED) +# define OPENRGB_DIRECT_MODE_STARTUP_RED 0 +#endif + +#if !defined(OPENRGB_DIRECT_MODE_STARTUP_GREEN) +# define OPENRGB_DIRECT_MODE_STARTUP_GREEN 0 +#endif + +#if !defined(OPENRGB_DIRECT_MODE_STARTUP_BLUE) +# define OPENRGB_DIRECT_MODE_STARTUP_BLUE 255 +#endif + +RGB g_openrgb_direct_mode_colors[DRIVER_LED_TOTAL] = {[0 ... DRIVER_LED_TOTAL - 1] = {OPENRGB_DIRECT_MODE_STARTUP_GREEN, OPENRGB_DIRECT_MODE_STARTUP_RED, OPENRGB_DIRECT_MODE_STARTUP_BLUE}}; +static const uint8_t openrgb_rgb_matrix_effects_indexes[] = { + 1, 2, + +#ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS + 3, +#endif +#ifndef DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN + 4, +#endif +#ifndef DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT + 5, +#endif +#ifndef DISABLE_RGB_MATRIX_BREATHING + 6, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_SAT + 7, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_VAL + 8, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT + 9, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL + 10, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT + 11, +#endif +#ifndef DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL + 12, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_ALL + 13, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + 14, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_UP_DOWN + 15, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_OUT_IN + 16, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL + 17, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + 18, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_PINWHEEL + 19, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_SPIRAL + 20, +#endif +#ifndef DISABLE_RGB_MATRIX_DUAL_BEACON + 21, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_BEACON + 22, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS + 23, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINDROPS + 24, +#endif +#ifndef DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + 25, +#endif +#ifndef DISABLE_RGB_MATRIX_HUE_BREATHING + 26, +#endif +#ifndef DISABLE_RGB_MATRIX_HUE_PENDULUM + 27, +#endif +#ifndef DISABLE_RGB_MATRIX_HUE_WAVE + 28, +#endif +#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) && !defined(DISABLE_RGB_MATRIX_TYPING_HEATMAP) + 29, +#endif +#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS) && !defined(DISABLE_RGB_MATRIX_DIGITAL_RAIN) + 30, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE + 31, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE + 32, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE + 33, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE + 34, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS + 35, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS + 36, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS + 37, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS + 38, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SPLASH + 39, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_MULTISPLASH + 40, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_SPLASH + 41, +#endif +#if defined RGB_MATRIX_KEYREACTIVE_ENABLED && !defined DISABLE_RGB_MATRIX_SOLID_MULTISPLASH + 42, +#endif +}; +static uint8_t raw_hid_buffer[RAW_EPSIZE]; + +void raw_hid_receive(uint8_t *data, uint8_t length) { + switch (*data) { + case OPENRGB_GET_PROTOCOL_VERSION: + openrgb_get_protocol_version(); + break; + case OPENRGB_GET_QMK_VERSION: + openrgb_get_qmk_version(); + break; + case OPENRGB_GET_DEVICE_INFO: + openrgb_get_device_info(); + break; + case OPENRGB_GET_MODE_INFO: + openrgb_get_mode_info(); + break; + case OPENRGB_GET_LED_INFO: + openrgb_get_led_info(data); + break; + case OPENRGB_GET_ENABLED_MODES: + openrgb_get_enabled_modes(); + break; + + case OPENRGB_SET_MODE: + openrgb_set_mode(data); + break; + case OPENRGB_DIRECT_MODE_SET_SINGLE_LED: + openrgb_direct_mode_set_single_led(data); + break; + case OPENRGB_DIRECT_MODE_SET_LEDS: + openrgb_direct_mode_set_leds(data); + break; + } + + if (*data != OPENRGB_DIRECT_MODE_SET_LEDS) { + raw_hid_buffer[RAW_EPSIZE - 1] = OPENRGB_END_OF_MESSAGE; + raw_hid_send(raw_hid_buffer, RAW_EPSIZE); + memset(raw_hid_buffer, 0x00, RAW_EPSIZE); + } +} + +void openrgb_get_protocol_version(void) { + raw_hid_buffer[0] = OPENRGB_GET_PROTOCOL_VERSION; + raw_hid_buffer[1] = OPENRGB_PROTOCOL_VERSION; +} +void openrgb_get_qmk_version(void) { + raw_hid_buffer[0] = OPENRGB_GET_QMK_VERSION; + uint8_t current_byte = 1; + for (uint8_t i = 0; (current_byte < (RAW_EPSIZE - 2)) && (QMK_VERSION[i] != 0); i++) { + raw_hid_buffer[current_byte] = QMK_VERSION[i]; + current_byte++; + } +} +void openrgb_get_device_info(void) { + raw_hid_buffer[0] = OPENRGB_GET_DEVICE_INFO; + raw_hid_buffer[1] = DRIVER_LED_TOTAL; + raw_hid_buffer[2] = MATRIX_COLS * MATRIX_ROWS; + +#define MASSDROP_VID 0x04D8 +#if VENDOR_ID == MASSDROP_VID +# define PRODUCT_STRING PRODUCT +# define MANUFACTURER_STRING MANUFACTURER +#else +# define PRODUCT_STRING STR(PRODUCT) +# define MANUFACTURER_STRING STR(MANUFACTURER) +#endif + + uint8_t current_byte = 3; + for (uint8_t i = 0; (current_byte < ((RAW_EPSIZE - 2) / 2)) && (PRODUCT_STRING[i] != 0); i++) { + raw_hid_buffer[current_byte] = PRODUCT_STRING[i]; + current_byte++; + } + raw_hid_buffer[current_byte] = 0; + current_byte++; + + for (uint8_t i = 0; (current_byte + 2 < RAW_EPSIZE) && (MANUFACTURER_STRING[i] != 0); i++) { + raw_hid_buffer[current_byte] = MANUFACTURER_STRING[i]; + current_byte++; + } +} +void openrgb_get_mode_info(void) { + const HSV hsv_color = rgb_matrix_get_hsv(); + + raw_hid_buffer[0] = OPENRGB_GET_MODE_INFO; + raw_hid_buffer[1] = rgb_matrix_get_mode(); + raw_hid_buffer[2] = rgb_matrix_get_speed(); + raw_hid_buffer[3] = hsv_color.h; + raw_hid_buffer[4] = hsv_color.s; + raw_hid_buffer[5] = hsv_color.v; +} +void openrgb_get_led_info(uint8_t *data) { + const uint8_t first_led = data[1]; + const uint8_t number_leds = data[2]; + + raw_hid_buffer[0] = OPENRGB_GET_LED_INFO; + + for (uint8_t i = 0; i < number_leds; i++) { + const uint8_t led_idx = first_led + i; + const uint8_t data_idx = i * 7; + + if (led_idx >= DRIVER_LED_TOTAL) { + raw_hid_buffer[data_idx + 3] = OPENRGB_FAILURE; + } else { + raw_hid_buffer[data_idx + 1] = g_led_config.point[led_idx].x; + raw_hid_buffer[data_idx + 2] = g_led_config.point[led_idx].y; + raw_hid_buffer[data_idx + 3] = g_led_config.flags[led_idx]; + raw_hid_buffer[data_idx + 4] = g_openrgb_direct_mode_colors[led_idx].r; + raw_hid_buffer[data_idx + 5] = g_openrgb_direct_mode_colors[led_idx].g; + raw_hid_buffer[data_idx + 6] = g_openrgb_direct_mode_colors[led_idx].b; + } + + uint8_t row = 0; + uint8_t col = 0; + uint8_t found = 0; + + for (row = 0; row < MATRIX_ROWS; row++) { + for (col = 0; col < MATRIX_COLS; col++) { + if (g_led_config.matrix_co[row][col] == led_idx) { + found = 1; + break; + } + } + + if (found == 1) { + break; + } + } + + if (col >= MATRIX_COLS || row >= MATRIX_ROWS) { + raw_hid_buffer[data_idx + 7] = KC_NO; + } + else { + raw_hid_buffer[data_idx + 7] = pgm_read_byte(&keymaps[0][row][col]); + } + } +} +void openrgb_get_enabled_modes(void) { + raw_hid_buffer[0] = OPENRGB_GET_ENABLED_MODES; + const uint8_t size = sizeof openrgb_rgb_matrix_effects_indexes / sizeof openrgb_rgb_matrix_effects_indexes[0]; + for (int i = 0; i < size; i++) { + raw_hid_buffer[i + 1] = openrgb_rgb_matrix_effects_indexes[i]; + } +} + +void openrgb_set_mode(uint8_t *data) { + const uint8_t h = data[1]; + const uint8_t s = data[2]; + const uint8_t v = data[3]; + const uint8_t mode = data[4]; + const uint8_t speed = data[5]; + const uint8_t save = data[6]; + + raw_hid_buffer[0] = OPENRGB_SET_MODE; + + if (h > 255 || s > 255 || v > 255 || mode >= RGB_MATRIX_EFFECT_MAX || speed > 255) { + raw_hid_buffer[RAW_EPSIZE - 2] = OPENRGB_FAILURE; + return; + } + + if (save == 1) { + rgb_matrix_mode(mode); + rgb_matrix_set_speed(speed); + rgb_matrix_sethsv(h, s, v); + } + else { + rgb_matrix_mode_noeeprom(mode); + rgb_matrix_set_speed_noeeprom(speed); + rgb_matrix_sethsv_noeeprom(h, s, v); + } + + raw_hid_buffer[RAW_EPSIZE - 2] = OPENRGB_SUCCESS; +} +void openrgb_direct_mode_set_single_led(uint8_t *data) { + const uint8_t led = data[1]; + const uint8_t r = data[2]; + const uint8_t g = data[3]; + const uint8_t b = data[4]; + + raw_hid_buffer[0] = OPENRGB_DIRECT_MODE_SET_SINGLE_LED; + + if (led >= DRIVER_LED_TOTAL || r > 255 || g > 255 || b > 255) { + raw_hid_buffer[RAW_EPSIZE - 2] = OPENRGB_FAILURE; + return; + } + + g_openrgb_direct_mode_colors[led].r = r; + g_openrgb_direct_mode_colors[led].g = g; + g_openrgb_direct_mode_colors[led].b = b; + + raw_hid_buffer[RAW_EPSIZE - 2] = OPENRGB_SUCCESS; +} +void openrgb_direct_mode_set_leds(uint8_t *data) { + const uint8_t first_led = data[1]; + const uint8_t number_leds = data[2]; + + for (uint8_t i = 0; i < number_leds; i++) { + const uint8_t color_idx = first_led + i; + const uint8_t data_idx = i * 3; + + g_openrgb_direct_mode_colors[color_idx].r = data[data_idx + 3]; + g_openrgb_direct_mode_colors[color_idx].g = data[data_idx + 4]; + g_openrgb_direct_mode_colors[color_idx].b = data[data_idx + 5]; + } +} \ No newline at end of file diff --git a/quantum/openrgb.h b/quantum/openrgb.h new file mode 100644 index 0000000000..8dd7300b96 --- /dev/null +++ b/quantum/openrgb.h @@ -0,0 +1,55 @@ +/* Copyright 2020 Kasper + * + * 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 + +// This is changed only when the command IDs change, +// so OpenRGB can detect compatible firmware. +#define OPENRGB_PROTOCOL_VERSION 0xC + +#define RAW_EPSIZE 64 + +enum openrgb_command_id { + OPENRGB_GET_PROTOCOL_VERSION = 1, + OPENRGB_GET_QMK_VERSION, + OPENRGB_GET_DEVICE_INFO, + OPENRGB_GET_MODE_INFO, + OPENRGB_GET_LED_INFO, + OPENRGB_GET_ENABLED_MODES, + + OPENRGB_SET_MODE, + OPENRGB_DIRECT_MODE_SET_SINGLE_LED, + OPENRGB_DIRECT_MODE_SET_LEDS, +}; + +enum openrgb_responses { + OPENRGB_FAILURE = 25, + OPENRGB_SUCCESS = 50, + OPENRGB_END_OF_MESSAGE = 100, +}; + +extern RGB g_openrgb_direct_mode_colors[DRIVER_LED_TOTAL]; + +void openrgb_get_protocol_version(void); +void openrgb_get_qmk_version(void); +void openrgb_get_device_info(void); +void openrgb_get_mode_info(void); +void openrgb_get_led_info(uint8_t *data); +void openrgb_get_enabled_modes(void); + +void openrgb_set_mode(uint8_t *data); +void openrgb_direct_mode_set_single_led(uint8_t *data); +void openrgb_direct_mode_set_leds(uint8_t *data); diff --git a/quantum/quantum.h b/quantum/quantum.h index 8d74f2be38..ae3b350f5e 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -214,6 +214,10 @@ extern layer_state_t layer_state; # include "via.h" #endif +#ifdef OPENRGB_ENABLE +# include "openrgb.h" +#endif + #ifdef WPM_ENABLE # include "wpm.h" #endif diff --git a/quantum/rgb_matrix/animations/openrgb_direct_anim.h b/quantum/rgb_matrix/animations/openrgb_direct_anim.h new file mode 100644 index 0000000000..fc78c76457 --- /dev/null +++ b/quantum/rgb_matrix/animations/openrgb_direct_anim.h @@ -0,0 +1,29 @@ +#ifdef OPENRGB_ENABLE +RGB_MATRIX_EFFECT(OPENRGB_DIRECT) +# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +bool OPENRGB_DIRECT(effect_params_t* params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + + for (uint8_t i = led_min; i < led_max; i++) { + #ifdef OPENRGB_DIRECT_MODE_USE_UNIVERSAL_BRIGHTNESS + float brightness = (float)rgb_matrix_config.hsv.v / UINT8_MAX; + rgb_matrix_set_color( + i, + brightness * g_openrgb_direct_mode_colors[i].r, + brightness * g_openrgb_direct_mode_colors[i].g, + brightness * g_openrgb_direct_mode_colors[i].b + ); + #else + rgb_matrix_set_color( + i, + g_openrgb_direct_mode_colors[i].r, + g_openrgb_direct_mode_colors[i].g, + g_openrgb_direct_mode_colors[i].b + ); + #endif + } + return led_max < DRIVER_LED_TOTAL; +} +# endif +#endif diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc index ac7bac428d..1fd166cbdd 100644 --- a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc +++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc @@ -38,3 +38,4 @@ #include "solid_reactive_nexus.h" #include "splash_anim.h" #include "solid_splash_anim.h" +#include "openrgb_direct_anim.h" diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c index 2730686839..4663f36061 100644 --- a/quantum/rgb_matrix/rgb_matrix.c +++ b/quantum/rgb_matrix/rgb_matrix.c @@ -86,12 +86,16 @@ __attribute__((weak)) RGB rgb_matrix_hsv_to_rgb(HSV hsv) { #endif #if !defined(RGB_MATRIX_STARTUP_MODE) -# ifdef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT -# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT +# ifdef OPENRGB_ENABLE +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_OPENRGB_DIRECT # else +# ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT +# else // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace -# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR -# endif +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR +# endif +# endif #endif #if !defined(RGB_MATRIX_STARTUP_HUE) diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h b/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h index 7a9ed31930..7a85d53cd3 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_device_epsize.h @@ -21,7 +21,7 @@ along with this program. If not, see . #define KEYBOARD_EPSIZE 8 #define MOUSE_EPSIZE 8 #define EXTRAKEY_EPSIZE 8 -#define RAW_EPSIZE 32 +#define RAW_EPSIZE 64 #define CONSOLE_EPSIZE 32 #define NKRO_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index f8b7a863aa..722ff0effe 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -305,7 +305,7 @@ enum usb_endpoints { #define KEYBOARD_EPSIZE 8 #define SHARED_EPSIZE 32 #define MOUSE_EPSIZE 8 -#define RAW_EPSIZE 32 +#define RAW_EPSIZE 64 #define CONSOLE_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 #define CDC_NOTIFICATION_EPSIZE 8