9 #include "../common/GuardedTypes.hpp"
10 #include "ActionMessage.hpp"
11 #include "BasicHandleInfo.hpp"
15 #include "gmlc/containers/BlockingQueue.hpp"
32 class SubscriptionInfo;
33 class PublicationInfo;
37 class CoreFederateInfo;
39 class TimeCoordinator;
43 constexpr
Time startupTime = Time::minVal();
44 constexpr
Time initialTime{-1000000.0};
63 const std::string name;
65 std::unique_ptr<TimeCoordinator> timeCoord;
72 std::atomic<FederateStates> state{FederateStates::CREATED};
73 bool only_transmit_on_change{
false};
77 bool reentrant{
false};
78 bool mSourceOnly{
false};
79 bool mCallbackBased{
false};
81 bool strict_input_type_checking{
false};
82 bool ignore_unit_mismatch{
false};
84 bool mSlowResponding{
false};
86 bool mAllowRemoteControl{
true};
87 InterfaceInfo interfaceInformation;
88 std::unique_ptr<LogManager> mLogManager;
98 bool wait_for_current_time{
false};
100 bool ignore_time_mismatch_warnings{
false};
102 bool mProfilerActive{
false};
105 bool mLocalProfileCapture{
false};
107 CommonCore* mParent{
nullptr};
108 std::string errorString;
110 decltype(std::chrono::steady_clock::now()) start_clock_time;
114 std::int32_t realTimeTimerIndex{-1};
115 std::int32_t grantTimeoutTimeIndex{-1};
120 std::atomic<bool> requestingMode{
false};
122 std::atomic<bool> initIterating{
false};
125 bool iterating{
false};
126 bool timeGranted_mode{
false};
128 bool terminate_on_error{
false};
134 std::uint32_t mGrantCount{0};
136 std::shared_ptr<MessageTimer> mTimer;
138 gmlc::containers::BlockingQueue<ActionMessage> queue;
140 gmlc::containers::BlockingQueue<std::pair<std::string, std::string>> commandQueue;
142 std::atomic<uint16_t> interfaceFlags{0};
144 std::map<GlobalFederateId, std::deque<ActionMessage>> delayQueues;
145 std::vector<InterfaceHandle> events;
146 std::vector<InterfaceHandle> eventMessages;
147 std::vector<GlobalFederateId> delayedFederates;
148 Time time_granted{startupTime};
149 Time allowed_send_time{startupTime};
150 Time minimumReceiveTime{startupTime};
151 mutable std::atomic_flag processing = ATOMIC_FLAG_INIT;
154 std::vector<std::function<std::string(std::string_view)>> queryCallbacks;
155 std::shared_ptr<FederateOperator> fedCallbacks;
156 std::vector<std::pair<std::string, std::string>> tags;
157 std::atomic<bool> queueProcessing{
false};
159 Time nextValueTime()
const;
161 Time nextMessageTime()
const;
167 bool messageShouldBeDelayed(
const ActionMessage& cmd)
const noexcept;
169 void addFederateToDelay(GlobalFederateId gid);
171 void generateConfig(Json::Value& base)
const;
175 void reset(
const CoreFederateInfo& fedInfo);
205 uint32_t* inputIndex);
227 void setProperty(
int intProperty,
int propertyVal);
249 while (processing.test_and_set()) {
256 if (!processing.test_and_set()) {
260 for (
int ii = 0; ii < 10000; ++ii) {
261 if (!processing.test_and_set()) {
265 while (processing.test_and_set()) {
266 std::this_thread::yield();
273 bool try_lock()
const {
return !processing.test_and_set(); }
275 void unlock()
const { processing.clear(); }
280 void setTag(std::string_view tag, std::string_view value);
282 const std::string&
getTag(std::string_view tag)
const;
284 const std::pair<std::string, std::string>&
getTagByIndex(
size_t index)
const
338 void fillEventVectorUpTo(
Time currentTime);
342 void fillEventVectorInclusive(
Time currentTime);
346 void fillEventVectorNextIteration(
Time currentTime);
355 int checkInterfaces();
357 std::
string processQueryActual(std::string_view query) const;
361 void generateProfilingMessage(
bool enterHelicsCode);
363 void generateProfilingMarker();
365 void updateMaxLogLevel();
368 void callbackProcessing() noexcept;
372 void initCallbackProcessing();
388 const std::vector<InterfaceHandle>&
getEvents()
const;
434 std::vector<std::pair<GlobalHandle, std::string_view>>
464 std::string_view logMessageSource,
465 std::string_view message,
466 bool fromRemote =
false)
const;
472 void setLogger(std::function<
void(
int, std::string_view, std::string_view)> logFunction);
478 fedCallbacks = std::move(fed);
487 order = std::clamp(order, 1, 10);
489 if (
static_cast<int>(queryCallbacks.size()) < order) {
490 queryCallbacks.resize(order);
492 queryCallbacks[order - 1] = std::move(queryCallbackFunction);
499 std::string
processQuery(std::string_view query,
bool force_ordering =
false)
const;
517 std::string_view key,
518 std::string_view type,
519 std::string_view units,
527 std::pair<std::string, std::string>
getCommand();
Definition: ActionMessage.hpp:30
Definition: CommonCore.hpp:75
Definition: CoreFederateInfo.hpp:16
Definition: FederateState.hpp:50
void setQueryCallback(std::function< std::string(std::string_view)> queryCallbackFunction, int order)
Definition: FederateState.hpp:484
const std::string & getTag(std::string_view tag) const
Definition: FederateState.cpp:2877
void setInterfaceProperty(const ActionMessage &cmd)
Definition: FederateState.cpp:1966
std::atomic< bool > init_transmitted
Definition: FederateState.hpp:92
std::pair< SmallBuffer, Time > getPublishedValue(InterfaceHandle handle)
Definition: FederateState.cpp:341
void routeMessage(const ActionMessage &msg)
Definition: FederateState.cpp:350
void spinlock() const
Definition: FederateState.hpp:247
auto tagCount() const
Definition: FederateState.hpp:289
std::atomic< bool > initRequested
Definition: FederateState.hpp:118
void reset(const CoreFederateInfo &fedInfo)
Definition: FederateState.cpp:157
const std::pair< std::string, std::string > & getTagByIndex(size_t index) const
Definition: FederateState.hpp:284
std::optional< ActionMessage > processPostTerminationAction(const ActionMessage &action)
Definition: FederateState.cpp:478
const std::string & getIdentifier() const
Definition: FederateState.hpp:177
const std::vector< std::shared_ptr< const SmallBuffer > > & getAllValues(InterfaceHandle handle)
Definition: FederateState.cpp:336
bool isCallbackFederate() const
Definition: FederateState.hpp:291
void setCoreObject(CommonCore *parent)
Definition: FederateState.cpp:2417
int inputCount() const
Definition: FederateState.cpp:2337
std::vector< GlobalFederateId > getDependents() const
Definition: FederateState.cpp:2347
std::pair< std::string, std::string > getCommand()
Definition: FederateState.cpp:2601
void forceProcessMessage(ActionMessage &action)
Definition: FederateState.cpp:491
iteration_time enterExecutingMode(IterationRequest iterate, bool sendRequest=false)
Definition: FederateState.cpp:568
std::unique_ptr< Message > receive(InterfaceHandle hid)
Definition: FederateState.cpp:293
InterfaceInfo & interfaces()
Definition: FederateState.hpp:181
LocalFederateId local_id
id code for the local federate descriptor
Definition: FederateState.hpp:68
void closeInterface(InterfaceHandle handle, InterfaceType type)
Definition: FederateState.cpp:436
void setProperties(const ActionMessage &cmd)
Definition: FederateState.cpp:1925
Time nextAllowedSendTime() const
Definition: FederateState.hpp:385
uint16_t getInterfaceFlags() const
Definition: FederateState.hpp:237
MessageProcessingResult genericUnspecifiedQueueProcess(bool busyReturn)
Definition: FederateState.cpp:891
void unlock() const
Definition: FederateState.hpp:275
std::vector< GlobalFederateId > getDependencies() const
Definition: FederateState.cpp:2342
int publicationCount() const
Definition: FederateState.cpp:2327
void setOptionFlag(int optionFlag, bool value)
Definition: FederateState.cpp:2113
void addAction(const ActionMessage &action)
Definition: FederateState.cpp:380
void finalize()
Definition: FederateState.cpp:930
std::vector< std::pair< GlobalHandle, std::string_view > > getMessageDestinations(InterfaceHandle handle)
Definition: FederateState.cpp:682
IterationResult waitSetup()
Definition: FederateState.cpp:501
uint64_t getQueueSize() const
Definition: FederateState.cpp:278
int indexGroup
storage for index group location (this only matters on construction so can be public)
Definition: FederateState.hpp:94
bool getOptionFlag(int optionFlag) const
Definition: FederateState.cpp:2248
void logMessage(int level, std::string_view logMessageSource, std::string_view message, bool fromRemote=false) const
Definition: FederateState.cpp:2424
const std::vector< InterfaceHandle > & getEvents() const
Definition: FederateState.cpp:992
std::pair< std::string, std::string > waitCommand()
Definition: FederateState.cpp:2616
std::unique_ptr< Message > receiveAny(InterfaceHandle &hid)
Definition: FederateState.cpp:302
FederateState(const FederateState &)=delete
FederateStates getState() const
Definition: FederateState.cpp:232
iteration_time requestTime(Time nextTime, IterationRequest iterate, bool sendRequest=false)
Definition: FederateState.cpp:691
int lastErrorCode() const noexcept
Definition: FederateState.hpp:398
const std::string & lastErrorString() const
Definition: FederateState.hpp:396
void sleeplock() const
Definition: FederateState.hpp:254
int32_t getCurrentIteration() const
Definition: FederateState.cpp:237
void setCallbackOperator(std::shared_ptr< FederateOperator > fed)
Definition: FederateState.hpp:476
const std::shared_ptr< const SmallBuffer > & getValue(InterfaceHandle handle, uint32_t *inputIndex)
Definition: FederateState.cpp:329
void createInterface(InterfaceType htype, InterfaceHandle handle, std::string_view key, std::string_view type, std::string_view units, uint16_t flags)
Definition: FederateState.cpp:400
void sendCommand(ActionMessage &command)
Definition: FederateState.cpp:2482
void setParent(CommonCore *coreObject)
Definition: FederateState.hpp:216
void setProperty(int timeProperty, Time propertyVal)
Definition: FederateState.cpp:2032
IterationResult enterInitializingMode(IterationRequest request)
Definition: FederateState.cpp:530
void processCommunications(std::chrono::milliseconds period)
Definition: FederateState.cpp:966
int getIntegerProperty(int intProperty) const
Definition: FederateState.cpp:2309
void lock()
Definition: FederateState.hpp:270
int loggingLevel() const
Definition: FederateState.cpp:2858
std::vector< GlobalHandle > getSubscribers(InterfaceHandle handle)
Definition: FederateState.cpp:668
int32_t getHandleOption(InterfaceHandle handle, char iType, int32_t option) const
Definition: FederateState.cpp:2293
Time getTimeProperty(int timeProperty) const
Definition: FederateState.cpp:2233
bool try_lock() const
Definition: FederateState.hpp:273
const InterfaceInfo & interfaces() const
Definition: FederateState.hpp:183
void setLogger(std::function< void(int, std::string_view, std::string_view)> logFunction)
Definition: FederateState.cpp:287
Time grantedTime() const
Definition: FederateState.hpp:383
FederateState(const std::string &fedName, const CoreFederateInfo &fedInfo)
Definition: FederateState.cpp:107
bool checkAndSetValue(InterfaceHandle pub_id, const char *data, uint64_t len)
Definition: FederateState.cpp:242
std::string processQuery(std::string_view query, bool force_ordering=false) const
Definition: FederateState.cpp:2835
void setTag(std::string_view tag, std::string_view value)
Definition: FederateState.cpp:2863
std::atomic< GlobalFederateId > global_id
global id code, default to invalid
Definition: FederateState.hpp:69
int endpointCount() const
Definition: FederateState.cpp:2332
Definition: GlobalFederateId.hpp:75
Definition: LocalFederateId.hpp:65
Definition: InterfaceInfo.hpp:26
Definition: LocalFederateId.hpp:22
@ HELICS_LOG_LEVEL_NO_PRINT
Definition: helics_enums.h:204
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
IterationResult
Definition: CoreTypes.hpp:93
FederateStates
Definition: CoreTypes.hpp:21
MessageProcessingResult
Definition: CoreTypes.hpp:74
constexpr Time timeZero
Definition: helicsTime.hpp:31
TimeSynchronizationMethod
enumeration of possible time coordination methods
Definition: FederateState.hpp:47
IterationRequest
Definition: CoreTypes.hpp:102
@ NO_ITERATIONS
indicator that the iterations have completed
InterfaceType
Definition: CoreTypes.hpp:111
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
Definition: helicsTime.hpp:43