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 {
105 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
106
108 {
109 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
110 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
111 } // InstrData unlocked here.
112
113 DynExpProto::NetworkSpectrometer::ExposureTimeMessage Message;
114 Message.set_time_ms(ExposureTime.count());
115
116 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetExposureTime, Message);
117
118 return {};
119 }
120
122 {
124 {
125 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
126 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
127 } // InstrData unlocked here.
128
129 DynExpProto::NetworkSpectrometer::FrequencyRangeMessage Message;
130 Message.set_lowerfrequency(LowerFrequency);
131 Message.set_upperfrequency(UpperFrequency);
132
133 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetFrequencyRange, Message);
134
135 return {};
136 }
137
139 {
141 {
142 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
143 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
144 } // InstrData unlocked here.
145
146 DynExpProto::NetworkSpectrometer::SilentModeMessage Message;
147 Message.set_enable(Enable);
148
149 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::SetSilentMode, Message);
150
151 return {};
152 }
153
155 {
157 {
158 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
159 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
160 } // InstrData unlocked here.
161
162 auto Response = InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::RecordSpectrumAsync, {});
163 if (Response.result() != DynExpProto::NetworkSpectrometer::ResultType::OK)
164 Instance.GetOwner().SetWarning("Failed to start spectrum acquisition.", Util::DynExpErrorCodes::ServiceFailed);
165
166 return {};
167 }
168
170 {
172 {
173 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(Instance.InstrumentDataGetter());
174 StubPtr = InstrData->template GetStub<DynExpProto::NetworkSpectrometer::NetworkSpectrometer>();
175 } // InstrData unlocked here.
176
177 InvokeStubFunc(StubPtr, &DynExpProto::NetworkSpectrometer::NetworkSpectrometer::Stub::Abort, {});
178
179 return {};
180 }
181
183 {
184 FrequencyUnit = FrequencyUnitType::Hz;
185 IntensityUnit = IntensityUnitType::Counts;
186 MinFrequency = 0.0;
187 MaxFrequency = 0.0;
188
189 CapturingState = CapturingStateType::Ready;
190 CapturingProgress = 0.0;
191
192 ResetImpl(dispatch_tag<NetworkSpectrometerData>());
193 }
194
195 NetworkSpectrometer::NetworkSpectrometer(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
196 : gRPCInstrument<Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer>(OwnerThreadID, std::move(Params))
197 {
198 }
199
201 {
202 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
203
204 return InstrData->GetFrequencyUnit();
205 }
206
208 {
209 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
210
211 return InstrData->GetIntensityUnit();
212 }
213
215 {
216 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
217
218 return InstrData->GetMinFrequency();
219 }
220
222 {
223 auto InstrData = DynExp::dynamic_InstrumentData_cast<NetworkSpectrometer>(GetInstrumentData());
224
225 return InstrData->GetMaxFrequency();
226 }
227
232}
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::IntensityUnitType GetIntensityUnit() const
Determines the intensity (y-axis) unit of the spectra acquired by the derived instrument.
virtual SpectrometerData::FrequencyUnitType GetFrequencyUnit() const
Determines the frequency (x-axis) unit of the spectra acquired by the derived instrument.
virtual double GetMinFrequency() const
Determines the minimal lower frequency limit where the spectrum acquisition can begin.
virtual double GetMaxFrequency() const
Determines the maximal upper frequency limit where the spectrum acquisition can end.
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:772
const InstrumentBase::InstrumentDataGetterType InstrumentDataGetter
Getter for instrument's data. Refer to InstrumentBase::InstrumentDataGetterType.
Definition Instrument.h:791
Refer to ParamsBase::dispatch_tag.
Definition Object.h:2018
const auto & GetOwner() const noexcept
Returns Owner.
Definition Object.h:3524
Defines the return type of task functions.
Definition Instrument.h:824
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.