From 54406d45398be4471743bd66e8a7533541824cd1 Mon Sep 17 00:00:00 2001 From: yangdigi Date: Sat, 22 Jun 2024 14:21:58 +0800 Subject: [PATCH] yd67ble do6m --- keyboards/ydkb/debounce_pk.h | 25 +- keyboards/ydkb/yd67ble/config.h | 77 +----- keyboards/ydkb/yd67ble/keymaps/via/config.h | 20 -- keyboards/ydkb/yd67ble/keymaps/via/keymap.c | 32 --- keyboards/ydkb/yd67ble/keymaps/via/readme.md | 5 - keyboards/ydkb/yd67ble/keymaps/via/rules.mk | 1 - keyboards/ydkb/yd67ble/keymaps/vial/readme.md | 5 - keyboards/ydkb/yd67ble/keymaps/vial/rules.mk | 4 +- keyboards/ydkb/yd67ble/matrix.c | 226 +++++++++++------- .../pre_compile_via/ydkb_yd67ble_via.zip | Bin 18665 -> 0 bytes keyboards/ydkb/yd67ble/rules.mk | 2 +- 11 files changed, 172 insertions(+), 225 deletions(-) delete mode 100644 keyboards/ydkb/yd67ble/keymaps/via/config.h delete mode 100644 keyboards/ydkb/yd67ble/keymaps/via/keymap.c delete mode 100644 keyboards/ydkb/yd67ble/keymaps/via/readme.md delete mode 100644 keyboards/ydkb/yd67ble/keymaps/via/rules.mk delete mode 100644 keyboards/ydkb/yd67ble/keymaps/vial/readme.md delete mode 100644 keyboards/ydkb/yd67ble/pre_compile_via/ydkb_yd67ble_via.zip diff --git a/keyboards/ydkb/debounce_pk.h b/keyboards/ydkb/debounce_pk.h index b94f5f753d7..be1a00fad25 100644 --- a/keyboards/ydkb/debounce_pk.h +++ b/keyboards/ydkb/debounce_pk.h @@ -10,22 +10,17 @@ #ifndef DEBOUNCE_DN #define DEBOUNCE_DN 5 #endif -#ifndef DEBOUNCE16_DN -#define DEBOUNCE16_DN DEBOUNCE_DN -#endif #ifndef DEBOUNCE_NK #define DEBOUNCE_NK 1 #endif -#ifndef DEBOUNCE16_NK -#define DEBOUNCE16_NK DEBOUNCE_NK -#endif #ifndef DEBOUNCE_UP #define DEBOUNCE_UP 5 #endif -#ifndef DEBOUNCE16_UP -#define DEBOUNCE16_UP DEBOUNCE_UP + +#ifndef DOUBLE_CLICK_FIX_DELAY //default 10 +#define DOUBLE_CLICK_FIX_DELAY 10 #endif #if (DEBOUNCE_DN < 8) && (DEBOUNCE_NK < 8) && (DEBOUNCE_UP < 8) @@ -35,6 +30,18 @@ #else #error "DEBOUNCE VALUE must not exceed 7" #endif +/* +#ifndef DEBOUNCE16_DN +#define DEBOUNCE16_DN DEBOUNCE_DN +#endif + +#ifndef DEBOUNCE16_NK +#define DEBOUNCE16_NK DEBOUNCE_NK +#endif + +#ifndef DEBOUNCE16_UP +#define DEBOUNCE16_UP DEBOUNCE_UP +#endif #if (DEBOUNCE16_DN < 16) && (DEBOUNCE16_NK < 16) && (DEBOUNCE16_UP < 16) #define DEBOUNCE16_DN_MASK (uint16_t)(~(0x8000 >> DEBOUNCE16_DN)) @@ -43,6 +50,6 @@ #else #error "DEBOUNCE16 VALUE must not exceed 15" #endif - +*/ #endif diff --git a/keyboards/ydkb/yd67ble/config.h b/keyboards/ydkb/yd67ble/config.h index 5e7d705e82e..cf55c668c48 100644 --- a/keyboards/ydkb/yd67ble/config.h +++ b/keyboards/ydkb/yd67ble/config.h @@ -1,90 +1,35 @@ #pragma once #include "config_common.h" +#include "config_ble51.h" /* USB Device descriptor parameter */ -#define FW_VER QMK_DN17 -#define FW_VER_VIA VIA_DN17 -#define FW_VER_VIAL VIAL_DN17 -#define VENDOR_ID 0x9D5B -#define PRODUCT_ID 0x2167 +#define FW_VER_DATE DO6M +#define VENDOR_ID 0x9D5B +#define PRODUCT_ID 0x2167 #define DEVICE_VER 0x0011 #define MANUFACTURER YDKB_KBDFans #define PRODUCT YD67BLE (FW_VER) +/* key matrix size */ #define MATRIX_ROWS 5 #define MATRIX_COLS 16 +#define DEFAULT_6KRO // macOS's Capslock switching between Chinese and English has compatibility issues with NKRO - -#define TAPPING_TOGGLE 2 - -#define IGNORE_MOD_TAP_INTERRUPT // this makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when you hold it, and when this option isn't enabled, z rapidly followed by x actually sends Ctrl-x. That's bad.) - - -/* key combination for command */ -#define IS_COMMAND() ( \ - (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) || \ - (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT))) \ -) -/* disable command for default layer */ -#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS 0 -#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS 0 - -/* fix space cadet rollover issue */ -#define DISABLE_SPACE_CADET_ROLLOVER - -#if defined(__AVR_ATmega32U4__) || defined(__AVR_AT90USB1286__) - #define UCSR1D _SFR_MEM8(0xCB) - #define RTSEN 0 - #define CTSEN 1 - - #define SERIAL_UART_BAUD 76800 - #define SERIAL_UART_DATA UDR1 - #define SERIAL_UART_UBRR ((F_CPU/(8.0*SERIAL_UART_BAUD)-1+0.5)) - #define SERIAL_UART_RXD_VECT USART1_RX_vect - #define SERIAL_UART_TXD_READY (UCSR1A&(1<>8); \ - UCSR1B |= (1<. - */ - //Keymap specific config.h -#pragma once -#undef PRODUCT -#define PRODUCT YD67BLE (FW_VER_VIA) -#define DYNAMIC_KEYMAP_LAYER_COUNT 4 \ No newline at end of file diff --git a/keyboards/ydkb/yd67ble/keymaps/via/keymap.c b/keyboards/ydkb/yd67ble/keymaps/via/keymap.c deleted file mode 100644 index 49863f0c68c..00000000000 --- a/keyboards/ydkb/yd67ble/keymaps/via/keymap.c +++ /dev/null @@ -1,32 +0,0 @@ -#include QMK_KEYBOARD_H - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { - { KC_GESC,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_HOME,KC_NO, }, - { 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_NO, }, - { 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_NO, KC_ENT, KC_PGDN,KC_NO, }, - { KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_NO, KC_RSFT,KC_UP, KC_END, KC_NO, }, - { KC_LCTL,KC_LGUI,KC_LALT,KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_RALT,MO(1), KC_NO, KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, } - }, - [1] = { - { 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, KC_TRNS,KC_TRNS,}, - { USER00, KC_MS_BTN1,KC_MS_UP,KC_MS_BTN2,KC_MS_BTN3,KC_TRNS,KC_TRNS,KC_TRNS,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,}, - { KC_TRNS,KC_MS_LEFT,KC_MS_DOWN,KC_MS_RIGHT,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_PGUP,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,}, - { KC_TRNS,USER03, KC_TRNS,KC_CALC,KC_TRNS,USER01, KC_TRNS,KC_TRNS,KC_END, KC_PGDN,KC_TRNS,KC_TRNS,KC_TRNS,KC_VOLU,KC_MUTE,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_MPRV,KC_VOLD,KC_MNXT,KC_TRNS,} - }, - [2] = { - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, } - }, - [3] = { - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, }, - {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, } - }, -}; diff --git a/keyboards/ydkb/yd67ble/keymaps/via/readme.md b/keyboards/ydkb/yd67ble/keymaps/via/readme.md deleted file mode 100644 index 83eb1776cf9..00000000000 --- a/keyboards/ydkb/yd67ble/keymaps/via/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -## Changelog - -### 2022-04-16 DM4G - -- Add default keymap diff --git a/keyboards/ydkb/yd67ble/keymaps/via/rules.mk b/keyboards/ydkb/yd67ble/keymaps/via/rules.mk deleted file mode 100644 index 1e5b99807cb..00000000000 --- a/keyboards/ydkb/yd67ble/keymaps/via/rules.mk +++ /dev/null @@ -1 +0,0 @@ -VIA_ENABLE = yes diff --git a/keyboards/ydkb/yd67ble/keymaps/vial/readme.md b/keyboards/ydkb/yd67ble/keymaps/vial/readme.md deleted file mode 100644 index 83eb1776cf9..00000000000 --- a/keyboards/ydkb/yd67ble/keymaps/vial/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -## Changelog - -### 2022-04-16 DM4G - -- Add default keymap diff --git a/keyboards/ydkb/yd67ble/keymaps/vial/rules.mk b/keyboards/ydkb/yd67ble/keymaps/vial/rules.mk index f1f782f1566..d655260103e 100644 --- a/keyboards/ydkb/yd67ble/keymaps/vial/rules.mk +++ b/keyboards/ydkb/yd67ble/keymaps/vial/rules.mk @@ -2,4 +2,6 @@ VIA_ENABLE = yes VIAL_ENABLE = yes VIAL_INSECURE = yes QMK_SETTINGS = no -TAP_DANCE_ENABLE = no \ No newline at end of file +TAP_DANCE_ENABLE = yes +COMBO_ENABLE = yes +KEY_OVERRIDE_ENABLE = no diff --git a/keyboards/ydkb/yd67ble/matrix.c b/keyboards/ydkb/yd67ble/matrix.c index 1f1f0fad585..013b605dfac 100644 --- a/keyboards/ydkb/yd67ble/matrix.c +++ b/keyboards/ydkb/yd67ble/matrix.c @@ -1,3 +1,23 @@ +/* +Copyright 2023 YANG + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +/* + * scan matrix + */ #include #include #include @@ -13,15 +33,13 @@ #include "keyboard.h" #include "timer.h" #include "matrix.h" +#include "debounce_pk.h" #include "suspend.h" #include "lufa.h" #include "ble51.h" #include "ble51_task.h" #include "switch_board.h" -#define DEBOUNCE_DN_MASK (uint8_t)(~(0x80 >> 5)) -#define DEBOUNCE_UP_MASK (uint8_t)(0x80 >> 5) - bool is_ver595 = 1; /* matrix state(1:on, 0:off) */ @@ -29,16 +47,22 @@ static matrix_row_t matrix[MATRIX_ROWS] = {0}; static matrix_row_t matrix_v595[MATRIX_ROWS] = {0}; static matrix_row_t matrix_v11[MATRIX_ROWS] = {0}; - static uint16_t matrix_scan_timestamp = 0; static uint8_t matrix_debouncing[MATRIX_ROWS][MATRIX_COLS] = {0}; static uint8_t matrix_debouncing_v11[MATRIX_ROWS][MATRIX_COLS] = {0}; +static uint8_t matrix_double_click_fix[MATRIX_ROWS][MATRIX_COLS] = {0}; +static uint8_t matrix_double_click_fix_v11[MATRIX_ROWS][MATRIX_COLS] = {0}; +#ifdef DEFAULT_6KRO +static uint8_t now_debounce_dn_mask = DEBOUNCE_DN_MASK; +#else +static uint8_t now_debounce_dn_mask = DEBOUNCE_NK_MASK; +#endif static void matrix_scan_ver595(void); static void matrix_scan_ver11(void); +static uint8_t get_key(uint8_t col); static void init_cols(void); static void select_row(uint8_t row); -static uint8_t get_key(uint8_t col); static void unselect_rows(void); static void select_all_rows(void); @@ -50,18 +74,6 @@ void matrix_scan_kb(void) { matrix_scan_user(); } -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void hook_early_init() { { @@ -122,16 +134,21 @@ static void matrix_scan_ver595(void) { init_cols(); select_row(10); // 10 for 595 key0 uint8_t *debounce = &matrix_debouncing[0][0]; - for (uint8_t row=0; row= 8) select_row(11); *debounce = (*debounce >> 1) | key; - if (1) { - //if ((*debounce > 0) && (*debounce < 255) && (BLE51_PowerState < 4)) { + + + if (real_col >= 8) select_row(11); //11 for 595 next key + + //if ((*debounce > 0) && (*debounce < 0xff)) { + if (1) { //always update matrix[row], it costs only a little time. uint8_t row_trans = row; uint8_t col_trans = real_col; if (row >= 2) { @@ -142,44 +159,56 @@ static void matrix_scan_ver595(void) { matrix_row_t row_prev = matrix_v595[row_trans]; matrix_row_t *p_row = &matrix_v595[row_trans]; matrix_row_t col_mask = ((matrix_row_t)1 << col_trans); - if (*debounce >= DEBOUNCE_DN_MASK) { - *p_row |= col_mask; - } else if (*debounce <= DEBOUNCE_UP_MASK) { - *p_row &= ~col_mask; + if (*double_click_fix > 0 && (*p_row & col_mask) == 0) { + (*double_click_fix)--; + } else { + if (*debounce > now_debounce_dn_mask) { //debounce KEY DOWN + *p_row |= col_mask; + *double_click_fix = DOUBLE_CLICK_FIX_DELAY; + } else if (*debounce < DEBOUNCE_UP_MASK) { //debounce KEY UP + *p_row &= ~col_mask; + } } if (*p_row != row_prev) { matrix[row_trans] = matrix_v595[row_trans]; } } } + //if key pressed, update kb_idle_times if (matrix[row] > 0) { kb_idle_times = 0; } } - } static void matrix_scan_ver11(void) { // scan for ver11 is_ver595 = 0; init_cols(); - uint8_t *debounce_v11 = &matrix_debouncing_v11[0][0]; - for (uint8_t row=0; row> 1) | key; + *debounce = (*debounce >> 1) | key; + + //if ((*debounce_v11 > 0) && (*debounce_v11 < 0xff)) { if (1) { - //if ((*debounce_v11 > 0) && (*debounce_v11 < 0xff) && (BLE51_PowerState < 4)) { matrix_row_t row_prev = matrix_v11[row]; //save prev value of this row matrix_row_t *p_row = &matrix_v11[row]; matrix_row_t col_mask = ((matrix_row_t)1 << col); - if (*debounce_v11 >= DEBOUNCE_DN_MASK) { //debounce KEY DOWN - *p_row |= col_mask; - } else if (*debounce_v11 <= DEBOUNCE_UP_MASK) { //debounce KEY UP - *p_row &= ~col_mask; - } + if (*double_click_fix > 0 && (*p_row & col_mask) == 0) { + (*double_click_fix)--; + } else { + if (*debounce > now_debounce_dn_mask) { //debounce KEY DOWN + *p_row |= col_mask; + *double_click_fix = DOUBLE_CLICK_FIX_DELAY; + } else if (*debounce < DEBOUNCE_UP_MASK) { //debounce KEY UP + *p_row &= ~col_mask; + } + } if (*p_row != row_prev) { matrix[row] = matrix_v11[row]; } @@ -302,74 +331,88 @@ static void select_row(uint8_t row) bool suspend_wakeup_condition(void) { - if (BLE51_PowerState >= 10) { //lock mode - matrix_scan(); - // ver595: Key1_S24 F (debounce[2][8]), Key2_K20 J (debounce[2][1]) - uint8_t *debounce = &matrix_debouncing[0][0]; - uint8_t matrix_keys_down = 0; - for (uint8_t i=0; i< MATRIX_ROWS * MATRIX_COLS; i++, *debounce++) { - if (*debounce > 0) { - if (i == KP(2,1) || i == KP(2,8)) matrix_keys_down += 100; - else matrix_keys_down++; - } - } - - // ver11: K24 F, K27 J - uint8_t *debounce_v11 = &matrix_debouncing_v11[0][0]; - for (uint8_t i=0; i< MATRIX_ROWS * MATRIX_COLS; i++, *debounce_v11++) { - if (*debounce_v11 > 0) { - if (i == KP(2,4) || i == KP(2,7)) matrix_keys_down += 100; - else matrix_keys_down++; - } - } - - if (matrix_keys_down == 200) { - if (BLE51_PowerState != 10) command_extra(KC_W); - return true; - } - } else { - // ver595 - //check all keys - is_ver595 = 1; - init_cols(); - DS_PL_LO(); - for (uint8_t i = 0; i < MATRIX_ROWS * MATRIX_COLS; i++) { - CLOCK_PULSE(); - } - _delay_us(6); - if ( (PINF&0b100010) < 0b100010) { // - return true; - } + uint8_t verx_has_key_pressed = 0; - // ver11 + // ver595 check all keys + is_ver595 = 1; + init_cols(); + DS_PL_LO(); + for (uint8_t i = 0; i < 40; i++) { + CLOCK_PULSE(); + } + _delay_us(6); + if ( (PINF&0b100010) < 0b100010) { // + verx_has_key_pressed = 10; + } + + // ver 11 + if (verx_has_key_pressed == 0) { is_ver595 = 0; init_cols(); select_all_rows(); _delay_us(6); for (uint8_t i = 0; i < MATRIX_COLS; i++) { if (get_key(i)) { - return true; + verx_has_key_pressed = 11; + break; } } } - return false; + if (verx_has_key_pressed && BLE51_PowerState >= 10) { //lock mode + uint8_t matrix_keys_down = 0; + // ver595(1.0) lock mode + if (verx_has_key_pressed == 10) { + // ver595: Key1_S24 F (debounce[2][8]), Key2_K20 J (debounce[2][1]) + //memset(matrix_debouncing, 0, sizeof(matrix_debouncing)); + matrix_scan_ver595(); + uint8_t *debounce = &matrix_debouncing[0][0]; + for (uint8_t i=0; i< MATRIX_ROWS * MATRIX_COLS; i++, *debounce++) { + if (*debounce > 0) { + if (i == KP(2,1) || i == KP(2,8)) matrix_keys_down += 100; + else matrix_keys_down++; + } + } + } else { // verx_has_key_pressed == 11) + // ver11: K24 F, K27 J + //memset(matrix_debouncing_v11, 0, sizeof(matrix_debouncing_v11)); + matrix_scan_ver11(); + uint8_t *debounce_v11 = &matrix_debouncing_v11[0][0]; + for (uint8_t i=0; i< MATRIX_ROWS * MATRIX_COLS; i++, *debounce_v11++) { + if (*debounce_v11 > 0) { + if (i == KP(2,4) || i == KP(2,7)) matrix_keys_down += 100; + else matrix_keys_down++; + } + } + } + if (matrix_keys_down == 200) { + if (!ble51_boot_on) command_extra(KC_W); + return true; + } else if (!ble51_boot_on && matrix_keys_down) return true; + else return false; //has_key_pressed but not wake up in lock mode. + } + return verx_has_key_pressed; +} + +void hook_nkro_change(void) { + uint8_t kbd_nkro = (keyboard_protocol & (1<<4)); + if (!kbd_nkro) { // kbd_nkro before hook_nkro_change() + now_debounce_dn_mask = DEBOUNCE_NK_MASK; + } else { + now_debounce_dn_mask = DEBOUNCE_DN_MASK; + } + type_num(kbd_nkro?6:0); } +#ifdef SUSPEND_ACTION void suspend_power_down_action(void) { PORTC &= ~(1<<6); //caps led off - #if 0 - if (BLE51_PowerState >= 10) { - memset(matrix, 0, sizeof matrix); - memset(matrix_v11, 0, sizeof matrix_v11); - } - #endif } void suspend_wakeup_init_action(void) { - if (BLE51_PowerState >= 4) display_connection_status_check_times = 1; } +#endif void ble51_task_user(void) @@ -402,3 +445,16 @@ void ble51_task_user(void) } } } + +void bootmagic_lite(void) { + matrix_scan(); + wait_ms(10); + matrix_scan(); + + if (matrix_get_row(1) == (1<<3 | 1<<0)) { //tab and E + bootmagic_lite_reset_eeprom(); + // Jump to bootloader. + bootloader_jump(); + } +} + diff --git a/keyboards/ydkb/yd67ble/pre_compile_via/ydkb_yd67ble_via.zip b/keyboards/ydkb/yd67ble/pre_compile_via/ydkb_yd67ble_via.zip deleted file mode 100644 index 635c8395f0926388b58f022057aee140f6aad81d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18665 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 z