Update Dvorak, Colemak and Workman keycode aliases (#8217)
[jackhill/qmk/firmware.git] / quantum / via.h
CommitLineData
320822d7
W
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
667045b4 19#include <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
320822d7
W
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
667045b4 28# define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
320822d7
W
29#endif
30
667045b4 31#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3)
320822d7
W
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
667045b4 37# define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
320822d7
W
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
667045b4 43#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
320822d7
W
44
45#ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
667045b4 46# define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
320822d7
W
47#endif
48
49// This is changed only when the command IDs change,
667045b4 50// so VIA Configurator can detect compatible firmware.
320822d7
W
51#define VIA_PROTOCOL_VERSION 0x0009
52
667045b4 53enum via_command_id {
484a9b12
W
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,
320822d7
W
74};
75
484a9b12
W
76enum via_keyboard_value_id {
77 id_uptime = 0x01, //
78 id_layout_options = 0x02,
79 id_switch_matrix_state = 0x03
80};
81
82enum 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};
320822d7
W
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
99enum 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
120enum user_keycodes {
667045b4
JC
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,
320822d7
W
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.
141bool 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
145void 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.
150void via_eeprom_reset(void);
151
152// Called by QMK core to initialize dynamic keymaps etc.
153void via_init(void);
154
155// Used by VIA to store and retrieve the layout options.
156uint32_t via_get_layout_options(void);
667045b4 157void via_set_layout_options(uint32_t value);
320822d7
W
158
159// Called by QMK core to process VIA-specific keycodes.
160bool process_record_via(uint16_t keycode, keyrecord_t *record);