Examples should all use _user functions for consistency
[jackhill/qmk/firmware.git] / docs / custom_quantum_functions.md
CommitLineData
7b0356d1 1# How to Customize Your Keyboard's Behavior
4f48dd7c 2
bb53635f 3For a lot of people a custom keyboard is about more than sending button presses to your computer. You want to be able to do things that are more complex than simple button presses and macros. QMK has hooks that allow you to inject code, override functionality, and otherwise customize how your keyboard behaves in different situations.
409cb1af 4
7aaef162 5This page does not assume any special knowledge about QMK, but reading [Understanding QMK](understanding_qmk.md) will help you understand what is going on at a more fundamental level.
409cb1af 6
7## A Word on Core vs Keyboards vs Keymap
4f48dd7c 8
9We have structured QMK as a hierarchy:
10
2f942c98 11* Core (`_quantum`)
4f48dd7c 12 * Keyboard/Revision (`_kb`)
13 * Keymap (`_user`)
14
409cb1af 15Each of the functions described below can be defined with a `_kb()` suffix or a `_user()` suffix. We intend for you to use the `_kb()` suffix at the Keyboard/Revision level, while the `_user()` suffix should be used at the Keymap level.
4f48dd7c 16
1ca87968 17When defining functions at the Keyboard/Revision level it is important that your `_kb()` implementation call `_user()` before executing anything else- otherwise the keymap level function will never be called.
4f48dd7c 18
486abde0 19# Custom Keycodes
4f48dd7c 20
409cb1af 21By far the most common task is to change the behavior of an existing keycode or to create a new keycode. From a code standpoint the mechanism for each is very similar.
22
486abde0 23## Defining a New Keycode
4f48dd7c 24
409cb1af 25The first step to creating your own custom keycode(s) is to enumerate them. This means both naming them and assigning a unique number to that keycode. Rather than limit custom keycodes to a fixed range of numbers QMK provides the `SAFE_RANGE` macro. You can use `SAFE_RANGE` when enumerating your custom keycodes to guarantee that you get a unique number.
4f48dd7c 26
409cb1af 27
28Here is an example of enumerating 2 keycodes. After adding this block to your `keymap.c` you will be able to use `FOO` and `BAR` inside your keymap.
b65282f6 29
30```
409cb1af 31enum my_keycodes {
32 FOO = SAFE_RANGE,
33 BAR
34};
b65282f6 35```
36
7b0356d1 37## Programming the Behavior of Any Keycode
b65282f6 38
d8f0faab 39When you want to override the behavior of an existing key, or define the behavior for a new key, you should use the `process_record_kb()` and `process_record_user()` functions. These are called by QMK during key processing before the actual key event is handled. If these functions return `true` QMK will process the keycodes as usual. That can be handy for extending the functionality of a key rather than replacing it. If these functions return `false` QMK will skip the normal key handling, and it will be up to you to send any key up or down events that are required.
4f48dd7c 40
409cb1af 41These function are called every time a key is pressed or released.
4f48dd7c 42
7b0356d1 43### Example `process_record_user()` Implementation
4f48dd7c 44
409cb1af 45This example does two things. It defines the behavior for a custom keycode called `FOO`, and it supplements our Enter key by playing a tone whenever it is pressed.
4f48dd7c 46
409cb1af 47```
48bool process_record_user(uint16_t keycode, keyrecord_t *record) {
49 switch (keycode) {
50 case FOO:
51 if (record->event.pressed) {
52 // Do something when pressed
53 } else {
54 // Do something else when release
55 }
56 return false; // Skip all further processing of this key
57 case KC_ENTER:
58 // Play a tone when enter is pressed
59 if (record->event.pressed) {
d8e29b53 60 PLAY_NOTE_ARRAY(tone_qwerty);
409cb1af 61 }
62 return true; // Let QMK send the enter press/release events
eab41f7b 63 default:
64 return true; // Process all other keycodes normally
409cb1af 65 }
66}
67```
34836a16 68
7b0356d1 69### `process_record_*` Function Documentation
34836a16 70
bb53635f 71* Keyboard/Revision: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
409cb1af 72* Keymap: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
4f48dd7c 73
409cb1af 74The `keycode` argument is whatever is defined in your keymap, eg `MO(1)`, `KC_L`, etc. You should use a `switch...case` block to handle these events.
4f48dd7c 75
af37bb2f 76The `record` argument contains information about the actual press:
4f48dd7c 77
78```
79keyrecord_t record {
2f942c98
JH
80+-keyevent_t event {
81| +-keypos_t key {
82| | +-uint8_t col
83| | +-uint8_t row
84| | }
85| +-bool pressed
86| +-uint16_t time
87| }
4f48dd7c 88}
89```
90
ea8df568 91# LED Control
34836a16 92
4f48dd7c 93This allows you to control the 5 LED's defined as part of the USB Keyboard spec. It will be called when the state of one of those 5 LEDs changes.
94
95* `USB_LED_NUM_LOCK`
96* `USB_LED_CAPS_LOCK`
97* `USB_LED_SCROLL_LOCK`
98* `USB_LED_COMPOSE`
99* `USB_LED_KANA`
100
d27d8549 101### Example `led_set_user()` Implementation
4f48dd7c 102
103```
d27d8549 104void led_set_user(uint8_t usb_led) {
4f48dd7c 105 if (usb_led & (1<<USB_LED_NUM_LOCK)) {
106 PORTB |= (1<<0);
107 } else {
108 PORTB &= ~(1<<0);
109 }
110 if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
111 PORTB |= (1<<1);
112 } else {
113 PORTB &= ~(1<<1);
114 }
115 if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
116 PORTB |= (1<<2);
117 } else {
118 PORTB &= ~(1<<2);
119 }
120 if (usb_led & (1<<USB_LED_COMPOSE_LOCK)) {
121 PORTB |= (1<<3);
122 } else {
123 PORTB &= ~(1<<3);
124 }
125 if (usb_led & (1<<USB_LED_KANA_LOCK)) {
126 PORTB |= (1<<4);
127 } else {
128 PORTB &= ~(1<<4);
129 }
130}
2f942c98 131```
409cb1af 132
7b0356d1 133### `led_set_*` Function Documentation
409cb1af 134
bb53635f 135* Keyboard/Revision: `void led_set_kb(uint8_t usb_led)`
409cb1af 136* Keymap: `void led_set_user(uint8_t usb_led)`
137
ea8df568 138# Matrix Initialization Code
409cb1af 139
140Before a keyboard can be used the hardware must be initialized. QMK handles initialization of the keyboard matrix itself, but if you have other hardware like LED's or i&#xb2;c controllers you will need to set up that hardware before it can be used.
141
7b0356d1 142### Example `matrix_init_kb()` Implementation
409cb1af 143
144This example, at the keyboard level, sets up B1, B2, and B3 as LED pins.
145
146```
d27d8549 147void matrix_init_user(void) {
409cb1af 148 // Call the keymap level matrix init.
409cb1af 149
150 // Set our LED pins as output
151 DDRB |= (1<<1);
152 DDRB |= (1<<2);
153 DDRB |= (1<<3);
154}
155```
156
7b0356d1 157### `matrix_init_*` Function Documentation
409cb1af 158
bb53635f 159* Keyboard/Revision: `void matrix_init_kb(void)`
409cb1af 160* Keymap: `void matrix_init_user(void)`
161
ea8df568 162# Matrix Scanning Code
409cb1af 163
164Whenever possible you should customize your keyboard by using `process_record_*()` and hooking into events that way, to ensure that your code does not have a negative performance impact on your keyboard. However, in rare cases it is necessary to hook into the matrix scanning. Be extremely careful with the performance of code in these functions, as it will be called at least 10 times per second.
165
7b0356d1 166### Example `matrix_scan_*` Implementation
409cb1af 167
168This example has been deliberately omitted. You should understand enough about QMK internals to write this without an example before hooking into such a performance sensitive area. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on gitter](https://gitter.im/qmk/qmk_firmware).
169
7b0356d1 170### `matrix_scan_*` Function Documentation
409cb1af 171
172* Keyboard/Revision: `void matrix_scan_kb(void)`
173* Keymap: `void matrix_scan_user(void)`
174
175This function gets called at every matrix scan, which is basically as often as the MCU can handle. Be careful what you put here, as it will get run a lot.
176
177You should use this function if you need custom matrix scanning code. It can also be used for custom status output (such as LED's or a display) or other functionality that you want to trigger regularly even when the user isn't typing.
d27d8549
L
178
179