/** * @file Sink.cpp * @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-2023 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 . */ #include "Sink.hpp" namespace artis::factory { void Sink::dint(const Time &/*t*/) { // TODO // Inutile si l'on consiède que cet élément ce fait que recevoir des POs. Il ne fait rien par lui-même, et ne varie que en fonction de son environnement. } void Sink::dext(const Time &t, const Time & /* e */, const Bag &bag) { std::for_each(bag.begin(), bag.end(), [this, t](const ExternalEvent &event) { if (event.port_index() == inputs::IN) { uint8_t *data = nullptr; event.data()(data); std::unique_ptr po = std::make_unique(data, event.data().size()); #ifdef WITH_TRACE Trace::trace() << TraceElement(get_name(), t, artis::common::FormalismType::PDEVS, artis::common::FunctionType::DELTA_EXT, artis::common::LevelType::USER) << "Sink received po = " << po->to_string(); Trace::trace().flush(); #endif _pos.push_back(std::move(po));//Je ne peux pas dupliquer ce pointer unique dans la liste, je dois explicitement le déplacer. _phase = Phase::LOADED; } }); } void Sink::start(const Time & /* t */) { _phase = Phase::INIT; // Préparation du modèle, j'imagine que ce n'est pas utile donc passage immédiat en READY _phase = Phase::READY; // Le modèle est prêt, on attend des PO _phase = Phase::WAIT; } Time Sink::ta(const Time & /* t */) const { switch (_phase) { case Phase::INIT:// Phase transitoire, je n'y reste pas, le modèle ne fait qu'y passer case Phase::READY:// Idem //case Phase::UNLOADING:// Déchargement des PO dans la sortie, ce n'est que transitoire return 0; case Phase::WAIT:// J'attends un premier PO, potentiellement infini case Phase::LOADED:// J'ai un PO en stock, j'attends d'en faire quelque chose,ce qui est potentiellement infini return artis::common::DoubleTime::infinity; } return artis::common::DoubleTime::infinity; } Bag Sink::lambda(const Time & /* t */) const { Bag bag; // TODO // Pour le moment, Sink ne laisse pas sortir les POs arrivés dedans. Inutile de définir ceci. return bag; } artis::common::event::Value Sink::observe(const Time & /* t */, unsigned int /* index */) const { return {}; } } // namespace artis::factory