mana: add cpp plugin interface and test plugin

This commit is contained in:
Florian Lüke 2024-12-27 18:49:19 +01:00
parent aa9d21d81c
commit a9bfcf151c
5 changed files with 119 additions and 38 deletions

View file

@ -24,20 +24,22 @@ if (MNODE_BUILD_TESTS)
target_link_libraries(test_mana PRIVATE mana)
endif()
add_library(rxi-logc INTERFACE)
target_sources(rxi-logc INTERFACE internal/rxi/log.c)
target_compile_options(rxi-logc INTERFACE -DLOG_USE_COLOR)
add_library(mana-plugin-c-test SHARED mana_plugin_c_test.c)
target_link_libraries(mana-plugin-c-test PRIVATE rxi-logc)
add_library(mana-plugin-cpp-test SHARED mana_plugin_cpp_test.cc)
target_link_libraries(mana-plugin-cpp-test PRIVATE rxi-logc)
find_package(ROOT COMPONENTS Hist)
if (ROOT_FOUND)
message("-- Using ROOT installation from ${ROOT_USE_FILE}")
include(${ROOT_USE_FILE})
add_library(mana-plugin-root-histogram SHARED mana_plugin_root_histogram.cc)
target_link_libraries(mana-plugin-root-histogram PRIVATE mana mesytec-mnode rxi-logc ${ROOT_LIBRARIES})
target_compile_options(mana-plugin-root-histogram PRIVATE -DLOG_USE_COLOR)
endif()
if (pybind11_FOUND)

62
src/internal/mana_api.hpp Normal file
View file

@ -0,0 +1,62 @@
#ifndef A042D3CF_5927_42A2_93FF_E49E940B32BD
#define A042D3CF_5927_42A2_93FF_E49E940B32BD
#include <memory>
#include <regex>
#include <string>
#include <vector>
#include "mana_c_api.h"
namespace mesytec::mnode::mana
{
class IManaSink
{
public:
virtual ~IManaSink() = default;
virtual void init(int plugin_argc, const char **plugin_argv) = 0;
virtual void shutdown() = 0;
virtual void begin_run(const char *descriptor_json) = 0;
virtual void end_run(const char *descriptor_json) = 0;
virtual void process_event(uint16_t eventIndex, mana_offset_array_t *arrays, size_t arrayCount,
size_t totalBytes) = 0;
virtual void process_system_event(const uint32_t *data, size_t size) = 0;
template <typename StringHolder> void init(StringHolder args)
{
std::vector<const char *> cargs(args.size());
std::transform(args.begin(), args.end(), cargs.begin(),
[](const std::string &s) { return s.c_str(); });
init(cargs.size(), cargs.data());
}
protected:
IManaSink() = default;
private:
IManaSink(const IManaSink &) = delete;
IManaSink &operator=(const IManaSink &) = delete;
};
class IManaPlugin
{
public:
virtual ~IManaPlugin() = default;
virtual std::unique_ptr<IManaSink> makeSink() = 0;
protected:
IManaPlugin() = default;
private:
IManaPlugin(const IManaPlugin &) = delete;
IManaPlugin &operator=(const IManaPlugin &) = delete;
};
} // namespace mesytec::mnode::mana
#define MANA_CPP_PLUGIN extern "C" mana::IManaPlugin *mana_get_plugin
#endif /* A042D3CF_5927_42A2_93FF_E49E940B32BD */

View file

@ -1,8 +1,8 @@
#ifndef AAB5E4D2_A05B_4F2F_B76A_406A5A569D55
#define AAB5E4D2_A05B_4F2F_B76A_406A5A569D55
#include "mana_api.hpp"
#include "mana_arena.h"
#include "mana_c_api.h"
#include <cassert>
#include <chrono>
#include <mesytec-mnode/mnode_cpp_types.h>
@ -128,36 +128,6 @@ inline nlohmann::json make_array_descriptor(const std::string &name, const std::
return make_array_descriptor(name, mana_float, size, bits);
}
class IManaSink
{
public:
virtual ~IManaSink() = default;
virtual void init(int plugin_argc, const char **plugin_argv) = 0;
virtual void shutdown() = 0;
virtual void begin_run(const char *descriptor_json) = 0;
virtual void end_run(const char *descriptor_json) = 0;
virtual void process_event(uint16_t eventIndex, mana_offset_array_t *arrays, size_t arrayCount,
size_t totalBytes) = 0;
virtual void process_system_event(const uint32_t *data, size_t size) = 0;
template <typename StringHolder> void init(StringHolder args)
{
std::vector<const char *> cargs(args.size());
std::transform(args.begin(), args.end(), cargs.begin(),
[](const std::string &s) { return s.c_str(); });
init(cargs.size(), cargs.data());
}
protected:
IManaSink() = default;
private:
IManaSink(const IManaSink &) = delete;
IManaSink &operator=(const IManaSink &) = delete;
};
#if 0
class ManaSinkProxy: public IManaSink
{

View file

@ -0,0 +1,51 @@
#include "internal/mana_api.hpp"
#include "internal/rxi/log.hpp"
using namespace mesytec::mnode;
using namespace mesytec::mnode::mana;
class Sink: public IManaSink
{
public:
void init(int plugin_argc, const char **plugin_argv) override
{
(void)plugin_argc;
(void)plugin_argv;
log_set_level(LOG_INFO);
log_info("init: this=%p", this);
}
void shutdown() override { log_info("shutdown: this=%p", this); }
void begin_run(const char *descriptor_json) override
{
(void)descriptor_json;
log_info("begin_run: this=%p", this);
}
void end_run(const char *descriptor_json) override
{
(void)descriptor_json;
log_info("end_run: this=%p", this);
}
void process_event(uint16_t eventIndex, mana_offset_array_t *arrays, size_t arrayCount,
size_t totalBytes) override
{
log_trace("event: this=%p, eventIndex=%d, arrayCount=%zu, totalBytes=%zu", this, eventIndex,
arrayCount, totalBytes);
}
void process_system_event(const uint32_t *data, size_t size) override
{
log_debug("system_event: this=%p, size=%zu", this, size);
}
};
class Plugin: public IManaPlugin
{
public:
std::unique_ptr<IManaSink> makeSink() override { return std::make_unique<Sink>(); }
};
MANA_CPP_PLUGIN() { return new Plugin; }

View file

@ -6,11 +6,7 @@
#include <vector>
#include "internal/mana_lib.hpp"
extern "C"
{
#include "internal/rxi/log.h"
}
#include "internal/rxi/log.hpp"
using namespace mesytec::mnode;