DynExp
Highly flexible laboratory automation for dynamically changing experiments.
NetworkAnalogInInstr.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 "NetworkAnalogIn.pb.h"
15 #include "NetworkAnalogIn.grpc.pb.h"
16 
17 namespace DynExpInstr
18 {
19  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
20  class NetworkAnalogInT;
21 
22  namespace NetworkAnalogInTasks
23  {
24  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, 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<AnalogIn, 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<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
47  class UpdateTask : public NetworkDataStreamInstrumentTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>
48  {
50  {
52  }
53 
55  };
56  }
57 
58  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
59  class NetworkAnalogInData : public NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>
60  {
61  public:
62  using InstrumentType = NetworkAnalogInT<BaseInstr, 0, gRPCStubs...>;
63 
64  NetworkAnalogInData(size_t BufferSizeInSamples = 1)
65  : NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>(BufferSizeInSamples) {}
66  virtual ~NetworkAnalogInData() = default;
67 
68  private:
70  {
72  }
73 
75  };
76 
77  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
78  class NetworkAnalogInParams : public NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>
79  {
80  public:
81  NetworkAnalogInParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) : NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>(ID, Core) {}
82  virtual ~NetworkAnalogInParams() = default;
83 
84  virtual const char* GetParamClassTag() const noexcept override { return "NetworkAnalogInParams"; }
85 
86  private:
88  {
91 
93  }
94 
96 
98  };
99 
100  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
101  class NetworkAnalogInConfigurator : public NetworkDataStreamInstrumentConfigurator<BaseInstr, 0, gRPCStubs...>
102  {
103  public:
104  using ObjectType = NetworkAnalogInT<BaseInstr, 0, gRPCStubs...>;
105  using ParamsType = NetworkAnalogInParams<BaseInstr, 0, gRPCStubs...>;
106 
108  virtual ~NetworkAnalogInConfigurator() = default;
109 
110  private:
111  virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkAnalogInConfigurator>(ID, Core); }
112  };
113 
114  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogIn, BaseInstr>, int>, typename... gRPCStubs>
115  class NetworkAnalogInT : public NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>
116  {
117  public:
118  using ParamsType = NetworkAnalogInParams<BaseInstr, 0, gRPCStubs...>;
119  using ConfigType = NetworkAnalogInConfigurator<BaseInstr, 0, gRPCStubs...>;
120  using InstrumentDataType = NetworkAnalogInData<BaseInstr, 0, gRPCStubs...>;
122 
123  constexpr static auto Name() noexcept { return "Network Analog In"; }
124 
125  NetworkAnalogInT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
126  : NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
127  virtual ~NetworkAnalogInT() {}
128 
129  virtual std::string GetName() const override { return Name(); }
130 
132  {
133  StubPtrType<StubType> StubPtr;
134  {
135  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
136  StubPtr = InstrData->template GetStub<StubType>();
137  } // InstrData unlocked here.
138 
139  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareLimits, {});
140 
141  return Response.lowerlimit();
142  }
143 
145  {
146  StubPtrType<StubType> StubPtr;
147  {
148  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
149  StubPtr = InstrData->template GetStub<StubType>();
150  } // InstrData unlocked here.
151 
152  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareLimits, {});
153 
154  return Response.upperlimit();
155  }
156 
158  {
159  StubPtrType<StubType> StubPtr;
160  {
161  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
162  StubPtr = InstrData->template GetStub<StubType>();
163  } // InstrData unlocked here.
164 
165  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareResolution, {});
166 
167  return Response.resolution();
168  }
169 
171  {
172  StubPtrType<StubType> StubPtr;
173  {
174  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
175  StubPtr = InstrData->template GetStub<StubType>();
176  } // InstrData unlocked here.
177 
178  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetValueUnit, {});
179 
180  return ToDataStreamInstrumentUnitType(Response.unit());
181  }
182 
183  // Override in order to disable writing to an input instrument.
184  virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<DynExp::DefaultTask>(CallbackFunc); }
185 
187  {
188  StubPtrType<StubType> StubPtr;
189  {
190  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
191  StubPtr = InstrData->template GetStub<StubType>();
192  } // InstrData unlocked here.
193 
194  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetAsync, {});
195 
196  return Response.value();
197  }
198 
200  {
201  StubPtrType<StubType> StubPtr;
202  {
203  auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogInT>(this->GetInstrumentData());
204  StubPtr = InstrData->template GetStub<StubType>();
205  } // InstrData unlocked here.
206 
207  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetSync, {});
208 
209  return Response.value();
210  }
211 
212  private:
214  {
216  }
217 
219 
220  virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkAnalogInTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
221  virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkAnalogInTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
222  virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkAnalogInTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
223  };
224 
229 }
Defines a meta instrument for a single analog input port to read a data stream consisting of analog v...
Implementation of a gRPC client instrument to access a remote data stream meta instrument.
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
Definition: AnalogIn.cpp:17
SampleT SampleType
Alias for SampleT.
UnitType
Units which can be used for data stream instruments.
double ValueType
Data type to represent hardware limits on the sample values to write to the hardware adapter assigned...
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
Definition: InputPort.cpp:49
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
NetworkAnalogInData(size_t BufferSizeInSamples=1)
virtual ~NetworkAnalogInData()=default
virtual void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkAnalogInData >)
NetworkAnalogInParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
DynExp::ParamsBase::DummyParam Dummy
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkAnalogInParams >)
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams< 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...
virtual ~NetworkAnalogInParams()=default
void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< BaseInstr, 0, gRPCStubs... >>) override final
virtual DataStreamInstrumentData::ValueType GetHardwareMinValue() const override
constexpr static auto Name() noexcept
virtual DataStreamInstrumentData::ValueType GetHardwareMaxValue() const override
DynExpProto::NetworkAnalogIn::NetworkAnalogIn StubType
virtual AnalogInData::SampleStreamType::SampleType GetSync() const
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkAnalogInT >)
NetworkAnalogInT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
virtual std::string GetName() const override
Returns the name of this Object type.
virtual std::unique_ptr< DynExp::InitTaskBase > MakeInitTask() const override
Factory function for an init task (InitTaskBase). Override to define the desired initialization task ...
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::unique_ptr< DynExp::ExitTaskBase > MakeExitTask() const override
Factory function for an exit task (ExitTaskBase). Override to define the desired deinitialization tas...
virtual AnalogInData::SampleStreamType::SampleType Get(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const
virtual DataStreamInstrumentData::ValueType GetHardwareResolution() const override final
virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual DataStreamInstrumentData::UnitType GetValueUnit() const override
void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::ExitTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
virtual void ExitFuncImpl(DynExp::ExitTaskBase::dispatch_tag< ExitTask >, DynExp::InstrumentInstance &Instance)
virtual void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< InitTask >, DynExp::InstrumentInstance &Instance)
void InitFuncImpl(DynExp::InitTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::InitTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
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)
Data stream instrument for bidirectional gRPC communication.
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
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
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
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
Refer to DynExp::ParamsBase::dispatch_tag.
Definition: Instrument.h:1182
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
Definition: Instrument.h:1254
NetworkAnalogInT< AnalogIn, 0, typename NetworkDataStreamInstrument::StubType, DynExpProto::NetworkAnalogIn::NetworkAnalogIn > NetworkAnalogIn
Explicit instantiation of derivable class NetworkAnalogInT to create the network analog in instrument...
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< TaskT > MakeTask(ArgTs &&...Args)
Factory function to create a task to be enqueued in an instrument's task queue.
Definition: Instrument.h:63
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.