/** * @file tests/mixed/models.hpp * @author The ARTIS Development Team * See the AUTHORS or Authors.txt file */ /* * ARTIS - the multimodeling and simulation environment * This file is a part of the ARTIS environment * * Copyright (C) 2013-2019 ULCO http://www.univ-littoral.fr * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TESTS_MIXED_MODELS_HPP #define TESTS_MIXED_MODELS_HPP 1 #include #include #include #include #include namespace artis { namespace tests { namespace mixed { class A1 : public artis::pdevs::Dynamics { public: enum inputs { IN }; enum outputs { OUT }; A1(const std::string& name, const artis::pdevs::Context& context) : artis::pdevs::Dynamics(name, context), _value(0) { input_ports({{IN, "in"}}); output_ports({{OUT, "out"}}); } ~A1() override = default; void dint(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_INT, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == SEND) { _phase = WAIT; } } void dext(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */, const common::Bag& bag) override { #ifndef WITH_TRACE (void)t; (void)bag; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_EXT, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif _phase = SEND; } void dconf(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */, const common::Bag& bag) override { #ifndef WITH_TRACE (void)t; (void)bag; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_CONF, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif } typename common::DoubleTime::type start(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::START, common::LevelType::USER); common::Trace::trace().flush(); #endif _phase = WAIT; return 0; } typename common::DoubleTime::type ta(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::TA, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == WAIT) { return 3; } else { return 0; } } common::Bag lambda(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif common::Bag bag; bag.push_back(artis::common::ExternalEvent(OUT, _value)); #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::LAMBDA, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif return bag; } private: enum Phase { WAIT, SEND }; Phase _phase; double _value; }; class B1 : public artis::pdevs::Dynamics { public: enum inputs { IN }; enum outputs { OUT }; B1(const std::string& name, const artis::pdevs::Context& context) : artis::pdevs::Dynamics(name, context) { input_ports({{IN, "in"}}); output_ports({{OUT, "out"}}); } ~B1() override = default; void dint(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_INT, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == SEND) { _phase = WAIT; } } void dext(typename common::DoubleTime::type t, typename common::DoubleTime::type e, const common::Bag& bag) override { #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_EXT, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif std::for_each(bag.begin(), bag.end(), [this, t, e](const common::ExternalEvent& /* event */) { ++_count; }); _phase = SEND; } void dconf(typename common::DoubleTime::type t, typename common::DoubleTime::type e, const common::Bag& bag) override { #ifndef WITH_TRACE (void)t; (void)bag; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_CONF, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif dext(t, e, bag); dint(t); } typename common::DoubleTime::type start(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::START, common::LevelType::USER); common::Trace::trace().flush(); #endif _count = 0; _phase = WAIT; return 0; // std::numeric_limits::max(); } typename common::DoubleTime::type ta(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::TA, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == WAIT) { return std::numeric_limits::max(); } else { return 0; } } common::Bag lambda(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif common::Bag bag; bag.push_back(artis::common::ExternalEvent(OUT, _count)); #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::LAMBDA, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif return bag; } private: enum Phase { WAIT, SEND }; Phase _phase; unsigned int _count; }; class A2 : public artis::dtss::Dynamics> { public: enum inputs { IN }; enum outputs { OUT }; A2(const std::string& name, const artis::dtss::Context>& context) : artis::dtss::Dynamics>( name, context), _value(0) { input_ports({{IN, "in"}}); output_ports({{OUT, "out"}}); } ~A2() override = default; void transition(const common::Bag& x, typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)x; (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::DTSS, common::FunctionType::TRANSITION, common::LevelType::USER) << "x = " << x.to_string(); common::Trace::trace().flush(); #endif } typename common::DoubleTime::type start(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::DTSS, common::FunctionType::START, common::LevelType::USER); common::Trace::trace().flush(); #endif return 0; } common::Bag lambda(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif common::Bag bag; bag.push_back(artis::common::ExternalEvent(OUT, _value)); #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::DTSS, common::FunctionType::LAMBDA, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif return bag; } private: double _value; }; class B2 : public artis::dtss::Dynamics> { public: enum inputs { IN }; enum outputs { OUT }; B2(const std::string& name, const artis::dtss::Context>& context) : artis::dtss::Dynamics>( name, context), _value(0) { input_ports({{IN, "in"}}); output_ports({{OUT, "out"}}); } ~B2() override = default; void transition(const common::Bag& x, typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)x; (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::DTSS, common::FunctionType::TRANSITION, common::LevelType::USER) << "x = " << x.to_string(); common::Trace::trace().flush(); #endif } typename common::DoubleTime::type start(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement( get_name(), t, common::FormalismType::DTSS, common::FunctionType::START, common::LevelType::USER); common::Trace::trace().flush(); #endif return 0; } common::Bag lambda(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif common::Bag bag; bag.push_back(artis::common::ExternalEvent(OUT, _value)); #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::DTSS, common::FunctionType::LAMBDA, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif return bag; } private: double _value; }; class Beep : public artis::pdevs::Dynamics { public: enum inputs { IN }; enum outputs { OUT }; Beep(const std::string& name, const artis::pdevs::Context& context) : artis::pdevs::Dynamics(name, context), _value(0) { input_ports({{IN, "in"}}); output_ports({{OUT, "out"}}); } ~Beep() override = default; void dint(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_INT, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == SEND) { _phase = WAIT; } } void dext(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */, const common::Bag& bag) override { #ifndef WITH_TRACE (void)t; (void)bag; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_EXT, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif _phase = SEND; } void dconf(typename common::DoubleTime::type t, typename common::DoubleTime::type /* e */, const common::Bag& bag) override { #ifndef WITH_TRACE (void)t; (void)bag; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::DELTA_CONF, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif } typename common::DoubleTime::type start(typename common::DoubleTime::type t) override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::START, common::LevelType::USER); common::Trace::trace().flush(); #endif _phase = WAIT; return 0; } typename common::DoubleTime::type ta(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::TA, common::LevelType::USER); common::Trace::trace().flush(); #endif if (_phase == WAIT) { return (rand() % 100) / 10.; } else { return 0; } } common::Bag lambda(typename common::DoubleTime::type t) const override { #ifndef WITH_TRACE (void)t; #endif common::Bag bag; bag.push_back(artis::common::ExternalEvent(OUT, _value)); #ifdef WITH_TRACE common::Trace::trace() << common::TraceElement(get_name(), t, common::FormalismType::PDEVS, common::FunctionType::LAMBDA, common::LevelType::USER) << "messages = " << bag.to_string(); common::Trace::trace().flush(); #endif return bag; } private: enum Phase { WAIT, SEND }; Phase _phase; double _value; }; } } } // namespace artis tests mixed #endif