diff --git a/keyboards/akko/yu01/.vscode/settings.json b/keyboards/akko/yu01/.vscode/settings.json new file mode 100644 index 00000000000..70e34ecb3dc --- /dev/null +++ b/keyboards/akko/yu01/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.errorSquiggles": "disabled" +} \ No newline at end of file diff --git a/keyboards/epomaker/tide65/config.h b/keyboards/epomaker/tide65/config.h index b37e56226a1..c7f34d3098e 100644 --- a/keyboards/epomaker/tide65/config.h +++ b/keyboards/epomaker/tide65/config.h @@ -3,27 +3,26 @@ #pragma once -#ifdef WIRELESS_ENABLE -# define LPWR_TIMEOUT RGB_MATRIX_TIMEOUT -#endif +#define USB_POWER_EN_PIN B1 // USB ENABLE pin +#define LED_POWER_EN_PIN A5 // LED ENABLE pin +#define HS_BAT_CABLE_PIN A7 // USB insertion detection pin +// #define HS_LED_BOOSTING_PIN D2 // LED BOOSTING,Power boost pin -#define USB_POWER_EN_PIN B1 //USB ENABLE pin -#define LED_POWER_EN_PIN A5 //LED ENABLE pin -#define HS_BAT_CABLE_PIN A7 //USB insertion detection pin +#define BAT_FULL_PIN A15 +#define BAT_FULL_STATE 1 -#define BAT_FULL_PIN A15 -#define BAT_FULL_STATE 1 +#define HS_RGB_INDICATOR_COUNT 69 +#define HS_RGB_BAT_COUNT 1 -/* Battery */ -#define BATTERY_CAPACITY_LOW 15 -#define BATTERY_CAPACITY_STOP 0 - -#define HS_RGB_INDICATOR_COUNT 69 -#define HS_RGB_BAT_COUNT 1 -#define RGB_MATRIX_BAT_INDEX_MAP {11, 12, 13, 14, 15, 16, 17, 18, 19, 20} +/* Device Name Definition */ +#define PRODUCT "EPOMAKER TIDE65" +#define MD_BT1_NAME "EPOMAKER TIDE65" +#define MD_BT2_NAME "EPOMAKER TIDE65" +#define MD_BT3_NAME "EPOMAKER TIDE65" +#define MD_DONGLE_MANUFACTURER "EPOMAKER TIDE 65" /* Device Connection RGB Indicator Light Index And Color */ -#define HS_RGB_BLINK_INDEX_BT1 43 +#define HS_RGB_BLINK_INDEX_BT1 43 #define HS_RGB_BLINK_INDEX_BT2 42 #define HS_RGB_BLINK_INDEX_BT3 41 #define HS_RGB_BLINK_INDEX_2G4 34 @@ -33,23 +32,31 @@ #define HS_LBACK_COLOR_BT2 RGB_BLUE #define HS_LBACK_COLOR_BT3 RGB_BLUE #define HS_LBACK_COLOR_2G4 RGB_GREEN -#define HS_LBACK_COLOR_UBS RGB_WHITE +#define HS_LBACK_COLOR_USB RGB_WHITE #define HS_PAIR_COLOR_BT1 RGB_BLUE #define HS_PAIR_COLOR_BT2 RGB_BLUE #define HS_PAIR_COLOR_BT3 RGB_BLUE -#define HS_PAIR_COLOR_2G4 RGB_GREEN +#define HS_PAIR_COLOR_2G4 RGB_GREEN + +#define WIITE_B 0X6e + +/* Battery */ +#define BATTERY_CAPACITY_LOW 15 +#define BATTERY_CAPACITY_STOP 0 +#define RGB_MATRIX_BAT_INDEX_MAP {11, 12, 13, 14, 15, 16, 17, 18, 19, 20} /* Status Indicator Lamp */ -#define HS_MATRIX_BLINK_INDEX_BAT 57 -#define HS_RGB_INDEX_CAPS 8 -#define HS_RGB_INDEX_WIN_LOCK 5 -#define HS_RGB_BLINK_INDEX_VAI 29 -#define HS_RGB_BLINK_INDEX_VAD 28 -#define HS_RGB_BLINK_INDEX_SPI 27 -#define HS_RGB_BLINK_INDEX_SPD 56 -#define HS_RGB_BLINK_INDEX_WIN 44 -#define HS_RGB_BLINK_INDEX_MAC 45 +#define HS_MATRIX_BLINK_INDEX_BAT 57 +#define HS_RGB_INDEX_CAPS 8 +#define HS_RGB_INDEX_WIN_LOCK 5 +#define HS_RGB_BLINK_INDEX_VAI 29 +#define HS_RGB_BLINK_INDEX_VAD 28 +#define HS_RGB_BLINK_INDEX_SPI 27 +#define HS_RGB_BLINK_INDEX_SPD 56 + +#define HS_RGB_BLINK_INDEX_WIN 44 +#define HS_RGB_BLINK_INDEX_MAC 45 /* UART */ #define SERIAL_DRIVER SD3 @@ -57,23 +64,42 @@ #define SD1_RX_PIN C11 /* Encoder */ -#define ENCODER_MAP_KEY_DELAY 1 +#define ENCODER_MAP_KEY_DELAY 1 +#define ENCODER_RESOLUTION 2 /* SPI */ -#define SPI_DRIVER SPIDQ -#define SPI_SCK_PIN B3 -#define SPI_MOSI_PIN B5 -#define SPI_MISO_PIN B4 +#define SPI_DRIVER SPIDQ +#define SPI_SCK_PIN B3 +#define SPI_MOSI_PIN B5 +#define SPI_MISO_PIN B4 /* Flash */ #define EXTERNAL_FLASH_SPI_SLAVE_SELECT_PIN C12 -#define WEAR_LEVELING_LOGICAL_SIZE (WEAR_LEVELING_BACKING_SIZE / 2) +#define WEAR_LEVELING_LOGICAL_SIZE (WEAR_LEVELING_BACKING_SIZE / 2) /* RGB Matrix */ #define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB #define RGB_MATRIX_FRAMEBUFFER_EFFECTS #define RGB_MATRIX_KEYPRESSES +/* RGB Light */ +#define RGBLED_NUM 8 +#define RGBLIGHT_CUSTOM_DRIVER +#define RGBLIGHT_DISABLE_KEYCODES +#define BREATHING_VAL 40 +#define RAINBOW_MOOD 40 +#define LED_TYPE RGB +#define RGBLIGHT_LED_MAP {0, 1, 2, 3, 4, 5, 6, 7} + /* WS2812 */ -#define WS2812_SPI_DRIVER SPIDM2 -#define WS2812_SPI_DIVISOR 32 +#define WS2812_SPI_DRIVER SPIDM2 +#define WS2812_SPI_DIVISOR 32 + +/* rgb_record */ +#define ENABLE_RGB_MATRIX_RGBR_PLAY +#define RGBREC_CHANNEL_NUM 4 +#define EECONFIG_CONFINFO_USE_SIZE (4 + 16) +#define EECONFIG_RGBREC_USE_SIZE (RGBREC_CHANNEL_NUM * MATRIX_ROWS * MATRIX_COLS * 2) +#define EECONFIG_USER_DATA_SIZE (EECONFIG_RGBREC_USE_SIZE + EECONFIG_CONFINFO_USE_SIZE) +#define RGBREC_EECONFIG_ADDR (uint8_t *)(EECONFIG_USER_DATABLOCK) +#define CONFINFO_EECONFIG_ADDR (uint32_t *)((uint32_t)RGBREC_EECONFIG_ADDR + (uint32_t)EECONFIG_RGBREC_USE_SIZE) diff --git a/keyboards/epomaker/tide65/control/control.c b/keyboards/epomaker/tide65/control/control.c new file mode 100644 index 00000000000..14c6a68bb65 --- /dev/null +++ b/keyboards/epomaker/tide65/control/control.c @@ -0,0 +1,197 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "control.h" + +static ioline_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +extern bool lower_sleep; + +bool hs_modeio_detection(bool update, uint8_t *mode,uint8_t lsat_btdev) { + static uint32_t scan_timer = 0x00; + + if ((update != true) && (timer_elapsed32(scan_timer) <= (HS_MODEIO_DETECTION_TIME))) { + return false; + } + scan_timer = timer_read32(); + +#if defined(HS_BT_DEF_PIN) && defined(HS_2G4_DEF_PIN) + uint8_t now_mode = 0x00; + uint8_t hs_mode = 0x00; + static uint8_t last_mode = 0x00; + bool sw_mode = false; + + now_mode = (HS_GET_MODE_PIN(HS_USB_PIN_STATE) ? 3 : (HS_GET_MODE_PIN(HS_BT_PIN_STATE) ? 1 : ((HS_GET_MODE_PIN(HS_2G4_PIN_STATE) ? 2 : 0)))); + hs_mode = (*mode >= DEVS_BT1 && *mode <= DEVS_BT5) ? 1 : ((*mode == DEVS_2G4) ? 2 : ((*mode == DEVS_USB) ? 3 : 0)); + sw_mode = ((update || (last_mode == now_mode)) && (hs_mode != now_mode)) ? true : false; + last_mode = now_mode; + + switch (now_mode) + { + case 1: + *mode = hs_bt; + if (sw_mode) { + wireless_devs_change(wireless_get_current_devs(), lsat_btdev, false); + + } + break; + case 2: + *mode = hs_2g4; + if (sw_mode) { + wireless_devs_change(wireless_get_current_devs(), DEVS_2G4, false); + + } + break; + case 3: + *mode = hs_usb; + if (sw_mode) + wireless_devs_change(wireless_get_current_devs(), DEVS_USB, false); + + break; + default: + break; + } + + if (sw_mode) { + hs_rgb_blink_set_timer(timer_read32()); + suspend_wakeup_init(); + return true; + } +#else + *mode = hs_none; +#endif + + return false; +} + +static uint32_t hs_linker_rgb_timer = 0x00; + +bool hs_mode_scan(bool update,uint8_t moude,uint8_t lsat_btdev) { + + if (hs_modeio_detection(update, &moude, lsat_btdev)) { + + return true; + } + hs_rgb_blink_hook(); + return false; +} + +void hs_rgb_blink_set_timer(uint32_t time) { + hs_linker_rgb_timer = time; +} + +uint32_t hs_rgb_blink_get_timer(void) { + return hs_linker_rgb_timer; +} + +bool hs_rgb_blink_hook(){ + static uint8_t last_status; + + if (last_status != *md_getp_state()){ + last_status = *md_getp_state(); + hs_rgb_blink_set_timer(0x00); + } + + switch (*md_getp_state()) + { + case MD_STATE_NONE: { + hs_rgb_blink_set_timer(0x00); + } break; + + case MD_STATE_DISCONNECTED: + if (hs_rgb_blink_get_timer() == 0x00){ + hs_rgb_blink_set_timer(timer_read32()); + extern void wireless_devs_change_kb(uint8_t old_devs, uint8_t new_devs, bool reset); + wireless_devs_change_kb(wireless_get_current_devs(),wireless_get_current_devs(),false); + } + else{ + if (timer_elapsed32(hs_rgb_blink_get_timer()) >= HS_LBACK_TIMEOUT) { + hs_rgb_blink_set_timer(timer_read32()); + md_send_devctrl(MD_SND_CMD_DEVCTRL_USB); + wait_ms(200); + lpwr_set_timeout_manual(true); + + } + } + case MD_STATE_CONNECTED: + if (hs_rgb_blink_get_timer() == 0x00){ + hs_rgb_blink_set_timer(timer_read32()); + } + else{ + if (timer_elapsed32(hs_rgb_blink_get_timer()) >= HS_SLEEP_TIMEOUT) { + hs_rgb_blink_set_timer(timer_read32()); + lpwr_set_timeout_manual(true); + } + } + default: + break; + } + return true; +} + +void lpwr_exti_init_hook(void){ + +#ifdef HS_BT_DEF_PIN + setPinInputHigh(HS_BT_DEF_PIN); + waitInputPinDelay(); + palEnableLineEvent(HS_BT_DEF_PIN, PAL_EVENT_MODE_BOTH_EDGES); +#endif + +#ifdef HS_2G4_DEF_PIN + setPinInputHigh(HS_2G4_DEF_PIN); + waitInputPinDelay(); + palEnableLineEvent(HS_2G4_DEF_PIN, PAL_EVENT_MODE_BOTH_EDGES); +#endif + + if (lower_sleep){ +#if DIODE_DIRECTION == ROW2COL + for (uint8_t i = 0; i < ARRAY_SIZE(col_pins); i++) { + if (col_pins[i] != NO_PIN) { + setPinOutput(col_pins[i]); + writePinHigh(col_pins[i]); + } + } +#endif + } + setPinInput(HS_BAT_CABLE_PIN); + waitInputPinDelay(); + palEnableLineEvent(HS_BAT_CABLE_PIN, PAL_EVENT_MODE_RISING_EDGE); +} + +void palcallback_cb(uint8_t line){ + switch (line) { + case PAL_PAD(HS_BAT_CABLE_PIN): { + lpwr_set_sleep_wakeupcd(LPWR_WAKEUP_CABLE); + } break; +#ifdef HS_2G4_DEF_PIN + case PAL_PAD(HS_2G4_DEF_PIN): { + lpwr_set_sleep_wakeupcd(LPWR_WAKEUP_SWITCH); + } break; +#endif + +#ifdef HS_BT_DEF_PIN + case PAL_PAD(HS_BT_DEF_PIN): { + lpwr_set_sleep_wakeupcd(LPWR_WAKEUP_SWITCH); + } break; +#endif + default: { + + } break; + } +} + + + +void lpwr_stop_hook_post(void){ + if (lower_sleep){ + switch (lpwr_get_sleep_wakeupcd()) { + case LPWR_WAKEUP_USB: + case LPWR_WAKEUP_CABLE: { + lower_sleep = false; + lpwr_set_state(LPWR_WAKEUP); + } break; + default: { + lpwr_set_state(LPWR_STOP); + } break; + } + } +} diff --git a/keyboards/epomaker/tide65/control/control.h b/keyboards/epomaker/tide65/control/control.h new file mode 100644 index 00000000000..2cd4f06fc06 --- /dev/null +++ b/keyboards/epomaker/tide65/control/control.h @@ -0,0 +1,35 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H + +#include +#include "wireless.h" + +/* Use when there is a three-stage dial switch */ +// # define HS_BT_DEF_PIN C14 +// # define HS_2G4_DEF_PIN C15 +// # define HS_BT_PIN_STATE 0, 1 +// # define HS_2G4_PIN_STATE 1, 0 +// # define HS_USB_PIN_STATE 1, 1 + +# define HS_GET_MODE_PIN_(pin_bt, pin_2g4) ((((#pin_bt)[0] == 'x') || ((readPin(HS_BT_DEF_PIN) + 0x30) == ((#pin_bt)[0]))) && (((#pin_2g4)[0] == 'x') || ((readPin(HS_2G4_DEF_PIN) + 0x30) == ((#pin_2g4)[0])))) +# define HS_GET_MODE_PIN(state) HS_GET_MODE_PIN_(state) +# define HS_MODEIO_DETECTION_TIME 50 + +/* Set the wireless device's reconnect timeout and connection usage sleep time */ +#define HS_LBACK_TIMEOUT (30 * 1000) +#define HS_SLEEP_TIMEOUT (1 * 60000) + +enum modeio_mode { + hs_none = 0, + hs_usb, + hs_bt, + hs_2g4, + hs_wireless +}; + +bool hs_rgb_blink_hook(void); +bool hs_mode_scan(bool update,uint8_t moude,uint8_t lsat_btdev); +bool hs_modeio_detection(bool update, uint8_t *mode,uint8_t lsat_btdev); +void hs_rgb_blink_set_timer(uint32_t time); \ No newline at end of file diff --git a/keyboards/epomaker/tide65/control/control.mk b/keyboards/epomaker/tide65/control/control.mk new file mode 100644 index 00000000000..ab8bf1bbf19 --- /dev/null +++ b/keyboards/epomaker/tide65/control/control.mk @@ -0,0 +1 @@ +SRC += control/control.c diff --git a/keyboards/epomaker/tide65/halconf.h b/keyboards/epomaker/tide65/halconf.h index 1baa28223e9..dd8501f04c2 100644 --- a/keyboards/epomaker/tide65/halconf.h +++ b/keyboards/epomaker/tide65/halconf.h @@ -3,8 +3,8 @@ #pragma once -#define HAL_USE_SERIAL TRUE -#define HAL_USE_SPI TRUE +#define HAL_USE_SERIAL TRUE +#define HAL_USE_SPI TRUE #define PAL_USE_CALLBACKS TRUE #include_next diff --git a/keyboards/epomaker/tide65/keyboard.json b/keyboards/epomaker/tide65/keyboard.json index 420d83f9927..2cba94025c2 100644 --- a/keyboards/epomaker/tide65/keyboard.json +++ b/keyboards/epomaker/tide65/keyboard.json @@ -32,9 +32,6 @@ "encoder": true }, "keycodes": [ - { - "key": "KC_USB" - }, { "key": "KC_BT1" }, @@ -44,17 +41,32 @@ { "key": "KC_BT3" }, - { - "key": "KC_BT4" - }, - { - "key": "KC_BT5" - }, { "key": "KC_2G4" }, { - "key": "KC_BATQ" + "key": "KC_USB" + }, + { + "key": "RP_P0" + }, + { + "key": "RP_P1" + }, + { + "key": "RP_P2" + }, + { + "key": "RP_END" + }, + { + "key": "RL_MOD" + }, + { + "key": "HS_BATQ" + }, + { + "key": "KC_TESTW" }, { "key": "KC_FTOG" @@ -188,19 +200,37 @@ {"matrix": [3, 1], "x": 16, "y": 48, "flags": 4} ], "max_brightness": 200, - "val_steps": 40, + "val_steps": 38, "speed_steps": 51, "default": { - "val" :153, + "animation": "cycle_left_right", + "val" :114, "speed" :204 }, - "sleep": true, - "timeout": 60000 + "sleep": true + }, + "rgblight": { + "animations": { + "alternatin":true, + "breathing": true, + "christmas":true, + "knight":true, + "rainbow_mood": true, + "rainbow_swirl": true, + "rgb_test": true, + "snake": true, + "static_gradient": true, + "twinkle": true + }, + "default": { + "animation": "rainbow_swirl", + "val": 60 + } }, "tap_keycode_delay": 10, "url": "https://www.epomaker.com", "usb": { - "device_version": "0.3.0", + "device_version": "0.4.0", "force_nkro": true, "pid": "0xE463", "suspend_wakeup_delay": 1000, diff --git a/keyboards/epomaker/tide65/keymaps/default/keymap.c b/keyboards/epomaker/tide65/keymaps/default/keymap.c index f467b74bbdf..b2b94e753db 100644 --- a/keyboards/epomaker/tide65/keymaps/default/keymap.c +++ b/keyboards/epomaker/tide65/keymaps/default/keymap.c @@ -1,32 +1,132 @@ -// Copyright 2024 SDK (@sdk66) +// Copyright 2024 SDK (@sdk66) // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H +#include "rgb_record/rgb_record.h" + +enum layers { + _BL = 0, + _FL, + _MBL, + _MFL, + _FBL, + _FFL, + _FMBL, + _FMFL, + _DEFA +}; // clang-format off const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_MUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + [_BL] = LAYOUT( /* win Base */ + 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_MUTE, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT + KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT ), - [1] = LAYOUT( + [_FL] = LAYOUT( /* win FN */ 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_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_BATQ, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, _______, RGB_VAI, _______, - _______, GU_TOGG, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI + _______, KC_NO, TO(_MBL), _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, HS_BATQ, _______, + _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, + KC_FTOG, GU_TOGG, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI ), + + [_MBL] = 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_MUTE, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LALT, KC_LCMD, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RCMD, MO(_MFL), KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_MFL] = 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_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, + _______, TO(_BL), KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, HS_BATQ, _______, + _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, + KC_FTOG, _______, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI + ), + + [_FBL] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_MUTE, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(_FFL), KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FFL] = LAYOUT( + KC_GRV, KC_MYCM, KC_WHOM, KC_MAIL, KC_CALC, KC_MSEL, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, KC_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, + _______, KC_NO, TO(_FMBL),_______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, HS_BATQ, _______, + _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, + KC_FTOG, GU_TOGG, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI + ), + + [_FMBL] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_MUTE, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, + KC_LCTL, KC_LALT, KC_LCMD, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RCMD, MO(_FMFL),KC_LEFT, KC_DOWN, KC_RGHT + ), + + [_FMFL] = LAYOUT( + KC_GRV, KC_BRID, KC_BRIU, KC_F3, KC_F4, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, KC_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, + _______, TO(_FBL), KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, HS_BATQ, _______, + _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, + KC_FTOG, _______, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI + ), + + [_DEFA] = LAYOUT( + KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + +const uint16_t PROGMEM rgbrec_default_effects[RGBREC_CHANNEL_NUM][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + HS_GREEN, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, ________, HS_GREEN, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, HS_GREEN, HS_GREEN, HS_GREEN, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, HS_GREEN, ________, + ________, ________, ________, ________, ________, ________, ________, ________, ________, HS_GREEN, HS_GREEN, HS_GREEN), + + [1] = LAYOUT( + ________, HS_RED, HS_RED, HS_RED, HS_RED, HS_RED, ________, ________, ________, ________, ________, ________, ________, ________, ________, + HS_RED, HS_RED, HS_RED, HS_RED, HS_RED, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, HS_RED, HS_RED, HS_RED, ________, HS_RED, ________, ________, ________, ________, ________, ________, ________, ________, + HS_RED, ________, ________, ________, ________, HS_RED, ________, ________, ________, ________, ________, ________, ________, ________, + HS_RED, ________, HS_RED, ________, ________, ________, ________, ________, ________, ________, ________, ________), + + [2] = LAYOUT( + ________, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, ________, ________, ________, ________, ________, ________, ________, + ________, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, HS_BLUE, ________, ________, ________, ________, ________, ________, ________, ________, + ________, ________, ________, HS_BLUE, HS_BLUE, ________, ________, ________, ________, ________, ________, ________, ________, ________, + ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________, ________), }; #ifdef ENCODER_MAP_ENABLE const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, [1] = {ENCODER_CCW_CW(_______, _______)}, + [2] = {ENCODER_CCW_CW(_______, _______)}, + [3] = {ENCODER_CCW_CW(_______, _______)}, + [4] = {ENCODER_CCW_CW(_______, _______)}, + [5] = {ENCODER_CCW_CW(_______, _______)}, + [6] = {ENCODER_CCW_CW(_______, _______)}, + [7] = {ENCODER_CCW_CW(_______, _______)}, + [8] = {ENCODER_CCW_CW(_______, _______)} }; #endif // clang-format on diff --git a/keyboards/epomaker/tide65/keymaps/via/keymap.c b/keyboards/epomaker/tide65/keymaps/via/keymap.c deleted file mode 100644 index c27400338c0..00000000000 --- a/keyboards/epomaker/tide65/keymaps/via/keymap.c +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2024 SDK (@sdk66) -// SPDX-License-Identifier: GPL-2.0-or-later - -#include QMK_KEYBOARD_H - -enum layers { - _BL = 0, - _FL, - _MBL, - _MFL, - _FBL, - _FFL, - _FMBL, - _FMFL, - _DEFA -}; - -// clang-format off -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_BL] = LAYOUT( /* win Base */ - 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_MUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT - ), - - [_FL] = LAYOUT( /* win FN */ - 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_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, - _______, KC_NO, TO(_MBL), _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_BATQ, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, - KC_FTOG, GU_TOGG, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI - ), - - [_MBL] = 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_MUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LALT, KC_LCMD, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RCMD, MO(_MFL), KC_LEFT, KC_DOWN, KC_RGHT - ), - - [_MFL] = 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_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, - _______, TO(_BL), KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_BATQ, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, - KC_FTOG, _______, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI - ), - - [_FBL] = LAYOUT( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_MUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(_FFL), KC_LEFT, KC_DOWN, KC_RGHT - ), - - [_FFL] = LAYOUT( - KC_GRV, KC_MYCM, KC_WHOM, KC_MAIL, KC_CALC, KC_MSEL, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, - _______, KC_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, - _______, KC_NO, TO(_FMBL),_______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_BATQ, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, - KC_FTOG, GU_TOGG, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI - ), - - [_FMBL] = LAYOUT( - KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, KC_MUTE, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, - KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, - KC_LCTL, KC_LALT, KC_LCMD, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RCMD, MO(_FMFL),KC_LEFT, KC_DOWN, KC_RGHT - ), - - [_FMFL] = LAYOUT( - KC_GRV, KC_BRID, KC_BRIU, KC_F3, KC_F4, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, - _______, KC_BT1, KC_BT2, KC_BT3, _______, KC_USB, _______, _______, _______, _______, KC_2G4, KC_HOME, KC_SCRL, RGB_MOD, _______, - _______, TO(_FBL), KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_BATQ, _______, - _______, RGB_TOG, _______, _______, _______, _______, _______, _______, RGB_HUI, _______, _______, MO(_DEFA),RGB_VAI, _______, - KC_FTOG, _______, _______, EE_CLR, EE_CLR, EE_CLR, EE_CLR, KC_RCTL, _______, RGB_SPD, RGB_VAD, RGB_SPI - ), - - [_DEFA] = LAYOUT( - KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, QK_BOOT, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ - ), - -}; - -#ifdef ENCODER_MAP_ENABLE -const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { - [0] = {ENCODER_CCW_CW(KC_VOLD, KC_VOLU)}, - [1] = {ENCODER_CCW_CW(_______, _______)}, - [2] = {ENCODER_CCW_CW(_______, _______)}, - [3] = {ENCODER_CCW_CW(_______, _______)}, - [4] = {ENCODER_CCW_CW(_______, _______)}, - [5] = {ENCODER_CCW_CW(_______, _______)}, - [6] = {ENCODER_CCW_CW(_______, _______)}, - [7] = {ENCODER_CCW_CW(_______, _______)}, - [8] = {ENCODER_CCW_CW(_______, _______)} -}; -#endif -// clang-format on diff --git a/keyboards/epomaker/tide65/keymaps/via/rules.mk b/keyboards/epomaker/tide65/keymaps/via/rules.mk deleted file mode 100644 index 715838ecc5d..00000000000 --- a/keyboards/epomaker/tide65/keymaps/via/rules.mk +++ /dev/null @@ -1,2 +0,0 @@ -ENCODER_MAP_ENABLE = yes -VIA_ENABLE = yes diff --git a/keyboards/epomaker/tide65/mcuconf.h b/keyboards/epomaker/tide65/mcuconf.h index b3bd3df4abb..f366d270daa 100644 --- a/keyboards/epomaker/tide65/mcuconf.h +++ b/keyboards/epomaker/tide65/mcuconf.h @@ -22,7 +22,7 @@ #define WB32_SPI_SPIM2_IRQ_PRIORITY 9 #undef WB32_SPI_QSPI_IRQ_PRIORITY -#define WB32_SPI_QSPI_IRQ_PRIORITY 10 +#define WB32_SPI_QSPI_IRQ_PRIORITY 10 #undef WB32_SERIAL_UART3_PRIORITY #define WB32_SERIAL_UART3_PRIORITY 8 diff --git a/keyboards/epomaker/tide65/post_rules.mk b/keyboards/epomaker/tide65/post_rules.mk index e21940014a5..3a451bf6aa0 100644 --- a/keyboards/epomaker/tide65/post_rules.mk +++ b/keyboards/epomaker/tide65/post_rules.mk @@ -1 +1,5 @@ +RGB_MATRIX_CUSTOM_USER = yes +RGBLIGHT_DRIVER = custom +include keyboards/epomaker/tide65/rgb_record/rgb_record.mk +include keyboards/epomaker/tide65/control/control.mk include keyboards/linker/wireless/wireless.mk diff --git a/keyboards/epomaker/tide65/rgb_matrix_user.inc b/keyboards/epomaker/tide65/rgb_matrix_user.inc new file mode 100644 index 00000000000..910d6b35746 --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_matrix_user.inc @@ -0,0 +1,18 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef ENABLE_RGB_MATRIX_RGBR_PLAY +RGB_MATRIX_EFFECT(RGBR_PLAY) +# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +bool RGBR_PLAY(effect_params_t *params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + + extern void rgbrec_play(uint8_t led_min, uint8_t led_max); + rgbrec_play(led_min, led_max); + + return rgb_matrix_check_finished_leds(led_max); +} + +# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS +#endif diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_effect.c b/keyboards/epomaker/tide65/rgb_record/rgb_effect.c new file mode 100644 index 00000000000..26d1d03cdcb --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_effect.c @@ -0,0 +1,241 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgb_effect.h" + +void rgblight_effect_breathing(animation_status_t *anim) { + static uint8_t i, r, g, b, dir; + + switch (i) { + case 0: { + if (dir == 0) { + if (r < BREATHING_VAL - 1) + r += 2; + else + r++; + } + if (r == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (r > 1) + r -= 2; + else + r--; + if (r == 0) { + dir = 0; + i = 1; + } + } + } break; + case 1: { + if (dir == 0) { + if (g < BREATHING_VAL - 1) + g += 2; + else + g++; + } + if (g == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (g > 1) + g -= 2; + else + g--; + if (g == 0) { + dir = 0; + i = 2; + } + } + } break; + case 2: { + if (dir == 0) { + if (b < BREATHING_VAL - 1) + b += 2; + else + b++; + } + if (b == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (b > 1) + b -= 2; + else + b--; + + if (b == 0) { + dir = 0; + i = 3; + } + } + } break; + case 3: { + if (dir == 0) { + if (r < BREATHING_VAL - 1) { + r += 2; + b += 2; + } else { + r++; + b++; + } + } + if (r == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (r > 1) { + r -= 2; + b -= 2; + } else { + r--; + b--; + } + if (r == 0) { + dir = 0; + i = 4; + } + } + } break; + case 4: { + if (dir == 0) { + if (r < BREATHING_VAL - 1) { + r += 2; + g += 2; + } else { + r++; + g++; + } + } + if (r == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (r > 1) { + r -= 2; + g -= 2; + } else { + r--; + g--; + } + if (r == 0) { + dir = 0; + i = 5; + } + } + } break; + case 5: { + if (dir == 0) { + if (g < BREATHING_VAL - 1) { + g += 2; + b += 2; + } else { + g++; + b++; + } + } + if (g == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (g > 1) { + g -= 2; + b -= 2; + } else { + g--; + b--; + } + if (g == 0) { + dir = 0; + i = 6; + } + } + } break; + case 6: { + if (dir == 0) { + if (g < BREATHING_VAL - 1) { + g += 2; + b += 2; + r += 2; + } else { + g++; + r++; + b++; + } + } + if (g == BREATHING_VAL) dir = 1; + if (dir == 1) { + if (g > 1) { + g -= 2; + b -= 2; + r -= 2; + } else { + g--; + r--; + b--; + } + if (g == 0) { + dir = 0; + i = 0; + } + } + } break; + default: + break; + } + for (uint8_t j = 0; j < RGBLED_NUM; j++) + rgblight_setrgb_at(r, g, b, j); +} + +void rgblight_effect_rainbow_mood(animation_status_t *anim) { + static uint8_t i = 0, r = RAINBOW_MOOD, g = 0, b = 0; + + if (rgblight_config.enable) { + for (uint8_t j = 0; j < RGBLED_NUM; j++) + rgblight_setrgb_at(r, g, b, j); + + if (i == 0) { + if (g < RAINBOW_MOOD - 1) { + r -= 2; + g += 2; + } else { + r--; + g++; + } + if (g == RAINBOW_MOOD) i = 1; + } + if (i == 1) { + if (b < RAINBOW_MOOD - 1) { + g -= 2; + b += 2; + } else { + g--; + b++; + } + if (b == RAINBOW_MOOD) i = 2; + } + if (i == 2) { + if (r < RAINBOW_MOOD - 1) { + b -= 2; + r += 2; + } else { + b--; + r++; + } + if (r == RAINBOW_MOOD) i = 0; + } + } +} + +bool rgblight_effect_custom_rainbow_swirl(animation_status_t *anim) { + uint8_t hue; + uint8_t i; + + for (i = 0; i < rgblight_ranges.effect_num_leds / 2; i++) { + hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue); + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]); + sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[rgblight_ranges.effect_num_leds - 1 - i + rgblight_ranges.effect_start_pos]); + } + rgblight_set(); + + if (anim->delta % 2) { + anim->current_hue++; + anim->current_hue++; + anim->current_hue++; + } else { + anim->current_hue--; + anim->current_hue--; + anim->current_hue--; + } + + return false; +} \ No newline at end of file diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_effect.h b/keyboards/epomaker/tide65/rgb_record/rgb_effect.h new file mode 100644 index 00000000000..ee6114644d2 --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_effect.h @@ -0,0 +1,11 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgblight.h" + +#define RGBLIGHT_RAINBOW_SWIRL_RANGE 255 + +extern rgblight_config_t rgblight_config; +extern rgb_led_t led[RGBLIGHT_LED_COUNT]; + +extern void sethsv(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1); diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_record.c b/keyboards/epomaker/tide65/rgb_record/rgb_record.c new file mode 100644 index 00000000000..2d1d374cd44 --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_record.c @@ -0,0 +1,327 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgb_record.h" +#include "rgb_matrix.h" +#include "eeprom.h" + +#define RGBREC_STATE_ON 1 +#define RGBREC_STATE_OFF 0 +#define RGBREC_COLOR_NUM (sizeof(rgbrec_hs_lists) / sizeof(rgbrec_hs_lists[0])) + +typedef struct { + uint8_t state; + uint8_t channel; + uint16_t value; +} rgbrec_info_t; + +typedef uint16_t (*rgbrec_effects_t)[MATRIX_COLS]; + +rgbrec_effects_t p_rgbrec_effects = NULL; + +static uint16_t rgbrec_hs_lists[] = RGB_RECORD_HS_LISTS; +static uint8_t rgbrec_buffer[MATRIX_ROWS * MATRIX_COLS * 2]; + +//clang-format off +static const uint8_t rgbmatrix_buff[] = {13, 15, 16, 24, 25, 26, 29, 37, 33, 34, 35, 43, 2, 5, 6, 9}; +static const uint8_t sixth_gear_buff[] = {6, 13, 15, 16, 25, 26, 34}; +static uint8_t rgb_hsvs[RGB_HSV_MAX][2] = { + {0, 255}, + {85, 255}, + {170, 255}, + {43, 255}, + {191, 255}, + {128, 255}, + {4, 80 }, +}; + +//clang-format on +static rgbrec_info_t rgbrec_info = { + .state = RGBREC_STATE_OFF, + .channel = 0, + .value = 0xFF, +}; + +static uint8_t rgbrec_buffer[MATRIX_ROWS * MATRIX_COLS * 2]; +extern const uint16_t PROGMEM rgbrec_default_effects[RGBREC_CHANNEL_NUM][MATRIX_ROWS][MATRIX_COLS]; + +static bool find_matrix_row_col(uint8_t index, uint8_t *row, uint8_t *col) { + uint8_t i, j; + + for (i = 0; i < MATRIX_ROWS; i++) { + for (j = 0; j < MATRIX_COLS; j++) { + if (g_led_config.matrix_co[i][j] != NO_LED) { + if (g_led_config.matrix_co[i][j] == index) { + *row = i; + *col = j; + + return true; + } + } + } + } + + return false; +} + +static inline RGB hs_to_rgb(uint8_t h, uint8_t s) { + + if ((h == 0) && (s == 0)) { + return hsv_to_rgb((HSV){0, 0, 0}); + } else if ((h == 1) && (s == 1)) { + return hsv_to_rgb((HSV){0, 0, rgbrec_info.value}); + } else { + return hsv_to_rgb((HSV){h, s, rgbrec_info.value}); + } +} + +void rgbrec_init(uint8_t channel) { + + p_rgbrec_effects = (rgbrec_effects_t)rgbrec_buffer; + rgbrec_info.state = RGBREC_STATE_OFF; + rgbrec_info.channel = channel; + rgbrec_info.value = rgb_matrix_get_val(); + + rgbrec_read_current_channel(rgbrec_info.channel); +} + +bool rgbrec_show(uint8_t channel) { + + if (channel >= RGBREC_CHANNEL_NUM) { + return false; + } + + rgbrec_info.channel = channel; + rgbrec_read_current_channel(rgbrec_info.channel); + + if (rgb_matrix_get_mode() != RGB_MATRIX_CUSTOM_RGBR_PLAY) { + rgb_matrix_mode(RGB_MATRIX_CUSTOM_RGBR_PLAY); + } + + return true; +} + +bool rgbrec_start(uint8_t channel) { + + if (channel >= RGBREC_CHANNEL_NUM) { + + return false; + } + + if (rgbrec_info.state == RGBREC_STATE_OFF) { + rgbrec_info.state = RGBREC_STATE_ON; + rgbrec_info.channel = channel; + rgbrec_read_current_channel(rgbrec_info.channel); + if (rgb_matrix_get_mode() != RGB_MATRIX_CUSTOM_RGBR_PLAY) { + rgb_matrix_mode(RGB_MATRIX_CUSTOM_RGBR_PLAY); + } + + return true; + } + + return false; +} + +void rgbrec_update_current_channel(uint8_t channel) { + uint32_t addr = 0; + + if (channel >= RGBREC_CHANNEL_NUM) { + return; + } + + addr = (uint32_t)(RGBREC_EECONFIG_ADDR) + (channel * sizeof(rgbrec_buffer)); + eeprom_update_block(rgbrec_buffer, (void *)addr, sizeof(rgbrec_buffer)); +} + +bool rgbrec_end(uint8_t channel) { + + if (channel >= RGBREC_CHANNEL_NUM) { + + return false; + } + + if ((rgbrec_info.state == RGBREC_STATE_ON) && (channel == rgbrec_info.channel)) { + rgbrec_info.state = RGBREC_STATE_OFF; + rgbrec_update_current_channel(rgbrec_info.channel); + + return true; + } + + return false; +} + +static inline void rgb_matrix_set_hs(int index, uint16_t hs) { + + RGB rgb = hs_to_rgb(HS_GET_H(hs), HS_GET_S(hs)); + rgb_matrix_set_color(index, rgb.r, rgb.g, rgb.b); +} + +void rgbrec_play(uint8_t led_min, uint8_t led_max) { + uint8_t row = 0xFF, col = 0xFF; + uint16_t hs_color; + + rgbrec_info.value = rgb_matrix_get_val(); + + for (uint8_t i = led_min; i < led_max; i++) { + if (find_matrix_row_col(i, &row, &col)) { + if (p_rgbrec_effects != NULL) { + hs_color = p_rgbrec_effects[row][col]; + rgb_matrix_set_hs(i, hs_color); + } + } + } +} + +void rgbrec_set_close_all(uint8_t h, uint8_t s, uint8_t v) { + + if (!h && !s && !v) { + memset(rgbrec_buffer, 0, sizeof(rgbrec_buffer)); + } else { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + rgbrec_buffer[row * MATRIX_COLS * col * 2] = s; + rgbrec_buffer[(row * MATRIX_COLS * col * 2) + 1] = v; + } + } + } +} + +void rgbrec_read_current_channel(uint8_t channel) { + uint32_t addr = 0; + + if (channel >= RGBREC_CHANNEL_NUM) { + + return; + } + + addr = (uint32_t)(RGBREC_EECONFIG_ADDR) + (channel * sizeof(rgbrec_buffer)); + eeprom_read_block(rgbrec_buffer, (void *)addr, sizeof(rgbrec_buffer)); +} + +bool rgbrec_is_started(void) { + + return (rgbrec_info.state == RGBREC_STATE_ON); +} + +static inline void cycle_rgb_next_color(uint8_t row, uint8_t col) { + + if (p_rgbrec_effects == NULL) { + + return; + } + + for (uint8_t index = 0; index < RGBREC_COLOR_NUM; index++) { + if (rgbrec_hs_lists[index] == p_rgbrec_effects[row][col]) { + index = ((index + 1) % RGBREC_COLOR_NUM); + p_rgbrec_effects[row][col] = rgbrec_hs_lists[index]; + + return; + } + } + + p_rgbrec_effects[row][col] = rgbrec_hs_lists[0]; +} + +bool rgbrec_register_record(uint16_t keycode, keyrecord_t *record) { + (void)keycode; + + if (rgbrec_info.state == RGBREC_STATE_ON) { + cycle_rgb_next_color(record->event.key.row, record->event.key.col); + + return true; + } + + return false; +} + +void eeconfig_init_user_datablock(void) { + uint32_t addr = 0; + + addr = (uint32_t)(RGBREC_EECONFIG_ADDR); + eeprom_update_block(rgbrec_default_effects, (void *)addr, sizeof(rgbrec_default_effects)); +} + +uint8_t find_index(void) { + + for (uint8_t index = 0; index < (sizeof(rgbmatrix_buff) / sizeof(rgbmatrix_buff[0])); index++) { + if (rgb_matrix_get_mode() == rgbmatrix_buff[index]) { + + return index; + } + } + + return 0; +} + +void record_rgbmatrix_increase(uint8_t *last_mode) { + uint8_t index; + + index = find_index(); + if (rgbrec_info.state != RGBREC_STATE_ON) { + index = (index + 1) % (sizeof(rgbmatrix_buff) / sizeof(rgbmatrix_buff[0])); + } + *last_mode = rgbmatrix_buff[index]; + rgb_matrix_mode(rgbmatrix_buff[index]); + record_color_hsv(false); +} + +uint8_t record_color_read_data(void) { + uint8_t hs_mode = find_index(); + const uint8_t *ptr = (const uint8_t *)(((uint32_t)CONFINFO_EECONFIG_ADDR + 4) + hs_mode); + uint8_t hs_c = eeprom_read_byte(ptr); + + if (hs_c > RGB_HSV_MAX) { + return 0; + } else { + return hs_c; + } +} + +void record_color_hsv(bool status) { + uint8_t temp; + uint8_t rgb_hsv_index = record_color_read_data(); + + for (uint8_t i = 0; i < (sizeof(sixth_gear_buff) / sizeof(sixth_gear_buff[0])); i++) { + if (rgb_matrix_get_mode() == sixth_gear_buff[i]) { + temp = RGB_HSV_MAX - 1; + break; + } else if (i == (sizeof(sixth_gear_buff) / sizeof(sixth_gear_buff[0]) - 1)) { + temp = RGB_HSV_MAX; + } + } + + if (status) rgb_hsv_index = (rgb_hsv_index + 1) % temp; + + rgb_matrix_sethsv(rgb_hsvs[rgb_hsv_index][0], rgb_hsvs[rgb_hsv_index][1], rgb_matrix_get_val()); + + uint8_t *ptr = (uint8_t *)(((uint32_t)CONFINFO_EECONFIG_ADDR + 4) + find_index()); + eeprom_write_byte(ptr, rgb_hsv_index); +} + +bool rk_bat_req_flag; + +void query(void){ + if (rk_bat_req_flag) { +# ifdef RGBLIGHT_ENABLE + for (uint8_t i = 0; i < (RGB_MATRIX_LED_COUNT - RGBLED_NUM); i++) { + rgb_matrix_set_color(i, 0, 0, 0); + } +# else + rgb_matrix_set_color_all(0x00, 0x00, 0x00); +# endif + for (uint8_t i = 0; i < 10; i++) { + uint8_t mi_index[10] = RGB_MATRIX_BAT_INDEX_MAP; + if ((i < (*md_getp_bat() / 10)) || (i < 1)) { + if (*md_getp_bat() >= (IM_BAT_REQ_LEVEL1_VAL)) { + rgb_matrix_set_color(mi_index[i], IM_BAT_REQ_LEVEL1_COLOR); + } else if (*md_getp_bat() >= (IM_BAT_REQ_LEVEL2_VAL)) { + rgb_matrix_set_color(mi_index[i], IM_BAT_REQ_LEVEL2_COLOR); + } else { + rgb_matrix_set_color(mi_index[i], IM_BAT_REQ_LEVEL3_COLOR); + } + } else { + rgb_matrix_set_color(mi_index[i], 0x00, 0x00, 0x00); + } + } + } +} diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_record.h b/keyboards/epomaker/tide65/rgb_record/rgb_record.h new file mode 100644 index 00000000000..f7b666e415f --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_record.h @@ -0,0 +1,82 @@ +/* + * 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 + +#include +#include +#include + +#include +#include "color.h" +#include "eeprom.h" +#include "quantum.h" +#include "wireless.h" + +#define HS_GET_H(value) ((uint8_t)(value >> 8)) +#define HS_GET_S(value) ((uint8_t)(value & 0xFF)) + +/* HSV Color bit[15:8] H bit[7:0] S */ +#define HS_AZURE 0x8466 +#define HS_BLACK 0x0000 +#define HS_BLUE 0xAAFF +#define HS_CHARTREUSE 0x40FF +#define HS_CORAL 0x0BB0 +#define HS_GOLD 0x24FF +#define HS_GOLDENROD 0x1EDA +#define HS_GREEN 0x55FF +#define HS_MAGENTA 0xD5FF +#define HS_ORANGE 0x15FF +#define HS_PINK 0xEA80 +#define HS_PURPLE 0xBFFF +#define HS_RED 0x00FF +#define HS_CYAN 0x6AFF +#define HS_TEAL 0x80FF +#define HS_TURQUOISE 0x7B5A +#define HS_WHITE 0x0101 +#define HS_YELLOW 0x2BFF + +#define LASET_MOD_NO 0xFF +#define RGB_HSV_MAX 7 +#define ________ HS_BLACK + +#ifndef RGB_RECORD_HS_LISTS +# define RGB_RECORD_HS_LISTS \ + {HS_BLACK, HS_RED, HS_GREEN, HS_BLUE, HS_YELLOW, HS_PURPLE, HS_CYAN, HS_WHITE} +#endif + +#define RGB_MATRIX_BAT_VAL 150 + +#define IM_BAT_REQ_LEVEL1_VAL 50 +#define IM_BAT_REQ_LEVEL1_COLOR 0x00, RGB_MATRIX_BAT_VAL, 0x00 + +#define IM_BAT_REQ_LEVEL2_VAL 30 +#define IM_BAT_REQ_LEVEL2_COLOR 0x00, RGB_MATRIX_BAT_VAL, 0x00 + +#define IM_BAT_REQ_LEVEL3_COLOR RGB_MATRIX_BAT_VAL, 0x00, 0x00 + +void rgbrec_read_current_channel(uint8_t channel); +void rgbrec_set_close_all(uint8_t h, uint8_t s, uint8_t v); +void rgbrec_play(uint8_t led_min, uint8_t led_max); +bool rgbrec_end(uint8_t channel); +bool rgbrec_start(uint8_t channel); +bool rgbrec_show(uint8_t channel); +void rgbrec_init(uint8_t channel); +bool rgbrec_is_started(void); +void eeconfig_init_user_datablock(void); +bool rgbrec_register_record(uint16_t keycode, keyrecord_t *record); +void record_rgbmatrix_increase(uint8_t *last_mode); +void record_color_hsv(bool status); +void query(void); diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_record.mk b/keyboards/epomaker/tide65/rgb_record/rgb_record.mk new file mode 100644 index 00000000000..0c91f748ecd --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_record.mk @@ -0,0 +1,6 @@ +SRC += rgb_record/rgb_record.c + +ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) + SRC += rgb_record/rgb_rgblight.c + SRC += rgb_record/rgb_effect.c +endif diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.c b/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.c new file mode 100644 index 00000000000..35827ad1128 --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.c @@ -0,0 +1,42 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgb_rgblight.h" +#include "rgblight.h" +LED_TYPE led[RGBLED_NUM]; +extern rgblight_config_t rgblight_config; + + +void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { + + memcpy(led, start_led, sizeof(LED_TYPE) * num_leds); +} + +void rgblight_set(void) { + LED_TYPE *start_led; + uint8_t num_leds = rgblight_ranges.clipping_num_leds; + const uint8_t led_map[] = RGBLIGHT_LED_MAP; + + if (!rgblight_config.enable) { + for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + } + } + LED_TYPE led0[RGBLED_NUM]; + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led0[i] = led[pgm_read_byte(&led_map[i])]; + } + start_led = led0 + rgblight_ranges.clipping_start_pos; + rgblight_call_driver(start_led, num_leds); +} + +bool rgb_matrix_indicators_advanced_rgblight(uint8_t led_min, uint8_t led_max) { + + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + rgb_matrix_set_color(RGB_MATRIX_LED_COUNT - RGBLED_NUM + i, led[i].r, led[i].g, led[i].b); // rgb light + } + + return true; +} diff --git a/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.h b/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.h new file mode 100644 index 00000000000..fec20a6b5d1 --- /dev/null +++ b/keyboards/epomaker/tide65/rgb_record/rgb_rgblight.h @@ -0,0 +1,6 @@ +// Copyright 2024 SDK (@sdk66) +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "rgb_matrix.h" + +bool rgb_matrix_indicators_advanced_rgblight(uint8_t led_min, uint8_t led_max); diff --git a/keyboards/epomaker/tide65/tide65.c b/keyboards/epomaker/tide65/tide65.c index af815842df5..79228751e16 100644 --- a/keyboards/epomaker/tide65/tide65.c +++ b/keyboards/epomaker/tide65/tide65.c @@ -2,6 +2,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include QMK_KEYBOARD_H +#include "control/control.h" +#include "rgb_record/rgb_record.h" +#include "rgb_record/rgb_rgblight.h" + #ifdef WIRELESS_ENABLE # include "wireless.h" @@ -14,10 +18,23 @@ typedef union { struct { uint8_t flag : 1; uint8_t devs : 3; + uint8_t record_channel : 4; + uint8_t record_last_mode; + uint8_t last_btdevs : 3; }; } confinfo_t; confinfo_t confinfo; +typedef struct { + bool active; + uint32_t timer; + uint32_t interval; + uint32_t times; + uint8_t index; + RGB rgb; + void (*blink_cb)(uint8_t); +} hs_rgb_indicator_t; + enum layers { _BL = 0, _FL, @@ -30,23 +47,15 @@ enum layers { _DEFA }; -typedef struct { - bool active; - uint32_t timer; - uint32_t interval; - uint32_t times; - uint8_t index; - RGB rgb; -} hs_rgb_indicator_t; - hs_rgb_indicator_t hs_rgb_indicators[HS_RGB_INDICATOR_COUNT]; hs_rgb_indicator_t hs_rgb_bat[HS_RGB_BAT_COUNT]; -void bat_indicators(void); void rgb_blink_dir(void); void hs_reset_settings(void); void rgb_matrix_hs_indicator(void); void rgb_matrix_hs_indicator_set(uint8_t index, RGB rgb, uint32_t interval, uint8_t times); +void rgb_matrix_hs_set_remain_time(uint8_t index, uint8_t remain_time); + #define keymap_is_mac_system() ((get_highest_layer(default_layer_state) == _MBL) || (get_highest_layer(default_layer_state) == _FMBL)) #define keymap_is_base_layer() ((get_highest_layer(default_layer_state) == _BL) || (get_highest_layer(default_layer_state) == _MBL)) @@ -59,6 +68,13 @@ bool bat_full_flag = false; bool enable_bat_indicators = true; uint32_t bat_indicator_cnt = true; static uint32_t ee_clr_timer = 0; +static uint32_t rec_time; +static bool rec_filp; +bool test_white_light_flag = false; +HSV start_hsv; +bool no_record_fg; +bool lower_sleep = false; +uint8_t buff[] = {14, 8, 2, 1, 1, 1, 1, 1, 1, 1, 0}; void eeconfig_confinfo_update(uint32_t raw) { @@ -72,12 +88,19 @@ uint32_t eeconfig_confinfo_read(void) { void eeconfig_confinfo_default(void) { - confinfo.flag = true; + confinfo.flag = true; + confinfo.record_channel = 0; + confinfo.record_last_mode = 0xff; + confinfo.last_btdevs = 1; #ifdef WIRELESS_ENABLE confinfo.devs = DEVS_USB; #endif + eeconfig_init_user_datablock(); eeconfig_confinfo_update(confinfo.raw); +#ifdef RGBLIGHT_ENABLE + rgblight_mode(buff[0]); +#endif } void eeconfig_confinfo_init(void) { @@ -88,6 +111,31 @@ void eeconfig_confinfo_init(void) { } } +void lpwr_stop_hook_pre(void){ + + gpio_write_pin_low(LED_POWER_EN_PIN); + +#ifdef HS_LED_BOOSTING_PIN + gpio_write_pin_low(HS_LED_BOOSTING_PIN); +#endif + + if (lower_sleep){ + md_send_devctrl(MD_SND_CMD_DEVCTRL_USB); + wait_ms(200); + lpwr_set_sleep_wakeupcd(LPWR_WAKEUP_UART); + } +} + +void lpwr_wakeup_hook(void){ + hs_mode_scan(false,confinfo.devs,confinfo.last_btdevs); + + gpio_write_pin_high(LED_POWER_EN_PIN); +#ifdef HS_LED_BOOSTING_PIN + gpio_write_pin_high(HS_LED_BOOSTING_PIN); +#endif + +} + void keyboard_post_init_kb(void) { #ifdef CONSOLE_ENABLE @@ -99,6 +147,20 @@ void keyboard_post_init_kb(void) { #ifdef LED_POWER_EN_PIN gpio_set_pin_output(LED_POWER_EN_PIN); gpio_write_pin_high(LED_POWER_EN_PIN); + +#ifdef HS_LED_BOOSTING_PIN + gpio_set_pin_output(HS_LED_BOOSTING_PIN); + gpio_write_pin_high(HS_LED_BOOSTING_PIN); +#endif + +#ifdef MM_BT_DEF_PIN + setPinInputHigh(MM_BT_DEF_PIN); +#endif + +#ifdef MM_2G4_DEF_PIN + setPinInputHigh(MM_2G4_DEF_PIN); +#endif + #endif #ifdef USB_POWER_EN_PIN @@ -107,7 +169,7 @@ void keyboard_post_init_kb(void) { #endif #ifdef HS_BAT_CABLE_PIN - setPinInputHigh(HS_BAT_CABLE_PIN); + setPinInput(HS_BAT_CABLE_PIN); #endif #ifdef BAT_FULL_PIN @@ -116,11 +178,15 @@ void keyboard_post_init_kb(void) { #ifdef WIRELESS_ENABLE wireless_init(); - wireless_devs_change(!confinfo.devs, confinfo.devs, false); + // wireless_devs_change(!confinfo.devs, confinfo.devs, false); post_init_timer = timer_read32(); #endif - + keyboard_post_init_user(); + + rgbrec_init(confinfo.record_channel); + + start_hsv = rgb_matrix_get_hsv(); } #ifdef WIRELESS_ENABLE @@ -144,7 +210,9 @@ void suspend_power_down_kb(void) { # ifdef LED_POWER_EN_PIN gpio_write_pin_low(LED_POWER_EN_PIN); # endif + suspend_power_down_user(); + } void suspend_wakeup_init_kb(void) { @@ -155,6 +223,7 @@ void suspend_wakeup_init_kb(void) { wireless_devs_change(wireless_get_current_devs(), wireless_get_current_devs(), false); suspend_wakeup_init_user(); + hs_rgb_blink_set_timer(timer_read32()); } bool lpwr_is_allow_timeout_hook(void) { @@ -162,20 +231,21 @@ bool lpwr_is_allow_timeout_hook(void) { if (wireless_get_current_devs() == DEVS_USB) { return false; } - return true; } void wireless_post_task(void) { - + // auto switching devs if (post_init_timer && timer_elapsed32(post_init_timer) >= 100) { + md_send_devctrl(MD_SND_CMD_DEVCTRL_FW_VERSION); // get the module fw version. md_send_devctrl(MD_SND_CMD_DEVCTRL_SLEEP_BT_EN); // timeout 30min to sleep in bt mode, enable md_send_devctrl(MD_SND_CMD_DEVCTRL_SLEEP_2G4_EN); // timeout 30min to sleep in 2.4g mode, enable wireless_devs_change(!confinfo.devs, confinfo.devs, false); post_init_timer = 0x00; } + hs_mode_scan(false,confinfo.devs,confinfo.last_btdevs); } uint32_t wls_process_long_press(uint32_t trigger_time, void *cb_arg) { @@ -183,22 +253,32 @@ uint32_t wls_process_long_press(uint32_t trigger_time, void *cb_arg) { switch (keycode) { case KC_BT1: { - wireless_devs_change(wireless_get_current_devs(), DEVS_BT1, true); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + wireless_devs_change(wireless_get_current_devs(), DEVS_BT1, true); + } } break; case KC_BT2: { - wireless_devs_change(wireless_get_current_devs(), DEVS_BT2, true); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + wireless_devs_change(wireless_get_current_devs(), DEVS_BT2, true); + } } break; case KC_BT3: { - wireless_devs_change(wireless_get_current_devs(), DEVS_BT3, true); - } break; - case KC_BT4: { - wireless_devs_change(wireless_get_current_devs(), DEVS_BT4, true); - } break; - case KC_BT5: { - wireless_devs_change(wireless_get_current_devs(), DEVS_BT5, true); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + wireless_devs_change(wireless_get_current_devs(), DEVS_BT3, true); + } } break; case KC_2G4: { - wireless_devs_change(wireless_get_current_devs(), DEVS_2G4, true); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_2g4) || (mode == hs_wireless) || (mode == hs_none)) { + wireless_devs_change(wireless_get_current_devs(), DEVS_2G4, true); + } } break; case EE_CLR: { @@ -223,7 +303,8 @@ bool process_record_wls(uint16_t keycode, keyrecord_t *record) { # define WLS_KEYCODE_EXEC(wls_dev) \ do { \ if (record->event.pressed) { \ - wireless_devs_change(wireless_get_current_devs(), wls_dev, false); \ + if (wireless_get_current_devs() != wls_dev) \ + wireless_devs_change(wireless_get_current_devs(), wls_dev, false); \ if (wls_process_long_press_token == INVALID_DEFERRED_TOKEN) { \ wls_process_long_press_token = defer_exec(WLS_KEYCODE_PAIR_TIME, wls_process_long_press, &keycode_shadow); \ } \ @@ -235,31 +316,43 @@ bool process_record_wls(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case KC_BT1: { - WLS_KEYCODE_EXEC(DEVS_BT1); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + WLS_KEYCODE_EXEC(DEVS_BT1); + hs_rgb_blink_set_timer(timer_read32()); + } + } break; case KC_BT2: { - WLS_KEYCODE_EXEC(DEVS_BT2); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + WLS_KEYCODE_EXEC(DEVS_BT2); + hs_rgb_blink_set_timer(timer_read32()); + } } break; case KC_BT3: { - WLS_KEYCODE_EXEC(DEVS_BT3); - } break; - case KC_BT4: { - WLS_KEYCODE_EXEC(DEVS_BT4); - } break; - case KC_BT5: { - WLS_KEYCODE_EXEC(DEVS_BT5); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_bt) || (mode == hs_wireless) || (mode == hs_none)) { + WLS_KEYCODE_EXEC(DEVS_BT3); + hs_rgb_blink_set_timer(timer_read32()); + } } break; case KC_2G4: { - WLS_KEYCODE_EXEC(DEVS_2G4); + uint8_t mode = confinfo.devs; + hs_modeio_detection(true, &mode,confinfo.last_btdevs); + if ((mode == hs_2g4) || (mode == hs_wireless) || (mode == hs_none)) { + WLS_KEYCODE_EXEC(DEVS_2G4); + hs_rgb_blink_set_timer(timer_read32()); + } } break; - case KC_USB: { + case KC_USB: { if (record->event.pressed) { wireless_devs_change(wireless_get_current_devs(), DEVS_USB, false); } } break; - case KC_BATQ: { - inqbat_flag = record->event.pressed; - } break; default: return true; } @@ -268,6 +361,98 @@ bool process_record_wls(uint16_t keycode, keyrecord_t *record) { } #endif +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + if (test_white_light_flag && record->event.pressed) { + test_white_light_flag = false; + rgb_matrix_set_color_all(0x00, 0x00, 0x00); + } + + if (*md_getp_state() == MD_STATE_CONNECTED){ + hs_rgb_blink_set_timer(timer_read32()); + } + + switch (keycode) { + case MO(_FBL): + case MO(_FMBL): + case MO(_FL): + case MO(_MFL): { + if (!record->event.pressed && rgbrec_is_started()) { + if (no_record_fg == true) { + no_record_fg = false; + rgbrec_register_record(keycode, record); + } + no_record_fg = true; + } + break; + } + case RP_END: + case RP_P0: + case RP_P1: + case RP_P2: + case RGB_MOD: + break; + default: { + if (rgbrec_is_started()) { + if (!IS_QK_MOMENTARY(keycode) && record->event.pressed) { + rgbrec_register_record(keycode, record); + + return false; + } + } + } break; + } + + if (rgbrec_is_started() && (!(keycode == RP_P0 || keycode == RP_P1 || keycode == RP_P2 || keycode == RP_END || keycode == RGB_MOD || keycode == MO(_FL) || keycode == MO(_MFL)))) { + + return false; + } + + return true; +} + +void im_rgblight_increase(void) { + HSV rgb = rgblight_get_hsv(); + uint8_t mode = rgblight_get_mode(); + static uint8_t current_mode = 0; + + if (mode == 1) { + current_mode = (rgb.h == 0 && rgb.s != 0) ? 3 : 9; + + switch (rgb.h) { + case 40: current_mode = 4; break; + case 80: current_mode = 5; break; + case 120: current_mode = 6; break; + case 160: current_mode = 7; break; + case 200: current_mode = 8; break; + default: break; + } + } + + current_mode = (current_mode + 1) % 11; + + if (current_mode == 10) { + rgblight_sethsv(0, 255, rgb.v); + rgblight_disable(); + } else { + rgblight_enable(); + rgblight_mode(buff[current_mode]); + } + + switch (current_mode) { + case 3: rgblight_sethsv(0, 255, rgb.v); break; + case 4: rgblight_sethsv(40, 255, rgb.v); break; + case 5: rgblight_sethsv(80, 255, rgb.v); break; + case 6: rgblight_sethsv(120, 255, rgb.v); break; + case 7: rgblight_sethsv(160, 255, rgb.v); break; + case 8: rgblight_sethsv(200, 255, rgb.v); break; + case 9: rgblight_sethsv(0, 0, rgb.v); break; + case 0: rgblight_set_speed(255); break; + default: rgblight_set_speed(200); break; + } +} + + bool process_record_kb(uint16_t keycode, keyrecord_t *record) { if (process_record_user(keycode, record) != true) { @@ -281,16 +466,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { #endif switch (keycode) { - case EE_CLR:{ - if (record->event.pressed) { - ee_clr_timer = timer_read32(); - } else { - ee_clr_timer = 0; - } - return false; - break; - } - case KC_FTOG:{ if (record->event.pressed) { @@ -316,7 +491,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return false; break; } - case KC_TILD:{ if (record->event.pressed){ register_code(KC_LSFT); @@ -328,68 +502,118 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { return false; break; } + case QK_BOOT: { + if (record->event.pressed) { + dprintf("into boot!!!\r\n"); + eeconfig_disable(); + bootloader_jump(); + } + } break; + case KC_TESTW: { + if (rgbrec_is_started()) { - case RGB_SPI:{ + return false; + } + if (record->event.pressed) { + test_white_light_flag = true; + } + return false; + } break; + case NK_TOGG: { + if (rgbrec_is_started()) { + + return false; + } + if (record->event.pressed) { + rgb_matrix_hs_indicator_set(0xFF, (RGB){0x00, 0x6E, 0x00}, 250, 1); + } + } break; + case RL_MOD: { + if (rgbrec_is_started()) { + + return false; + } + if (record->event.pressed) { + im_rgblight_increase(); + } + + return false; + } break; + case EE_CLR: { + if (record->event.pressed) { + ee_clr_timer = timer_read32(); + } else { + ee_clr_timer = 0; + } + + return false; + } break; + case RGB_SPI: { if (record->event.pressed) { if (rgb_matrix_get_speed() >= (RGB_MATRIX_SPD_STEP * 5)) { rgb_blink_dir(); } } - return true; } break; - case RGB_SPD: { if (record->event.pressed) { if (rgb_matrix_get_speed() <= RGB_MATRIX_SPD_STEP) { rgb_blink_dir(); rgb_matrix_set_speed(RGB_MATRIX_SPD_STEP); + return false; } } - return true; } break; - case RGB_VAI: { if (record->event.pressed) { if (rgb_matrix_get_val() >= (RGB_MATRIX_MAXIMUM_BRIGHTNESS - RGB_MATRIX_VAL_STEP)) { rgb_blink_dir(); + start_hsv.v = RGB_MATRIX_MAXIMUM_BRIGHTNESS; + } + else{ + start_hsv.v = rgb_matrix_get_val() + RGB_MATRIX_VAL_STEP; } } - return true; } break; - case RGB_VAD: { if (record->event.pressed) { if (rgb_matrix_get_val() <= RGB_MATRIX_VAL_STEP) { rgb_blink_dir(); - rgb_matrix_set_color_all(0x00, 0x00, 0x00); + for(uint8_t i = 0; i < RGB_MATRIX_LED_COUNT - RGBLED_NUM;i++){ + rgb_matrix_set_color(i,0,0,0); + } + start_hsv.v = 0; + } + else{ + start_hsv.v = rgb_matrix_get_val() - RGB_MATRIX_VAL_STEP; } } - return true; } break; - case TO(_BL): { if (record->event.pressed) { + rgb_matrix_hs_set_remain_time(HS_RGB_BLINK_INDEX_MAC, 0); rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_WIN, (RGB){RGB_WHITE}, 250, 3); if (keymap_is_mac_system()) { - set_single_persistent_default_layer(_BL); - layer_move(0); + set_single_persistent_default_layer(_BL); + layer_move(0); } } + return false; } break; - case TO(_MBL): { if (record->event.pressed) { + rgb_matrix_hs_set_remain_time(HS_RGB_BLINK_INDEX_WIN, 0); rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_MAC, (RGB){RGB_WHITE}, 250, 3); if (!keymap_is_mac_system()) { - set_single_persistent_default_layer(_MBL); - layer_move(0); + set_single_persistent_default_layer(_MBL); + layer_move(0); } } + return false; } break; - case TO(_FBL): { if (record->event.pressed) { rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_WIN, (RGB){RGB_WHITE}, 250, 3); @@ -400,7 +624,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { } return false; } break; - case TO(_FMBL): { if (record->event.pressed) { rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_MAC, (RGB){RGB_WHITE}, 250, 3); @@ -411,12 +634,175 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) { } return false; } break; + case RP_P0: { + if (record->event.pressed) { + confinfo.record_channel = 0; + rgbrec_read_current_channel(confinfo.record_channel); + rgbrec_end(confinfo.record_channel); + eeconfig_confinfo_update(confinfo.raw); + rgbrec_show(confinfo.record_channel); + dprintf("confinfo.record_last_mode = %d\r\n", confinfo.record_last_mode); + } + + return false; + } break; + case RP_P1: { + if (record->event.pressed) { + confinfo.record_channel = 1; + rgbrec_read_current_channel(confinfo.record_channel); + rgbrec_end(confinfo.record_channel); + eeconfig_confinfo_update(confinfo.raw); + rgbrec_show(confinfo.record_channel); + } + + return false; + } break; + case RP_P2: { + if (record->event.pressed) { + confinfo.record_channel = 2; + rgbrec_read_current_channel(confinfo.record_channel); + rgbrec_end(confinfo.record_channel); + eeconfig_confinfo_update(confinfo.raw); + rgbrec_show(confinfo.record_channel); + } + + return false; + } break; + case RP_END: { + if (record->event.pressed) { + if (rgb_matrix_get_mode() != RGB_MATRIX_CUSTOM_RGBR_PLAY) { + + return false; + } + if (!rgbrec_is_started()) { + rgbrec_start(confinfo.record_channel); + no_record_fg = false; + rec_time = timer_read32(); + rgbrec_set_close_all(HSV_BLACK); + } else { + rec_time = 0; + rgbrec_end(confinfo.record_channel); + } + dprintf("confinfo.record_last_mode = %d\r\n", confinfo.record_last_mode); + } + + return false; + } break; + case RGB_MOD: { + if (record->event.pressed) { + if (rgb_matrix_get_mode() == RGB_MATRIX_CUSTOM_RGBR_PLAY) { + if (rgbrec_is_started()) { + rgbrec_read_current_channel(confinfo.record_channel); + rgbrec_end(confinfo.record_channel); + no_record_fg = false; + } + if (confinfo.record_last_mode != 0xFF) + rgb_matrix_mode(confinfo.record_last_mode); + else + rgb_matrix_mode(RGB_MATRIX_DEFAULT_MODE); + eeconfig_confinfo_update(confinfo.raw); + dprintf("confinfo.record_last_mode = %d\r\n", confinfo.record_last_mode); + start_hsv = rgb_matrix_get_hsv(); + return false; + } + record_rgbmatrix_increase(&(confinfo.record_last_mode)); + eeconfig_confinfo_update(confinfo.raw); + start_hsv = rgb_matrix_get_hsv(); + } + + return false; + } break; + case RGB_HUI: { + if (record->event.pressed) { + record_color_hsv(true); + start_hsv = rgb_matrix_get_hsv(); + } + + return false; + } break; + case KC_LCMD: { + if (keymap_is_mac_system()) { + if (keymap_config.no_gui && !rgbrec_is_started()) { + if (record->event.pressed) { + register_code16(KC_LCMD); + } else { + unregister_code16(KC_LCMD); + } + } + } - default: return true; + } break; + case KC_RCMD: { + if (keymap_is_mac_system()) { + if (keymap_config.no_gui && !rgbrec_is_started()) { + if (record->event.pressed) { + register_code16(KC_RCMD); + } else { + unregister_code16(KC_RCMD); + } + } + } + + return true; + } break; + case HS_BATQ: { + extern bool rk_bat_req_flag; + rk_bat_req_flag = (confinfo.devs != DEVS_USB) && record->event.pressed; + return false; + } break; + default: + break; + } + + return true; +} + +void housekeeping_task_user(void) { + uint8_t hs_now_mode; + static uint32_t hs_current_time; + static bool val_value = false; + + charging_state = readPin(HS_BAT_CABLE_PIN); + + bat_full_flag = readPin(BAT_FULL_PIN); + + + if (charging_state && (bat_full_flag)) { + hs_now_mode = MD_SND_CMD_DEVCTRL_CHARGING_DONE; + } else if (charging_state) { + hs_now_mode = MD_SND_CMD_DEVCTRL_CHARGING; + } else { + hs_now_mode = MD_SND_CMD_DEVCTRL_CHARGING_STOP; + } + + if (!hs_current_time || timer_elapsed32(hs_current_time) > 1000) { + + hs_current_time = timer_read32(); + md_send_devctrl(hs_now_mode); + md_send_devctrl(MD_SND_CMD_DEVCTRL_INQVOL); + } + + if (charging_state){ +#ifdef HS_LED_BOOSTING_PIN + writePin(HS_LED_BOOSTING_PIN,0); +#endif + if(!val_value){ + rgb_matrix_sethsv_noeeprom(start_hsv.h,start_hsv.s,150); + } + val_value = true; + + } + else{ +#ifdef HS_LED_BOOSTING_PIN + writePin(HS_LED_BOOSTING_PIN,1); +#endif + if(val_value){ + rgb_matrix_sethsv(start_hsv.h,start_hsv.s,start_hsv.v); + } + val_value = false; } - return false; } #ifdef RGB_MATRIX_ENABLE @@ -445,6 +831,7 @@ void wireless_devs_change_kb(uint8_t old_devs, uint8_t new_devs, bool reset) { if (confinfo.devs != wireless_get_current_devs()) { confinfo.devs = wireless_get_current_devs(); + if (confinfo.devs > 0 && confinfo.devs < 4) confinfo.last_btdevs = confinfo.devs; eeconfig_confinfo_update(confinfo.raw); } @@ -470,20 +857,6 @@ void wireless_devs_change_kb(uint8_t old_devs, uint8_t new_devs, bool reset) { rgb_matrix_wls_indicator_set(HS_RGB_BLINK_INDEX_BT3, (RGB){HS_PAIR_COLOR_BT3}, 500, 1); } } break; - case DEVS_BT4: { - if (reset) { - rgb_matrix_wls_indicator_set(41, (RGB){RGB_BLUE}, 200, 1); - } else { - rgb_matrix_wls_indicator_set(41, (RGB){RGB_BLUE}, 500, 1); - } - } break; - case DEVS_BT5: { - if (reset) { - rgb_matrix_wls_indicator_set(42, (RGB){RGB_BLUE}, 200, 1); - } else { - rgb_matrix_wls_indicator_set(42, (RGB){RGB_BLUE}, 500, 1); - } - } break; case DEVS_2G4: { if (reset) { rgb_matrix_wls_indicator_set(HS_RGB_BLINK_INDEX_2G4, (RGB){HS_LBACK_COLOR_2G4}, 200, 1); @@ -534,24 +907,6 @@ void rgb_matrix_wls_indicator(void) { rgb_matrix_set_color(wls_rgb_indicator_index, 0x00, 0x00, 0x00); } } - - if (inqbat_flag) { - rgb_matrix_set_color_all(0x00, 0x00, 0x00); - for (uint8_t i = 0; i < 10; i++) { - uint8_t mi_index[10] = RGB_MATRIX_BAT_INDEX_MAP; - if (i < (*md_getp_bat() / 10)) { - if (*md_getp_bat() >= 50) { - rgb_matrix_set_color(mi_index[i], RGB_GREEN); - } else if (*md_getp_bat() >= 30) { - rgb_matrix_set_color(mi_index[i], RGB_YELLOW); - } else { - rgb_matrix_set_color(mi_index[i], RGB_RED); - } - } else { - rgb_matrix_set_color(mi_index[i], 0x00, 0x00, 0x00); - } - } - } } void rgb_matrix_hs_bat_set(uint8_t index, RGB rgb, uint32_t interval, uint8_t times) { @@ -612,8 +967,9 @@ void bat_indicators(void) { battery_process_time = timer_read32(); } - if (battery_process_time && timer_elapsed32(battery_process_time) > 30000) { + if (battery_process_time && timer_elapsed32(battery_process_time) > 20000) { battery_process_time = 0; + lower_sleep = true; lpwr_set_timeout_manual(false); } } @@ -624,21 +980,68 @@ void bat_indicators(void) { # endif +#endif + +void rgb_blink_dir(void) { + + rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_VAI, (RGB){0x20, 0x20, 0x20}, 250, 3); + rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_VAD, (RGB){0x20, 0x20, 0x20}, 250, 3); + rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_SPI, (RGB){0x20, 0x20, 0x20}, 250, 3); + rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_SPD, (RGB){0x20, 0x20, 0x20}, 250, 3); +} + +bool hs_reset_settings_user(void) { + + rgb_matrix_hs_indicator_set(0xFF, (RGB){WIITE_B,WIITE_B,WIITE_B}, 250, 3); + + return true; +} + +void nkr_indicators_hook(uint8_t index) { + + if ((hs_rgb_indicators[index].rgb.r == WIITE_B) && (hs_rgb_indicators[index].rgb.g == 0x00) && (hs_rgb_indicators[index].rgb.b == 0x00)) { + + rgb_matrix_hs_indicator_set(0xFF, (RGB){WIITE_B, 0x00, 0x00}, 250, 1); + + } else if ((hs_rgb_indicators[index].rgb.r == 0x00) && (hs_rgb_indicators[index].rgb.g == 0x6E) && (hs_rgb_indicators[index].rgb.b == 0x00)) { + + rgb_matrix_hs_indicator_set(0xFF, (RGB){0x00, 0x00, WIITE_B}, 250, 1); + } +} + void rgb_matrix_hs_indicator_set(uint8_t index, RGB rgb, uint32_t interval, uint8_t times) { + for (int i = 0; i < HS_RGB_INDICATOR_COUNT; i++) { if (!hs_rgb_indicators[i].active) { - hs_rgb_indicators[i].active = true; - hs_rgb_indicators[i].timer = timer_read32(); + hs_rgb_indicators[i].active = true; + hs_rgb_indicators[i].timer = timer_read32(); hs_rgb_indicators[i].interval = interval; - hs_rgb_indicators[i].times = times * 2; - hs_rgb_indicators[i].index = index; - hs_rgb_indicators[i].rgb = rgb; + hs_rgb_indicators[i].times = times * 2; + hs_rgb_indicators[i].index = index; + hs_rgb_indicators[i].rgb = rgb; + if (index != 0xFF) + hs_rgb_indicators[i].blink_cb = NULL; + else { + hs_rgb_indicators[i].blink_cb = nkr_indicators_hook; + } + break; + } + } +} + +void rgb_matrix_hs_set_remain_time(uint8_t index, uint8_t remain_time) { + + for (int i = 0; i < HS_RGB_INDICATOR_COUNT; i++) { + if (hs_rgb_indicators[i].index == index) { + hs_rgb_indicators[i].times = 0; + hs_rgb_indicators[i].active = false; break; } } } void rgb_matrix_hs_indicator(void) { + for (int i = 0; i < HS_RGB_INDICATOR_COUNT; i++) { if (hs_rgb_indicators[i].active) { if (timer_elapsed32(hs_rgb_indicators[i].timer) >= hs_rgb_indicators[i].interval) { @@ -650,30 +1053,53 @@ void rgb_matrix_hs_indicator(void) { if (hs_rgb_indicators[i].times <= 0) { hs_rgb_indicators[i].active = false; - hs_rgb_indicators[i].timer = 0x00; + hs_rgb_indicators[i].timer = 0x00; + if (hs_rgb_indicators[i].blink_cb != NULL) + hs_rgb_indicators[i].blink_cb(i); + continue; } } - if (hs_rgb_indicators[i].times % 2) { - rgb_matrix_set_color(hs_rgb_indicators[i].index, hs_rgb_indicators[i].rgb.r, hs_rgb_indicators[i].rgb.g, hs_rgb_indicators[i].rgb.b); + if (!(hs_rgb_indicators[i].times % 2)) { + if (hs_rgb_indicators[i].index == 0xFF) { + rgb_matrix_set_color_all(hs_rgb_indicators[i].rgb.r, hs_rgb_indicators[i].rgb.g, hs_rgb_indicators[i].rgb.b); + } else { + rgb_matrix_set_color(hs_rgb_indicators[i].index, hs_rgb_indicators[i].rgb.r, hs_rgb_indicators[i].rgb.g, hs_rgb_indicators[i].rgb.b); + } } else { - rgb_matrix_set_color(hs_rgb_indicators[i].index, 0x00, 0x00, 0x00); + if (hs_rgb_indicators[i].index == 0xFF) { + rgb_matrix_set_color_all(0x00, 0x00, 0x00); + } else { + rgb_matrix_set_color(hs_rgb_indicators[i].index, 0x00, 0x00, 0x00); + } } } } } +void rgb_matrix_start_rec(void) { + + if (rgbrec_is_started()) { + if (!rec_time || timer_elapsed32(rec_time) > 250) { + rec_time = timer_read32(); + rec_filp = !rec_filp; + } + if (rec_filp) { + rgb_matrix_set_color(0, 0x20, 0x20, 0x20); + rgb_matrix_set_color(1, 0x20, 0x20, 0x20); + rgb_matrix_set_color(2, 0x20, 0x20, 0x20); + } else { + rgb_matrix_set_color(0, 0x00, 0x00, 0x00); + rgb_matrix_set_color(1, 0x00, 0x00, 0x00); + rgb_matrix_set_color(2, 0x00, 0x00, 0x00); + } + } else { + rec_time = 0; + rec_filp = false; + } +} + bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { - - if (rgb_matrix_indicators_advanced_user(led_min, led_max) != true) { - return false; - } - - if (ee_clr_timer && timer_elapsed32(ee_clr_timer) > 3000) { - hs_reset_settings(); - ee_clr_timer = 0; - } - extern RGB rgb_matrix_ws2812_array[HS_RGB_INDICATOR_COUNT]; uint8_t r,g,b; @@ -682,6 +1108,23 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { b = rgb_matrix_ws2812_array[1].b; rgb_matrix_set_color(2,r,g,b); + if (test_white_light_flag) { + RGB rgb_test_open = hsv_to_rgb((HSV){.h = 0, .s = 0, .v = RGB_MATRIX_VAL_STEP * 5}); + rgb_matrix_set_color_all(rgb_test_open.r, rgb_test_open.g, rgb_test_open.b); + + return false; + } + + if (rgb_matrix_indicators_advanced_user(led_min, led_max) != true) { + + return false; + } + + if (ee_clr_timer && timer_elapsed32(ee_clr_timer) > 3000) { + hs_reset_settings(); + ee_clr_timer = 0; + } + if ((*md_getp_state() == MD_STATE_CONNECTED) || USB_DRIVER.state == USB_ACTIVE) { if (host_keyboard_led_state().caps_lock) @@ -690,11 +1133,18 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { if (!keymap_is_mac_system() && keymap_config.no_gui) rgb_matrix_set_color(HS_RGB_INDEX_WIN_LOCK, RGB_WHITE); } - -# ifdef WIRELESS_ENABLE + +#ifdef RGBLIGHT_ENABLE + if (rgb_matrix_indicators_advanced_rgblight(led_min, led_max) != true) { + + return false; + } +#endif + + # ifdef WIRELESS_ENABLE rgb_matrix_wls_indicator(); - if (enable_bat_indicators && !inqbat_flag) { + if (enable_bat_indicators && !inqbat_flag && !rgbrec_is_started()) { rgb_matrix_hs_bat(); bat_indicators(); bat_indicator_cnt = timer_read32(); @@ -710,55 +1160,36 @@ bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max) { if (confinfo.devs == DEVS_USB){ if (USB_DRIVER.state != USB_ACTIVE) { if(enable_bat_indicators){ - rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_USB, (RGB){HS_LBACK_COLOR_UBS}, 500, 1); + rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_USB, (RGB){HS_LBACK_COLOR_USB}, 500, 1); } - - } else { - lpwr_set_state(LPWR_WAKEUP); - } + } } # endif - - rgb_matrix_hs_indicator(); - -#ifdef HS_BAT_CABLE_PIN - charging_state = readPin(HS_BAT_CABLE_PIN); -#endif - -#ifdef BAT_FULL_PIN - bat_full_flag = readPin(BAT_FULL_PIN); -#endif - - return true; -} - -#endif - -void rgb_blink_dir(void){ - rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_VAI, (RGB){RGB_WHITE}, 250, 3); - rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_VAD, (RGB){RGB_WHITE}, 250, 3); - rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_SPI, (RGB){RGB_WHITE}, 250, 3); - rgb_matrix_hs_indicator_set(HS_RGB_BLINK_INDEX_SPD, (RGB){RGB_WHITE}, 250, 3); -} - -bool hs_reset_settings_user(void) { - for(uint8_t i = 0; i < HS_RGB_INDICATOR_COUNT; i ++){ - rgb_matrix_hs_indicator_set(i, (RGB){RGB_WHITE}, 250, 3); - } - + rgb_matrix_hs_indicator(); + + query(); return true; } void hs_reset_settings(void) { enable_bat_indicators = false; eeconfig_init(); - eeconfig_update_rgb_matrix_default(); + +#ifdef RGBLIGHT_ENABLE + extern void rgblight_init(void); + is_rgblight_initialized = false; + rgblight_init(); + eeconfig_update_rgblight_default(); + rgblight_enable(); +#endif + eeconfig_update_rgb_matrix_default(); keymap_config.raw = eeconfig_read_keymap(); + #if defined(NKRO_ENABLE) && defined(FORCE_NKRO) - keymap_config.nkro = 1; + keymap_config.nkro = 0; eeconfig_update_keymap(keymap_config.raw); #endif @@ -767,7 +1198,11 @@ void hs_reset_settings(void) { #endif if (hs_reset_settings_user() != true) { + return; } + hs_rgb_blink_set_timer(timer_read32()); keyboard_post_init_kb(); } + + diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c index b0f2dfdc1d8..5baebaba375 100644 --- a/quantum/rgblight/rgblight.c +++ b/quantum/rgblight/rgblight.c @@ -243,7 +243,7 @@ void rgblight_init(void) { rgblight_timer_init(); // setup the timer - rgblight_driver.init(); + // rgblight_driver.init(); if (rgblight_config.enable) { rgblight_mode_noeeprom(rgblight_config.mode); @@ -896,51 +896,55 @@ void rgblight_wakeup(void) { #endif +#ifndef RGBLIGHT_CUSTOM_DRIVER + void rgblight_set(void) { rgb_led_t *start_led; - uint8_t num_leds = rgblight_ranges.clipping_num_leds; + uint8_t num_leds = rgblight_ranges.clipping_num_leds; if (!rgblight_config.enable) { for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) { led[i].r = 0; led[i].g = 0; led[i].b = 0; -#ifdef WS2812_RGBW +# ifdef WS2812_RGBW led[i].w = 0; -#endif +# endif } } -#ifdef RGBLIGHT_LAYERS +# ifdef RGBLIGHT_LAYERS if (rgblight_layers != NULL -# if !defined(RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF) +# if !defined(RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF) && rgblight_config.enable -# elif defined(RGBLIGHT_SLEEP) +# elif defined(RGBLIGHT_SLEEP) && !is_suspended -# endif +# endif ) { rgblight_layers_write(); } -#endif +# endif -#ifdef RGBLIGHT_LED_MAP +# ifdef RGBLIGHT_LED_MAP rgb_led_t led0[RGBLIGHT_LED_COUNT]; for (uint8_t i = 0; i < RGBLIGHT_LED_COUNT; i++) { led0[i] = led[pgm_read_byte(&led_map[i])]; } start_led = led0 + rgblight_ranges.clipping_start_pos; -#else +# else start_led = led + rgblight_ranges.clipping_start_pos; -#endif +# endif -#ifdef WS2812_RGBW +# ifdef WS2812_RGBW for (uint8_t i = 0; i < num_leds; i++) { convert_rgb_to_rgbw(&start_led[i]); } -#endif +# endif rgblight_driver.setleds(start_led, num_leds); } +#endif + #ifdef RGBLIGHT_SPLIT /* for split keyboard master side */ uint8_t rgblight_get_change_flags(void) { @@ -1193,7 +1197,7 @@ static uint8_t breathe_calc(uint8_t pos) { __attribute__((weak)) const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; -void rgblight_effect_breathing(animation_status_t *anim) { +__attribute__((weak)) void rgblight_effect_breathing(animation_status_t *anim) { uint8_t val = breathe_calc(anim->pos); rgblight_sethsv_noeeprom_old(rgblight_config.hue, rgblight_config.sat, val); anim->pos = (anim->pos + 1); @@ -1203,7 +1207,7 @@ void rgblight_effect_breathing(animation_status_t *anim) { #ifdef RGBLIGHT_EFFECT_RAINBOW_MOOD __attribute__((weak)) const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30}; -void rgblight_effect_rainbow_mood(animation_status_t *anim) { +__attribute__((weak)) void rgblight_effect_rainbow_mood(animation_status_t *anim) { rgblight_sethsv_noeeprom_old(anim->current_hue, rgblight_config.sat, rgblight_config.val); anim->current_hue++; } @@ -1216,10 +1220,17 @@ void rgblight_effect_rainbow_mood(animation_status_t *anim) { __attribute__((weak)) const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; +__attribute__((weak)) bool rgblight_effect_custom_rainbow_swirl(animation_status_t *anim); + void rgblight_effect_rainbow_swirl(animation_status_t *anim) { uint8_t hue; uint8_t i; + if (rgblight_effect_custom_rainbow_swirl(anim) != true){ + + return; + } + for (i = 0; i < rgblight_ranges.effect_num_leds; i++) { hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue); sethsv(hue, rgblight_config.sat, rgblight_config.val, (rgb_led_t *)&led[i + rgblight_ranges.effect_start_pos]);