14#include "NetworkTimeTagger.pb.h"
15#include "NetworkTimeTagger.grpc.pb.h"
19 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
20 class NetworkTimeTaggerT;
22 namespace NetworkTimeTaggerTasks
24 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
31 auto InstrData = dynamic_InstrumentData_cast<
NetworkTimeTaggerT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
32 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
35 auto HardwareInfoResponse =
InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::GetHardwareInfo, {});
38 auto InstrData = dynamic_InstrumentData_cast<
NetworkTimeTaggerT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
40 InstrData->MinThresholdInVolts = HardwareInfoResponse.mininputthresholdinvolts();
41 InstrData->MaxThresholdInVolts = HardwareInfoResponse.maxinputthresholdinvolts();
42 InstrData->Resolution =
Util::picoseconds(HardwareInfoResponse.timingresolutioninpicoseconds());
51 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
62 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
68 bool StreamModeChanged =
false;
72 auto InstrData = dynamic_InstrumentData_cast<
NetworkTimeTaggerT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
73 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
75 StreamModeChanged = InstrData->GetStreamModeChanged();
76 StreamMode = InstrData->GetStreamMode();
77 InstrData->ClearStreamModeChanged();
80 if (StreamModeChanged)
82 DynExpProto::NetworkTimeTagger::StreamModeMessage StreamModeMsg;
84 DynExpProto::NetworkTimeTagger::StreamModeType::Counts : DynExpProto::NetworkTimeTagger::StreamModeType::Events);
86 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::SetStreamMode, StreamModeMsg);
89 auto BufferInfoResponse =
InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::GetBufferInfo, {});
90 auto StreamModeResponse =
InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::GetStreamMode, {});
93 auto InstrData = dynamic_InstrumentData_cast<
NetworkTimeTaggerT<BaseInstr, 0, gRPCStubs...>>(Instance.InstrumentDataGetter());
95 InstrData->BufferSizeInSamples = Util::NumToT<size_t>(BufferInfoResponse.buffersizeinsamples());
100 if (!InstrData->GetStreamModeChanged())
102 InstrData->SetStreamMode(StreamModeResponse.streammode() == DynExpProto::NetworkTimeTagger::StreamModeType::Counts ?
104 InstrData->ClearStreamModeChanged();
114 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
126 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
129 auto HBTResultsResponse =
InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::GetHBTResults, {});
134 InstrData->GetHBTResults().Enabled = HBTResultsResponse.enabled();
135 InstrData->GetHBTResults().EventCounts = Util::NumToT<decltype(TimeTaggerData::HBTResultsType::EventCounts)>(HBTResultsResponse.eventcounts());
136 InstrData->GetHBTResults().IntegrationTime = std::chrono::microseconds(HBTResultsResponse.integrationtimeinmicroseconds());
138 InstrData->GetHBTResults().ResultVector.clear();
139 for (
decltype(HBTResultsResponse.results_size()) i = 0; i < HBTResultsResponse.results_size(); ++i)
140 InstrData->GetHBTResults().ResultVector.emplace_back(HBTResultsResponse.results(i).value(), HBTResultsResponse.results(i).time());
147 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
159 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
162 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::ClearBuffer, {});
168 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
178 DynExpProto::NetworkTimeTagger::ConfigureInputMessage ConfigureInputMsg;
185 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
188 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::ConfigureInput, ConfigureInputMsg);
197 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
207 DynExpProto::NetworkTimeTagger::ExposureTimeMessage ExposureTimeMsg;
208 ExposureTimeMsg.set_exposuretimeinpicoseconds(
ExposureTime.count());
213 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
216 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::SetExposureTime, ExposureTimeMsg);
224 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
234 DynExpProto::NetworkTimeTagger::CoincidenceWindowMessage CoincidenceWindowMsg;
235 CoincidenceWindowMsg.set_coincidencewindowinpicoseconds(
CoincidenceWindow.count());
240 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
243 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::SetCoincidenceWindow, CoincidenceWindowMsg);
251 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
261 DynExpProto::NetworkTimeTagger::InputDelayMessage InputDelayMsg;
262 InputDelayMsg.set_delayinpicoseconds(
Delay.count());
267 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
270 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::SetInputDelay, InputDelayMsg);
278 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
288 DynExpProto::NetworkTimeTagger::HBTActiveMessage HBTActiveMsg;
289 HBTActiveMsg.set_enable(
Enable);
295 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
298 InstrData->EnqueuePriorityTask(DynExp::MakeTask<DynExp::DefaultTask>(
nullptr,
299 std::chrono::system_clock::now() + std::chrono::milliseconds(InstrParams->HeavyOperationWaitTime)));
302 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::SetHBTActive, HBTActiveMsg);
310 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
320 DynExpProto::NetworkTimeTagger::ConfigureHBTMessage ConfigureHBTMsg;
321 ConfigureHBTMsg.set_binwidthinpicoseconds(
BinWidth.count());
322 ConfigureHBTMsg.set_bincount(Util::NumToT<google::protobuf::uint64>(
BinCount));
327 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
330 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::ConfigureHBT, ConfigureHBTMsg);
339 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
351 StubPtr = InstrData->template GetStub<DynExpProto::NetworkTimeTagger::NetworkTimeTagger>();
354 InvokeStubFunc(StubPtr, &DynExpProto::NetworkTimeTagger::NetworkTimeTagger::Stub::ResetHBT, {});
361 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
398 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
405 virtual const char*
GetParamClassTag() const noexcept
override {
return "NetworkTimeTaggerParams"; }
408 "HeavyOperationWaitTime",
"Heavy operation wait time in ms",
409 "Wait time in ms for heavy operations on the remote site, like enabling the HBT feature of qutools time taggers.",
421 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
435 template <
typename BaseInstr,
typename std::enable_if_t<std::is_base_of_v<TimeTagger, BaseInstr>,
int>,
typename... gRPCStubs>
442 using StubType = DynExpProto::NetworkTimeTagger::NetworkTimeTagger;
444 constexpr static auto Name() noexcept {
return "Network Time Tagger"; }
454 auto InstrData = dynamic_InstrumentData_cast<NetworkTimeTaggerT>(this->GetInstrumentData());
455 return InstrData->GetMinThresholdInVolts();
460 auto InstrData = dynamic_InstrumentData_cast<NetworkTimeTaggerT>(this->GetInstrumentData());
461 return InstrData->GetMaxThresholdInVolts();
466 auto InstrData = dynamic_InstrumentData_cast<NetworkTimeTaggerT>(this->GetInstrumentData());
467 return InstrData->GetResolution();
472 auto InstrData = dynamic_InstrumentData_cast<NetworkTimeTaggerT>(this->GetInstrumentData());
473 return InstrData->GetBufferSizeInSamples();
Implementation of a gRPC client instrument to access a remote data stream meta instrument.
Data stream instrument for bidirectional gRPC communication.
virtual void ReadData(DynExp::TaskBase::CallbackType CallbackFunc=nullptr) const override
DynExp's core class acts as the interface between the user interface and DynExp's internal data like ...
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...
Refer to ParamsBase::dispatch_tag.
Defines data for a thread belonging to a InstrumentBase instance. Refer to RunnableInstance.
const InstrumentBase::InstrumentDataGetterType InstrumentDataGetter
Getter for instrument's data. Refer to InstrumentBase::InstrumentDataGetterType.
Refer to ParamsBase::dispatch_tag.
Tag for function dispatching mechanism within this class used when derived classes are not intended t...
const Object::ParamsGetterType ParamsGetter
Invoke to obtain the parameters (derived from ParamsBase) of Owner.
Type owning a callback function which is invoked when a task has finished, failed,...
Base class for all tasks being processed by instruments. The class must not contain public virtual fu...
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.
Refer to DynExp::ParamsBase::dispatch_tag.
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
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< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
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.
T::ParamsType * dynamic_Params_cast(ParamsBasePtrType::element_type *Params)
Casts the parameter base class to a derived Object's parameter class.
std::chrono::duration< double, std::pico > picoseconds
Extends std::chrono by a duration data type for picoseconds.
Accumulates include statements to provide a precompiled header.