diff --git a/CMakeLists.txt b/CMakeLists.txt index 7045633..b82c5c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,14 @@ if(LIBICSNEO_BUILD_EXAMPLES) add_subdirectory(examples) endif() +# Extensions +set(LIBICSNEO_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +foreach(EXT_PATH ${LIBICSNEO_EXTENSION_DIRS}) + get_filename_component(EXT_DIR ${EXT_PATH} NAME) + message("Adding extension " ${EXT_DIR}) + add_subdirectory(${EXT_PATH} ${CMAKE_CURRENT_BINARY_DIR}/${EXT_DIR}) +endforeach() + set(SRC_FILES communication/message/flexray/control/flexraycontrolmessage.cpp communication/message/neomessage.cpp @@ -165,6 +173,18 @@ endif() configure_file(api/icsneocpp/buildinfo.h.template ${CMAKE_CURRENT_BINARY_DIR}/generated/buildinfo.h) configure_file(api/icsneoc/version.rc.template ${CMAKE_CURRENT_BINARY_DIR}/generated/icsneoc/version.rc) + +foreach(EXTINC ${LIBICSNEO_EXTENSION_INCLUDES}) + message("Including " ${EXTINC}) + list(APPEND LIBICSNEO_EXT_CODE_INCS_LIST "#include \"${EXTINC}\"") +endforeach() +list(JOIN LIBICSNEO_EXT_CODE_INCS_LIST "\n" LIBICSNEO_EXT_CODE_INCS) +foreach(EXTCLASS ${LIBICSNEO_EXTENSION_CLASSES}) + list(APPEND LIBICSNEO_EXT_CODE_LIST "device->addExtension(std::make_shared<${EXTCLASS}>(*device))\;") +endforeach() +list(JOIN LIBICSNEO_EXT_CODE_LIST "\n\t" LIBICSNEO_EXT_CODE) +configure_file(include/icsneo/device/extensions/builtin.h.template ${CMAKE_CURRENT_BINARY_DIR}/generated/extensions/builtin.h) + include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) add_library(icsneocpp @@ -174,15 +194,19 @@ add_library(icsneocpp api/icsneocpp/version.cpp ${SRC_FILES} ) +message("Include paths " ${LIBICSNEO_EXTENSION_INCLUDE_PATHS}) target_include_directories(icsneocpp PUBLIC $ $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + ${LIBICSNEO_EXTENSION_INCLUDE_PATHS} ) set_property(TARGET icsneocpp PROPERTY POSITION_INDEPENDENT_CODE ON) target_compile_features(icsneocpp PUBLIC cxx_auto_type cxx_constexpr cxx_lambdas cxx_nullptr cxx_range_for cxx_rvalue_references cxx_sizeof_member cxx_strong_enums) +message("Loaded extensions: " ${LIBICSNEO_EXTENSION_TARGETS}) +target_link_libraries(icsneocpp PUBLIC ${LIBICSNEO_EXTENSION_TARGETS}) # libftdi if(NOT WIN32) diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index 9215058..ba6ffa5 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -1,5 +1,6 @@ #include "icsneo/device/devicefinder.h" #include "icsneo/platform/devices.h" +#include "generated/extensions/builtin.h" using namespace icsneo; @@ -245,6 +246,10 @@ std::vector> DeviceFinder::FindAll() { foundDevices.insert(foundDevices.end(), std::make_move_iterator(results.begin()), std::make_move_iterator(results.end())); } + for(auto& device : foundDevices) { + AddBuiltInExtensionsTo(device); + } + return foundDevices; } diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 0cb78ad..08be7ae 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -157,6 +157,8 @@ public: virtual std::vector> getFlexRayControllers() const { return {}; } + void addExtension(std::shared_ptr&& extension); + /** * For use by extensions only. */ @@ -248,7 +250,6 @@ protected: virtual void setupSupportedTXNetworks(std::vector&) {} virtual void setupExtensions() {} - void addExtension(std::shared_ptr&& extension); // Hook for devices such as FIRE which need to inject traffic before RequestSerialNumber // Return false to bail diff --git a/include/icsneo/device/extensions/builtin.h.template b/include/icsneo/device/extensions/builtin.h.template new file mode 100644 index 0000000..985983a --- /dev/null +++ b/include/icsneo/device/extensions/builtin.h.template @@ -0,0 +1,16 @@ +#ifndef __ICSNEO_DEVICE_EXTENSIONS_BUILTIN_H_ +#define __ICSNEO_DEVICE_EXTENSIONS_BUILTIN_H_ + +@LIBICSNEO_EXT_CODE_INCS@ +#include "icsneo/device/device.h" +#include + +namespace icsneo { + +static void AddBuiltInExtensionsTo([[maybe_unused]] const std::shared_ptr& device) { + @LIBICSNEO_EXT_CODE@ +} + +} + +#endif \ No newline at end of file