DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
NetworkSpectrometer.cpp
Go to the documentation of this file.
1// This file is part of DynExp.
2
3#include "stdafx.h"
5
6namespace DynExpInstr
7{
9 {
11 {
12 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
13 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
14 } // InstrData unlocked here.
15
16 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetDeviceInfo, {});
17
18 {
19 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
20
21 InstrData->FrequencyUnit = ToSpectrometerUnitType(Response.frequencyunit());
22 InstrData->IntensityUnit = ToSpectrometerUnitType(Response.intensityunit());
23 InstrData->MinFrequency = Response.hardwareminfrequency();
24 InstrData->MaxFrequency = Response.hardwaremaxfrequency();
25
26 InstrData->SetMinExposureTime(Response.hardwareminexposuretime_ms());
27 InstrData->SetMaxExposureTime(Response.hardwaremaxexposuretime_ms());
28 } // InstrData unlocked here.
29
30 // Initialize derived instrument last.
31 InitFuncImpl(dispatch_tag<InitTask>(), Instance);
32 }
33
35 {
36 // Shut down derived instrument first.
37 ExitFuncImpl(dispatch_tag<ExitTask>(), Instance);
38
39 try
40 {
41 // Stop spectrum acquisition.
43 {
44 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
45 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
46 } // InstrData unlocked here.
47
48 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::Abort, {});
49 }
50 catch (...)
51 {
52 // Swallow any exception which might arise from instrument shutdown since a failure
53 // of this function is not considered a severe error.
54 }
55 }
56
58 {
60 {
61 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
62 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
63 } // InstrData unlocked here.
64
65 auto StateResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetState, {});
66 auto ExposureTimeResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetExposureTime, {});
67 auto FrequencyRangeResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetFrequencyRange, {});
68 auto SilentModeResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetSilentMode, {});
69
70 DynExpProto::NetworkSpectrometer::SpectrumMessage SpectrumResponse;
71 if (StateResponse.spectrumavailable())
72 SpectrumResponse = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::GetSpectrum, {});
73
74 {
75 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
76
77 InstrData->CapturingState = ToSpectrometerStateType(StateResponse.state());
78 InstrData->CapturingProgress = StateResponse.has_progress() ? StateResponse.progress() : 0;
79 InstrData->SetCurrentExposureTime(ExposureTimeResponse.time_ms());
80 InstrData->SetCurrentLowerFrequency(FrequencyRangeResponse.lowerfrequency());
81 InstrData->SetCurrentUpperFrequency(FrequencyRangeResponse.upperfrequency());
82 InstrData->SetSilentModeEnabled(SilentModeResponse.enable());
83
84 if (StateResponse.spectrumavailable() && SpectrumResponse.spectrumavailable())
85 {
86 if (SpectrumResponse.resultmsg().result() != DynExpProto::NetworkSpectrometer::ResultType::OK)
87 Instance.GetOwner().SetWarning("Spectrum acquisition failed.", Util::DynExpErrorCodes::ServiceFailed);
88 else
89 {
90 SpectrometerData::SpectrumType Spectrum(InstrData->GetFrequencyUnit(), InstrData->GetIntensityUnit());
91 for (decltype(SpectrumResponse.samples_size()) i = 0; i < SpectrumResponse.samples_size(); ++i)
92 Spectrum.GetSpectrum().insert({ SpectrumResponse.samples(i).frequency(), SpectrumResponse.samples(i).value() });
93
94 InstrData->SetSpectrum(std::move(Spectrum));
95 }
96 }
97 } // InstrData unlocked here.
98
99 // Update derived instrument.
100 UpdateFuncImpl(dispatch_tag<UpdateTask>(), Instance);
101 }
102
104 {
106 {
107 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
108 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
109 } // InstrData unlocked here.
110
111 DynExpProto::NetworkSpectrometer::ExposureTimeMessage Message;
112 Message.set_time_ms(ExposureTime.count());
113
114 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetExposureTime, Message);
115
116 return {};
117 }
118
120 {
122 {
123 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
124 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
125 } // InstrData unlocked here.
126
127 DynExpProto::NetworkSpectrometer::FrequencyRangeMessage Message;
128 Message.set_lowerfrequency(LowerFrequency);
129 Message.set_upperfrequency(UpperFrequency);
130
131 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetFrequencyRange, Message);
132
133 return {};
134 }
135
137 {
139 {
140 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
141 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
142 } // InstrData unlocked here.
143
144 DynExpProto::NetworkSpectrometer::SilentModeMessage Message;
145 Message.set_enable(Enable);
146
147 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetSilentMode, Message);
148
149 return {};
150 }
151
153 {
155 {
156 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
157 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
158 } // InstrData unlocked here.
159
160 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::RecordSpectrumAsync, {});
161 if (Response.result() != DynExpProto::NetworkSpectrometer::ResultType::OK)
162 Instance.GetOwner().SetWarning("Failed to start spectrum acquisition.", Util::DynExpErrorCodes::ServiceFailed);
163
164 return {};
165 }
166
168 {
170 {
171 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
172 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
173 } // InstrData unlocked here.
174
175 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::Abort, {});
176
177 return {};
178 }
179
181 {
182 FrequencyUnit = FrequencyUnitType::Hz;
183 IntensityUnit = IntensityUnitType::Counts;
184 MinFrequency = 0.0;
185 MaxFrequency = 0.0;
186
187 CapturingState = CapturingStateType::Ready;
188 CapturingProgress = 0.0;
189
190 ResetImpl(dispatch_tag<NetworkSpectrometerData>());
191 }
192
193 NetworkSpectrometer::NetworkSpectrometer(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
194 : gRPCInstrument<Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer>(OwnerThreadID, std::move(Params))
195 {
196 }
197
199 {
200 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
201
202 return InstrData->GetFrequencyUnit();
203 }
204
206 {
207 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
208
209 return InstrData->GetIntensityUnit();
210 }
211
213 {
214 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
215
216 return InstrData->GetMinFrequency();
217 }
218
220 {
221 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
222
223 return InstrData->GetMaxFrequency();
224 }
225
230}
Implementation of a gRPC client instrument to access a remote spectrometer meta instrument.
void ResetImpl(dispatch_tag< gRPCInstrumentData< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer > >) override final
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...
void ExitFuncImpl(dispatch_tag< gRPCInstrumentTasks::ExitTask< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer > >, DynExp::InstrumentInstance &Instance) override final
void InitFuncImpl(dispatch_tag< gRPCInstrumentTasks::InitTask< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer > >, DynExp::InstrumentInstance &Instance) override final
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...
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...
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...
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...
void UpdateFuncImpl(dispatch_tag< gRPCInstrumentTasks::UpdateTask< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer > >, DynExp::InstrumentInstance &Instance) override final
virtual SpectrometerData::FrequencyUnitType GetFrequencyUnit() const override
Determines the frequency (x-axis) unit of the spectra acquired by the derived instrument.
virtual double GetMaxFrequency() const override
Determines the maximal upper frequency limit where the spectrum acquisition can end.
virtual SpectrometerData::IntensityUnitType GetIntensityUnit() const override
Determines the intensity (y-axis) unit of the spectra acquired by the derived instrument.
virtual double GetMinFrequency() const override
Determines the minimal lower frequency limit where the spectrum acquisition can begin.
NetworkSpectrometer(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
void ResetImpl(dispatch_tag< gRPCInstrument< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer > >) override final
Type describing a spectrum as acquired by the Spectrometer instrument.
auto & GetSpectrum() const noexcept
Getter for Samples.
FrequencyUnitType
Supported spectrometer frequency units.
IntensityUnitType
Supported spectrometer intensity units.
Meta instrument for a spectrometer.
Data class for gRPCInstrument.
Defines a task for deinitializing an instrument within an instrument inheritance hierarchy....
Defines a task for initializing an instrument within an instrument inheritance hierarchy....
Defines a task for updating an instrument within an instrument inheritance hierarchy....
Meta instrument template for transforming meta instruments into network instruments,...
InstrumentDataTypeSyncPtrType GetInstrumentData(const std::chrono::milliseconds Timeout=GetInstrumentDataTimeoutDefault)
Locks the mutex of the instrument data class instance InstrumentData assigned to this InstrumentBase ...
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:2018
const auto & GetOwner() const noexcept
Returns Owner.
Definition Object.h:3556
Defines the return type of task functions.
Definition Instrument.h:865
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
constexpr SpectrometerData::FrequencyUnitType ToSpectrometerUnitType(DynExpProto::Common::FrequencyUnitType 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.
constexpr SpectrometerData::CapturingStateType ToSpectrometerStateType(DynExpProto::NetworkSpectrometer::StateType State)
std::unique_ptr< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
Definition Object.h:1807
Accumulates include statements to provide a precompiled header.