DynExp
Highly flexible laboratory automation for dynamically changing experiments.
NetworkAnalogOutModule.h
Go to the documentation of this file.
1 // This file is part of DynExp.
2 
9 #pragma once
10 
11 #include "stdafx.h"
12 #include "../MetaInstruments/AnalogOut.h"
14 
15 #include "NetworkAnalogOut.grpc.pb.h"
16 
17 namespace DynExpModule
18 {
19  template <typename... gRPCServices>
20  class NetworkAnalogOutT;
21 
22  template <typename... gRPCServices>
23  class NetworkAnalogOutData : public NetworkDataStreamInstrumentData<gRPCServices...>
24  {
25  public:
27 
29  virtual ~NetworkAnalogOutData() = default;
30 
31  auto GetAnalogOut() { return DynExp::dynamic_Object_cast<InstrType>(NetworkDataStreamInstrumentData<gRPCServices...>::GetDataStreamInstrument().get()); }
32 
33  private:
36 
37  void Init() {}
38  };
39 
40  template <typename... gRPCServices>
42  {
43  public:
45  virtual ~NetworkAnalogOutParams() = default;
46 
47  virtual const char* GetParamClassTag() const noexcept override { return "NetworkAnalogOutParams"; }
48 
49  private:
52 
54  };
55 
56  template <typename... gRPCServices>
58  {
59  public:
60  using ObjectType = NetworkAnalogOutT<gRPCServices...>;
61  using ParamsType = NetworkAnalogOutParams<gRPCServices...>;
62 
64  virtual ~NetworkAnalogOutConfigurator() = default;
65 
66  private:
67  virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkAnalogOutConfigurator>(ID, Core); }
68  };
69 
70  template <typename... gRPCServices>
71  class NetworkAnalogOutT : public NetworkDataStreamInstrumentT<gRPCServices...>
72  {
73  public:
74  using ParamsType = NetworkAnalogOutParams<gRPCServices...>;
75  using ConfigType = NetworkAnalogOutConfigurator<gRPCServices...>;
76  using ModuleDataType = NetworkAnalogOutData<gRPCServices...>;
78 
79  constexpr static auto Name() noexcept { return "Network Analog Out"; }
80 
82  : NetworkDataStreamInstrumentT<gRPCServices...>(OwnerThreadID, std::move(Params)) {}
83  virtual ~NetworkAnalogOutT() = default;
84 
85  virtual std::string GetName() const override { return Name(); }
86 
87  protected:
89  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetHardwareLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage>
90  {
91  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetHardwareLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage>;
92  using Base::ResponseMessage;
93 
94  public:
95  CallDataGetHardwareLimits(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
96  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestGetHardwareLimits) {}
97  virtual ~CallDataGetHardwareLimits() = default;
98 
99  private:
100  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
101  {
102  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
103 
104  ResponseMessage.set_lowerlimit(ModuleData->GetAnalogOut()->GetHardwareMinValue());
105  ResponseMessage.set_upperlimit(ModuleData->GetAnalogOut()->GetHardwareMaxValue());
106  }
107  };
108 
110  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetUserLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage>
111  {
112  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetUserLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage>;
113  using Base::ResponseMessage;
114 
115  public:
116  CallDataGetUserLimits(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
117  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestGetUserLimits) {}
118  virtual ~CallDataGetUserLimits() = default;
119 
120  private:
121  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
122  {
123  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
124 
125  ResponseMessage.set_lowerlimit(ModuleData->GetAnalogOut()->GetUserMinValue());
126  ResponseMessage.set_upperlimit(ModuleData->GetAnalogOut()->GetUserMaxValue());
127  }
128  };
129 
131  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataHardwareResolution, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueResolutionMessage>
132  {
133  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataHardwareResolution, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueResolutionMessage>;
134  using Base::ResponseMessage;
135 
136  public:
137  CallDataHardwareResolution(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
138  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestGetHardwareResolution) {}
139  virtual ~CallDataHardwareResolution() = default;
140 
141  private:
142  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
143  {
144  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
145 
146  ResponseMessage.set_resolution(ModuleData->GetAnalogOut()->GetHardwareResolution());
147  }
148  };
149 
151  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetValueUnit, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueUnitMessage>
152  {
153  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataGetValueUnit, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueUnitMessage>;
154  using Base::ResponseMessage;
155 
156  public:
157  CallDataGetValueUnit(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
158  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestGetValueUnit) {}
159  virtual ~CallDataGetValueUnit() = default;
160 
161  private:
162  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
163  {
164  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
165 
166  ResponseMessage.set_unit(DynExpInstr::ToPrototUnitType(ModuleData->GetAnalogOut()->GetValueUnit()));
167  }
168  };
169 
171  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetAsync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage>
172  {
173  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetAsync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage>;
174  using Base::RequestMessage;
175 
176  public:
177  CallDataSetAsync(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
178  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestSetAsync) {}
179  virtual ~CallDataSetAsync() = default;
180 
181  private:
182  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
183  {
184  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
185 
186  ModuleData->GetAnalogOut()->Set(RequestMessage.value());
187  }
188  };
189 
191  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetSync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage>
192  {
193  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetSync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage>;
194  using Base::RequestMessage;
195 
196  public:
197  CallDataSetSync(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
198  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestSetSync) {}
199  virtual ~CallDataSetSync() = default;
200 
201  private:
202  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
203  {
204  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
205 
206  ModuleData->GetAnalogOut()->SetSync(RequestMessage.value());
207  }
208  };
209 
211  : public gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetDefault, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::Common::VoidMessage>
212  {
213  using Base = gRPCModule<gRPCServices...>::template TypedCallDataBase<CallDataSetDefault, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::Common::VoidMessage>;
214 
215  public:
216  CallDataSetDefault(const gRPCModule<gRPCServices...>* const OwningModule) noexcept
217  : Base::TypedCallDataBase(OwningModule, &DynExpProto::NetworkAnalogOut::NetworkAnalogOut::AsyncService::RequestSetDefault) {}
218  virtual ~CallDataSetDefault() = default;
219 
220  private:
221  virtual void ProcessChildImpl(DynExp::ModuleInstance& Instance) override
222  {
223  auto ModuleData = DynExp::dynamic_ModuleData_cast<NetworkAnalogOutT>(Instance.ModuleDataGetter());
224 
225  ModuleData->GetAnalogOut()->SetDefault();
226  }
227  };
228 
229  private:
231  {
233  }
234 
236 
238  {
239  CallDataGetHardwareLimits::MakeCall(this, Instance);
240  CallDataGetUserLimits::MakeCall(this, Instance);
241  CallDataHardwareResolution::MakeCall(this, Instance);
242  CallDataGetValueUnit::MakeCall(this, Instance);
243  CallDataSetAsync::MakeCall(this, Instance);
244  CallDataSetSync::MakeCall(this, Instance);
245  CallDataSetDefault::MakeCall(this, Instance);
246 
248  }
249 
251 
252  virtual void ValidateInstrType(const DynExpInstr::DataStreamInstrument* Instr) const override { DynExp::dynamic_Object_cast<typename ModuleDataType::InstrType>(Instr); }
253  };
254 
259 }
Implementation of a gRPC server module to provide remote access to a data stream instrument meta inst...
Meta instrument for a single analog output port based on the data stream, function generator,...
Definition: AnalogOut.h:176
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::ModuleDataBase::dispatch_tag< NetworkDataStreamInstrumentData< gRPCServices... >>) override final
virtual void ResetImpl(DynExp::ModuleDataBase::dispatch_tag< NetworkAnalogOutData >)
virtual ~NetworkAnalogOutData()=default
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...
virtual void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkAnalogOutParams >)
NetworkAnalogOutParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
virtual ~NetworkAnalogOutParams()=default
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams< gRPCServices... >>) override final
CallDataGetHardwareLimits(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataGetHardwareLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage > Base
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataGetUserLimits, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueLimitsMessage > Base
CallDataGetUserLimits(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataGetValueUnit, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueUnitMessage > Base
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
CallDataGetValueUnit(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
CallDataHardwareResolution(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataHardwareResolution, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::NetworkAnalogOut::ValueResolutionMessage > Base
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataSetAsync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage > Base
CallDataSetAsync(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataSetDefault, ThisServiceType, DynExpProto::Common::VoidMessage, DynExpProto::Common::VoidMessage > Base
CallDataSetDefault(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
gRPCModule< gRPCServices... >::template TypedCallDataBase< CallDataSetSync, ThisServiceType, DynExpProto::NetworkAnalogOut::SampleMessage, DynExpProto::Common::VoidMessage > Base
virtual void ProcessChildImpl(DynExp::ModuleInstance &Instance) override
CallDataSetSync(const gRPCModule< gRPCServices... > *const OwningModule) noexcept
void CreateInitialCallDataObjectsImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< gRPCServices... >>, DynExp::ModuleInstance &Instance) const override final
DynExpProto::NetworkAnalogOut::NetworkAnalogOut ThisServiceType
void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< gRPCServices... >>) override final
virtual void ValidateInstrType(const DynExpInstr::DataStreamInstrument *Instr) const override
NetworkAnalogOutT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
virtual ~NetworkAnalogOutT()=default
virtual void CreateInitialCallDataObjectsImpl(DynExp::Object::dispatch_tag< NetworkAnalogOutT >, DynExp::ModuleInstance &Instance) const
constexpr static auto Name() noexcept
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkAnalogOutT >)
virtual std::string GetName() const override
Returns the name of this Object type.
Module template for building gRPC servers listening on TCP sockets for network instruments to connect...
Definition: gRPCModule.h:116
DynExp's core class acts as the interface between the user interface and DynExp's internal data like ...
Definition: DynExpCore.h:127
Base class for modules. Modules implement programs on their own (e.g. measurement protocols or server...
Definition: Module.h:392
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Definition: Module.h:743
Configurator class for ModuleBase.
Definition: Module.h:374
Data structure to contain data which is synchronized in between different threads....
Definition: Module.h:171
Refer to ParamsBase::dispatch_tag.
Definition: Module.h:189
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
Definition: Module.h:793
const ModuleBase::ModuleDataGetterType ModuleDataGetter
Getter for module's data. Refer to ModuleBase::ModuleDataGetterType.
Definition: Module.h:825
Parameter class for ModuleBase.
Definition: Module.h:337
const std::thread::id OwnerThreadID
Thread id of the thread which has constructed (and owns) this Object instance.
Definition: Object.h:2302
const ParamsBasePtrType Params
Pointer to the parameter class instance belonging to this Object instance.
Definition: Object.h:2303
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
const ItemIDType ID
ID of the Object this parameter class instance belongs to.
Definition: Object.h:1779
const DynExpCore & Core
Reference to DynExp's core.
Definition: Object.h:1780
Tag for function dispatching mechanism within this class used when derived classes are not intended t...
Definition: Object.h:349
constexpr DynExpProto::Common::UnitType ToPrototUnitType(DataStreamInstrumentData::UnitType Unit)
DynExp's module namespace contains the implementation of DynExp modules which extend DynExp's core fu...
NetworkAnalogOutT< typename NetworkDataStreamInstrument::ThisServiceType, DynExpProto::NetworkAnalogOut::NetworkAnalogOut > NetworkAnalogOut
Explicit instantiation of derivable class NetworkAnalogOutT to create the network analog out module.
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.