feat(bt-module): Add optional “configurable” interface to bt io modules

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.
This commit is contained in:
icex2
2024-08-17 12:50:14 +02:00
parent 620ca84c5f
commit d237b42525
5 changed files with 66 additions and 0 deletions

20
src/api/io.h Normal file
View File

@@ -0,0 +1,20 @@
#ifndef BT_API_IO_H
#define BT_API_IO_H
#include <stdbool.h>
#include <stdint.h>
#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

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -0,0 +1,10 @@
#ifndef MODULE_CONFIGURE_H
#define MODULE_CONFIGURE_H
#include <stdbool.h>
#include "api/core/config.h"
bool bt_module_configure_do(const bt_core_config_t *config);
#endif