24class InterfaceQueued :
public Interface,
28 typedef std::shared_ptr<InterfaceQueued> Ptr;
30 using AttributePacket =
struct AttributePacket {
31 CPS::AttributeBase::Ptr value;
39 enum AttributePacketFlags {
41 PACKET_CLOSE_INTERFACE = 1,
44 InterfaceQueued(std::shared_ptr<InterfaceWorker> intf,
45 const String &name =
"", UInt downsampling = 1)
46 : Interface(name), mInterfaceWorker(intf), mDownsampling(downsampling) {
47 mQueueDpsimToInterface = std::make_shared<
48 moodycamel::BlockingReaderWriterQueue<AttributePacket>>();
49 mQueueInterfaceToDpsim = std::make_shared<
50 moodycamel::BlockingReaderWriterQueue<AttributePacket>>();
53 virtual void open()
override;
54 virtual void close()
override;
58 virtual void pushDpsimAttrsToQueue();
61 virtual void popDpsimAttrsFromQueue(
bool isSync =
false);
64 virtual void syncExports()
override;
68 virtual CPS::Task::List getTasks()
override;
70 virtual void setLogger(CPS::Logger::Log log)
override;
72 virtual ~InterfaceQueued() {
78 std::shared_ptr<InterfaceWorker> mInterfaceWorker;
80 std::thread mInterfaceWriterThread;
81 std::thread mInterfaceReaderThread;
83 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
84 mQueueDpsimToInterface;
85 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
86 mQueueInterfaceToDpsim;
91 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
92 mQueueDpsimToInterface;
93 std::shared_ptr<InterfaceWorker> mInterfaceWorker;
97 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
98 queueDpsimToInterface,
99 std::shared_ptr<InterfaceWorker> intf)
100 : mQueueDpsimToInterface(queueDpsimToInterface),
101 mInterfaceWorker(intf){};
102 void operator()()
const;
107 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
108 mQueueInterfaceToDpsim;
109 std::shared_ptr<InterfaceWorker> mInterfaceWorker;
110 std::atomic<bool> &mOpened;
114 std::shared_ptr<moodycamel::BlockingReaderWriterQueue<AttributePacket>>
115 queueInterfaceToDpsim,
116 std::shared_ptr<InterfaceWorker> intf, std::atomic<bool> &opened)
117 : mQueueInterfaceToDpsim(queueInterfaceToDpsim), mInterfaceWorker(intf),
119 void operator()()
const;
124 explicit PreStep(InterfaceQueued &intf)
125 : Task(intf.getName() +
".Read"), mIntf(intf) {
126 for (
const auto &[attr, _seqId, _blockOnRead, _syncOnStart] :
127 intf.mImportAttrsDpsim) {
128 mModifiedAttributes.push_back(attr);
132 void execute(Real time, Int timeStepCount)
override;
135 InterfaceQueued &mIntf;
140 explicit PostStep(InterfaceQueued &intf)
141 : Task(intf.getName() +
".Write"), mIntf(intf) {
142 for (
const auto &[attr, _seqId] : intf.mExportAttrsDpsim) {
143 mAttributeDependencies.push_back(attr);
145 mModifiedAttributes.push_back(Scheduler::external);
148 void execute(Real time, Int timeStepCount)
override;
151 InterfaceQueued &mIntf;