diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 77088fe..a5d02a0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/internal/mana_api.hpp b/src/internal/mana_api.hpp new file mode 100644 index 0000000..f9d3ffb --- /dev/null +++ b/src/internal/mana_api.hpp @@ -0,0 +1,62 @@ +#ifndef A042D3CF_5927_42A2_93FF_E49E940B32BD +#define A042D3CF_5927_42A2_93FF_E49E940B32BD + +#include +#include +#include +#include + +#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 void init(StringHolder args) + { + std::vector 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 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 */ diff --git a/src/internal/mana_lib.hpp b/src/internal/mana_lib.hpp index 7a81e35..db4074d 100644 --- a/src/internal/mana_lib.hpp +++ b/src/internal/mana_lib.hpp @@ -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 #include #include @@ -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 void init(StringHolder args) - { - std::vector 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 { diff --git a/src/mana_plugin_cpp_test.cc b/src/mana_plugin_cpp_test.cc new file mode 100644 index 0000000..4902b1b --- /dev/null +++ b/src/mana_plugin_cpp_test.cc @@ -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 makeSink() override { return std::make_unique(); } +}; + +MANA_CPP_PLUGIN() { return new Plugin; } diff --git a/src/mana_plugin_root_histogram.cc b/src/mana_plugin_root_histogram.cc index 11fdea0..684d11c 100644 --- a/src/mana_plugin_root_histogram.cc +++ b/src/mana_plugin_root_histogram.cc @@ -6,11 +6,7 @@ #include #include "internal/mana_lib.hpp" - -extern "C" -{ -#include "internal/rxi/log.h" -} +#include "internal/rxi/log.hpp" using namespace mesytec::mnode;