diff --git a/CMakeLists.txt b/CMakeLists.txt index fd0ea64..1b8391b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,8 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) include(CMakePackageConfigHelpers) include(GNUInstallDirs) +set(generatedSourcesDir "${CMAKE_BINARY_DIR}/generated") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(CMAKE_CXX_FLAGS_RELEASE "/O2") elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") @@ -47,6 +49,7 @@ find_package(spdlog CONFIG REQUIRED) find_package(libzip CONFIG REQUIRED) find_package(pugixml CONFIG REQUIRED) find_package(Thrift CONFIG REQUIRED) +find_package(CLI11 CONFIG REQUIRED) # ============================================================================== # Targets @@ -57,6 +60,7 @@ if (ECOS_BUILD_CLI OR ECOS_BUILD_TESTS) endif() add_subdirectory(src) +add_subdirectory(tool) if (ECOS_BUILD_CLI) @@ -65,7 +69,6 @@ if (ECOS_BUILD_CLI) GIT_REPOSITORY https://github.com/CLIUtils/CLI11 GIT_TAG v2.2.0 ) - FetchContent_MakeAvailable(cli11) add_subdirectory(cli) @@ -84,7 +87,6 @@ if (ECOS_BUILD_EXAMPLES OR ECOS_BUILD_TESTS) GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_TAG v2.13.8 ) - FetchContent_MakeAvailable(Catch2) enable_testing() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b91df01..e46c321 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,5 +1,4 @@ -set(publicHeaderDir ${CMAKE_SOURCE_DIR}/include) -set(generatedSourcesDir "${CMAKE_BINARY_DIR}/generated") +set(publicHeaderDir ${PROJECT_SOURCE_DIR}/include) add_subdirectory(proxyfmu) @@ -41,6 +40,8 @@ set(privateHeaders "ecos/fmi/fmi_model.hpp" "ecos/fmi/fmi_model_instance.hpp" "ecos/fmi/fmi_model_sub_resolver.hpp" + "ecos/fmi/proxy/proxy_fmu.hpp" + "ecos/fmi/proxy/proxy_slave.hpp" "ecos/fmi/proxy/proxy_model.hpp" "ecos/fmi/proxy/proxy_model_sub_resolver.hpp" @@ -52,10 +53,6 @@ set(privateHeaders "ecos/fmi/fmi2/fmi2_slave.hpp" "ecos/fmi/fmi2/fmi2_model_description.hpp" -# "ecos/proxyfmu/process_helper.hpp" -# "ecos/proxyfmu/remote_info.hpp" -# "ecos/proxyfmu/client/proxy_slave.hpp" - "ecos/ssp/ssp.hpp" "ecos/util/temp_dir.hpp" @@ -68,20 +65,13 @@ set(sources "ecos/logger.cpp" "ecos/model_resolver.cpp" - "ecos/scenario/scenario.cpp" - "ecos/scenario/scenario_loader_xml.cpp" "ecos/simulation.cpp" "ecos/simulation_runner.cpp" + + "ecos/scenario/scenario.cpp" + "ecos/scenario/scenario_loader_xml.cpp" + "ecos/algorithm/fixed_step_algorithm.cpp" - "ecos/fmi/fmi_model_sub_resolver.cpp" - "ecos/fmi/proxy/proxy_model_sub_resolver.cpp" - "ecos/listeners/csv_writer.cpp" - "ecos/listeners/simulation_listener.cpp" - "ecos/ssp/ssp_loader.cpp" - "ecos/structure/simulation_structure.cpp" - "ecos/util/temp_dir.cpp" - "ecos/util/unzipper.cpp" - "ecos/util/uuid.cpp" "ecos/fmi/fmu.cpp" "ecos/fmi/fmi1/fmi1_fmu.cpp" @@ -90,11 +80,23 @@ set(sources "ecos/fmi/fmi2/fmi2_fmu.cpp" "ecos/fmi/fmi2/fmi2_slave.cpp" "ecos/fmi/fmi2/fmi2_model_description.cpp" + "ecos/fmi/fmi_model_sub_resolver.cpp" -# "ecos/proxyfmu/client/proxy_fmu.cpp" -# "ecos/proxyfmu/client/proxy_slave.cpp" + "ecos/fmi/proxy/proxy_model_sub_resolver.cpp" + "ecos/fmi/proxy/proxy_fmu.cpp" + "ecos/fmi/proxy/proxy_slave.cpp" + + "ecos/listeners/csv_writer.cpp" + "ecos/listeners/simulation_listener.cpp" "ecos/ssp/ssp.cpp" + "ecos/ssp/ssp_loader.cpp" + + "ecos/structure/simulation_structure.cpp" + + "ecos/util/temp_dir.cpp" + "ecos/util/unzipper.cpp" + "ecos/util/uuid.cpp" ) @@ -114,6 +116,7 @@ target_include_directories(libecos "$" "$" PRIVATE + "${generatedSourcesDir}" "${SUBPROCESS_INCLUDE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" ) @@ -121,7 +124,7 @@ target_link_libraries(libecos PUBLIC fmt::fmt PRIVATE -# thrift::thrift + thrift::thrift pugixml::pugixml libzip::zip spdlog::spdlog) diff --git a/src/ecos/fmi/fmi2/fmi2_model_description.cpp b/src/ecos/fmi/fmi2/fmi2_model_description.cpp index 2e32b42..4484194 100644 --- a/src/ecos/fmi/fmi2/fmi2_model_description.cpp +++ b/src/ecos/fmi/fmi2/fmi2_model_description.cpp @@ -1,6 +1,8 @@ #include "fmi2_model_description.hpp" +using namespace ecos; + namespace { @@ -54,7 +56,7 @@ std::optional to_scalar_variable(fmi2_import_variable_t* v } // namespace -namespace fmi +namespace ecos::fmi { model_description create_model_description(fmi2_import_t* handle) diff --git a/src/ecos/fmi/fmu.cpp b/src/ecos/fmi/fmu.cpp index 1aa8d1b..d03aef6 100644 --- a/src/ecos/fmi/fmu.cpp +++ b/src/ecos/fmi/fmu.cpp @@ -6,18 +6,18 @@ using namespace ecos; -std::unique_ptr loadFmu(const std::filesystem::path& fmuPath, bool fmiLogging) +std::unique_ptr loadFmu(const std::filesystem::path& fmuPath, bool fmiLogging) { - auto ctx = std::make_unique(fmiLogging); + auto ctx = std::make_unique(fmiLogging); - const std::string fmuName = filesystem::path(fmuPath).stem().string(); + const std::string fmuName = std::filesystem::path(fmuPath).stem().string(); auto tmp = std::make_shared(fmuName); fmi_version_enu_t version = fmi_import_get_fmi_version(ctx->ctx_, fmuPath.string().c_str(), tmp->path().string().c_str()); if (version == fmi_version_1_enu) { - return std::make_unique(std::move(ctx), tmp, fmiLogging); + return std::make_unique(std::move(ctx), tmp, fmiLogging); } else if (version == fmi_version_2_0_enu) { - return std::make_unique(std::move(ctx), tmp, fmiLogging); + return std::make_unique(std::move(ctx), tmp, fmiLogging); } else { // TODO } diff --git a/src/proxyfmu/process_helper.hpp b/src/ecos/fmi/proxy/process_helper.hpp similarity index 100% rename from src/proxyfmu/process_helper.hpp rename to src/ecos/fmi/proxy/process_helper.hpp diff --git a/src/proxyfmu/client/proxy_fmu.cpp b/src/ecos/fmi/proxy/proxy_fmu.cpp similarity index 60% rename from src/proxyfmu/client/proxy_fmu.cpp rename to src/ecos/fmi/proxy/proxy_fmu.cpp index 42ffc73..cb470a5 100644 --- a/src/proxyfmu/client/proxy_fmu.cpp +++ b/src/ecos/fmi/proxy/proxy_fmu.cpp @@ -1,8 +1,8 @@ -#include "proxy_slave.hpp" - #include "proxy_fmu.hpp" +#include "proxy_slave.hpp" + #include "ecos/fmi/fmu.hpp" #include @@ -15,19 +15,19 @@ namespace ecos::proxyfmu proxy_fmu::proxy_fmu(const std::filesystem::path& fmuPath, std::optional remote) : fmuPath_(fmuPath) , remote_(std::move(remote)) - , modelDescription_(fmilibcpp::loadFmu(fmuPath)->get_model_description()) + , modelDescription_(fmi::loadFmu(fmuPath)->get_model_description()) { - if (!exists(fmuPath)) throw std::runtime_error("No such file: " + filesystem::absolute(fmuPath).string() + "!"); + if (!exists(fmuPath)) throw std::runtime_error("No such file: " + std::filesystem::absolute(fmuPath).string() + "!"); } -const fmilibcpp::model_description& proxy_fmu::get_model_description() const +const fmi::model_description& proxy_fmu::get_model_description() const { return modelDescription_; } -std::unique_ptr proxy_fmu::new_instance(const std::string& instanceName) +std::unique_ptr proxy_fmu::new_instance(const std::string& instanceName) { return std::make_unique(fmuPath_, instanceName, modelDescription_, remote_); } -} // namespace proxyfmu::client +} // namespace ecos::proxyfmu diff --git a/src/ecos/fmi/proxy/proxy_fmu.hpp b/src/ecos/fmi/proxy/proxy_fmu.hpp new file mode 100644 index 0000000..5205f0a --- /dev/null +++ b/src/ecos/fmi/proxy/proxy_fmu.hpp @@ -0,0 +1,38 @@ + +#ifndef PROXY_PROXY_FMU_FMU_HPP +#define PROXY_PROXY_FMU_FMU_HPP + +#include "remote_info.hpp" + +#include "ecos/fmi/fmu.hpp" +#include "ecos/fmi/model_description.hpp" +#include "ecos/fmi/slave.hpp" + +#include + +namespace ecos::proxyfmu +{ + +class proxy_fmu : public fmi::fmu +{ + +private: + const std::filesystem::path fmuPath_; + const fmi::model_description modelDescription_; + + const std::optional remote_; + +public: + explicit proxy_fmu(const std::filesystem::path& fmuPath, std::optional remote = std::nullopt); + + [[nodiscard]] const fmi::model_description& get_model_description() const override; + + std::unique_ptr new_instance(const std::string& instanceName) override; + + ~proxy_fmu() override = default; +}; + +} // namespace proxyfmu::client + + +#endif // PROXY_PROXY_FMU_FMU_HPP diff --git a/src/ecos/fmi/proxy/proxy_model.hpp b/src/ecos/fmi/proxy/proxy_model.hpp index ac848f7..9856bb3 100644 --- a/src/ecos/fmi/proxy/proxy_model.hpp +++ b/src/ecos/fmi/proxy/proxy_model.hpp @@ -2,7 +2,7 @@ #ifndef ECOS_PROXY_MODEL_HPP #define ECOS_PROXY_MODEL_HPP -#include "proxyfmu/client/proxy_fmu.hpp" +#include "proxy_fmu.hpp" #include "ecos/fmi/fmi_model_instance.hpp" #include "ecos/model.hpp" @@ -26,7 +26,7 @@ class proxy_model : public model } private: - proxyfmu::client::proxy_fmu fmu_; + proxyfmu::proxy_fmu fmu_; }; } // namespace ecos diff --git a/src/proxyfmu/client/proxy_slave.cpp b/src/ecos/fmi/proxy/proxy_slave.cpp similarity index 82% rename from src/proxyfmu/client/proxy_slave.cpp rename to src/ecos/fmi/proxy/proxy_slave.cpp index 0525e16..49ada51 100644 --- a/src/proxyfmu/client/proxy_slave.cpp +++ b/src/ecos/fmi/proxy/proxy_slave.cpp @@ -1,16 +1,14 @@ #include "proxy_slave.hpp" -#include "../process_helper.hpp" +#include "process_helper.hpp" +#include +#include #include - #include #include #include - -#include -#include #include #include @@ -40,15 +38,15 @@ void read_data(std::string const& fileName, std::string& data) } // namespace -namespace proxyfmu::client +namespace ecos::proxyfmu { proxy_slave::proxy_slave( - const filesystem::path& fmuPath, + const std::filesystem::path& fmuPath, const std::string& instanceName, - fmilibcpp::model_description modelDescription, + fmi::model_description modelDescription, const std::optional& remote) - : fmilibcpp::slave(instanceName) + : fmi::slave(instanceName) , modelDescription_(std::move(modelDescription)) { int port = -1; @@ -72,7 +70,7 @@ proxy_slave::proxy_slave( std::string data; read_data(fmuPath.string(), data); - const std::string fmuName = proxyfmu::filesystem::path(fmuPath).stem().string(); + const std::string fmuName = std::filesystem::path(fmuPath).stem().string(); port = client->loadFromBinaryData(fmuName, instanceName, data); transport->close(); } @@ -91,7 +89,7 @@ proxy_slave::proxy_slave( client_->instantiate(); } -const fmilibcpp::model_description& proxy_slave::get_model_description() const +const fmi::model_description& proxy_slave::get_model_description() const { return modelDescription_; } @@ -132,7 +130,7 @@ bool proxy_slave::reset() return status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::get_integer(const std::vector& vr, std::vector& values) +bool proxy_slave::get_integer(const std::vector& vr, std::vector& values) { IntegerRead read; const ValueReferences _vr = std::vector(vr.begin(), vr.end()); @@ -143,7 +141,7 @@ bool proxy_slave::get_integer(const std::vector& vr, std:: return read.status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::get_real(const std::vector& vr, std::vector& values) +bool proxy_slave::get_real(const std::vector& vr, std::vector& values) { assert(values.size() == vr.size()); RealRead read; @@ -155,7 +153,7 @@ bool proxy_slave::get_real(const std::vector& vr, std::vec return read.status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::get_string(const std::vector& vr, std::vector& values) +bool proxy_slave::get_string(const std::vector& vr, std::vector& values) { assert(values.size() == vr.size()); StringRead read; @@ -167,7 +165,7 @@ bool proxy_slave::get_string(const std::vector& vr, std::v return read.status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::get_boolean(const std::vector& vr, std::vector& values) +bool proxy_slave::get_boolean(const std::vector& vr, std::vector& values) { assert(values.size() == vr.size()); BooleanRead read; @@ -179,7 +177,7 @@ bool proxy_slave::get_boolean(const std::vector& vr, std:: return read.status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::set_integer(const std::vector& vr, const std::vector& values) +bool proxy_slave::set_integer(const std::vector& vr, const std::vector& values) { assert(values.size() == vr.size()); const ValueReferences _vr = std::vector(vr.begin(), vr.end()); @@ -187,7 +185,7 @@ bool proxy_slave::set_integer(const std::vector& vr, const return status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::set_real(const std::vector& vr, const std::vector& values) +bool proxy_slave::set_real(const std::vector& vr, const std::vector& values) { assert(values.size() == vr.size()); const ValueReferences _vr = std::vector(vr.begin(), vr.end()); @@ -195,7 +193,7 @@ bool proxy_slave::set_real(const std::vector& vr, const st return status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::set_string(const std::vector& vr, const std::vector& values) +bool proxy_slave::set_string(const std::vector& vr, const std::vector& values) { assert(values.size() == vr.size()); const ValueReferences _vr = std::vector(vr.begin(), vr.end()); @@ -203,7 +201,7 @@ bool proxy_slave::set_string(const std::vector& vr, const return status == ::proxyfmu::thrift::Status::type::OK_STATUS; } -bool proxy_slave::set_boolean(const std::vector& vr, const std::vector& values) +bool proxy_slave::set_boolean(const std::vector& vr, const std::vector& values) { assert(values.size() == vr.size()); const ValueReferences _vr = std::vector(vr.begin(), vr.end()); @@ -225,4 +223,4 @@ proxy_slave::~proxy_slave() proxy_slave::freeInstance(); } -} // namespace proxyfmu::client +} // namespace ecos::proxyfmu diff --git a/src/ecos/fmi/proxy/proxy_slave.hpp b/src/ecos/fmi/proxy/proxy_slave.hpp new file mode 100644 index 0000000..38650dc --- /dev/null +++ b/src/ecos/fmi/proxy/proxy_slave.hpp @@ -0,0 +1,66 @@ + +#ifndef PROXY_FMU_PROXY_SLAVE_HPP +#define PROXY_FMU_PROXY_SLAVE_HPP + +#include "proxyfmu/thrift/FmuService.h" +#include "remote_info.hpp" + +#include "ecos/fmi/slave.hpp" + +#include +#include +#include + +using namespace proxyfmu::thrift; +using namespace apache::thrift; +using namespace apache::thrift::transport; + +namespace ecos::proxyfmu +{ + +class proxy_slave : public fmi::slave +{ + +private: + const fmi::model_description modelDescription_; + std::shared_ptr client_; + std::shared_ptr transport_; + std::unique_ptr thread_; + + bool freed = false; + +public: + proxy_slave( + const std::filesystem::path& fmuPath, + const std::string& instanceName, + fmi::model_description modelDescription, + const std::optional& remote); + + [[nodiscard]] const fmi::model_description& get_model_description() const override; + + bool setup_experiment(double start_time, double stop_time, double tolerance) override; + bool enter_initialization_mode() override; + bool exit_initialization_mode() override; + + bool step(double current_time, double step_size) override; + + bool reset() override; + bool terminate() override; + void freeInstance() override; + + bool get_integer(const std::vector& vr, std::vector& values) override; + bool get_real(const std::vector& vr, std::vector& values) override; + bool get_string(const std::vector& vr, std::vector& values) override; + bool get_boolean(const std::vector& vr, std::vector& values) override; + + bool set_integer(const std::vector& vr, const std::vector& values) override; + bool set_real(const std::vector& vr, const std::vector& values) override; + bool set_string(const std::vector& vr, const std::vector& values) override; + bool set_boolean(const std::vector& vr, const std::vector& values) override; + + ~proxy_slave() override; +}; + +} // namespace ecos::proxyfmu + +#endif // PROXY_FMU_PROXY_SLAVE_HPP diff --git a/src/proxyfmu/remote_info.hpp b/src/ecos/fmi/proxy/remote_info.hpp similarity index 95% rename from src/proxyfmu/remote_info.hpp rename to src/ecos/fmi/proxy/remote_info.hpp index 9f4a648..ceeb42b 100644 --- a/src/proxyfmu/remote_info.hpp +++ b/src/ecos/fmi/proxy/remote_info.hpp @@ -5,7 +5,7 @@ #include #include -namespace proxyfmu +namespace ecos::proxyfmu { class remote_info diff --git a/src/proxyfmu/CMakeLists.txt b/src/proxyfmu/CMakeLists.txt index a6df341..9dfd746 100644 --- a/src/proxyfmu/CMakeLists.txt +++ b/src/proxyfmu/CMakeLists.txt @@ -48,62 +48,6 @@ add_library(proxyfmu-service OBJECT ${thriftGenerated}) target_link_libraries(proxyfmu-service PUBLIC thrift::thrift) #set_target_properties(proxyfmu-service PROPERTIES POSITION_INDEPENDENT_CODE ON) - - -set(commonPublicHeaders - - "proxyfmu/remote_info.hpp" - - ) - -set(commonPublicHeadersFull) -foreach (header IN LISTS commonPublicHeaders) - list(APPEND commonPublicHeadersFull "${publicHeaderDir}/${header}") -endforeach () - -set(clientPublicHeaders - "proxyfmu/client/proxy_fmu.hpp") - -set(clientPrivateHeaders - "proxyfmu/process_helper.hpp" - "proxyfmu/client/proxy_slave.hpp") - -set(clientSources - "proxyfmu/client/proxy_slave.cpp" - "proxyfmu/client/proxy_fmu.cpp") - -set(clientPublicHeadersFull) -foreach (header IN LISTS clientPublicHeaders) - list(APPEND clientPublicHeadersFull "${publicHeaderDir}/${header}") -endforeach () - - -add_library(proxyfmu-client ${commonPublicHeadersFull} ${clientPublicHeadersFull} ${clientPrivateHeaders} ${clientSources} "$") -add_library(proxyfmu::proxy-client ALIAS proxyfmu-client) -target_compile_features(proxyfmu-client PUBLIC "cxx_std_17") - -target_include_directories(proxyfmu-client - PUBLIC - "$" - "$" - PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}" - "${generatedSourcesDir}" - "${SUBPROCESS_INCLUDE_DIR}" - ) -target_link_libraries(proxyfmu-client - PUBLIC - fmilibcpp::fmilibcpp - PRIVATE - thrift::thrift - ) -if (UNIX) - target_link_libraries(proxyfmu-client PRIVATE pthread) -endif () - -# Make sure executable is up to date -add_dependencies(proxyfmu-client proxyfmu) - # ============================================================================== # Installation rules # ============================================================================== diff --git a/src/proxyfmu/client/proxy_fmu.hpp b/src/proxyfmu/client/proxy_fmu.hpp deleted file mode 100644 index 564609a..0000000 --- a/src/proxyfmu/client/proxy_fmu.hpp +++ /dev/null @@ -1,39 +0,0 @@ - -#ifndef PROXY_PROXY_FMU_FMU_HPP -#define PROXY_PROXY_FMU_FMU_HPP - -#include -#include - -#include -#include -#include - -#include - -namespace proxyfmu::client -{ - -class proxy_fmu : public fmilibcpp::fmu -{ - -private: - const filesystem::path fmuPath_; - const fmilibcpp::model_description modelDescription_; - - const std::optional remote_; - -public: - explicit proxy_fmu(const filesystem::path& fmuPath, std::optional remote = std::nullopt); - - [[nodiscard]] const fmilibcpp::model_description& get_model_description() const override; - - std::unique_ptr new_instance(const std::string& instanceName) override; - - ~proxy_fmu() override = default; -}; - -} // namespace proxyfmu::client - - -#endif // PROXY_PROXY_FMU_FMU_HPP diff --git a/src/proxyfmu/client/proxy_slave.hpp b/src/proxyfmu/client/proxy_slave.hpp deleted file mode 100644 index b79eaaa..0000000 --- a/src/proxyfmu/client/proxy_slave.hpp +++ /dev/null @@ -1,64 +0,0 @@ - -#ifndef PROXY_FMU_PROXY_SLAVE_HPP -#define PROXY_FMU_PROXY_SLAVE_HPP - -#include "ecos/proxyfmu/remote_info.hpp" -#include "ecos/proxyfmu/FmuService.h" - -#include "ecos/fmi/slave.hpp" - -#include -#include - -using namespace apache::thrift; -using namespace apache::thrift::transport; - -namespace proxyfmu::client -{ - -class proxy_slave : public fmilibcpp::slave -{ - -private: - const fmilibcpp::model_description modelDescription_; - std::shared_ptr client_; - std::shared_ptr transport_; - std::unique_ptr thread_; - - bool freed = false; - -public: - proxy_slave( - const filesystem::path& fmuPath, - const std::string& instanceName, - fmilibcpp::model_description modelDescription, - const std::optional& remote); - - [[nodiscard]] const fmilibcpp::model_description& get_model_description() const override; - - bool setup_experiment(double start_time, double stop_time, double tolerance) override; - bool enter_initialization_mode() override; - bool exit_initialization_mode() override; - - bool step(double current_time, double step_size) override; - - bool reset() override; - bool terminate() override; - void freeInstance() override; - - bool get_integer(const std::vector& vr, std::vector& values) override; - bool get_real(const std::vector& vr, std::vector& values) override; - bool get_string(const std::vector& vr, std::vector& values) override; - bool get_boolean(const std::vector& vr, std::vector& values) override; - - bool set_integer(const std::vector& vr, const std::vector& values) override; - bool set_real(const std::vector& vr, const std::vector& values) override; - bool set_string(const std::vector& vr, const std::vector& values) override; - bool set_boolean(const std::vector& vr, const std::vector& values) override; - - ~proxy_slave() override; -}; - -} // namespace proxyfmu::client - -#endif // PROXY_FMU_PROXY_SLAVE_HPP diff --git a/tests/test_controlled_temp.cpp b/tests/test_controlled_temp.cpp index 9bbe825..3aec616 100644 --- a/tests/test_controlled_temp.cpp +++ b/tests/test_controlled_temp.cpp @@ -1,9 +1,9 @@ #define CATCH_CONFIG_MAIN #include -#include +#include "ecos/fmi/fmu.hpp" -using namespace fmilibcpp; +using namespace ecos::fmi; namespace { diff --git a/tests/test_identity.cpp b/tests/test_identity.cpp index 143caef..318ef7f 100644 --- a/tests/test_identity.cpp +++ b/tests/test_identity.cpp @@ -1,14 +1,14 @@ #define CATCH_CONFIG_MAIN #include -#include +#include -using namespace fmilibcpp; +using namespace ecos; namespace { -void test(fmu& fmu) +void test(fmi::fmu& fmu) { const auto d = fmu.get_model_description(); CHECK(d.modelName == "no.viproma.demo.identity"); @@ -21,7 +21,7 @@ void test(fmu& fmu) REQUIRE(slave->enter_initialization_mode()); REQUIRE(slave->exit_initialization_mode()); - std::vector vr{0}; + std::vector vr{0}; std::vector realVal{0.0}; std::vector integerVal{0}; @@ -72,6 +72,6 @@ void test(fmu& fmu) TEST_CASE("fmi_test_identity") { std::string fmuPath = std::string(DATA_FOLDER) + "/fmus/1.0/identity.fmu"; - auto fmu = loadFmu(fmuPath); + auto fmu = fmi::loadFmu(fmuPath); test(*fmu); } diff --git a/tool/CMakeLists.txt b/tool/CMakeLists.txt index 8a211cf..f192fb0 100644 --- a/tool/CMakeLists.txt +++ b/tool/CMakeLists.txt @@ -4,16 +4,17 @@ add_executable(proxyfmu "handlers/fmu_service_handler.cpp" "handlers/boot_service_handler.cpp" "$" - "${generatedSourcesDir}/proxyfmu/lib_info.cpp") + "${generatedSourcesDir}/ecos/lib_info.cpp") target_include_directories(proxyfmu PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" - "${CMAKE_SOURCE_DIR}/include" - "${CMAKE_SOURCE_DIR}/src" + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_SOURCE_DIR}/src" "${SUBPROCESS_INCLUDE_DIR}" "${generatedSourcesDir}") target_link_libraries(proxyfmu PRIVATE + libecos CLI11::CLI11 thrift::thrift ) diff --git a/tool/handlers/boot_service_handler.cpp b/tool/handlers/boot_service_handler.cpp index 34df5da..62cd5b3 100644 --- a/tool/handlers/boot_service_handler.cpp +++ b/tool/handlers/boot_service_handler.cpp @@ -1,7 +1,7 @@ #include "handlers/boot_service_handler.hpp" -#include +#include "ecos/fmi/proxy/process_helper.hpp" #include #include @@ -22,7 +22,7 @@ void write_data(std::string const& fileName, std::string const& data) int32_t boot_service_handler::loadFromBinaryData(const std::string& fmuName, const std::string& instanceName, const std::string& data) { - auto tmp = std::make_unique(fmuName); + auto tmp = std::make_unique(fmuName); std::string fmuPath(tmp->path().string() + "/" + fmuName + ".fmu"); write_data(fmuPath, data); @@ -30,12 +30,12 @@ int32_t boot_service_handler::loadFromBinaryData(const std::string& fmuName, con int port = -1; std::mutex mtx; std::condition_variable cv; - auto t = std::make_unique(&start_process, fmuPath, instanceName, std::ref(port), std::ref(mtx), std::ref(cv)); + auto t = std::make_unique(&ecos::proxyfmu::start_process, fmuPath, instanceName, std::ref(port), std::ref(mtx), std::ref(cv)); processes_.emplace_back(std::move(t)); dirs_.emplace_back(std::move(tmp)); std::unique_lock lck(mtx); - while (port == -1) cv.wait(lck); + cv.wait(lck, [&port]{return port != -1;}); return port; } diff --git a/tool/handlers/boot_service_handler.hpp b/tool/handlers/boot_service_handler.hpp index 20876fd..911b7f8 100644 --- a/tool/handlers/boot_service_handler.hpp +++ b/tool/handlers/boot_service_handler.hpp @@ -2,7 +2,7 @@ #ifndef PROXYFMU_BOOT_SERVICE_HANDLER_HPP #define PROXYFMU_BOOT_SERVICE_HANDLER_HPP -#include "temp_dir.hpp" +#include "ecos/util/temp_dir.hpp" #include @@ -17,7 +17,7 @@ class boot_service_handler : virtual public thrift::BootServiceIf { private: - std::vector> dirs_; + std::vector> dirs_; std::vector> processes_; public: diff --git a/tool/handlers/fmu_service_handler.cpp b/tool/handlers/fmu_service_handler.cpp index 93cdd80..ecd1e91 100644 --- a/tool/handlers/fmu_service_handler.cpp +++ b/tool/handlers/fmu_service_handler.cpp @@ -4,6 +4,7 @@ #include #include +using namespace ecos; using namespace proxyfmu::thrift; using namespace proxyfmu::server; @@ -19,7 +20,7 @@ fmu_service_handler::fmu_service_handler( void fmu_service_handler::instantiate() { - auto fmu = fmilibcpp::loadFmu(fmuPath_); + auto fmu = fmi::loadFmu(fmuPath_); modelName_ = fmu->get_model_description().modelName; slave_ = fmu->new_instance(instanceName_); } @@ -61,7 +62,7 @@ Status::type fmu_service_handler::reset() void fmu_service_handler::read_integer(IntegerRead& _return, const ValueReferences& vr) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); _return.value.resize(vr.size()); auto status = slave_->get_integer(_vr, _return.value); _return.status = status ? Status::OK_STATUS : Status::ERROR_STATUS; @@ -69,7 +70,7 @@ void fmu_service_handler::read_integer(IntegerRead& _return, const ValueReferenc void fmu_service_handler::read_real(RealRead& _return, const ValueReferences& vr) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); _return.value.resize(vr.size()); auto status = slave_->get_real(_vr, _return.value); _return.status = status ? Status::OK_STATUS : Status::ERROR_STATUS; @@ -78,7 +79,7 @@ void fmu_service_handler::read_real(RealRead& _return, const ValueReferences& vr void fmu_service_handler::read_string(StringRead& _return, const ValueReferences& vr) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); _return.value.resize(vr.size()); auto status = slave_->get_string(_vr, _return.value); _return.status = status ? Status::OK_STATUS : Status::ERROR_STATUS; @@ -86,7 +87,7 @@ void fmu_service_handler::read_string(StringRead& _return, const ValueReferences void fmu_service_handler::read_boolean(BooleanRead& _return, const ValueReferences& vr) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); _return.value.resize(vr.size()); auto status = slave_->get_boolean(_vr, _return.value); _return.status = status ? Status::OK_STATUS : Status::ERROR_STATUS; @@ -94,21 +95,21 @@ void fmu_service_handler::read_boolean(BooleanRead& _return, const ValueReferenc Status::type fmu_service_handler::write_integer(const ValueReferences& vr, const IntArray& value) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); auto status = slave_->set_integer(_vr, value); return status ? Status::OK_STATUS : Status::ERROR_STATUS; } Status::type fmu_service_handler::write_real(const ValueReferences& vr, const RealArray& value) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); auto status = slave_->set_real(_vr, value); return status ? Status::OK_STATUS : Status::ERROR_STATUS; } Status::type fmu_service_handler::write_string(const ValueReferences& vr, const StringArray& value) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); auto status = slave_->set_string(_vr, value); return status ? Status::OK_STATUS : Status::ERROR_STATUS; } @@ -116,7 +117,7 @@ Status::type fmu_service_handler::write_string(const ValueReferences& vr, const Status::type fmu_service_handler::write_boolean(const ValueReferences& vr, const BooleanArray& value) { - const std::vector _vr(vr.begin(), vr.end()); + const std::vector _vr(vr.begin(), vr.end()); auto status = slave_->set_boolean(_vr, value); return status ? Status::OK_STATUS : Status::ERROR_STATUS; } diff --git a/tool/handlers/fmu_service_handler.hpp b/tool/handlers/fmu_service_handler.hpp index 80af81c..380198c 100644 --- a/tool/handlers/fmu_service_handler.hpp +++ b/tool/handlers/fmu_service_handler.hpp @@ -2,9 +2,9 @@ #ifndef PROXY_FMU_FMUSERVICEHANDLER_HPP #define PROXY_FMU_FMUSERVICEHANDLER_HPP -#include +#include "proxyfmu/thrift/FmuService.h" -#include +#include "ecos/fmi/fmu.hpp" #include @@ -20,7 +20,7 @@ class fmu_service_handler : virtual public thrift::FmuServiceIf const std::string& fmuPath_; const std::string& instanceName_; - std::unique_ptr slave_; + std::unique_ptr slave_; std::function stop_; diff --git a/tool/proxyfmu.cpp b/tool/proxyfmu.cpp index ee1d28c..3dacc8e 100644 --- a/tool/proxyfmu.cpp +++ b/tool/proxyfmu.cpp @@ -3,15 +3,14 @@ #include "handlers/boot_service_handler.hpp" #include "handlers/fmu_service_handler.hpp" -#include +#include "ecos/lib_info.hpp" #include +#include +#include #include #include #include - -#include -#include #include using namespace proxyfmu::thrift; @@ -75,7 +74,7 @@ int run_application(const std::string& fmu, const std::string& instanceName) std::shared_ptr transportFactory(new TFramedTransportFactory()); std::shared_ptr protocolFactory(new TBinaryProtocolFactory()); - proxyfmu::fixed_range_random_generator rng(port_range_min, port_range_max); + fixed_range_random_generator rng(port_range_min, port_range_max); int port; int final_port = -1; @@ -140,8 +139,7 @@ int printHelp(CLI::App& desc) std::string version() { - - const auto v = proxyfmu::library_version(); + const auto v = ecos::library_version(); std::stringstream ss; ss << "v" << v.major << "." << v.minor << "." << v.patch; return ss.str(); @@ -176,9 +174,9 @@ int main(int argc, char** argv) } else { const auto fmu = app["--fmu"]->as(); - const auto fmuPath = proxyfmu::filesystem::path(fmu); - if (!proxyfmu::filesystem::exists(fmuPath)) { - std::cerr << "[proxyfmu] No such file: '" << proxyfmu::filesystem::absolute(fmuPath) << "'"; + const auto fmuPath = std::filesystem::path(fmu); + if (!std::filesystem::exists(fmuPath)) { + std::cerr << "[proxyfmu] No such file: '" << std::filesystem::absolute(fmuPath) << "'"; return COMMANDLINE_ERROR; }