ںܶ˵ƻ̿ɲֻĵԷ㰴Ǹô϶ʵֱȼͺӵĹܡQMKעĹ, ǹ, ⣬ԶڲͬµΪ
ҳٶκQMK֪ʶĶQMKڸIJⷢʲô
ǰqmk֯һνṹ
_quantum
)
_kb
)_user
)ÿһڶϼһ_kb()
_user()
ڼ/ʹ_kb()
ڲֲʹ_user()
ڼ/㶨庯ʱ_kb()
ִκδǰȵ_user()
DZҪģȻֲ㺯ͲҪá
ĿǰΪֹǸмΪµļ롣ӴǶЩơ
һöٳȫҲǸֲΨһֵQMKûֱֵСṩһSAFE_RANGE
ꡣöʱSAFE_RANGE
֤ȡΨһļֵ
öӡӵkeymap.c
ĻڲFOO
BAR
ˡ
enum my_keycodes {
FOO = SAFE_RANGE,
BAR
};
㸲һѴڰΪʱΪ¼ʱҪprocess_record_kb()
process_record_user()
ڼʵ¼ǰQMKátrue
QMKķʽ롣ԺܷչĹܶ滻false
QMKȻͼ̧ǰ¼ˡ
ij»ͷʱᱻá
¡ԶһFOO
ļΪڰ»سʱ
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case FOO:
if (record->event.pressed) {
// ʱЩʲô
} else {
// ͷʱЩʲô
}
return false; // ˼нһ
case KC_ENTER:
// »سʱ
if (record->event.pressed) {
PLAY_NOTE_ARRAY(tone_qwerty);
}
return true; // QMKس/ͷ¼
default:
return true; //
}
}
process_record_*
ĵbool process_record_kb(uint16_t keycode, keyrecord_t *record)
bool process_record_user(uint16_t keycode, keyrecord_t *record)
keycode()
ڲ϶ģMO(1)
, KC_L
, ȵȡ Ҫ switch...case
Щ¼
record
ʵʰϢ
keyrecord_t record {
keyevent_t event {
keypos_t key {
uint8_t col
uint8_t row
}
bool pressed
uint16_t time
}
}
qmkṩ˶ȡHID淶5LEDķ:
USB_LED_NUM_LOCK
USB_LED_CAPS_LOCK
USB_LED_SCROLL_LOCK
USB_LED_COMPOSE
USB_LED_KANA
ӦLED״̬λλ ַԻLED״̬
led_set_user()
host_keyboard_leds()
led_set_user()
5LEDκһ״̬Ҫıʱ˺á˺ͨLED
ʹIS_LED_ON(usb_led, led_name)
IS_LED_OFF(usb_led, led_name)
LED״̬
!> host_keyboard_leds()
ܻled_set_user()
ǰֵ
led_set_user()
ʾʵvoid led_set_user(uint8_t usb_led) {
if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
writePinLow(B0);
} else {
writePinHigh(B0);
}
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
writePinLow(B1);
} else {
writePinHigh(B1);
}
if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
writePinLow(B2);
} else {
writePinHigh(B2);
}
if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
writePinLow(B3);
} else {
writePinHigh(B3);
}
if (IS_LED_ON(usb_led, USB_LED_KANA)) {
writePinLow(B4);
} else {
writePinHigh(B4);
}
}
led_set_*
ĵvoid led_set_kb(uint8_t usb_led)
void led_set_user(uint8_t usb_led)
host_keyboard_leds()
᷵յLED״̬led_set_*
֮ȡLED״̬ʱãmatrix_scan_user()
.
Ϊ˱ݣIS_HOST_LED_ON(led_name)
IS_HOST_LED_OFF(led_name)
ֱ꣬ӵúͼhost_keyboard_leds()
һЩʵΪLED״̬ṩ˷ķ
Ergodoxʵṩergodox_right_led_1
/2
/3_on
/off()
ÿLED, Ҳ ergodox_right_led_on
/off(uint8_t led)
رǡ
⣬ʹergodox_led_all_set(uint8_t n)
ָLEDȼÿLEDergodox_right_led_1
/2
/3_set(uint8_t n)
ʹĻergodox_right_led_set(uint8_t led, uint8_t n)
Ergodox boards ͬʱȼLED_BRIGHTNESS_LO
ȼLED_BRIGHTNESS_HI
(Ĭ).
̳ʼм衣ǸȡҪʲô
Ҫʼ˳г
keyboard_pre_init_*
- ڴǰСЩҪǰеӲʼmatrix_init_*
- ڹ̼м䱻áʱӲѳʼδʼkeyboard_post_init_*
- ڹ̼á£ġƻ붼Է!> ڴ˵keyboard_post_init_user
Ҫõĺ, ʱRGBƷ⡣
뼫УUSBʼǰС
֮þͱʼˡ
ڴû˵,òΪҪӲijʼ
ӲʼĻٺò(ʼLEDһ).
keyboard_pre_init_user()
ʾʵڼ̼趨 B0, B1, B2, B3, B4 LEDš
void keyboard_pre_init_user(void) {
// üԤʼ
// LEDΪģʽ
setPinOutput(B0);
setPinOutput(B1);
setPinOutput(B2);
setPinOutput(B3);
setPinOutput(B4);
}
keyboard_pre_init_*
ĵvoid keyboard_pre_init_kb(void)
void keyboard_pre_init_user(void)
⽫ھʼʱãijЩӲúúһЩܱʼǰ
طõĶʱãӲأҲλá
matrix_init_*
ĵvoid matrix_init_kb(void)
void matrix_init_user(void)
Ǽ̳ʼеһijЩԣãΪʱӦöǽгʼ
keyboard_post_init_user()
ʾʵʾгʼɺУRGBơ
void keyboard_post_init_user(void) {
// úʼ
rgblight_enable_noeeprom(); // ʹRgb
rgblight_sethsv_noeeprom(180, 255, 255); // ɫõɫ(ɫ)
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // ÿٺģʽ
}
keyboard_post_init_*
ĵvoid keyboard_post_init_kb(void)
void keyboard_post_init_user(void)
ܵĻҪprocess_record_*()
Զַ̣ʽӵ¼Уȷ벻Լ̲Ӱ졣Ȼڼ£бҪоɨ衣ЩҪرעܣΪÿٱ10Ρ
matrix_scan_*
ʾʵӱʡˡhookһܼе֮ǰӦ㹻˽qmkڲṹԱûʾ±дҪһissueDiscordǽ.
matrix_scan_*
ĵvoid matrix_scan_kb(void)
void matrix_scan_user(void)
úÿξɨʱãMCUͬдҪΪкܶΡ
ԶɨʱõҲԶ״̬(LEDƻĻ)ûҲ붨еĹܡ
֧־ͿֹͨͣһƱﵽ""RGBƺͱǺܺõӡԽԼܺģҲ̷ζѡ
: suspend_power_down_*
suspend_wakeup_init_*
, ֱϵͳкͻʱá
void suspend_power_down_user(void) {
rgb_matrix_set_suspend_state(true);
}
void suspend_wakeup_init_user(void) {
rgb_matrix_set_suspend_state(false);
}
void suspend_power_down_kb(void)
void suspend_wakeup_init_user(void)
void suspend_power_down_kb(void)
void suspend_wakeup_init_user(void)
ÿıд롣ڲָʾԶ㴦á
layer_state_set_*
ʾʵʹPlanckʾ RGBʹ֮Ӧ
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case _RAISE:
rgblight_setrgb (0x00, 0x00, 0xFF);
break;
case _LOWER:
rgblight_setrgb (0xFF, 0x00, 0x00);
break;
case _PLOVER:
rgblight_setrgb (0x00, 0xFF, 0x00);
break;
case _ADJUST:
rgblight_setrgb (0x7A, 0x00, 0xFF);
break;
default: // for any other layers, or the default layer
rgblight_setrgb (0x00, 0xFF, 0xFF);
break;
}
return state;
}
layer_state_set_*
ĵuint32_t layer_state_set_kb(uint32_t state)
uint32_t layer_state_set_user(uint32_t state)
״̬
ǻbitmask, ָ
óڵıڼСЩñصEEPROM粻ʧ ÿeeconfig_read_kb
eeconfig_read_user
ȡeeconfig_update_kb
eeconfig_update_user
д롣ϣܹлĹܺ(лRGBָʾ⣬eeconfig_init_kb
eeconfig_init_user
EEPROMĬֵ
ӵIJֿǣкܶͨEEPROM洢ͷݣҲûַǡȷġÿֻһ˫(ֽ)ռ䡣
סEEPROMдġдܸߣDzֻдEEPROMСдƵMCU̡
ãҶдʹû֡һӵĺкܶҪʵϣʹ˺ܶ
keymap.cļУ´:
typedef union {
uint32_t raw;
struct {
bool rgb_layer_change :1;
};
} user_config_t;
user_config_t user_config;
ϴ뽨һṹ壬ýṹԴ洢òдEEPROM㽫趨ΪڽṹȻ塣Ҫסbool
()ֵʹ1λ, uint8_t
ʹ8λ, uint16_t
ʹ16λԻϴʹã˳Ǵܻ鷳Ϊǻıддֵ
layer_state_set_*
ʹrgb_layer_change
ʹkeyboard_post_init_user
process_record_user
һС
Ҫʹkeyboard_post_init_userҪ
eeconfig_read_user()`ոմĽṹ塣ȻʹṹIJеĹܡ
void keyboard_post_init_user(void) {
// òּľʼ
// EEPROMû
user_config.raw = eeconfig_read_user();
// ʹܣĬϲ
if (user_config.rgb_layer_change) {
rgblight_enable_noeeprom();
rgblight_sethsv_noeeprom_cyan();
rgblight_mode_noeeprom(1);
}
}
ϺڶEEPROMúʹøĬϲRGBɫ"raw"ֵǴ"union"Ľṹתġ
uint32_t layer_state_set_user(uint32_t state) {
switch (biton32(state)) {
case _RAISE:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
break;
case _LOWER:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
break;
case _PLOVER:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
break;
case _ADJUST:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
break;
default: // Ĭϲ
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
break;
}
return state;
}
ֵʹʱıRGBơֵ, Ϊprocess_record_user
һ¼RGB_LYR
ҪȷʹRGB룬ʹʾرգ뽫Ϊ
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case FOO:
if (record->event.pressed) {
// ʱʲô
} else {
// ͷʱʲô
}
return false; // ˼Ľһ
case KC_ENTER:
// ڰ»سʱ
if (record->event.pressed) {
PLAY_NOTE_ARRAY(tone_qwerty);
}
return true; // QMKس/ͷ¼
case RGB_LYR: // underglowΪָʾʹá
if (record->event.pressed) {
user_config.rgb_layer_change ^= 1; // л״̬
eeconfig_update_user(user_config.raw); // EEPROMд״̬
if (user_config.rgb_layer_change) { // ״̬ʹ
layer_state_set(layer_state); // ô̸²ɫ
}
}
return false; break;
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // еRGB (see quantum_keycodes.h, L400 Բο)
if (record->event.pressed) { //ʧָܲʾıҪ
if (user_config.rgb_layer_change) { // ʹʱ
user_config.rgb_layer_change = false; // ʧܣȻ
eeconfig_update_user(user_config.raw); // EEPROMд
}
}
return true; break;
default:
return true; //
}
}
Ҫeeconfig_init_user
ԵEEPROMʱָĬֵ, ԶǿEEPROMEEP_RST
Bootmagic磬ҪĬRGBָʾĬֵ
void eeconfig_init_user(void) { // EEPROM
user_config.raw = 0;
user_config.rgb_layer_change = true; // ҪĬʹ
eeconfig_update_user(user_config.raw); // EEPROMдĬֵ
// use the non noeeprom versions, ҪEEPROMдЩֵ
rgblight_enable(); // ĬʹRGB
rgblight_sethsv_cyan(); // Ĭɫ
rgblight_mode(1); // Ĭó
}
ȻˡRGBָʾʱûһֱ棬¼̡ʹRGB룬ָʾʧܣˡ
void eeconfig_init_kb(void)
, uint32_t eeconfig_read_kb(void)
void eeconfig_update_kb(uint32_t val)
void eeconfig_init_user(void)
, uint32_t eeconfig_read_user(void)
void eeconfig_update_user(uint32_t val)
val
дEEPROMֵeeconfig_read_*
EEPROMһ32λ(˫)ֵ
Ĭ,-ٽֵȫͳһģҲͨáڴû˵ܺáЩ£LT
˵ʱ˫ܼΪЩļװסΪ˲ÿԶ룬ܿΪÿTAPPING_TERM
ʹܵĻ, Ҫconfig.h
#define TAPPING_TERM_PER_KEY
get_tapping_term
ʾʵҪĻڼTAPPING TERM
,Ҫkeymap.c
ļ´:
uint16_t get_tapping_term(uint16_t keycode) {
switch (keycode) {
case SFT_T(KC_SPC):
return TAPPING_TERM + 1250;
case LT(1, KC_GRV):
return 130;
default:
return TAPPING_TERM;
}
}
get_tapping_term
ĵƪ,Ҫquantum̼ĺֻҪûɡ