DynExp
Highly flexible laboratory automation for dynamically changing experiments.
NetworkDigitalOutInstr.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 "NetworkDigitalOut.pb.h"
15 #include "NetworkDigitalOut.grpc.pb.h"
16 
17 namespace DynExpInstr
18 {
19  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
20  class NetworkDigitalOutT;
21 
22  namespace NetworkDigitalOutTasks
23  {
24  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
25  class InitTask : public NetworkDataStreamInstrumentTasks::InitTask<BaseInstr, 0, gRPCStubs...>
26  {
28  {
30  }
31 
33  };
34 
35  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
36  class ExitTask : public NetworkDataStreamInstrumentTasks::ExitTask<BaseInstr, 0, gRPCStubs...>
37  {
39  {
41  }
42 
44  };
45 
46  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
47  class UpdateTask : public NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>
48  {
50  {
52  }
53 
55  };
56 
57  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
58  class SetTask : public DynExp::TaskBase
59  {
60  public:
62 
63  private:
65  {
66  DynExpProto::NetworkDigitalOut::SampleMessage SampleMsg;
67  SampleMsg.set_value(Sample != 0);
68 
70  {
71  auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkDigitalOutT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
72  StubPtr = InstrData->template GetStub<DynExpProto::NetworkDigitalOut::NetworkDigitalOut>();
73  } // InstrData unlocked here.
74 
75  InvokeStubFunc(StubPtr, &DynExpProto::NetworkDigitalOut::NetworkDigitalOut::Stub::SetAsync, SampleMsg);
76 
77  return {};
78  }
79 
81  };
82 
83  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
85  {
86  public:
88 
89  private:
91  {
93  {
94  auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkDigitalOutT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
95  StubPtr = InstrData->template GetStub<DynExpProto::NetworkDigitalOut::NetworkDigitalOut>();
96  } // InstrData unlocked here.
97 
98  InvokeStubFunc(StubPtr, &DynExpProto::NetworkDigitalOut::NetworkDigitalOut::Stub::SetDefault, {});
99 
100  return {};
101  }
102  };
103  }
104 
105  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
106  class NetworkDigitalOutData : public NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>
107  {
108  public:
109  using InstrumentType = NetworkDigitalOutT<BaseInstr, 0, gRPCStubs...>;
110 
111  NetworkDigitalOutData(size_t BufferSizeInSamples = 1)
112  : NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>(BufferSizeInSamples) {}
113  virtual ~NetworkDigitalOutData() = default;
114 
115  private:
117  {
119  }
120 
122  };
123 
124  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
125  class NetworkDigitalOutParams : public NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>
126  {
127  public:
128  NetworkDigitalOutParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) : NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>(ID, Core) {}
129  virtual ~NetworkDigitalOutParams() = default;
130 
131  virtual const char* GetParamClassTag() const noexcept override { return "NetworkDigitalOutParams"; }
132 
133  private:
135  {
138 
140  }
141 
143 
145  };
146 
147  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
149  {
150  public:
151  using ObjectType = NetworkDigitalOutT<BaseInstr, 0, gRPCStubs...>;
152  using ParamsType = NetworkDigitalOutParams<BaseInstr, 0, gRPCStubs...>;
153 
155  virtual ~NetworkDigitalOutConfigurator() = default;
156 
157  private:
158  virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkDigitalOutConfigurator>(ID, Core); }
159  };
160 
161  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalOut, BaseInstr>, int>, typename... gRPCStubs>
162  class NetworkDigitalOutT : public NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>
163  {
164  public:
165  using ParamsType = NetworkDigitalOutParams<BaseInstr, 0, gRPCStubs...>;
166  using ConfigType = NetworkDigitalOutConfigurator<BaseInstr, 0, gRPCStubs...>;
167  using InstrumentDataType = NetworkDigitalOutData<BaseInstr, 0, gRPCStubs...>;
169 
170  constexpr static auto Name() noexcept { return "Network Digital Out"; }
171 
172  NetworkDigitalOutT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
173  : NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
174  virtual ~NetworkDigitalOutT() {}
175 
176  virtual std::string GetName() const override { return Name(); }
177 
178  // Override in order to disable reading from an output instrument.
179  virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<DynExp::DefaultTask>(CallbackFunc); }
180 
181  virtual void Set(DigitalOutData::SampleStreamType::SampleType Sample, DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDigitalOutTasks::SetTask<BaseInstr, 0, gRPCStubs...>>(Sample, CallbackFunc); }
182  virtual void SetDefault(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkDigitalOutTasks::SetDefaultTask<BaseInstr, 0, gRPCStubs...>>(CallbackFunc); }
183 
184  virtual void SetSync(DigitalOutData::SampleStreamType::SampleType Sample) const override
185  {
186  DynExpProto::NetworkDigitalOut::SampleMessage SampleMsg;
187  SampleMsg.set_value(Sample != 0);
188 
189  StubPtrType<StubType> StubPtr;
190  {
191  auto InstrData = dynamic_InstrumentData_cast<NetworkDigitalOutT>(this->GetInstrumentData());
192  StubPtr = InstrData->template GetStub<StubType>();
193  } // InstrData unlocked here.
194 
195  InvokeStubFunc(StubPtr, &StubType::Stub::SetSync, SampleMsg);
196  }
197 
198  private:
200  {
202  }
203 
205 
207 
208  virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkDigitalOutTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
209  virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkDigitalOutTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
210  virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkDigitalOutTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
211  };
212 
217 }
Defines a meta instrument for a single digital output port to write a data stream consisting of digit...
Implementation of a gRPC client instrument to access a remote data stream meta instrument.
SampleT SampleType
Alias for SampleT.
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
Definition: DigitalOut.cpp:27
Data stream instrument for bidirectional gRPC communication.
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< NetworkDataStreamInstrumentData< BaseInstr, 0, gRPCStubs... >>) override final
virtual void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkDigitalOutData >)
NetworkDigitalOutData(size_t BufferSizeInSamples=1)
virtual ~NetworkDigitalOutData()=default
virtual ~NetworkDigitalOutParams()=default
NetworkDigitalOutParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDigitalOutParams >)
DynExp::ParamsBase::DummyParam Dummy
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...
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams< BaseInstr, 0, gRPCStubs... >>) override final
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 void ReadData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkDigitalOutT >)
void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< BaseInstr, 0, gRPCStubs... >>) override final
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::string GetName() const override
Returns the name of this Object type.
virtual void Set(DigitalOutData::SampleStreamType::SampleType Sample, DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void SetDefault(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 ...
NetworkDigitalOutT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
constexpr static auto Name() noexcept
virtual void SetSync(DigitalOutData::SampleStreamType::SampleType Sample) const override
virtual Util::FeatureTester< FunctionGenerator::WaveformCapsType > GetWaveformCapsChild() const override
DynExpProto::NetworkDigitalOut::NetworkDigitalOut StubType
virtual void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< ExitTask >, DynExp::InstrumentInstance &Instance)
void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::ExitTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::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...
SetTask(DigitalOutData::SampleStreamType::SampleType Sample, CallbackType CallbackFunc) noexcept
const DigitalOutData::SampleStreamType::SampleType Sample
void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::UpdateTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
virtual void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< UpdateTask >, DynExp::InstrumentInstance &Instance)
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
Definition: OutputPort.cpp:49
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
Holds a bitset containing flags to indicate which features a certain instrument/ module etc....
Definition: Util.h:1231
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
Definition: Instrument.h:1254
NetworkDigitalOutT< DigitalOut, 0, typename NetworkDataStreamInstrument::StubType, DynExpProto::NetworkDigitalOut::NetworkDigitalOut > NetworkDigitalOut
Explicit instantiation of derivable class NetworkDigitalOutT to create the network digital out instru...
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.
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.