|
| 1 | + |
| 2 | +#ifndef IDENTITY_HPP |
| 3 | +#define IDENTITY_HPP |
| 4 | + |
| 5 | +#include <fmu4cpp/fmu_base.hpp> |
| 6 | + |
| 7 | +using namespace fmu4cpp; |
| 8 | + |
| 9 | +class Model : public fmu_base { |
| 10 | + |
| 11 | +public: |
| 12 | + FMU4CPP_CTOR(Model) { |
| 13 | + |
| 14 | + register_variable(integer( |
| 15 | + "integerIn", &state_.integer_) |
| 16 | + .setCausality(causality_t::INPUT) |
| 17 | + .setVariability(variability_t::DISCRETE)); |
| 18 | + register_variable( |
| 19 | + real( |
| 20 | + "realIn", &state_.real_) |
| 21 | + .setCausality(causality_t::INPUT) |
| 22 | + .setVariability(variability_t::DISCRETE)); |
| 23 | + |
| 24 | + register_variable(boolean( |
| 25 | + "booleanIn", &state_.boolean_) |
| 26 | + .setCausality(causality_t::INPUT) |
| 27 | + .setVariability(variability_t::DISCRETE)); |
| 28 | + |
| 29 | + register_variable(string( |
| 30 | + "stringIn", &state_.string_) |
| 31 | + .setCausality(causality_t::INPUT) |
| 32 | + .setVariability(variability_t::DISCRETE)); |
| 33 | + |
| 34 | + register_variable(integer("integerOut", &state_.integer_) |
| 35 | + .setCausality(causality_t::OUTPUT) |
| 36 | + .setVariability(variability_t::DISCRETE) |
| 37 | + .setInitial(initial_t::CALCULATED) |
| 38 | + .setDependencies({"integerIn"})); |
| 39 | + |
| 40 | + register_variable(real("realOut", &state_.real_) |
| 41 | + .setCausality(causality_t::OUTPUT) |
| 42 | + .setVariability(variability_t::DISCRETE) |
| 43 | + .setInitial(initial_t::CALCULATED) |
| 44 | + .setDependencies({"realIn"})); |
| 45 | + |
| 46 | + register_variable(boolean("booleanOut", &state_.boolean_) |
| 47 | + .setCausality(causality_t::OUTPUT) |
| 48 | + .setVariability(variability_t::DISCRETE) |
| 49 | + .setInitial(initial_t::CALCULATED) |
| 50 | + .setDependencies({"booleanIn"})); |
| 51 | + |
| 52 | + register_variable(string("stringOut", &state_.string_) |
| 53 | + .setCausality(causality_t::OUTPUT) |
| 54 | + .setVariability(variability_t::DISCRETE) |
| 55 | + .setInitial(initial_t::CALCULATED) |
| 56 | + .setDependencies({"stringIn"})); |
| 57 | + |
| 58 | + Model::reset(); |
| 59 | + } |
| 60 | + |
| 61 | + bool do_step(double dt) override { |
| 62 | + log(fmiOK, "hello@ " + std::to_string(currentTime())); |
| 63 | + return true; |
| 64 | + } |
| 65 | + |
| 66 | + void *getFMUState() override { |
| 67 | + auto* state = new State(state_); |
| 68 | + return state; |
| 69 | + } |
| 70 | + |
| 71 | + void setFmuState(void *state) override { |
| 72 | + state_ = *static_cast<State *>(state); |
| 73 | + } |
| 74 | + |
| 75 | + void freeFmuState(void **state) override { |
| 76 | + delete static_cast<State *>(*state); |
| 77 | + *state = nullptr; |
| 78 | + } |
| 79 | + |
| 80 | + void reset() override { |
| 81 | + state_.reset(); |
| 82 | + } |
| 83 | + |
| 84 | +private: |
| 85 | + |
| 86 | + struct State { |
| 87 | + int integer_{}; |
| 88 | + double real_{}; |
| 89 | + bool boolean_{}; |
| 90 | + std::string string_{}; |
| 91 | + |
| 92 | + void reset() { |
| 93 | + integer_ = 0; |
| 94 | + real_ = 0; |
| 95 | + boolean_ = false; |
| 96 | + string_ = "empty"; |
| 97 | + } |
| 98 | + }; |
| 99 | + |
| 100 | + State state_; |
| 101 | +}; |
| 102 | + |
| 103 | +model_info fmu4cpp::get_model_info() { |
| 104 | + model_info info; |
| 105 | + info.modelName = "Identity"; |
| 106 | + info.description = "A simple feed-trough model"; |
| 107 | + info.defaultExperiment = {0.0, 10}; |
| 108 | + info.canGetAndSetFMUstate = true; |
| 109 | + |
| 110 | + return info; |
| 111 | +} |
| 112 | + |
| 113 | +FMU4CPP_INSTANTIATE(Model);// Entry point for FMI instantiate function. |
| 114 | + |
| 115 | + |
| 116 | +#endif //IDENTITY_HPP |
0 commit comments