67 lines
1.9 KiB
C
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, ¤t);
|
|
|
|
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)
|