DynExp
Highly flexible laboratory automation for dynamically changing experiments.
NetworkSpectrometer.cpp
Go to the documentation of this file.
1 // This file is part of DynExp.
2 
3 #include "stdafx.h"
4 #include "NetworkSpectrometer.h"
5 
6 namespace 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 
229  {
231  }
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.
void ResetImpl(dispatch_tag< gRPCInstrument< Spectrometer, 0, DynExpProto::NetworkSpectrometer::NetworkSpectrometer >>) override final
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)
Type describing a spectrum as acquired by the Spectrometer instrument.
Definition: Spectrometer.h:121
auto & GetSpectrum() const noexcept
Getter for Samples.
Definition: Spectrometer.h:166
FrequencyUnitType
Supported spectrometer frequency units.
Definition: Spectrometer.h:78
IntensityUnitType
Supported spectrometer intensity units.
Definition: Spectrometer.h:89
Meta instrument for a spectrometer.
Definition: Spectrometer.h:318
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 ...
Definition: Instrument.cpp:222
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...
Definition: Instrument.h:1254
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)
constexpr auto Ready
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.