diff --git a/data/constants/led_matrix_0.0.1.json b/data/constants/led_matrix_0.0.1.json index 89373f58c2c..5d59c7a14ce 100644 --- a/data/constants/led_matrix_0.0.1.json +++ b/data/constants/led_matrix_0.0.1.json @@ -3,76 +3,76 @@ "reactive": {} }, "effects": { - "0x01": { + "0x00": { "key": "SOLID" }, - "0x02": { + "0x01": { "key": "ALPHAS_MODS" }, - "0x03": { + "0x02": { "key": "BREATHING" }, - "0x04": { + "0x03": { "key": "BAND" }, - "0x05": { + "0x04": { "key": "BAND_PINWHEEL" }, - "0x06": { + "0x05": { "key": "BAND_SPIRAL" }, - "0x07": { + "0x06": { "key": "CYCLE_LEFT_RIGHT" }, - "0x08": { + "0x07": { "key": "CYCLE_UP_DOWN" }, - "0x09": { + "0x08": { "key": "CYCLE_OUT_IN" }, - "0x0A": { + "0x09": { "key": "DUAL_BEACON" }, - "0x0B": { + "0x0A": { "key": "WAVE_LEFT_RIGHT" }, - "0x0C": { + "0x0B": { "key": "WAVE_UP_DOWN" }, - "0x0D": { + "0x0C": { "key": "SOLID_REACTIVE_SIMPLE", "group": "reactive" }, - "0x0E": { + "0x0D": { "key": "SOLID_REACTIVE_WIDE", "group": "reactive" }, - "0x0F": { + "0x0E": { "key": "SOLID_REACTIVE_MULTIWIDE", "group": "reactive" }, - "0x10": { + "0x0F": { "key": "SOLID_REACTIVE_CROSS", "group": "reactive" }, - "0x11": { + "0x10": { "key": "SOLID_REACTIVE_MULTICROSS", "group": "reactive" }, - "0x12": { + "0x11": { "key": "SOLID_REACTIVE_NEXUS", "group": "reactive" }, - "0x13": { + "0x12": { "key": "SOLID_REACTIVE_MULTINEXUS", "group": "reactive" }, - "0x14": { + "0x13": { "key": "SOLID_SPLASH", "group": "reactive" }, - "0x15": { + "0x14": { "key": "SOLID_MULTISPLASH", "group": "reactive" } diff --git a/data/constants/rgb_matrix_0.0.1.json b/data/constants/rgb_matrix_0.0.1.json index 51c1b72cb8f..350dcdeb074 100644 --- a/data/constants/rgb_matrix_0.0.1.json +++ b/data/constants/rgb_matrix_0.0.1.json @@ -4,151 +4,151 @@ "reactive": {} }, "effects": { - "0x01": { + "0x00": { "key": "SOLID_COLOR" }, - "0x02": { + "0x01": { "key": "ALPHAS_MODS" }, - "0x03": { + "0x02": { "key": "GRADIENT_UP_DOWN" }, - "0x04": { + "0x03": { "key": "GRADIENT_LEFT_RIGHT" }, - "0x05": { + "0x04": { "key": "BREATHING" }, - "0x06": { + "0x05": { "key": "BAND_SAT" }, - "0x07": { + "0x06": { "key": "BAND_VAL" }, - "0x08": { + "0x07": { "key": "BAND_PINWHEEL_SAT" }, - "0x09": { + "0x08": { "key": "BAND_PINWHEEL_VAL" }, - "0x0A": { + "0x09": { "key": "BAND_SPIRAL_SAT" }, - "0x0B": { + "0x0A": { "key": "BAND_SPIRAL_VAL" }, - "0x0C": { + "0x0B": { "key": "CYCLE_ALL" }, - "0x0D": { + "0x0C": { "key": "CYCLE_LEFT_RIGHT" }, - "0x0E": { + "0x0D": { "key": "CYCLE_UP_DOWN" }, - "0x0F": { + "0x0E": { "key": "CYCLE_OUT_IN" }, - "0x10": { + "0x0F": { "key": "CYCLE_OUT_IN_DUAL" }, - "0x11": { + "0x10": { "key": "RAINBOW_MOVING_CHEVRON" }, - "0x12": { + "0x11": { "key": "CYCLE_PINWHEEL" }, - "0x13": { + "0x12": { "key": "CYCLE_SPIRAL" }, - "0x14": { + "0x13": { "key": "DUAL_BEACON" }, - "0x15": { + "0x14": { "key": "RAINBOW_BEACON" }, - "0x16": { + "0x15": { "key": "RAINBOW_PINWHEELS" }, - "0x17": { + "0x16": { "key": "RAINDROPS" }, - "0x18": { + "0x17": { "key": "JELLYBEAN_RAINDROPS" }, - "0x19": { + "0x18": { "key": "HUE_BREATHING" }, - "0x1A": { + "0x19": { "key": "HUE_PENDULUM" }, - "0x1B": { + "0x1A": { "key": "HUE_WAVE" }, - "0x1C": { + "0x1B": { "key": "PIXEL_FRACTAL" }, - "0x1D": { + "0x1C": { "key": "PIXEL_FLOW" }, - "0x1E": { + "0x1D": { "key": "PIXEL_RAIN" }, - "0x1F": { + "0x1E": { "key": "TYPING_HEATMAP", "group": "framebuffer" }, - "0x20": { + "0x1F": { "key": "DIGITAL_RAIN", "group": "framebuffer" }, - "0x21": { + "0x20": { "key": "SOLID_REACTIVE_SIMPLE", "group": "reactive" }, - "0x22": { + "0x21": { "key": "RGB_MATRIX_SOLID_REACTIVE", "group": "reactive" }, - "0x23": { + "0x22": { "key": "RGB_MATRIX_SOLID_REACTIVE_WIDE", "group": "reactive" }, - "0x24": { + "0x23": { "key": "SOLID_REACTIVE_MULTIWIDE", "group": "reactive" }, - "0x25": { + "0x24": { "key": "SOLID_REACTIVE_CROSS", "group": "reactive" }, - "0x26": { + "0x25": { "key": "SOLID_REACTIVE_MULTICROSS", "group": "reactive" }, - "0x27": { + "0x26": { "key": "SOLID_REACTIVE_NEXUS", "group": "reactive" }, - "0x28": { + "0x27": { "key": "SOLID_REACTIVE_MULTINEXUS", "group": "reactive" }, - "0x29": { + "0x28": { "key": "SPLASH", "group": "reactive" }, - "0x2A": { + "0x29": { "key": "MULTISPLASH", "group": "reactive" }, - "0x2B": { + "0x2A": { "key": "SOLID_SPLASH", "group": "reactive" }, - "0x2C": { + "0x2B": { "key": "SOLID_MULTISPLASH", "group": "reactive" } diff --git a/data/constants/rgblight_0.0.1.json b/data/constants/rgblight_0.0.1.json index 20344b42d57..e096628ae4d 100644 --- a/data/constants/rgblight_0.0.1.json +++ b/data/constants/rgblight_0.0.1.json @@ -1,129 +1,129 @@ { "effects": { - "0x01": { + "0x00": { "key": "STATIC_LIGHT" }, - "0x02": { + "0x01": { "key": "BREATHING" }, - "0x03": { + "0x02": { "key": "BREATHING_2" }, - "0x04": { + "0x03": { "key": "BREATHING_3" }, - "0x05": { + "0x04": { "key": "BREATHING_4" }, - "0x06": { + "0x05": { "key": "RAINBOW_MOOD" }, - "0x07": { + "0x06": { "key": "RAINBOW_MOOD_2" }, - "0x08": { + "0x07": { "key": "RAINBOW_MOOD_3" }, - "0x09": { + "0x08": { "key": "RAINBOW_SWIRL" }, - "0x0A": { + "0x09": { "key": "RAINBOW_SWIRL_2" }, - "0x0B": { + "0x0A": { "key": "RAINBOW_SWIRL_3" }, - "0x0C": { + "0x0B": { "key": "RAINBOW_SWIRL_4" }, - "0x0D": { + "0x0C": { "key": "RAINBOW_SWIRL_5" }, - "0x0E": { + "0x0D": { "key": "RAINBOW_SWIRL_6" }, - "0x0F": { + "0x0E": { "key": "SNAKE" }, - "0x10": { + "0x0F": { "key": "SNAKE_2" }, - "0x11": { + "0x10": { "key": "SNAKE_3" }, - "0x12": { + "0x11": { "key": "SNAKE_4" }, - "0x13": { + "0x12": { "key": "SNAKE_5" }, - "0x14": { + "0x13": { "key": "SNAKE_6" }, - "0x15": { + "0x14": { "key": "KNIGHT" }, - "0x16": { + "0x15": { "key": "KNIGHT_2" }, - "0x17": { + "0x16": { "key": "KNIGHT_3" }, - "0x18": { + "0x17": { "key": "CHRISTMAS" }, - "0x19": { + "0x18": { "key": "STATIC_GRADIENT" }, - "0x1A": { + "0x19": { "key": "STATIC_GRADIENT_2" }, - "0x1B": { + "0x1A": { "key": "STATIC_GRADIENT_3" }, - "0x1C": { + "0x1B": { "key": "STATIC_GRADIENT_4" }, - "0x1D": { + "0x1C": { "key": "STATIC_GRADIENT_5" }, - "0x1E": { + "0x1D": { "key": "STATIC_GRADIENT_6" }, - "0x1F": { + "0x1E": { "key": "STATIC_GRADIENT_7" }, - "0x20": { + "0x1F": { "key": "STATIC_GRADIENT_8" }, - "0x21": { + "0x20": { "key": "STATIC_GRADIENT_9" }, - "0x22": { + "0x21": { "key": "STATIC_GRADIENT_10" }, - "0x23": { - "key": "TEST" + "0x22": { + "key": "RGB_TEST" }, - "0x24": { + "0x23": { "key": "ALTERNATING" }, - "0x25": { + "0x24": { "key": "TWINKLE" }, - "0x26": { + "0x25": { "key": "TWINKLE_2" }, - "0x27": { + "0x26": { "key": "TWINKLE_3" }, - "0x28": { + "0x27": { "key": "TWINKLE_4" }, - "0x29": { + "0x28": { "key": "TWINKLE_5" }, - "0x2A": { + "0x29": { "key": "TWINKLE_6" } } diff --git a/lib/python/qmk/cli/xap/generate_qmk.py b/lib/python/qmk/cli/xap/generate_qmk.py index 5144d5fd722..5339166b4b1 100755 --- a/lib/python/qmk/cli/xap/generate_qmk.py +++ b/lib/python/qmk/cli/xap/generate_qmk.py @@ -19,11 +19,11 @@ def xap_generate_qmk_inc(cli): # Determine our keyboard/keymap if not cli.args.keyboard: cli.log.error('Missing parameter: --keyboard') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-inc'].print_help() return False if not cli.args.keymap: cli.log.error('Missing parameter: --keymap') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-inc'].print_help() return False generate_inline(cli.args.output, cli.args.keyboard, cli.args.keymap) @@ -39,11 +39,11 @@ def xap_generate_qmk_h(cli): # Determine our keyboard/keymap if not cli.args.keyboard: cli.log.error('Missing parameter: --keyboard') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-h'].print_help() return False if not cli.args.keymap: cli.log.error('Missing parameter: --keymap') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-h'].print_help() return False generate_header(cli.args.output, cli.args.keyboard, cli.args.keymap) @@ -59,11 +59,11 @@ def xap_generate_qmk_blob_h(cli): # Determine our keyboard/keymap if not cli.args.keyboard: cli.log.error('Missing parameter: --keyboard') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-blob-h'].print_help() return False if not cli.args.keymap: cli.log.error('Missing parameter: --keymap') - cli.subcommands['xap-generate-info-h'].print_help() + cli.subcommands['xap-generate-qmk-blob-h'].print_help() return False generate_blob(cli.args.output, cli.args.keyboard, cli.args.keymap) diff --git a/lib/python/qmk/xap/gen_firmware/inline_generator.py b/lib/python/qmk/xap/gen_firmware/inline_generator.py index 9d0a6ed54c9..e6fe3f60223 100755 --- a/lib/python/qmk/xap/gen_firmware/inline_generator.py +++ b/lib/python/qmk/xap/gen_firmware/inline_generator.py @@ -1,9 +1,46 @@ """This script generates the XAP protocol generated header to be compiled into QMK. """ +import re +from pathlib import Path + from qmk.casing import to_snake from qmk.commands import dump_lines from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE from qmk.xap.common import merge_xap_defs, route_conditions +from qmk.json_schema import json_load + +PREFIX_MAP = { + 'rgblight': { + 'ifdef': 'RGBLIGHT_EFFECT', + 'def': 'RGBLIGHT_MODE', + }, + 'rgb_matrix': { + 'ifdef': 'ENABLE_RGB_MATRIX', + 'def': 'RGB_MATRIX', + }, + 'led_matrix': { + 'ifdef': 'ENABLE_LED_MATRIX', + 'def': 'LED_MATRIX', + }, +} + + +def _get_lighting_spec(xap_defs, feature): + version = xap_defs["uses"][feature] + spec = json_load(Path(f'data/constants/{feature}_{version}.json')) + + # preprocess for gross rgblight "mode + n" + for obj in spec.get('effects', {}).values(): + define = obj["key"] + offset = 0 + found = re.match("(.*)_(\\d+)$", define) + if found: + define = found.group(1) + offset = int(found.group(2)) - 1 + obj["define"] = define + obj["offset"] = offset + + return spec def _get_c_type(xap_type): @@ -276,6 +313,82 @@ def _append_broadcast_messages(lines, container): lines.append(f'void {name}(const void *data, size_t length){{ xap_broadcast({key}, data, length); }}') +def _append_lighting_map(lines, feature, spec): + """TODO: + """ + ifdef_prefix = PREFIX_MAP[feature]['ifdef'] + def_prefix = PREFIX_MAP[feature]['def'] + + lines.append(f'static uint8_t {feature}_effect_map[][2] = {{') + for id, obj in spec.get('effects', {}).items(): + define = obj["define"] + offset = f' + {obj["offset"]}' if obj["offset"] else '' + + lines.append(f''' +#ifdef {ifdef_prefix}_{define} + {{ {id}, {def_prefix}_{define}{offset}}}, +#endif''') + + lines.append('};') + + # add helper funcs + lines.append( + f''' +uint8_t {feature}2xap(uint8_t val) {{ + for(uint8_t i = 0; i < ARRAY_SIZE({feature}_effect_map); i++) {{ + if ({feature}_effect_map[i][1] == val) + return {feature}_effect_map[i][0]; + }} + return 0xFF; +}} + +uint8_t xap2{feature}(uint8_t val) {{ + for(uint8_t i = 0; i < ARRAY_SIZE({feature}_effect_map); i++) {{ + if ({feature}_effect_map[i][0] == val) + return {feature}_effect_map[i][1]; + }} + return 0xFF; +}}''' + ) + + +def _append_lighting_bitmask(lines, feature, spec): + """TODO: + """ + ifdef_prefix = PREFIX_MAP[feature]['ifdef'] + + lines.append(f"static const uint64_t ENABLED_{feature.upper()}_EFFECTS = 0") + for id, obj in spec.get('effects', {}).items(): + define = obj["define"] + + lines.append(f''' +#ifdef {ifdef_prefix}_{define} + | (1ULL << {id}) +#endif''') + lines.append(';') + + +def _append_lighting_mapping(lines, xap_defs): + """TODO: + """ + # TODO: remove bodge for always enabled effects + lines.append(''' +#define RGBLIGHT_EFFECT_STATIC_LIGHT +#define ENABLE_RGB_MATRIX_SOLID_COLOR +#define ENABLE_LED_MATRIX_SOLID +''') + + for feature in PREFIX_MAP.keys(): + spec = _get_lighting_spec(xap_defs, feature) + + lines.append(f"#ifdef {feature.upper()}_ENABLE") + _append_lighting_map(lines, feature, spec) + lines.append(f"#endif //{feature.upper()}_ENABLE") + + # TODO: should be inside ifdef but causes build issues + _append_lighting_bitmask(lines, feature, spec) + + def generate_inline(output_file, keyboard, keymap): """Generates the XAP protocol header file, generated during normal build. """ @@ -284,6 +397,9 @@ def generate_inline(output_file, keyboard, keymap): # Preamble lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, ''] + # TODO: gen somewhere else? + _append_lighting_mapping(lines, xap_defs) + # Add all the generated code _append_broadcast_messages(lines, xap_defs) _append_routing_tables(lines, xap_defs) diff --git a/quantum/xap/xap.c b/quantum/xap/xap.c index c9d80ba10b1..62e4590ac26 100644 --- a/quantum/xap/xap.c +++ b/quantum/xap/xap.c @@ -28,9 +28,7 @@ bool get_config_blob_chunk(uint16_t offset, uint8_t *data, uint8_t data_len) { return true; } -// TODO: return actual values -#define ENABLED_RGBLIGHT_EFFECTS 0xFFFFFFFF -#define ENABLED_RGB_MATRIX_EFFECTS 0xFFFFFFFF +// TODO: move to better location? #ifdef BACKLIGHT_BREATHING # define ENABLED_BACKLIGHT_EFFECTS 0b00000001 #else diff --git a/quantum/xap/xap_handlers.c b/quantum/xap/xap_handlers.c index ca39f7d8942..c729949ff5e 100644 --- a/quantum/xap/xap_handlers.c +++ b/quantum/xap/xap_handlers.c @@ -182,6 +182,8 @@ bool xap_respond_dynamic_encoder_set_keycode(xap_token_t token, const void *data } #endif +#define INVALID_EFFECT 0xFF + #if ((defined(BACKLIGHT_ENABLE))) # include "backlight.h" @@ -204,66 +206,13 @@ bool xap_respond_get_backlight_config(xap_token_t token, const void *data, size_ extern rgblight_config_t rgblight_config; -// static uint8_t effect_map[][2] = { -// {1, RGBLIGHT_MODE_STATIC_LIGHT}, -// # ifdef RGBLIGHT_EFFECT_BREATHING -// {2, RGBLIGHT_MODE_BREATHING}, -// {3, RGBLIGHT_MODE_BREATHING + 1}, -// {4, RGBLIGHT_MODE_BREATHING + 2}, -// {5, RGBLIGHT_MODE_BREATHING + 3}, -// # endif -// /*...*/ -// }; - -// static uint8_t xap2rgb(uint8_t val) { -// for(uint8_t i = 0; i < ARRAY_SIZE(effect_map); i++){ -// if (effect_map[i][0] == val) { -// return effect_map[i][1]; -// } -// } -// return 0; -// } - -// static uint8_t rgb2xap(uint8_t val) { -// for(uint8_t i = 0; i < ARRAY_SIZE(effect_map); i++){ -// if (effect_map[i][1] == val) { -// return effect_map[i][0]; -// } -// } -// return 0; -// } - -static uint8_t effect_map[43] = { - 0, // - RGBLIGHT_MODE_STATIC_LIGHT, // -# ifdef RGBLIGHT_EFFECT_BREATHING - RGBLIGHT_MODE_BREATHING, - RGBLIGHT_MODE_BREATHING + 1, - RGBLIGHT_MODE_BREATHING + 2, - RGBLIGHT_MODE_BREATHING + 3, -# endif - 0, - /*...*/ -}; - -// static uint8_t xap2rgb(uint8_t val) { -// return effect_map[val]; -// } - -static uint8_t rgb2xap(uint8_t val) { - for (uint8_t i = 0; i < ARRAY_SIZE(effect_map); i++) { - if (effect_map[i] == val) { - return i; - } - } - return 0; -} +uint8_t rgblight2xap(uint8_t val); bool xap_respond_get_rgblight_config(xap_token_t token, const void *data, size_t length) { xap_route_lighting_rgblight_get_config_t ret; ret.enable = rgblight_config.enable; - ret.mode = rgb2xap(rgblight_config.mode); + ret.mode = rgblight2xap(rgblight_config.mode); ret.hue = rgblight_config.hue; ret.sat = rgblight_config.sat; ret.val = rgblight_config.val; @@ -278,34 +227,13 @@ bool xap_respond_get_rgblight_config(xap_token_t token, const void *data, size_t extern rgb_config_t rgb_matrix_config; -static uint8_t effect_map[43] = { - 0, // - RGB_MATRIX_SOLID_COLOR, // -# ifdef ENABLE_RGB_MATRIX_ALPHAS_MODS - RGB_MATRIX_ALPHAS_MODS, -# endif - 0, - /*...*/ -}; - -// static uint8_t xap2rgb(uint8_t val) { -// return effect_map[val]; -// } - -static uint8_t rgb2xap(uint8_t val) { - for (uint8_t i = 0; i < ARRAY_SIZE(effect_map); i++) { - if (effect_map[i] == val) { - return i; - } - } - return 0; -} +uint8_t rgb_matrix2xap(uint8_t val); bool xap_respond_get_rgb_matrix_config(xap_token_t token, const void *data, size_t length) { xap_route_lighting_rgb_matrix_get_config_t ret; ret.enable = rgb_matrix_config.enable; - ret.mode = rgb2xap(rgb_matrix_config.mode); + ret.mode = rgb_matrix2xap(rgb_matrix_config.mode); ret.hue = rgb_matrix_config.hsv.h; ret.sat = rgb_matrix_config.hsv.s; ret.val = rgb_matrix_config.hsv.v;