94 lines
3.2 KiB
C++
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
|