mana: add cpp plugin interface and test plugin
This commit is contained in:
parent
aa9d21d81c
commit
a9bfcf151c
5 changed files with 119 additions and 38 deletions
|
@ -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
62
src/internal/mana_api.hpp
Normal 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 */
|
|
@ -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
|
||||
{
|
||||
|
|
51
src/mana_plugin_cpp_test.cc
Normal file
51
src/mana_plugin_cpp_test.cc
Normal 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; }
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue