From d237b42525ce9abbae3e37a15121adba2564d62f Mon Sep 17 00:00:00 2001 From: icex2 Date: Sat, 17 Aug 2024 12:50:14 +0200 Subject: [PATCH] =?UTF-8?q?feat(bt-module):=20Add=20optional=20=E2=80=9Cco?= =?UTF-8?q?nfigurable=E2=80=9D=20interface=20to=20bt=20io=20modules?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This solves the problem have requiring nested configuration for several IO modules in bemanitools, e.g. com port configuration for p3io. Don’t make this a part of the specific IO API, e.g. iidxio, to keep the IO interface clean and independent of bemanitools. Any bemanitools functionality is composed as separate interfaces into a final module. This concept was already applied to all modules with providing the API vtables for threads, log and config. --- src/api/io.h | 20 ++++++++++++++++++++ src/main/module/configure.h | 8 ++++++++ src/main/module/io.c | 27 +++++++++++++++++++++++++++ src/main/module/io.h | 1 + src/sdk/module/configure.h | 10 ++++++++++ 5 files changed, 66 insertions(+) create mode 100644 src/api/io.h create mode 100644 src/main/module/configure.h create mode 100644 src/sdk/module/configure.h diff --git a/src/api/io.h b/src/api/io.h new file mode 100644 index 0000000..b88d5cf --- /dev/null +++ b/src/api/io.h @@ -0,0 +1,20 @@ +#ifndef BT_API_IO_H +#define BT_API_IO_H + +#include +#include + +#include "api/core/config.h" + +typedef bool (*bt_io_configure_t)(const bt_core_config_t *config); + +typedef struct bt_io_api { + uint16_t version; + + struct { + // Optional + bt_io_configure_t configure; + } v1; +} bt_hook_api_t; + +#endif \ No newline at end of file diff --git a/src/main/module/configure.h b/src/main/module/configure.h new file mode 100644 index 0000000..2ac7896 --- /dev/null +++ b/src/main/module/configure.h @@ -0,0 +1,8 @@ +#ifndef MODULE_CONFIGURE_H +#define MODULE_CONFIGURE_H + +#include "api/core/config.h" + +typedef bool (*bt_module_configure_do_t)(const bt_core_config_t *config); + +#endif \ No newline at end of file diff --git a/src/main/module/io.c b/src/main/module/io.c index 11ef1ec..bb2887f 100644 --- a/src/main/module/io.c +++ b/src/main/module/io.c @@ -7,6 +7,7 @@ #include "iface-core/log.h" #include "main/module/core.h" +#include "main/module/configure.h" #include "main/module/io.h" #include "main/module/module.h" @@ -21,6 +22,7 @@ struct module_io { bt_module_core_config_api_set_t core_config_api_set; bt_module_core_log_api_set_t core_log_api_set; bt_module_core_thread_api_set_t core_thread_api_set; + bt_module_configure_do_t configure_do; module_io_api_get_t api_get; // Keep for debug logging @@ -39,6 +41,9 @@ _module_io_resolve(module_io_t *module, const char *api_get_func_name) module->core_thread_api_set = (bt_module_core_thread_api_set_t) module_func_optional_resolve( module->module, "bt_module_core_thread_api_set"); + module->configure_do = + (bt_module_configure_do_t) module_func_optional_resolve( + module->module, "bt_module_configure_do"); module->api_get = (module_io_api_get_t) module_func_required_resolve( module->module, api_get_func_name); @@ -122,6 +127,28 @@ void module_io_core_thread_api_set( } } +bool module_io_configure_do(const module_io_t *module, const bt_core_config_t *config) +{ + bool result; + + log_assert(module); + log_assert(config); + + result = true; + + if (module->configure_do) { + module_func_pre_invoke_log( + module->module, "bt_module_configure_do"); + + result = module->configure_do(config); + + module_func_post_invoke_log( + module->module, "bt_module_configure_do"); + } + + return result; +} + void module_io_api_get(const module_io_t *module, void *api) { log_assert(module); diff --git a/src/main/module/io.h b/src/main/module/io.h index 5329513..53fb423 100644 --- a/src/main/module/io.h +++ b/src/main/module/io.h @@ -20,6 +20,7 @@ void module_io_core_log_api_set( const module_io_t *module, const bt_core_log_api_t *api); void module_io_core_thread_api_set( const module_io_t *module, const bt_core_thread_api_t *api); +bool module_io_configure_do(const module_io_t *module, const bt_core_config_t *config); void module_io_api_get(const module_io_t *module, void *api); diff --git a/src/sdk/module/configure.h b/src/sdk/module/configure.h new file mode 100644 index 0000000..8ff4cf2 --- /dev/null +++ b/src/sdk/module/configure.h @@ -0,0 +1,10 @@ +#ifndef MODULE_CONFIGURE_H +#define MODULE_CONFIGURE_H + +#include + +#include "api/core/config.h" + +bool bt_module_configure_do(const bt_core_config_t *config); + +#endif \ No newline at end of file