DynExp
Highly flexible laboratory automation for dynamically changing experiments.
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 
17 namespace 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>
90  class ExitTask : public gRPCInstrumentTasks::ExitTask<BaseInstr, 0, gRPCStubs...>
91  {
93  {
95  }
96 
98  };
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>
137  class ReadTask : public DynExp::TaskBase
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>
249  class StopTask : public DynExp::TaskBase
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 
323  const size_t StreamSizeInSamples;
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 
368  {
370  double HardwareMinValue = 0;
371  double HardwareMaxValue = 0;
372  bool IsBasicSampleTimeUsed = false;
373  size_t StreamSizeRead = 0;
374  size_t StreamSizeWrite = 0;
375  };
376 
377  NetworkDataStreamInstrumentData(size_t BufferSizeInSamples = 1)
378  : gRPCInstrumentData<BaseInstr, 0, gRPCStubs...>(std::make_unique<SampleStreamType>(BufferSizeInSamples)) {}
379  virtual ~NetworkDataStreamInstrumentData() = default;
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:
392  {
393  RemoteStreamInfo = {};
396 
399 
401  }
402 
404 
408 
410  size_t LastWrittenSampleID = 0;
411  };
412 
413  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
414  class NetworkDataStreamInstrumentParams : public gRPCInstrumentParams<BaseInstr, 0, gRPCStubs...>
415  {
416  public:
417  NetworkDataStreamInstrumentParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) : gRPCInstrumentParams<BaseInstr, 0, gRPCStubs...>(ID, Core) {}
419 
420  virtual const char* GetParamClassTag() const noexcept override { return "NetworkDataStreamInstrumentParams"; }
421 
422  private:
425 
427  };
428 
429  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DataStreamInstrument, BaseInstr>, int>, typename... gRPCStubs>
430  class NetworkDataStreamInstrumentConfigurator : public gRPCInstrumentConfigurator<BaseInstr, 0, 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:
495  {
497  }
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:
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 >)
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< gRPCInstrumentParams< BaseInstr, 0, gRPCStubs... >>) override final
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)
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams >)
Data stream instrument for bidirectional gRPC communication.
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 std::unique_ptr< DynExp::InitTaskBase > MakeInitTask() const override
Factory function for an init task (InitTaskBase). Override to define the desired initialization task ...
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 void ResetStreamSize(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
void ResetImpl(DynExp::Object::dispatch_tag< gRPCInstrument< BaseInstr, 0, gRPCStubs... >>) override final
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT >)
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 std::unique_ptr< DynExp::ExitTaskBase > MakeExitTask() const override
Factory function for an exit task (ExitTaskBase). Override to define the desired deinitialization tas...
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
void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< gRPCInstrumentTasks::InitTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
virtual void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< InitTask >, 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...
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.
Definition: Instrument.h:1151
Refer to DynExp::ParamsBase::dispatch_tag.
Definition: Instrument.h:1120
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...
Definition: Instrument.h:1072
Defines the return type of task functions.
Definition: Instrument.h:824
Refer to DynExp::ParamsBase::dispatch_tag.
Definition: Instrument.h:1182
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...
Definition: Instrument.h:1254
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)
NetworkDataStreamInstrumentT< DynExpProto::NetworkDataStreamInstrument::NetworkDataStreamInstrument > NetworkDataStreamInstrument
Explicit instantiation of derivable class NetworkDataStreamInstrumentT to create the network data str...
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
auto dynamic_InstrumentData_cast(Util::SynchronizedPointer< From > &&InstrumentDataPtr)
Casts the data base class From into a derived InstrumentBase's (To) data class keeping the data locke...
Definition: Instrument.h:810
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.
Accumulates include statements to provide a precompiled header.