DynExp
Highly flexible laboratory automation for dynamically changing experiments.
NetworkDigitalInInstr.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 "NetworkDigitalIn.pb.h"
15 #include "NetworkDigitalIn.grpc.pb.h"
16 
17 namespace DynExpInstr
18 {
19  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalIn, BaseInstr>, int>, typename... gRPCStubs>
20  class NetworkDigitalInT;
21 
22  namespace NetworkDigitalInTasks
23  {
24  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalIn, 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<DigitalIn, 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<DigitalIn, 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<DigitalIn, BaseInstr>, int>, typename... gRPCStubs>
59  class NetworkDigitalInData : public NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>
60  {
61  public:
62  using InstrumentType = NetworkDigitalInT<BaseInstr, 0, gRPCStubs...>;
63 
64  NetworkDigitalInData(size_t BufferSizeInSamples = 1)
65  : NetworkDataStreamInstrumentData<BaseInstr, 0, gRPCStubs...>(BufferSizeInSamples) {}
66  virtual ~NetworkDigitalInData() = default;
67 
68  private:
70  {
72  }
73 
75  };
76 
77  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalIn, BaseInstr>, int>, typename... gRPCStubs>
78  class NetworkDigitalInParams : public NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>
79  {
80  public:
81  NetworkDigitalInParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) : NetworkDataStreamInstrumentParams<BaseInstr, 0, gRPCStubs...>(ID, Core) {}
82  virtual ~NetworkDigitalInParams() = default;
83 
84  virtual const char* GetParamClassTag() const noexcept override { return "NetworkDigitalInParams"; }
85 
86  private:
88  {
91 
93  }
94 
96 
98  };
99 
100  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalIn, BaseInstr>, int>, typename... gRPCStubs>
102  {
103  public:
104  using ObjectType = NetworkDigitalInT<BaseInstr, 0, gRPCStubs...>;
105  using ParamsType = NetworkDigitalInParams<BaseInstr, 0, gRPCStubs...>;
106 
108  virtual ~NetworkDigitalInConfigurator() = default;
109 
110  private:
111  virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<NetworkDigitalInConfigurator>(ID, Core); }
112  };
113 
114  template <typename BaseInstr, typename std::enable_if_t<std::is_base_of_v<DigitalIn, BaseInstr>, int>, typename... gRPCStubs>
115  class NetworkDigitalInT : public NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>
116  {
117  public:
118  using ParamsType = NetworkDigitalInParams<BaseInstr, 0, gRPCStubs...>;
119  using ConfigType = NetworkDigitalInConfigurator<BaseInstr, 0, gRPCStubs...>;
120  using InstrumentDataType = NetworkDigitalInData<BaseInstr, 0, gRPCStubs...>;
122 
123  constexpr static auto Name() noexcept { return "Network Digital In"; }
124 
125  NetworkDigitalInT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
126  : NetworkDataStreamInstrumentT<BaseInstr, 0, gRPCStubs...>(OwnerThreadID, std::move(Params)) {}
127  virtual ~NetworkDigitalInT() {}
128 
129  virtual std::string GetName() const override { return Name(); }
130 
131  // Override in order to disable writing to an input instrument.
132  virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc = nullptr) const override { DynExp::InstrumentBase::MakeAndEnqueueTask<DynExp::DefaultTask>(CallbackFunc); }
133 
135  {
136  StubPtrType<StubType> StubPtr;
137  {
138  auto InstrData = dynamic_InstrumentData_cast<NetworkDigitalInT>(this->GetInstrumentData());
139  StubPtr = InstrData->template GetStub<StubType>();
140  } // InstrData unlocked here.
141 
142  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetAsync, {});
143 
144  return Response.value();
145  }
146 
148  {
149  StubPtrType<StubType> StubPtr;
150  {
151  auto InstrData = dynamic_InstrumentData_cast<NetworkDigitalInT>(this->GetInstrumentData());
152  StubPtr = InstrData->template GetStub<StubType>();
153  } // InstrData unlocked here.
154 
155  auto Response = InvokeStubFunc(StubPtr, &StubType::Stub::GetSync, {});
156 
157  return Response.value();
158  }
159 
160  private:
162  {
164  }
165 
167 
168  virtual std::unique_ptr<DynExp::InitTaskBase> MakeInitTask() const override { return DynExp::MakeTask<NetworkDigitalInTasks::InitTask<BaseInstr, 0, gRPCStubs...>>(); }
169  virtual std::unique_ptr<DynExp::ExitTaskBase> MakeExitTask() const override { return DynExp::MakeTask<NetworkDigitalInTasks::ExitTask<BaseInstr, 0, gRPCStubs...>>(); }
170  virtual std::unique_ptr<DynExp::UpdateTaskBase> MakeUpdateTask() const override { return DynExp::MakeTask<NetworkDigitalInTasks::UpdateTask<BaseInstr, 0, gRPCStubs...>>(); }
171  };
172 
177 }
Defines a meta instrument for a single digital input port to read a data stream consisting of digital...
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: DigitalIn.cpp:37
void DisableUserEditable()
Calls DynExp::ParamsBase::DisableUserEditable() on all bundled parameters.
Definition: InputPort.cpp:49
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...
NetworkDigitalInData(size_t BufferSizeInSamples=1)
void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkDataStreamInstrumentData< BaseInstr, 0, gRPCStubs... >>) override final
virtual ~NetworkDigitalInData()=default
virtual void ResetImpl(DynExp::InstrumentDataBase::dispatch_tag< NetworkDigitalInData >)
NetworkDigitalInParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
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< NetworkDigitalInParams >)
void ConfigureParamsImpl(DynExp::ParamsBase::dispatch_tag< NetworkDataStreamInstrumentParams< BaseInstr, 0, gRPCStubs... >>) override final
DynExp::ParamsBase::DummyParam Dummy
virtual ~NetworkDigitalInParams()=default
virtual std::unique_ptr< DynExp::ExitTaskBase > MakeExitTask() const override
Factory function for an exit task (ExitTaskBase). Override to define the desired deinitialization tas...
virtual void WriteData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual DigitalInData::SampleStreamType::SampleType Get(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
virtual void ResetImpl(DynExp::Object::dispatch_tag< NetworkDigitalInT >)
virtual DigitalInData::SampleStreamType::SampleType GetSync() 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 ...
void ResetImpl(DynExp::Object::dispatch_tag< NetworkDataStreamInstrumentT< BaseInstr, 0, gRPCStubs... >>) override final
virtual std::string GetName() const override
Returns the name of this Object type.
constexpr static auto Name() noexcept
NetworkDigitalInT(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
DynExpProto::NetworkDigitalIn::NetworkDigitalIn 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...
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
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
virtual void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< UpdateTask >, DynExp::InstrumentInstance &Instance)
void UpdateFuncImpl(DynExp::UpdateTaskBase::dispatch_tag< NetworkDataStreamInstrumentTasks::UpdateTask< BaseInstr, 0, gRPCStubs... >>, DynExp::InstrumentInstance &Instance) override final
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
NetworkDigitalInT< DigitalIn, 0, typename NetworkDataStreamInstrument::StubType, DynExpProto::NetworkDigitalIn::NetworkDigitalIn > NetworkDigitalIn
Explicit instantiation of derivable class NetworkDigitalInT to create the network digital in instrume...
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
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.