8 #include "../core/LocalFederateId.hpp"
9 #include "../core/helicsTime.hpp"
10 #include "../helics_enums.h"
11 #include "FederateInfo.hpp"
12 #include "helics/helics-config.h"
14 #include "helics_cxx_export.h"
25 namespace gmlc::libguarded {
26 template<
class T,
class M>
36 class AsyncFedCallInfo;
37 class MessageOperator;
38 class ConnectorFederateManager;
39 class PotentialInterfacesManager;
70 PENDING_ITERATIVE_TIME = 8,
77 PENDING_ITERATIVE_INIT = 12,
81 std::atomic<Modes> currentMode{Modes::STARTUP};
82 char nameSegmentSeparator =
'/';
84 bool strictConfigChecking{
true};
86 bool useJsonSerialization{
false};
88 bool observerMode{
false};
90 bool retriggerTimeRequest{
false};
92 bool singleThreadFederate{
false};
94 bool hasPotentialInterfaces{
false};
97 LocalFederateId fedID;
100 Time mCurrentTime = Time::minVal();
101 Time mStopTime = Time::maxVal();
105 std::unique_ptr<gmlc::libguarded::shared_guarded<AsyncFedCallInfo, std::mutex>> asyncCallInfo;
106 std::unique_ptr<ConnectorFederateManager> cManager;
108 std::unique_ptr<PotentialInterfacesManager> potManager;
109 std::atomic<int> potInterfacesSequence{0};
111 std::function<void(
Time,
Time,
bool)> timeRequestEntryCallback;
112 std::function<void(
Time,
bool)> timeUpdateCallback;
113 std::function<void(Modes, Modes)> modeUpdateCallback;
114 std::function<void(
Time,
bool)> timeRequestReturnCallback;
115 std::function<void(
bool)> initializingEntryCallback;
116 std::function<void()> executingEntryCallback;
117 std::function<void()> cosimulationTerminationCallback;
118 std::function<void(
int, std::string_view)> errorHandlerCallback;
132 const std::shared_ptr<Core>& core,
140 Federate(std::string_view fedname, CoreApp& core,
const FederateInfo& fedInfo = FederateInfo{});
144 explicit Federate(
const std::string& configString);
150 Federate(std::string_view fedname,
const std::string& configString);
154 Federate(Federate&& fed) noexcept;
166 void enterInitializingMode();
172 void enterInitializingModeAsync();
177 bool isAsyncOperationCompleted() const;
181 void enterInitializingModeComplete();
188 void enterInitializingModeIterative();
194 void enterInitializingModeIterativeAsync();
200 void enterInitializingModeIterativeComplete();
224 void finalizeAsync();
226 void finalizeComplete();
230 void processCommunication(std::chrono::milliseconds period = std::chrono::milliseconds(0));
233 virtual
void disconnect();
239 void localError(
int errorcode, std::string_view message);
246 void globalError(
int errorcode, std::string_view message);
251 void localError(
int errorcode);
256 void globalError(
int errorcode);
265 void setSeparator(
char separator) { nameSegmentSeparator = separator; }
269 Time requestTime(
Time nextInternalTimeStep);
290 void requestTimeAsync(
Time nextInternalTimeStep);
302 Time requestTimeComplete();
314 void setTag(std::string_view tag, std::string_view value);
321 const std::string& getTag(std::string_view tag)
const;
327 virtual void setProperty(int32_t option,
double timeValue);
333 virtual void setProperty(int32_t option,
Time timeValue);
339 virtual void setFlagOption(
int flag,
bool flagValue =
true);
344 virtual void setProperty(int32_t option, int32_t optionValue);
349 virtual Time getTimeProperty(int32_t option)
const;
354 virtual bool getFlagOption(
int flag)
const;
358 virtual int getIntegerProperty(int32_t option)
const;
366 void setLoggingCallback(
367 const std::function<
void(
int, std::string_view, std::string_view)>& logFunction);
376 void setInitializingEntryCallback(std::function<
void(
bool)> callback);
383 void setExecutingEntryCallback(std::function<
void()> callback);
392 void setTimeRequestEntryCallback(std::function<
void(
Time,
Time,
bool)> callback);
402 void setTimeUpdateCallback(std::function<
void(
Time,
bool)> callback);
412 void setModeUpdateCallback(std::function<
void(Modes, Modes)> callback);
421 void setTimeRequestReturnCallback(std::function<
void(
Time,
bool)> callback);
428 void setCosimulationTerminatedCallback(std::function<
void()> callback);
436 void setErrorHandlerCallback(std::function<
void(
int, std::string_view)> errorHandlerCallback);
451 std::string query(std::string_view target,
452 std::string_view queryStr,
467 std::string query(std::string_view queryStr,
481 QueryId queryAsync(std::string_view target,
482 std::string_view queryStr,
494 QueryId queryAsync(std::string_view queryStr,
506 std::string queryComplete(
QueryId queryIndex);
511 bool isQueryCompleted(
QueryId queryIndex)
const;
521 void setQueryCallback(
const std::function<std::string(std::string_view)>& queryFunction);
528 void setGlobal(std::string_view valueName, std::string_view value);
533 void addAlias(std::string_view interfaceName, std::string_view alias);
543 std::string_view target,
544 std::string_view commandStr,
551 std::pair<std::string, std::string> getCommand();
557 std::pair<std::string, std::string> waitCommand();
563 void addDependency(std::string_view fedName);
570 Filter& registerGlobalFilter(std::string_view filterName,
571 std::string_view inputType = std::string_view{},
572 std::string_view outputType = std::string_view{});
580 CloningFilter& registerGlobalCloningFilter(std::string_view filterName,
581 std::string_view inputType = std::string_view{},
582 std::string_view outputType = std::string_view{});
590 Filter& registerFilter(std::string_view filterName,
591 std::string_view inputType = std::string_view{},
592 std::string_view outputType = std::string_view{});
602 CloningFilter& registerCloningFilter(std::string_view filterName,
603 std::string_view inputType = std::string_view{},
604 std::string_view outputType = std::string_view{});
610 return registerGlobalFilter(std::string(), std::string_view{}, std::string_view{});
619 Translator& registerGlobalTranslator(std::int32_t translatorType,
620 std::string_view translatorName,
621 std::string_view endpointType = std::string_view{},
622 std::string_view units = std::string_view{});
631 Translator& registerTranslator(std::int32_t translatorType,
632 std::string_view translatorName,
633 std::string_view endpointType = std::string_view{},
634 std::string_view units = std::string_view{});
642 std::string_view endpointType = std::string_view{},
643 std::string_view units = std::string_view{})
645 return registerGlobalTranslator(0, translatorName, endpointType, units);
655 std::string_view endpointType = std::string_view{},
656 std::string_view units = std::string_view{})
658 return registerTranslator(0, translatorName, endpointType, units);
668 return registerGlobalCloningFilter(std::string(), std::string(), std::string());
674 const Filter& getFilter(std::string_view filterName)
const;
679 const Filter& getFilter(
int index)
const;
684 Filter& getFilter(std::string_view filterName);
689 Filter& getFilter(
int index);
700 [[deprecated]]
static void setFilterOperator(
Filter& filt,
701 std::shared_ptr<FilterOperator> filtOp);
704 int getFilterCount()
const;
711 const Translator& getTranslator(std::string_view translatorName)
const;
717 const Translator& getTranslator(
int index)
const;
723 Translator& getTranslator(std::string_view translatorName);
740 [[deprecated]]
static void setTranslatorOperator(
Translator& trans,
741 std::shared_ptr<TranslatorOperator> transOp);
744 int getTranslatorCount()
const;
755 void finalizeOperations();
756 void preTimeRequestOperations(
Time nextStep,
bool iterating);
757 void postTimeRequestOperations(
Time newTime,
bool iterating);
759 virtual void updateTime(
Time newTime,
Time oldTime);
762 virtual void startupToInitializeStateTransition();
765 virtual void initializeToExecuteStateTransition(
iteration_time iterate);
767 virtual void disconnectTransition();
770 virtual std::string localQuery(std::string_view queryStr)
const;
773 std::string localNameGenerator(std::string_view addition)
const;
775 void handleError(
int errorCode, std::string_view errorString,
bool noThrow);
776 void setAsyncCheck(std::function<
bool()> asyncCheck);
784 virtual void registerInterfaces(
const std::string& configString);
790 void registerConnectorInterfaces(
const std::string& configString);
798 registerConnectorInterfaces(configString);
801 auto getID() const noexcept {
return fedID; }
808 const std::string&
getName()
const {
return mName; }
816 void logMessage(
int level, std::string_view message)
const;
847 void completeOperation();
857 void updateFederateMode(Modes newMode);
859 void potentialInterfacesStartupSequence();
861 void updateSimulationTime(
Time newTime,
Time oldTime,
bool iterating);
866 void registerConnectorInterfacesJson(
const std::string& jsonString);
871 void registerConnectorInterfacesToml(
const std::string& tomlString);
876 checkValidFilterType(
bool useTypes,
FilterTypes opType,
const std::string& operation)
const;
889 mCore(core), handle(hid), mName(actName)
899 bool isValid()
const {
return handle.isValid(); }
900 bool operator<(
const Interface& inp)
const {
return (handle < inp.
handle); }
901 bool operator>(
const Interface& inp)
const {
return (handle > inp.handle); }
902 bool operator==(
const Interface& inp)
const {
return (handle == inp.handle); }
903 bool operator!=(
const Interface& inp)
const {
return (handle != inp.handle); }
909 const std::string& getName()
const;
911 [[deprecated]]
const std::string& getTarget()
const;
913 void addSourceTarget(std::string_view newTarget,
InterfaceType hint = InterfaceType::UNKNOWN);
915 void addDestinationTarget(std::string_view newTarget,
918 void removeTarget(std::string_view targetToRemove);
920 void addAlias(std::string_view alias);
922 const std::string& getInfo()
const;
924 void setInfo(std::string_view info);
930 void setTag(std::string_view tag, std::string_view value);
937 const std::string& getTag(std::string_view tag)
const;
939 virtual void setOption(int32_t option, int32_t value = 1);
942 virtual int32_t getOption(int32_t option)
const;
949 const std::string& getInjectionType()
const;
956 const std::string& getExtractionType()
const;
963 const std::string& getInjectionUnits()
const;
969 const std::string& getExtractionUnits()
const;
972 virtual const std::string& getDisplayName()
const = 0;
975 const std::string& getSourceTargets()
const;
978 const std::string& getDestinationTargets()
const;
980 std::size_t getSourceTargetCount()
const;
982 std::size_t getDestinationTargetCount()
const;
986 void disconnectFromCore();
Definition: application_api/Federate.hpp:27
Definition: Filters.hpp:111
Definition: core/Core.hpp:41
Definition: FederateInfo.hpp:28
Definition: application_api/Federate.hpp:48
Modes getCurrentMode() const noexcept
Definition: application_api/Federate.hpp:803
Translator & registerTranslator(std::string_view translatorName, std::string_view endpointType=std::string_view{}, std::string_view units=std::string_view{})
Definition: application_api/Federate.hpp:654
const std::string & getName() const
Definition: application_api/Federate.hpp:808
const std::string & getConfigFile() const
Definition: application_api/Federate.hpp:746
void logErrorMessage(std::string_view message) const
Definition: application_api/Federate.hpp:821
Time requestNextStep()
Definition: application_api/Federate.hpp:273
const std::shared_ptr< Core > & getCorePointer()
Definition: application_api/Federate.hpp:810
auto getID() const noexcept
Definition: application_api/Federate.hpp:801
void logDebugMessage(std::string_view message) const
Definition: application_api/Federate.hpp:842
CloningFilter & registerCloningFilter()
Definition: application_api/Federate.hpp:666
std::shared_ptr< Core > coreObject
reference to the core simulation API
Definition: application_api/Federate.hpp:99
std::string configFile
any config file used
Definition: application_api/Federate.hpp:102
void registerFilterInterfaces(const std::string &configString)
Definition: application_api/Federate.hpp:796
void logWarningMessage(std::string_view message) const
Definition: application_api/Federate.hpp:828
Time getCurrentTime() const noexcept
Definition: application_api/Federate.hpp:806
Translator & registerTranslator()
Definition: application_api/Federate.hpp:663
Modes
Definition: application_api/Federate.hpp:51
Time requestTimeAdvance(Time timeDelta)
Definition: application_api/Federate.hpp:278
Filter & registerFilter()
Definition: application_api/Federate.hpp:608
Translator & registerGlobalTranslator(std::string_view translatorName, std::string_view endpointType=std::string_view{}, std::string_view units=std::string_view{})
Definition: application_api/Federate.hpp:641
void logInfoMessage(std::string_view message) const
Definition: application_api/Federate.hpp:835
Definition: Filters.hpp:39
Definition: LocalFederateId.hpp:65
Definition: application_api/Federate.hpp:880
InterfaceHandle handle
the id as generated by the Federate
Definition: application_api/Federate.hpp:883
const std::string & getLocalName() const
Definition: application_api/Federate.hpp:906
bool isValid() const
Definition: application_api/Federate.hpp:899
InterfaceHandle getHandle() const
Definition: application_api/Federate.hpp:895
std::string mName
the name or key of the interface
Definition: application_api/Federate.hpp:884
Definition: application_api/Translator.hpp:35
Definition: JsonProcessingFunctions.hpp:25
@ HELICS_LOG_LEVEL_ERROR
Definition: helics_enums.h:208
@ HELICS_LOG_LEVEL_SUMMARY
Definition: helics_enums.h:214
@ HELICS_LOG_LEVEL_DEBUG
Definition: helics_enums.h:225
@ HELICS_LOG_LEVEL_WARNING
Definition: helics_enums.h:212
HelicsSequencingModes
Definition: helics_enums.h:427
@ HELICS_SEQUENCING_MODE_FAST
Definition: helics_enums.h:429
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
bool operator!=(const SmallBuffer &sb1, const SmallBuffer &sb2)
Definition: SmallBuffer.hpp:412
IterationResult
Definition: CoreTypes.hpp:94
@ FINISHED
the federation has finished its execution
@ EXECUTING
the federation has entered execution state and it now advancing in time
constexpr Time timeZero
Definition: helicsTime.hpp:31
void cleanupHelicsLibrary()
Definition: Federate.cpp:42
IterationRequest
Definition: CoreTypes.hpp:103
InterfaceType
Definition: CoreTypes.hpp:112
FilterTypes
Definition: Filters.hpp:21
bool operator==(const SmallBuffer &sb1, const SmallBuffer &sb2)
Definition: SmallBuffer.hpp:406
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
Definition: helicsTime.hpp:43