zmk/app/src/behavior.c
2024-02-09 14:32:46 -08:00

67 lines
1.9 KiB
C

/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/sys/util_macro.h>
#include <string.h>
#include <drivers/behavior.h>
#include <zmk/behavior.h>
#include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
const struct device *zmk_behavior_get_binding(const char *name) {
return behavior_get_binding(name);
}
const struct device *z_impl_behavior_get_binding(const char *name) {
if (name == NULL || name[0] == '\0') {
return NULL;
}
STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) {
if (z_device_is_ready(item->device) && item->device->name == name) {
return item->device;
}
}
STRUCT_SECTION_FOREACH(zmk_behavior_ref, item) {
if (z_device_is_ready(item->device) && strcmp(item->device->name, name) == 0) {
return item->device;
}
}
return NULL;
}
#if IS_ENABLED(CONFIG_LOG)
static int check_behavior_names(void) {
// Behavior names must be unique, but we don't have a good way to enforce this
// at compile time, so log an error at runtime if they aren't unique.
ptrdiff_t count;
STRUCT_SECTION_COUNT(zmk_behavior_ref, &count);
for (ptrdiff_t i = 0; i < count; i++) {
const struct zmk_behavior_ref *current;
STRUCT_SECTION_GET(zmk_behavior_ref, i, &current);
for (ptrdiff_t j = i + 1; j < count; j++) {
const struct zmk_behavior_ref *other;
STRUCT_SECTION_GET(zmk_behavior_ref, j, &other);
if (strcmp(current->device->name, other->device->name) == 0) {
LOG_ERR("Multiple behaviors have the same name '%s'", current->device->name);
}
}
}
return 0;
}
SYS_INIT(check_behavior_names, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
#endif // IS_ENABLED(CONFIG_LOG)