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 DynExp::Units::UnitType ToDataStreamInstrumentUnitType(DynExpProto::Common::IntensityUnitType Unit)
25 {
26 switch (Unit)
27 {
28 case DynExpProto::Common::IntensityUnitType::Arbitrary: return DynExp::Units::UnitType::Arbitrary;
29 case DynExpProto::Common::IntensityUnitType::LogicLevel: return DynExp::Units::UnitType::LogicLevel;
30 case DynExpProto::Common::IntensityUnitType::Counts: return DynExp::Units::UnitType::Counts;
31 case DynExpProto::Common::IntensityUnitType::Volt: return DynExp::Units::UnitType::Volt;
32 case DynExpProto::Common::IntensityUnitType::Ampere: return DynExp::Units::UnitType::Ampere;
33 case DynExpProto::Common::IntensityUnitType::Power_W: return DynExp::Units::UnitType::Power_W;
34 case DynExpProto::Common::IntensityUnitType::Power_dBm: return DynExp::Units::UnitType::Power_dBm;
35 default: throw Util::InvalidDataException("The given unit is not supported here. Did you forget to adjust this function or the IntensityUnitType enumeration in file \"Common.proto\"?");
36 }
37 }
38
39 namespace NetworkDataStreamInstrumentTasks
40 {
41 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
42 class InitTask : public gRPCInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>
43 {
45 {
47 {
48 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
49
50 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
51 } // InstrData unlocked here.
52
53 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::GetStreamInfo, {});
54
55 {
56 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
57
58 InstrData->RemoteStreamInfo.ValueUnit = ToDataStreamInstrumentUnitType(Response.valueunit());
59 InstrData->RemoteStreamInfo.HardwareMinValue = Response.hardwareminvalue();
60 InstrData->RemoteStreamInfo.HardwareMaxValue = Response.hardwaremaxvalue();
61 InstrData->RemoteStreamInfo.IsBasicSampleTimeUsed = Response.isbasicsampletimeused();
62 InstrData->RemoteStreamInfo.StreamSizeRead = Util::NumToT<size_t>(Response.streamsizemsg().streamsizeread());
63 InstrData->RemoteStreamInfo.StreamSizeWrite = Util::NumToT<size_t>(Response.streamsizemsg().streamsizewrite());
64
65 InstrData->GetSampleStream()->SetStreamSize(InstrData->RemoteStreamInfo.StreamSizeWrite);
66 } // InstrData unlocked here.
67
69 }
70
72 };
73
74 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
84
85 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
86 class UpdateTask : public gRPCInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>
87 {
89 {
91 {
92 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
93 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
94 } // InstrData unlocked here.
95
96 auto StreamSizeResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::GetStreamSize, {});
97 auto FinishedResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::HasFinished, {});
98 auto RunningResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::IsRunning, {});
99
100 {
101 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
102
103 InstrData->RemoteStreamInfo.StreamSizeRead = Util::NumToT<size_t>(StreamSizeResponse.streamsizeread());
104 InstrData->RemoteStreamInfo.StreamSizeWrite = Util::NumToT<size_t>(StreamSizeResponse.streamsizewrite());
105 InstrData->Finished = FinishedResponse.has_value() ? Util::OptionalBool(FinishedResponse.value()) : Util::OptionalBool::Values::Unknown;
106 InstrData->Running = RunningResponse.has_value() ? Util::OptionalBool(RunningResponse.value()) : Util::OptionalBool::Values::Unknown;
107
108 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != InstrData->RemoteStreamInfo.StreamSizeWrite)
109 {
110 InstrData->GetSampleStream()->SetStreamSize(InstrData->RemoteStreamInfo.StreamSizeWrite);
111 InstrData->SetLastReadRemoteSampleID(0);
112 }
113 } // InstrData unlocked here.
114
116 }
117
119 };
120
121 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
123 {
124 public:
126
127 private:
129 {
130 DynExpProto::NetworkDataStreamInstrument::ReadMessage ReadMsg;
132 {
133 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
134
135 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
136 ReadMsg.set_startsampleid(Util::NumToT<google::protobuf::uint64>(InstrData->GetLastReadRemoteSampleID()));
137 } // InstrData unlocked here.
138
139 auto ReadResultMsg = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Read, ReadMsg);
140
141 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
142 for (decltype(ReadResultMsg.samples_size()) i = 0; i < ReadResultMsg.samples_size(); ++i)
143 InstrData->GetSampleStream()->WriteBasicSample({ ReadResultMsg.samples(i).value(), ReadResultMsg.samples(i).time() });
144
145 InstrData->SetLastReadRemoteSampleID(Util::NumToT<size_t>(ReadResultMsg.lastsampleid()));
146
147 return {};
148 }
149 };
150
151 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
153 {
154 public:
156
157 private:
159 {
161 std::vector<NetworkDataStreamInstrumentDataSampleStreamType::SampleType> Samples;
162 {
163 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
164 auto SampleStream = InstrData->template GetCastSampleStream<NetworkDataStreamInstrumentDataSampleStreamType>();
165
166 if (SampleStream->GetNumSamplesWritten() == InstrData->GetLastWrittenSampleID())
167 return {};
168 if (SampleStream->GetNumSamplesWritten() < InstrData->GetLastWrittenSampleID())
169 InstrData->SetLastWrittenSampleID(0); // e.g. if SampleStream has been cleared. Transmit the entire buffer then.
170
171 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
172
173 Samples = SampleStream->ReadRecentBasicSamples(InstrData->GetLastWrittenSampleID());
174 InstrData->SetLastWrittenSampleID(SampleStream->GetNumSamplesWritten());
175 } // InstrData unlocked here.
176
177 DynExpProto::NetworkDataStreamInstrument::WriteMessage WriteMsg;
178 for (const auto& Sample : Samples)
179 {
180 auto BasicSampleMsg = WriteMsg.add_samples();
181 BasicSampleMsg->set_value(Sample.Value);
182 BasicSampleMsg->set_time(Sample.Time);
183 }
184
185 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Write, WriteMsg);
186
187 return {};
188 }
189 };
190
191 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
193 {
194 public:
196
197 private:
199 {
201 {
202 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
203 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
204 } // InstrData unlocked here.
205
206 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::ClearData, {});
207
208 return {};
209 }
210 };
211
212 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
214 {
215 public:
217
218 private:
220 {
222 {
223 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
224 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
225 } // InstrData unlocked here.
226
227 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Start, {});
228
229 return {};
230 }
231 };
232
233 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
235 {
236 public:
238
239 private:
241 {
243 {
244 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
245 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
246 } // InstrData unlocked here.
247
248 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Stop, {});
249
250 return {};
251 }
252 };
253
254 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
256 {
257 public:
259
260 private:
262 {
264 {
265 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
266 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
267 } // InstrData unlocked here.
268
269 InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::Restart, {});
270
271 return {};
272 }
273 };
274
275 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
277 {
278 public:
281
282 private:
284 {
285 DynExpProto::NetworkDataStreamInstrument::StreamSizeMessage StreamSizeMsg;
286 StreamSizeMsg.set_streamsizewrite(Util::NumToT<google::protobuf::uint64>(StreamSizeInSamples));
287
289 {
290 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
291 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
292 } // InstrData unlocked here.
293
294 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::SetStreamSize, StreamSizeMsg);
295
296 {
297 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
298 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != Response.streamsizewrite())
299 {
300 InstrData->GetSampleStream()->SetStreamSize(Response.streamsizewrite());
301 InstrData->SetLastReadRemoteSampleID(0);
302 }
303 } // InstrData unlocked here.
304
305 return {};
306 }
307
309 };
310
311 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
313 {
314 public:
316
317 private:
319 {
321 {
322 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
323 StubPtr = InstrData->template GetStub<DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>();
324 } // InstrData unlocked here.
325
326 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument::Stub::ResetStreamSize, {});
327
328 {
329 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
330 if (InstrData->GetSampleStream()->GetStreamSizeWrite() != Response.streamsizewrite())
331 {
332 InstrData->GetSampleStream()->SetStreamSize(Response.streamsizewrite());
333 InstrData->SetLastReadRemoteSampleID(0);
334 }
335 } // InstrData unlocked here.
336
337 return {};
338 }
339 };
340 }
341
342 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
343 class NetworkDataStreamInstrumentData : public gRPCInstrumentData<BaseInstr, 0, gRPCStubs...>
344 {
345 friend class NetworkDataStreamInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>;
346 friend class NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>;
347
348 public:
350 using InstrumentType = NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>;
351
361
362 NetworkDataStreamInstrumentData(size_t BufferSizeInSamples = 1)
363 : gRPCInstrumentData<BaseInstr, 0, gRPCStubs...>(std::make_unique<SampleStreamType>(BufferSizeInSamples)) {}
365
366 const auto& GetRemoteStreamInfo() const noexcept { return RemoteStreamInfo; }
367 auto HasFinished() const noexcept { return Finished; }
368 auto IsRunning() const noexcept { return Running; }
369
370 auto GetLastReadRemoteSampleID() const noexcept { return LastReadRemoteSampleID; }
371 void SetLastReadRemoteSampleID(size_t SampleID) noexcept { LastReadRemoteSampleID = SampleID; }
372 auto GetLastWrittenSampleID() const noexcept { return LastWrittenSampleID; }
373 void SetLastWrittenSampleID(size_t SampleID) noexcept { LastWrittenSampleID = SampleID; }
374
375 private:
387
389
393
396 };
397
398 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
413
414 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
416 {
417 public:
418 using ObjectType = NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>;
419 using ParamsType = NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>;
420
423
424 private:
425 virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkDataStreamInstrumentConfigurator>(ID, Core); }
426 };
427
434 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
435 class NetworkDataStreamInstrumentT : public gRPCInstrument<BaseInstr, 0, gRPCStubs...>
436 {
437 public:
438 using ParamsType = NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>;
439 using ConfigType = NetworkDataStreamInstrumentConfigurator<BaseInstr, 0, gRPCStubs...>;
440 using InstrumentDataType = NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>;
441
442 constexpr static auto Name() noexcept { return "Network Data Stream Instrument"; }
443
444 NetworkDataStreamInstrumentT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
445 : gRPCInstrument<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
447
448 virtual std::string GetName() const override { return Name(); }
449
454 virtual std::chrono::milliseconds GetTaskQueueDelay() const { return std::chrono::milliseconds(500); }
455
456 virtual Util::OptionalBool HasFinished() const override
457 {
458 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
459 return InstrData->HasFinished();
460 }
461
462 virtual Util::OptionalBool IsRunning() const override
463 {
464 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
465 return InstrData->IsRunning();
466 }
467
468 // Tasks
469 virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ReadTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
470 virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::WriteTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
471 virtual void ClearData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ClearTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
472 virtual void Start(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::StartTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
473 virtual void Stop(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::StopTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
474 virtual void Restart(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::RestartTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
475 virtual void SetStreamSize(size_t BufferSizeInSamples, DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::SetStreamSizeTask<BaseInstr, 0, gRPCStubs...>>(BufferSizeInSamples, std::move(CallbackFunc)); }
476 virtual void ResetStreamSize(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDataStreamInstrumentTasks::ResetStreamSizeTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
477
478 private:
483
485
486 virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
487 virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
488 virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
489 };
490
494 class NetworkDataStreamInstrument : public NetworkDataStreamInstrumentT<DataStreamInstrument, 0, DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument>
495 {
496 public:
497 using StubType = DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument;
498
499 NetworkDataStreamInstrument(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
500 : NetworkDataStreamInstrumentT<DataStreamInstrument, 0, StubType>(OwnerThreadID, std::move(Params)) {}
502
503 // Only available if derived directly from DataStreamInstrument since other BaseInstr might already override this function differently.
504 virtual DynExp::Units::UnitType GetValueUnit() const override
505 {
506 auto InstrData = dynamic_InstrumentData_cast<NetworkDataStreamInstrumentT>(this->GetInstrumentData());
507 return InstrData->GetValueUnit();
508 }
509 };
510}
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.
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 DynExp::Units::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:675
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:813
const InstrumentBase::InstrumentDataGetterType InstrumentDataGetter
Getter for instrument's data. Refer to InstrumentBase::InstrumentDataGetterType.
Definition Instrument.h:832
Refer to ParamsBase::dispatch_tag.
Definition Object.h:2026
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
Type owning a callback function which is invoked when a task has finished, failed,...
Definition Instrument.h:978
Base class for all tasks being processed by instruments. The class must not contain public virtual fu...
Definition Instrument.h:929
CallbackType CallbackFunc
This callback function is called after the task has finished (either successfully or not) with a poin...
TaskBase(CallbackType CallbackFunc=nullptr, std::chrono::system_clock::time_point DeferUntil={}) noexcept
Constructs an instrument task.
Defines the return type of task functions.
Definition Instrument.h:865
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:164
Data type which stores an optional bool value (unknown, false, true). The type evaluates to bool whil...
Definition Util.h:550
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 DynExp::Units::UnitType ToDataStreamInstrumentUnitType(DynExpProto::Common::IntensityUnitType 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.
UnitType
Units which can be used with DynExp instruments.
Definition Units.h:28
@ Ampere
Electric current in Ampere (A)
@ Power_dBm
Power in dBm.
@ Arbitrary
Arbitrary units (a.u.)
@ LogicLevel
Logic level (TTL) units (1 or 0)
@ Power_W
Power in Watt (W)
@ Volt
Voltage in Volt (V)
@ Counts
Count rate in counts per second (cps)
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.