Files
tp-modelisation-problemes/src/Sink.cpp

94 lines
3.2 KiB
C++

/**
* @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 <http://www.gnu.org/licenses/>.
*/
#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<ProductionOrder> po = std::make_unique<ProductionOrder>(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