via.h (6939B)
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 "action.h" 20 21 // Changing the layout options size after release will invalidate EEPROM, 22 // but this is something that should be set correctly on initial implementation. 23 // 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary ) 24 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE 25 # define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1 26 #endif 27 28 // Allow override of the layout options default value. 29 // This requires advanced knowledge of how VIA stores layout options 30 // and is only really useful for setting a boolean layout option 31 // state to true by default. 32 #ifndef VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 33 # define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000 34 #endif 35 36 #ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE 37 # define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0 38 #endif 39 40 // This is changed only when the command IDs change, 41 // so VIA Configurator can detect compatible firmware. 42 #define VIA_PROTOCOL_VERSION 0x000C 43 44 // This is a version number for the firmware for the keyboard. 45 // It can be used to ensure the VIA keyboard definition and the firmware 46 // have the same version, especially if there are changes to custom values. 47 // Define this in config.h to override and bump this number. 48 // This is *not* required if the keyboard is only using basic functionality 49 // and not using custom values for lighting, rotary encoders, etc. 50 #ifndef VIA_FIRMWARE_VERSION 51 # define VIA_FIRMWARE_VERSION 0x00000000 52 #endif 53 54 enum via_command_id { 55 id_get_protocol_version = 0x01, // always 0x01 56 id_get_keyboard_value = 0x02, 57 id_set_keyboard_value = 0x03, 58 id_dynamic_keymap_get_keycode = 0x04, 59 id_dynamic_keymap_set_keycode = 0x05, 60 id_dynamic_keymap_reset = 0x06, 61 id_custom_set_value = 0x07, 62 id_custom_get_value = 0x08, 63 id_custom_save = 0x09, 64 id_eeprom_reset = 0x0A, 65 id_bootloader_jump = 0x0B, 66 id_dynamic_keymap_macro_get_count = 0x0C, 67 id_dynamic_keymap_macro_get_buffer_size = 0x0D, 68 id_dynamic_keymap_macro_get_buffer = 0x0E, 69 id_dynamic_keymap_macro_set_buffer = 0x0F, 70 id_dynamic_keymap_macro_reset = 0x10, 71 id_dynamic_keymap_get_layer_count = 0x11, 72 id_dynamic_keymap_get_buffer = 0x12, 73 id_dynamic_keymap_set_buffer = 0x13, 74 id_dynamic_keymap_get_encoder = 0x14, 75 id_dynamic_keymap_set_encoder = 0x15, 76 id_unhandled = 0xFF, 77 }; 78 79 enum via_keyboard_value_id { 80 id_uptime = 0x01, 81 id_layout_options = 0x02, 82 id_switch_matrix_state = 0x03, 83 id_firmware_version = 0x04, 84 id_device_indication = 0x05, 85 }; 86 87 enum via_channel_id { 88 id_custom_channel = 0, 89 id_qmk_backlight_channel = 1, 90 id_qmk_rgblight_channel = 2, 91 id_qmk_rgb_matrix_channel = 3, 92 id_qmk_audio_channel = 4, 93 id_qmk_led_matrix_channel = 5, 94 }; 95 96 enum via_qmk_backlight_value { 97 id_qmk_backlight_brightness = 1, 98 id_qmk_backlight_effect = 2, 99 }; 100 101 enum via_qmk_rgblight_value { 102 id_qmk_rgblight_brightness = 1, 103 id_qmk_rgblight_effect = 2, 104 id_qmk_rgblight_effect_speed = 3, 105 id_qmk_rgblight_color = 4, 106 }; 107 108 enum via_qmk_rgb_matrix_value { 109 id_qmk_rgb_matrix_brightness = 1, 110 id_qmk_rgb_matrix_effect = 2, 111 id_qmk_rgb_matrix_effect_speed = 3, 112 id_qmk_rgb_matrix_color = 4, 113 }; 114 115 enum via_qmk_led_matrix_value { 116 id_qmk_led_matrix_brightness = 1, 117 id_qmk_led_matrix_effect = 2, 118 id_qmk_led_matrix_effect_speed = 3, 119 }; 120 121 enum via_qmk_audio_value { 122 id_qmk_audio_enable = 1, 123 id_qmk_audio_clicky_enable = 2, 124 }; 125 126 // Can be called in an overriding via_init_kb() to test if keyboard level code usage of 127 // EEPROM is invalid and use/save defaults. 128 bool via_eeprom_is_valid(void); 129 130 // Sets VIA/keyboard level usage of EEPROM to valid/invalid 131 // Keyboard level code (eg. via_init_kb()) should not call this 132 void via_eeprom_set_valid(bool valid); 133 134 // Called by QMK core to initialize dynamic keymaps etc. 135 void eeconfig_init_via(void); 136 void via_init(void); 137 138 // Used by VIA to store and retrieve the layout options. 139 uint32_t via_get_layout_options(void); 140 void via_set_layout_options(uint32_t value); 141 void via_set_layout_options_kb(uint32_t value); 142 143 #if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0 144 uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length); 145 uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length); 146 #endif 147 148 // Used by VIA to tell a device to flash LEDs (or do something else) when that 149 // device becomes the active device being configured, on startup or switching 150 // between devices. 151 void via_set_device_indication(uint8_t value); 152 153 // Called by QMK core to process VIA-specific keycodes. 154 bool process_record_via(uint16_t keycode, keyrecord_t *record); 155 156 // These are made external so that keyboard level custom value handlers can use them. 157 #if defined(BACKLIGHT_ENABLE) 158 void via_qmk_backlight_command(uint8_t *data, uint8_t length); 159 void via_qmk_backlight_set_value(uint8_t *data); 160 void via_qmk_backlight_get_value(uint8_t *data); 161 void via_qmk_backlight_save(void); 162 #endif 163 164 #if defined(RGBLIGHT_ENABLE) 165 void via_qmk_rgblight_command(uint8_t *data, uint8_t length); 166 void via_qmk_rgblight_set_value(uint8_t *data); 167 void via_qmk_rgblight_get_value(uint8_t *data); 168 void via_qmk_rgblight_save(void); 169 #endif 170 171 #if defined(RGB_MATRIX_ENABLE) 172 void via_qmk_rgb_matrix_command(uint8_t *data, uint8_t length); 173 void via_qmk_rgb_matrix_set_value(uint8_t *data); 174 void via_qmk_rgb_matrix_get_value(uint8_t *data); 175 void via_qmk_rgb_matrix_save(void); 176 #endif 177 178 #if defined(LED_MATRIX_ENABLE) 179 void via_qmk_led_matrix_command(uint8_t *data, uint8_t length); 180 void via_qmk_led_matrix_set_value(uint8_t *data); 181 void via_qmk_led_matrix_get_value(uint8_t *data); 182 void via_qmk_led_matrix_save(void); 183 #endif 184 185 #if defined(AUDIO_ENABLE) 186 void via_qmk_audio_command(uint8_t *data, uint8_t length); 187 void via_qmk_audio_set_value(uint8_t *data); 188 void via_qmk_audio_get_value(uint8_t *data); 189 void via_qmk_audio_save(void); 190 #endif