Sorry for the late reply.
Of course it is possible to register several flatbuffers in one app. I adapted the registernode example of the SDK for ctrlx AUTOMATION in version 1.10:
Added new schema file "mysampleSchema.fbs:Copy
// IDL file for sample schema.
namespace mysample.myschema;
table InertialValue { x:short; y:short; z:short; a:short;}
root_type InertialValue;β
Extended CMakeLists.txt:Copy
...
# Flatbuffers
set (FLATBUFFERS_FLATC_EXECUTABLE ${USER_DEPENDENCY_DIR}/bin/oss.flatbuffers/linux-gcc-x64/release/flatc)
set (FLATBUFFERS_INCLUDE_DIR ${USER_DEPENDENCY_DIR}/include/oss.flatbuffers/oss.flatbuffers)
include (${USER_DEPENDENCY_DIR}/cmake/oss.flatbuffers/FindFlatBuffers.cmake)
set( FLATBUFFERS_FLATC_SCHEMA_EXTRA_ARGS "--gen-object-api")
build_flatbuffers("sampleSchema.fbs" "" "registernodeflatbuffers" "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/bfbs" "")
build_flatbuffers("mysampleSchema.fbs" "" "myregisternodeflatbuffers" "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/bfbs" "")
...β
# Define Executables to add from project files and their depending source files
add_executable( ${TARGET_PROJECT_NAME} ${SOURCE_FILES_REGISTERNODE} )
add_dependencies(${TARGET_PROJECT_NAME} registernodeflatbuffers)
add_dependencies(${TARGET_PROJECT_NAME} myregisternodeflatbuffers)
Adapted main.cpp:Copy
...
#include "sampleSchema_generated.h"
#include "mysampleSchema_generated.h"
...
// Read function of metadata of an object. Function will be called whenever a node should be written.
virtual void onMetadata(const std::string &address, const comm::datalayer::IProviderNode::ResponseCallback &callback) override {
flatbuffers::FlatBufferBuilder builder;
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<comm::datalayer::Reference>>> references;
flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<comm::datalayer::Reference>>> references2;
auto emptyString = builder.CreateString("This is a Description");
if (address.compare("myData/myFlatbuffer") == 0) {
flatbuffers::Offset<comm::datalayer::Reference> vecReferences[] = {
comm::datalayer::CreateReferenceDirect(builder, "readType", "types/sampleSchema/inertialValue"), };
references = builder.CreateVectorOfSortedTables(vecReferences, 1); }
else if (address.compare("myData/myFlatbuffer2") == 0) {
flatbuffers::Offset<comm::datalayer::Reference> vecReferences[] = {
comm::datalayer::CreateReferenceDirect(builder, "readType", "types/mysampleSchema/inertialValue"), };
references2 = builder.CreateVectorOfSortedTables(vecReferences, 1); }
// Set allowed operations
comm::datalayer::AllowedOperationsBuilder allowedOperations(builder);
allowedOperations.add_read(true);
allowedOperations.add_write(false);
allowedOperations.add_create(true);
allowedOperations.add_delete_(false);
auto operations = allowedOperations.Finish();
// Create metadata
comm::datalayer::MetadataBuilder metadata(builder);
metadata.add_description(emptyString);
metadata.add_descriptionUrl(emptyString);
metadata.add_operations(operations);
if (address.compare("myData/myFlatbuffer") == 0) {
metadata.add_references(references); }
else if (address.compare("myData/myFlatbuffer2") == 0) {
metadata.add_references(references2); }
auto metaFinished = metadata.Finish();
builder.Finish(metaFinished);
β
...
// Create dummy flatbuffer data
flatbuffers::FlatBufferBuilder builder2;
auto actInertialValue2 = mysample::myschema::CreateInertialValue(builder2, 33, -427, 911, 42);
builder2.Finish(actInertialValue2);
comm::datalayer::Variant myFlatbuffer2;
myFlatbuffer2.shareFlatbuffers(builder2);
// Register type of flatbuffer value
// If running on SNAP environment, use $SNAP environment variable for register the bfbs
std::string bfbsPath2 = getenv("SNAP") != nullptr ? getenv("SNAP") : "bfbs";
bfbsPath2 += "/sampleSchema.bfbs";
std::cout << bfbsPath2 << std::endl;
result = myProvider->registerType("types/mysampleSchema/inertialValue", bfbsPath2);
if(STATUS_FAILED(result)) {
std::cout << "Register type 'types/mysampleSchema/inertialValue' failed with: " << result.toString() << std::endl; }
else {
std::cout << "Register type 'types/mysampleSchema/inertialValue' was successful!" << std::endl; }
// Register a node as flatbuffer value
result = myProvider->registerNode("myData/myFlatbuffer2", new MyProviderNode(myFlatbuffer2));
if(STATUS_FAILED(result)) {
std::cout << "Register node 'myData/myFlatbuffer2' failed with: " << result.toString() << std::endl; }
else {
std::cout << "Register node 'myData/myFlatbuffer2' was successful!" << std::endl; }
...
// Unregister type and nodes
myProvider->unregisterType("types/sampleSchema/inertialValue");
myProvider->unregisterType("types/mysampleSchema/inertialValue");
...
Run application:
β