format code according to conventions [skip ci]
[jackhill/qmk/firmware.git] / quantum / via.h
1 /* Copyright 2019 Jason Williams (Wilba)
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17 #pragma once
18
19 #include <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
20
21 // Keyboard level code can change where VIA stores the magic.
22 // The magic is the build date YYMMDD encoded as BCD in 3 bytes,
23 // thus installing firmware built on a different date to the one
24 // already installed can be detected and the EEPROM data is reset.
25 // The only reason this is important is in case EEPROM usage changes
26 // and the EEPROM was not explicitly reset by bootmagic lite.
27 #ifndef VIA_EEPROM_MAGIC_ADDR
28 # define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
29 #endif
30
31 #define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3)
32
33 // Changing the layout options size after release will invalidate EEPROM,
34 // but this is something that should be set correctly on initial implementation.
35 // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
36 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
37 # define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
38 #endif
39
40 // The end of the EEPROM memory used by VIA
41 // By default, dynamic keymaps will start at this if there is no
42 // custom config
43 #define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
44
45 #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
46 # define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
47 #endif
48
49 // This is changed only when the command IDs change,
50 // so VIA Configurator can detect compatible firmware.
51 #define VIA_PROTOCOL_VERSION 0x0009
52
53 enum via_command_id {
54 id_get_protocol_version = 0x01, // always 0x01
55 id_get_keyboard_value = 0x02,
56 id_set_keyboard_value = 0x03,
57 id_dynamic_keymap_get_keycode = 0x04,
58 id_dynamic_keymap_set_keycode = 0x05,
59 id_dynamic_keymap_reset = 0x06,
60 id_lighting_set_value = 0x07,
61 id_lighting_get_value = 0x08,
62 id_lighting_save = 0x09,
63 id_eeprom_reset = 0x0A,
64 id_bootloader_jump = 0x0B,
65 id_dynamic_keymap_macro_get_count = 0x0C,
66 id_dynamic_keymap_macro_get_buffer_size = 0x0D,
67 id_dynamic_keymap_macro_get_buffer = 0x0E,
68 id_dynamic_keymap_macro_set_buffer = 0x0F,
69 id_dynamic_keymap_macro_reset = 0x10,
70 id_dynamic_keymap_get_layer_count = 0x11,
71 id_dynamic_keymap_get_buffer = 0x12,
72 id_dynamic_keymap_set_buffer = 0x13,
73 id_unhandled = 0xFF,
74 };
75
76 enum via_keyboard_value_id {
77 id_uptime = 0x01, //
78 id_layout_options = 0x02,
79 id_switch_matrix_state = 0x03
80 };
81
82 enum via_lighting_value {
83 // QMK BACKLIGHT
84 id_qmk_backlight_brightness = 0x09,
85 id_qmk_backlight_effect = 0x0A,
86
87 // QMK RGBLIGHT
88 id_qmk_rgblight_brightness = 0x80,
89 id_qmk_rgblight_effect = 0x81,
90 id_qmk_rgblight_effect_speed = 0x82,
91 id_qmk_rgblight_color = 0x83,
92 };
93
94 // Can't use SAFE_RANGE here, it might change if someone adds
95 // new values to enum quantum_keycodes.
96 // Need to keep checking 0x5F10 is still in the safe range.
97 // TODO: merge this into quantum_keycodes
98 // Backlight keycodes are in range 0x5F00-0x5F0F
99 enum via_keycodes {
100 FN_MO13 = 0x5F10,
101 FN_MO23,
102 MACRO00,
103 MACRO01,
104 MACRO02,
105 MACRO03,
106 MACRO04,
107 MACRO05,
108 MACRO06,
109 MACRO07,
110 MACRO08,
111 MACRO09,
112 MACRO10,
113 MACRO11,
114 MACRO12,
115 MACRO13,
116 MACRO14,
117 MACRO15,
118 };
119
120 enum user_keycodes {
121 USER00 = 0x5F80,
122 USER01,
123 USER02,
124 USER03,
125 USER04,
126 USER05,
127 USER06,
128 USER07,
129 USER08,
130 USER09,
131 USER10,
132 USER11,
133 USER12,
134 USER13,
135 USER14,
136 USER15,
137 };
138
139 // Can be called in an overriding via_init_kb() to test if keyboard level code usage of
140 // EEPROM is invalid and use/save defaults.
141 bool via_eeprom_is_valid(void);
142
143 // Sets VIA/keyboard level usage of EEPROM to valid/invalid
144 // Keyboard level code (eg. via_init_kb()) should not call this
145 void via_eeprom_set_valid(bool valid);
146
147 // Flag QMK and VIA/keyboard level EEPROM as invalid.
148 // Used in bootmagic_lite() and VIA command handler.
149 // Keyboard level code should not need to call this.
150 void via_eeprom_reset(void);
151
152 // Called by QMK core to initialize dynamic keymaps etc.
153 void via_init(void);
154
155 // Used by VIA to store and retrieve the layout options.
156 uint32_t via_get_layout_options(void);
157 void via_set_layout_options(uint32_t value);
158
159 // Called by QMK core to process VIA-specific keycodes.
160 bool process_record_via(uint16_t keycode, keyrecord_t *record);