DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
NetworkDataStreamInstrument.h
Go to the documentation of this file.
1// This file is part of DynExp.
2
8#pragma once
9
10#include "stdafx.h"
13
14#include "NetworkDataStreamInstrument.pb.h"
15#include "NetworkDataStreamInstrument.grpc.pb.h"
16
17namespace DynExpInstr
18{
19 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
20 class NetworkDataStreamInstrumentT;
21
23
24 constexpr DynExpProto::Common::UnitType ToPrototUnitType(DataStreamInstrumentData::UnitType Unit)
25 {
26 switch (Unit)
27 {
28 case DataStreamInstrumentData::UnitType::Arbitrary: return DynExpProto::Common::UnitType::Arbitrary;
29 case DataStreamInstrumentData::UnitType::LogicLevel: return DynExpProto::Common::UnitType::LogicLevel;
30 case DataStreamInstrumentData::UnitType::Counts: return DynExpProto::Common::UnitType::Counts;
31 case DataStreamInstrumentData::UnitType::Volt: return DynExpProto::Common::UnitType::Volt;
32 case DataStreamInstrumentData::UnitType::Ampere: return DynExpProto::Common::UnitType::Ampere;
33 case DataStreamInstrumentData::UnitType::Power_W: return DynExpProto::Common::UnitType::Power_W;
34 case DataStreamInstrumentData::UnitType::Power_dBm: return DynExpProto::Common::UnitType::Power_dBm;
35 default: throw Util::InvalidDataException("The given unit does not exist in the DataStreamInstrumentData::UnitType enumeration. Did you forget to adjust the UnitType enumeration in class \"DataStreamInstrumentData\"?");
36 }
37 }
38
39 constexpr DataStreamInstrumentData::UnitType ToDataStreamInstrumentUnitType(DynExpProto::Common::UnitType Unit)
40 {
41 switch (Unit)
42 {
43 case DynExpProto::Common::UnitType::Arbitrary: return DataStreamInstrumentData::UnitType::Arbitrary;
44 case DynExpProto::Common::UnitType::LogicLevel: return DataStreamInstrumentData::UnitType::LogicLevel;
45 case DynExpProto::Common::UnitType::Counts: return DataStreamInstrumentData::UnitType::Counts;
46 case DynExpProto::Common::UnitType::Volt: return DataStreamInstrumentData::UnitType::Volt;
47 case DynExpProto::Common::UnitType::Ampere: return DataStreamInstrumentData::UnitType::Ampere;
48 case DynExpProto::Common::UnitType::Power_W: return DataStreamInstrumentData::UnitType::Power_W;
49 case DynExpProto::Common::UnitType::Power_dBm: return DataStreamInstrumentData::UnitType::Power_dBm;
50 default: throw Util::InvalidDataException("The given unit does not exist in the DynExpProto::Common::UnitType enumeration. Did you forget to adjust the UnitType enumeration in file \"Common.proto\"?");
51 }
52 }
53
54 namespace NetworkDataStreamInstrumentTasks
55 {
56 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
57 class InitTask : public gRPCInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>
58 {
60 {
62 {
63 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
64
65 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
66 } // InstrData unlocked here.
67
68 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::GetStreamInfo, {});
69
70 {
71 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
72
73 InstrData->RemoteStreamInfo.ValueUnit = ToDataStreamInstrumentUnitType(Response.valueunit());
74 InstrData->RemoteStreamInfo.HardwareMinValue = Response.hardwareminvalue();
75 InstrData->RemoteStreamInfo.HardwareMaxValue = Response.hardwaremaxvalue();
76 InstrData->RemoteStreamInfo.IsBasicSampleTimeUsed = Response.isbasicsampletimeused();
77 InstrData->RemoteStreamInfo.StreamSizeRead = Util::NumToT<size_t>(Response.streamsizemsg().streamsizeread());
78 InstrData->RemoteStreamInfo.StreamSizeWrite = Util::NumToT<size_t>(Response.streamsizemsg().streamsizewrite());
79
80 InstrData->GetSampleStream()->SetStreamSize(InstrData->RemoteStreamInfo.StreamSizeWrite);
81 } // InstrData unlocked here.
82
84 }
85
87 };
88
89 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
99
100 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
101 class UpdateTask : public gRPCInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>
102 {
104 {
106 {
107 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
108 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
109 } // InstrData unlocked here.
110
111 auto StreamSizeResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::GetStreamSize, {});
112 auto FinishedResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::HasFinished, {});
113 auto RunningResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::IsRunning, {});
114
115 {
116 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
117
118 InstrData->RemoteStreamInfo.StreamSizeRead = Util::NumToT<size_t>(StreamSizeResponse.streamsizeread());
119 InstrData->RemoteStreamInfo.StreamSizeWrite = Util::NumToT<size_t>(StreamSizeResponse.streamsizewrite());
120 InstrData->Finished = FinishedResponse.has_value() ? Util::OptionalBool(FinishedResponse.value()) : Util::OptionalBool::Values::Unknown;
121 InstrData->Running = RunningResponse.has_value() ? Util::OptionalBool(RunningResponse.value()) : Util::OptionalBool::Values::Unknown;
122
123 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != InstrData->RemoteStreamInfo.StreamSizeWrite)
124 {
125 InstrData->GetSampleStream()->SetStreamSize(InstrData->RemoteStreamInfo.StreamSizeWrite);
126 InstrData->SetLastReadRemoteSampleID(0);
127 }
128 } // InstrData unlocked here.
129
131 }
132
134 };
135
136 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
138 {
139 public:
141
142 private:
144 {
145 DynExpProto::NetworkDataStreamInstrument::ReadMessage ReadMsg;
147 {
148 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
149
150 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
151 ReadMsg.set_startsampleid(Util::NumToT<google::protobuf::uint64>(InstrData->GetLastReadRemoteSampleID()));
152 } // InstrData unlocked here.
153
154 auto ReadResultMsg = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Read, ReadMsg);
155
156 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
157 for (decltype(ReadResultMsg.samples_size()) i = 0; i < ReadResultMsg.samples_size(); ++i)
158 InstrData->GetSampleStream()->WriteBasicSample({ ReadResultMsg.samples(i).value(), ReadResultMsg.samples(i).time() });
159
160 InstrData->SetLastReadRemoteSampleID(Util::NumToT<size_t>(ReadResultMsg.lastsampleid()));
161
162 return {};
163 }
164 };
165
166 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
168 {
169 public:
171
172 private:
174 {
176 std::vector<NetworkDataStreamInstrumentDataSampleStreamType::SampleType> Samples;
177 {
178 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
179 auto SampleStream = InstrData->template GetCastSampleStream<NetworkDataStreamInstrumentDataSampleStreamType>();
180
181 if (SampleStream->GetNumSamplesWritten() == InstrData->GetLastWrittenSampleID())
182 return {};
183 if (SampleStream->GetNumSamplesWritten() < InstrData->GetLastWrittenSampleID())
184 InstrData->SetLastWrittenSampleID(0); // e.g. if SampleStream has been cleared. Transmit the entire buffer then.
185
186 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
187
188 Samples = SampleStream->ReadRecentBasicSamples(InstrData->GetLastWrittenSampleID());
189 InstrData->SetLastWrittenSampleID(SampleStream->GetNumSamplesWritten());
190 } // InstrData unlocked here.
191
192 DynExpProto::NetworkDataStreamInstrument::WriteMessage WriteMsg;
193 for (const auto& Sample : Samples)
194 {
195 auto BasicSampleMsg = WriteMsg.add_samples();
196 BasicSampleMsg->set_value(Sample.Value);
197 BasicSampleMsg->set_time(Sample.Time);
198 }
199
200 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Write, WriteMsg);
201
202 return {};
203 }
204 };
205
206 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
208 {
209 public:
211
212 private:
214 {
216 {
217 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
218 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
219 } // InstrData unlocked here.
220
221 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::ClearData, {});
222
223 return {};
224 }
225 };
226
227 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
229 {
230 public:
232
233 private:
235 {
237 {
238 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
239 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
240 } // InstrData unlocked here.
241
242 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Start, {});
243
244 return {};
245 }
246 };
247
248 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
250 {
251 public:
253
254 private:
256 {
258 {
259 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
260 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
261 } // InstrData unlocked here.
262
263 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Stop, {});
264
265 return {};
266 }
267 };
268
269 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
271 {
272 public:
274
275 private:
277 {
279 {
280 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
281 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
282 } // InstrData unlocked here.
283
284 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Restart, {});
285
286 return {};
287 }
288 };
289
290 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
292 {
293 public:
296
297 private:
299 {
300 DynExpProto::NetworkDataStreamInstrument::StreamSizeMessage StreamSizeMsg;
301 StreamSizeMsg.set_streamsizewrite(Util::NumToT<google::protobuf::uint64>(StreamSizeInSamples));
302
304 {
305 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
306 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
307 } // InstrData unlocked here.
308
309 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::SetStreamSize, StreamSizeMsg);
310
311 {
312 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
313 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != Response.streamsizewrite())
314 {
315 InstrData->GetSampleStream()->SetStreamSize(Response.streamsizewrite());
316 InstrData->SetLastReadRemoteSampleID(0);
317 }
318 } // InstrData unlocked here.
319
320 return {};
321 }
322
324 };
325
326 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
328 {
329 public:
331
332 private:
334 {
336 {
337 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
338 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
339 } // InstrData unlocked here.
340
341 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::ResetStreamSize, {});
342
343 {
344 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
345 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != Response.streamsizewrite())
346 {
347 InstrData->GetSampleStream()->SetStreamSize(Response.streamsizewrite());
348 InstrData->SetLastReadRemoteSampleID(0);
349 }
350 } // InstrData unlocked here.
351
352 return {};
353 }
354 };
355 }
356
357 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
358 class NetworkDataStreamInstrumentData : public gRPCInstrumentData<BaseInstr, 0, gRPCStubs...>
359 {
360 friend class NetworkDataStreamInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>;
361 friend class NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>;
362
363 public:
365 using InstrumentType = NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>;
366
376
377 NetworkDataStreamInstrumentData(size_t BufferSizeInSamples = 1)
378 : gRPCInstrumentData<BaseInstr, 0, gRPCStubs...>(std::make_unique<SampleStreamType>(BufferSizeInSamples)) {}
380
381 const auto& GetRemoteStreamInfo() const noexcept { return RemoteStreamInfo; }
382 auto HasFinished() const noexcept { return Finished; }
383 auto IsRunning() const noexcept { return Running; }
384
385 auto GetLastReadRemoteSampleID() const noexcept { return LastReadRemoteSampleID; }
386 void SetLastReadRemoteSampleID(size_t SampleID) noexcept { LastReadRemoteSampleID = SampleID; }
387 auto GetLastWrittenSampleID() const noexcept { return LastWrittenSampleID; }
388 void SetLastWrittenSampleID(size_t SampleID) noexcept { LastWrittenSampleID = SampleID; }
389
390 private:
402
404
408
411 };
412
413 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
428
429 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
431 {
432 public:
433 using ObjectType = NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>;
434 using ParamsType = NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>;
435
438
439 private:
440 virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkDataStreamInstrumentConfigurator>(ID, Core); }
441 };
442
449 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
450 class NetworkDataStreamInstrumentT : public gRPCInstrument<BaseInstr, 0, gRPCStubs...>
451 {
452 public:
453 using ParamsType = NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>;
454 using ConfigType = NetworkDataStreamInstrumentConfigurator<BaseInstr, 0, gRPCStubs...>;
455 using InstrumentDataType = NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>;
456
457 constexpr static auto Name() noexcept { return "Network Data Stream Instrument"; }
458
459 NetworkDataStreamInstrumentT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
460 : gRPCInstrument<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
462
463 virtual std::string GetName() const override { return Name(); }
464
469 virtual std::chrono::milliseconds GetTaskQueueDelay() const { return std::chrono::milliseconds(500); }
470
471 virtual Util::OptionalBool HasFinished() const override
472 {
473 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
474 return InstrData->HasFinished();
475 }
476
477 virtual Util::OptionalBool IsRunning() const override
478 {
479 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
480 return InstrData->IsRunning();
481 }
482
483 // Tasks
484 virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ReadTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
485 virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::WriteTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
486 virtual void ClearData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ClearTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
487 virtual void Start(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::StartTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
488 virtual void Stop(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::StopTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
489 virtual void Restart(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::RestartTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
490 virtual void SetStreamSize(size_t BufferSizeInSamples, DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::SetStreamSizeTask<BaseInstr, 0, gRPCStubs...>>(BufferSizeInSamples, CallbackFunc); }
491 virtual void ResetStreamSize(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ResetStreamSizeTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
492
493 private:
498
500
501 virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
502 virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
503 virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
504 };
505
509 class NetworkDataStreamInstrument : public NetworkDataStreamInstrumentT<DataStreamInstrument, 0, DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>
510 {
511 public:
512 using StubType = DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument;
513
514 NetworkDataStreamInstrument(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
515 : NetworkDataStreamInstrumentT<DataStreamInstrument, 0, StubType>(OwnerThreadID, std::move(Params)) {}
517
518 // Only available if derived directly from DataStreamInstrument since other BaseInstr might already override this function differently.
520 {
521 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
522 return InstrData->GetValueUnit();
523 }
524 };
525}
Implementation of a data stream meta instrument and of data streams input/output devices might work o...
Implements a circular data stream based on Util::circularbuf using samples of type BasicSample.
UnitType
Units which can be used for data stream instruments.
@ Ampere
Electric current in Ampere (A)
@ LogicLevel
Logic level (TTL) units (1 or 0)
@ Counts
Count rate in counts per second (cps)
Implementation of the data stream meta instrument, which is a base class for all instruments reading/...
virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core) const override
Override to make derived classes call DynExp::MakeParams with the correct configurator type derived f...
void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< gRPCInstrumentData< BaseInstr, 0, gRPCStubs... > >) override final
size_t LastReadRemoteSampleID
ID of the last sample read from the remote site and written to the assigned data stream.
size_t LastWrittenSampleID
ID of the last sample read from the assigned data stream and written to the remote site.
virtual void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkDataStreamInstrumentData >)
virtual const char * GetParamClassTag() const noexcept override
This function is intended to be overridden once in each derived class returning the name of the respe...
NetworkDataStreamInstrumentParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< gRPCInstrumentParams< BaseInstr, 0, gRPCStubs... > >) override final
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams >)
Data stream instrument for bidirectional gRPC communication.
virtual std::unique_ptr< DynExp::ExitTaskBase > MakeExitTask() const override
Factory function for an exit task (ExitTaskBase). Override to define the desired deinitialization tas...
virtual std::unique_ptr< DynExp::UpdateTaskBase > MakeUpdateTask() const override
Factory function for an update task (UpdateTaskBase). Override to define the desired update task in d...
virtual std::string GetName() const override
Returns the name of this Object type.
NetworkDataStreamInstrumentT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
virtual void ClearData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void Stop(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual Util::OptionalBool IsRunning() const override
virtual Util::OptionalBool HasFinished() const override
virtual void Start(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void SetStreamSize(size_t BufferSizeInSamples, DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual std::unique_ptr< DynExp::InitTaskBase > MakeInitTask() const override
Factory function for an init task (InitTaskBase). Override to define the desired initialization task ...
virtual void ResetStreamSize(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT >)
void ResetImpl(DynExp::Object::dispatch_tag< gRPCInstrument< BaseInstr, 0, gRPCStubs... > >) override final
virtual std::chrono::milliseconds GetTaskQueueDelay() const
Read remote instrument's state periodically.
virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void Restart(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
virtual void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< ExitTask >, DynExp::InstrumentInstance &Instance)
void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< gRPCInstrumentTasks::ExitTask< BaseInstr, 0, gRPCStubs... > >, DynExp::InstrumentInstance &Instance) override final
virtual void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< InitTask >, DynExp::InstrumentInstance &Instance)
void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< gRPCInstrumentTasks::InitTask< BaseInstr, 0, gRPCStubs... > >, DynExp::InstrumentInstance &Instance) override final
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
SetStreamSizeTask(size_t StreamSizeInSamples, CallbackType CallbackFunc) noexcept
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< gRPCInstrumentTasks::UpdateTask< BaseInstr, 0, gRPCStubs... > >, DynExp::InstrumentInstance &Instance) override final
virtual void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< UpdateTask >, DynExp::InstrumentInstance &Instance)
virtual DynExp::TaskResultType RunChild(DynExp::InstrumentInstance &Instance) override
Runs the task. Override RunChild() to define a derived task's action(s). Any exception leaving RunChi...
Explicit instantiation of derivable class NetworkDataStreamInstrumentT to create the network data str...
DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument StubType
virtual DataStreamInstrumentData::UnitType GetValueUnit() const override
NetworkDataStreamInstrument(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
Configurator class for gRPCInstrument.
Data class for gRPCInstrument.
Parameter class for gRPCInstrument.
Defines a task for deinitializing an instrument within an instrument inheritance hierarchy....
Defines a task for initializing an instrument within an instrument inheritance hierarchy....
Defines a task for updating an instrument within an instrument inheritance hierarchy....
Meta instrument template for transforming meta instruments into network instruments,...
DynExp's core class acts as the interface between the user interface and DynExp's internal data like ...
Definition DynExpCore.h:127
Refer to DynExp::ParamsBase::dispatch_tag.
Refer to DynExp::ParamsBase::dispatch_tag.
void MakeAndEnqueueTask(ArgTs &&...Args) const
Calls MakeTask() to construct a new task and subsequently enqueues the task into the instrument's tas...
Definition Instrument.h:627
Refer to ParamsBase::dispatch_tag.
Definition Instrument.h:146
Defines data for a thread belonging to a InstrumentBase instance. Refer to RunnableInstance.
Definition Instrument.h:772
const InstrumentBase::InstrumentDataGetterType InstrumentDataGetter
Getter for instrument's data. Refer to InstrumentBase::InstrumentDataGetterType.
Definition Instrument.h:791
Refer to ParamsBase::dispatch_tag.
Definition Object.h:2018
Dummy parameter which is to be owned once by parameter classes that do not contain any other paramete...
Definition Object.h:522
Tag for function dispatching mechanism within this class used when derived classes are not intended t...
Definition Object.h:349
Base class for all tasks being processed by instruments. The class must not contain public virtual fu...
Definition Instrument.h:892
std::function< void(const TaskBase &, ExceptionContainer &)> CallbackType
Type of a callback function which is invoked when a task has finished, failed or has been aborted....
Definition Instrument.h:939
TaskBase(CallbackType CallbackFunc=nullptr) noexcept
Constructs an instrument task.
Definition Instrument.h:979
const CallbackType CallbackFunc
This callback function is called after the task has finished (either successfully or not) with a refe...
Defines the return type of task functions.
Definition Instrument.h:824
Refer to DynExp::ParamsBase::dispatch_tag.
Data to operate on is invalid for a specific purpose. This indicates a corrupted data structure or fu...
Definition Exception.h:163
Data type which stores an optional bool value (unknown, false, true). The type evaluates to bool whil...
Definition Util.h:549
Defines a meta instrument template for transforming meta instruments into network instruments,...
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
constexpr DynExpProto::Common::UnitType ToPrototUnitType(DataStreamInstrumentData::UnitType Unit)
BasicSampleStream NetworkDataStreamInstrumentDataSampleStreamType
ResponseMsgType InvokeStubFunc(StubPtrType< gRPCStub > StubPtr, StubFuncPtrType< gRPCStub, RequestMsgType, ResponseMsgType > StubFunc, const RequestMsgType &RequestMsg)
Invokes a gRPC stub function as a remote procedure call. Waits for a fixed amount of time (2 seconds)...
std::shared_ptr< typename gRPCStub::Stub > StubPtrType
Alias for a pointer to a gRPC stub.
constexpr DataStreamInstrumentData::UnitType ToDataStreamInstrumentUnitType(DynExpProto::Common::UnitType Unit)
std::unique_ptr< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
Definition Object.h:1807
size_t ItemIDType
ID type of objects/items managed by DynExp.
std::unique_ptr< TaskT > MakeTask(ArgTs &&...Args)
Factory function to create a task to be enqueued in an instrument's task queue.
Definition Instrument.h:63
Accumulates include statements to provide a precompiled header.