DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
NetworkAnalogOutInstr.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 "NetworkAnalogOut.pb.h"
15#include "NetworkAnalogOut.grpc.pb.h"
16
17namespace DynExpInstr
18{
19 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
20 class NetworkAnalogOutT;
21
22 namespace NetworkAnalogOutTasks
23 {
24 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
40
41 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
51
52 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
62
63 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
65 {
66 public:
68
69 private:
71 {
72 DynExpProto::NetworkAnalogOut::SampleMessage SampleMsg;
73 SampleMsg.set_value(Sample);
74
76 {
77 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkAnalogOutT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
78 StubPtr = InstrData->template GetStub<DynExpProto::NetworkAnalogOut::NetworkAnalogOut>();
79 } // InstrData unlocked here.
80
81 InvokeStubFunc(StubPtr, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::Stub::SetAsync, SampleMsg);
82
83 return {};
84 }
85
87 };
88
89 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
91 {
92 public:
94
95 private:
97 {
99 {
100 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkAnalogOutT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
101 StubPtr = InstrData->template GetStub<DynExpProto::NetworkAnalogOut::NetworkAnalogOut>();
102 } // InstrData unlocked here.
103
104 InvokeStubFunc(StubPtr, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::Stub::SetDefault, {});
105
106 return {};
107 }
108 };
109 }
110
111 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
112 class NetworkAnalogOutData : public NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>
113 {
114 public:
115 using InstrumentType = NetworkAnalogOutT<BaseInstr, 0, gRPCStubs...>;
116
117 NetworkAnalogOutData(size_t BufferSizeInSamples = 1)
118 : NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>(BufferSizeInSamples) {}
119 virtual ~NetworkAnalogOutData() = default;
120
121 private:
126
128 };
129
130 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
152
153 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
155 {
156 public:
157 using ObjectType = NetworkAnalogOutT<BaseInstr, 0, gRPCStubs...>;
158 using ParamsType = NetworkAnalogOutParams<BaseInstr, 0, gRPCStubs...>;
159
161 virtual ~NetworkAnalogOutConfigurator() = default;
162
163 private:
164 virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkAnalogOutConfigurator>(ID, Core); }
165 };
166
167 template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<AnalogOut, BaseInstr>, int>, typename... gRPCStubs>
168 class NetworkAnalogOutT : public NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>
169 {
170 public:
171 using ParamsType = NetworkAnalogOutParams<BaseInstr, 0, gRPCStubs...>;
172 using ConfigType = NetworkAnalogOutConfigurator<BaseInstr, 0, gRPCStubs...>;
173 using InstrumentDataType = NetworkAnalogOutData<BaseInstr, 0, gRPCStubs...>;
174 using StubType = DynExpProto::NetworkAnalogOut::NetworkAnalogOut;
175
176 constexpr static auto Name() noexcept { return "Network Analog Out"; }
177
178 NetworkAnalogOutT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
179 : NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
181
182 virtual std::string GetName() const override { return Name(); }
183
185 {
186 StubPtrType<StubType> StubPtr;
187 {
188 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
189 StubPtr = InstrData->template GetStub<StubType>();
190 } // InstrData unlocked here.
191
192 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareLimits, {});
193
194 return Response.lowerlimit();
195 }
196
198 {
199 StubPtrType<StubType> StubPtr;
200 {
201 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
202 StubPtr = InstrData->template GetStub<StubType>();
203 } // InstrData unlocked here.
204
205 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareLimits, {});
206
207 return Response.upperlimit();
208 }
209
211 {
212 StubPtrType<StubType> StubPtr;
213 {
214 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
215 StubPtr = InstrData->template GetStub<StubType>();
216 } // InstrData unlocked here.
217
218 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetHardwareResolution, {});
219
220 return Response.resolution();
221 }
222
223 virtual DynExp::Units::UnitType GetValueUnit() const override
224 {
225 StubPtrType<StubType> StubPtr;
226 {
227 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
228 StubPtr = InstrData->template GetStub<StubType>();
229 } // InstrData unlocked here.
230
231 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetValueUnit, {});
232
233 return ToDataStreamInstrumentUnitType(Response.unit());
234 }
235
237 {
238 StubPtrType<StubType> StubPtr;
239 {
240 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
241 StubPtr = InstrData->template GetStub<StubType>();
242 } // InstrData unlocked here.
243
244 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetUserLimits, {});
245
246 return Response.lowerlimit();
247 }
248
250 {
251 StubPtrType<StubType> StubPtr;
252 {
253 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
254 StubPtr = InstrData->template GetStub<StubType>();
255 } // InstrData unlocked here.
256
257 auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetUserLimits, {});
258
259 return Response.upperlimit();
260 }
261
262 // Override in order to disable reading from an output instrument.
263 virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<DynExp::DefaultTask>(std::move(CallbackFunc)); }
264
265 virtual void Set(AnalogOutData::SampleStreamType::SampleType Sample, DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkAnalogOutTasks::SetTask<BaseInstr, 0, gRPCStubs...>>(Sample, std::move(CallbackFunc)); }
266 virtual void SetDefault(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<NetworkAnalogOutTasks::SetDefaultTask<BaseInstr, 0, gRPCStubs...>>(std::move(CallbackFunc)); }
267
268 virtual void SetSync(AnalogOutData::SampleStreamType::SampleType Sample) const override
269 {
270 DynExpProto::NetworkAnalogOut::SampleMessage SampleMsg;
271 SampleMsg.set_value(Sample);
272
273 StubPtrType<StubType> StubPtr;
274 {
275 auto InstrData = dynamic_InstrumentData_cast<NetworkAnalogOutT>(this->GetInstrumentData());
276 StubPtr = InstrData->template GetStub<StubType>();
277 } // InstrData unlocked here.
278
279 InvokeStubFunc(StubPtr, &StubType::Stub::SetSync, SampleMsg);
280 }
281
282 private:
287
289
291
292 virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkAnalogOutTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
293 virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkAnalogOutTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
294 virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkAnalogOutTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
295 };
296
301}
Defines a meta instrument for a single analog output port to write a data stream consisting of analog...
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 AnalogOut.cpp:35
SampleT SampleType
Alias for SampleT.
double ValueType
Data type to represent hardware limits on the sample values to write to the hardware adapter assigned...
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...
NetworkAnalogOutData(size_t BufferSizeInSamples=1)
virtual ~NetworkAnalogOutData()=default
virtual void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkAnalogOutData >)
void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkDataStreamInstrumentData< BaseInstr, 0, gRPCStubs... > >) override final
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkAnalogOutParams >)
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 ~NetworkAnalogOutParams()=default
DynExp::ParamsBase::DummyParam Dummy
NetworkAnalogOutParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
virtual DataStreamInstrumentData::ValueType GetHardwareMinValue() 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 DataStreamInstrumentData::ValueType GetHardwareResolution() const override final
virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void SetSync(AnalogOutData::SampleStreamType::SampleType Sample) const override
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkAnalogOutT >)
void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< BaseInstr, 0, gRPCStubs... > >) override final
virtual void Set(AnalogOutData::SampleStreamType::SampleType Sample, DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual DataStreamInstrumentData::ValueType GetUserMaxValue() 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...
NetworkAnalogOutT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
virtual DataStreamInstrumentData::ValueType GetUserMinValue() const override
virtual void SetDefault(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual DataStreamInstrumentData::ValueType GetHardwareMaxValue() const override
virtual DynExp::Units::UnitType GetValueUnit() const override
static constexpr auto Name() noexcept
virtual Util::FeatureTester< FunctionGenerator::WaveformCapsType > GetWaveformCapsChild() const override
virtual std::string GetName() const override
Returns the name of this Object type.
DynExpProto::NetworkAnalogOut::NetworkAnalogOut StubType
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...
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 bool ApplyLimits() const noexcept override
Disable setting data stream limits in AnalogOutTasks::InitTask::InitFuncImpl() since limits are manag...
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...
const AnalogOutData::SampleStreamType::SampleType Sample
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(AnalogOutData::SampleStreamType::SampleType Sample, CallbackType CallbackFunc) noexcept
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.
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
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.
Holds a bitset containing flags to indicate which features a certain instrument/ module etc....
Definition Util.h:1289
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
constexpr DynExp::Units::UnitType ToDataStreamInstrumentUnitType(DynExpProto::Common::IntensityUnitType Unit)
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
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:851
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.