mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-12-16 06:33:23 +00:00
167 lines
6.1 KiB
Django/Jinja
Executable File
167 lines
6.1 KiB
Django/Jinja
Executable File
{{ constants.GPL2_HEADER_C_LIKE }}
|
|
{{ constants.GENERATED_HEADER_C_LIKE }}
|
|
|
|
{% macro route_conditions(route_stack) %}
|
|
{% set conditions = [] %}
|
|
{% for data in route_stack %}
|
|
{% if 'enable_if_preprocessor' in data %}
|
|
{{ conditions.append(data.enable_if_preprocessor) or '' }}
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
{% if conditions %}
|
|
#if ({{ conditions | join(' && ') }})
|
|
{% endif %}
|
|
{{ caller() }}
|
|
{%- if conditions %}
|
|
#endif // ({{ conditions | join(' && ') }})
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Broadcast
|
|
|
|
{% for message_id,data in xap.broadcast_messages.messages | dictsort %}
|
|
{% if 'return_type' in data %}
|
|
void {{ xap.broadcast_messages.define_prefix | lower }}_{{ data.define | to_snake | lower }}({{ data.return_type | type_to_c('value') }}) { xap_broadcast({{ message_id }}, &value, sizeof(value)); }
|
|
{% else %}
|
|
void {{ xap.broadcast_messages.define_prefix | lower }}_{{ data.define | to_snake | lower }}(const void *data, size_t length) { xap_broadcast({{ message_id }}, data, length); }
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Decl
|
|
|
|
{% macro export_route_declaration(prefix, container) %}
|
|
{% if 'routes' in container %}
|
|
{% for route, data in container.routes | dictsort %}
|
|
{% set this_prefix_uc = (prefix + '_' + data.define) | upper %}
|
|
{% set this_prefix_lc = this_prefix_uc | lower %}
|
|
{% if 'return_execute' in data %}
|
|
|
|
{% if 'request_struct_members' in data %}
|
|
{% set arg_type = ( this_prefix_lc | to_snake | lower ) + '_arg_t' %}
|
|
{% set arg_var = arg_type + ' arg' %}
|
|
{% elif 'request_type' in data %}
|
|
{% set arg_type = data.request_type | type_to_c() %}
|
|
{% set arg_var = data.request_type | type_to_c('arg') %}
|
|
{% endif %}
|
|
|
|
__attribute__((weak)) bool xap_execute_{{ data.return_execute }}(xap_token_t token{% if arg_type %}, {{ (arg_type + '* arg') if 'xap_route' in arg_type else arg_var }}{% endif %}) { return false; }
|
|
__attribute__((weak)) bool xap_respond_{{ data.return_execute }}(xap_token_t token, const uint8_t *data, size_t data_len) {
|
|
{% if arg_type %}
|
|
if (data_len != sizeof({{ arg_type }})) {
|
|
return false;
|
|
}
|
|
{{ arg_var }};
|
|
memcpy(&arg, data, sizeof({{ arg_type }}));
|
|
{% endif %}
|
|
|
|
return xap_execute_{{ data.return_execute }}(token{% if arg_type %}, {{ '&' if 'xap_route' in arg_type else '' }}arg{% endif %});
|
|
}
|
|
{% endif %}
|
|
{{ export_route_declaration(this_prefix_lc, data) }}
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{{ export_route_declaration('xap_route', xap) }}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Data
|
|
|
|
{% macro export_route_data(prefix, container, route_stack) %}
|
|
{% set this_route_stack = route_stack.copy() %}
|
|
{{ this_route_stack.append(container) or '' }}
|
|
{% if 'routes' in container %}
|
|
{% for route, data in container.routes | dictsort %}
|
|
{% set this_prefix_uc = (prefix + '_' + data.define) | upper %}
|
|
{% set this_prefix_lc = this_prefix_uc | lower %}
|
|
{% if 'return_constant' in data %}
|
|
{% if data.return_type == 'struct' %}
|
|
{% call route_conditions(this_route_stack) %}
|
|
static const {{ this_prefix_lc }}_t {{ this_prefix_lc }}_data PROGMEM = {
|
|
{% for member in data.return_constant %}
|
|
{{ member }},
|
|
{% endfor %}
|
|
};
|
|
{% endcall %}
|
|
{% elif data.return_type == 'string' %}
|
|
{% call route_conditions(this_route_stack) %}
|
|
static const char {{ this_prefix_lc }}_str[] PROGMEM = {{ data.return_constant }};
|
|
{% endcall %}
|
|
{% else %}
|
|
{% call route_conditions(this_route_stack) %}
|
|
static const {{ data.return_type | type_to_c_before }} {{ this_prefix_lc }}_data PROGMEM = {{ data.return_constant }};
|
|
{% endcall %}
|
|
{% endif %}
|
|
{% endif %}
|
|
{{ export_route_data(this_prefix_lc, data, this_route_stack) }}
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{{ export_route_data('XAP_ROUTE', xap, []) }}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Routes
|
|
|
|
{% macro append_routing_table(prefix, container, route_stack) %}
|
|
{% set this_route_stack = route_stack.copy() %}
|
|
{{ this_route_stack.append(container) or '' }}
|
|
{% if 'routes' in container %}
|
|
{% for route, data in container.routes | dictsort %}
|
|
{% set this_prefix_uc = (prefix + '_' + data.define) | upper %}
|
|
{% set this_prefix_lc = this_prefix_uc | lower %}
|
|
{{ append_routing_table(this_prefix_lc, data, this_route_stack) }}
|
|
{% endfor %}
|
|
{% call route_conditions(this_route_stack) %}
|
|
static const xap_route_t {{ prefix | lower}}_table[] PROGMEM = {
|
|
{% for route, data in container.routes | dictsort %}
|
|
{% set inner_route_stack = this_route_stack.copy() %}
|
|
{{ inner_route_stack.append(data) or '' }}
|
|
{% if 'permissions' in data %}
|
|
{% set secure_status = 'ROUTE_PERMISSIONS_SECURE' %}
|
|
{% else %}
|
|
{% set secure_status = 'ROUTE_PERMISSIONS_INSECURE' %}
|
|
{% endif %}
|
|
{% call route_conditions(inner_route_stack) %}
|
|
[{{ prefix | upper }}_{{ data.define }}] = {
|
|
{% if 'routes' in data %}
|
|
.flags = {
|
|
.type = XAP_ROUTE,
|
|
.secure = {{ secure_status }},
|
|
},
|
|
.child_routes = {{ prefix | lower }}_{{ data.define | lower }}_table,
|
|
.child_routes_len = sizeof({{ prefix | lower }}_{{ data.define | lower }}_table)/sizeof(xap_route_t),
|
|
{% elif 'return_execute' in data %}
|
|
.flags = {
|
|
.type = XAP_EXECUTE,
|
|
.secure = {{ secure_status }},
|
|
},
|
|
.handler = xap_respond_{{ data.return_execute | lower }},
|
|
{% elif 'return_constant' in data and data.return_type == 'string' %}
|
|
.flags = {
|
|
.type = XAP_CONST_MEM,
|
|
.secure = {{ secure_status }},
|
|
},
|
|
.const_data = {{ prefix | lower }}_{{ data.define | lower }}_str,
|
|
.const_data_len = sizeof({{ prefix | lower }}_{{ data.define | lower }}_str) - 1,
|
|
{% elif 'return_constant' in data %}
|
|
.flags = {
|
|
.type = XAP_CONST_MEM,
|
|
.secure = {{ secure_status }},
|
|
},
|
|
.const_data = &{{ prefix | lower }}_{{ data.define | lower }}_data,
|
|
.const_data_len = sizeof({{ prefix | lower }}_{{ data.define | lower }}_data),
|
|
{% endif %}
|
|
},
|
|
{% endcall %}
|
|
{% endfor %}
|
|
};
|
|
{% endcall %}
|
|
{% endif %}
|
|
{% endmacro %}
|
|
|
|
{{ append_routing_table("xap_route", xap, []) }}
|