DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
NP_Conex_CC.cpp
Go to the documentation of this file.
1// This file is part of DynExp.
2
3#include "stdafx.h"
4#include "NP_Conex_CC.h"
5
6namespace DynExpInstr
7{
9 {
10 {
11 auto InstrParams = DynExp::dynamic_Params_cast<NP_Conex_CC>(Instance.ParamsGetter());
12 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
13
14 InstrData->Channel = InstrParams->Conex_CC_Address;
15 Instance.LockObject(InstrParams->HardwareAdapter, InstrData->HardwareAdapter);
16 InstrData->HardwareAdapter->Clear();
17
18 // Define and go to home (this includes resetting the controller):
19 // To set the current position as home position, the stage has to be in the CONFIGURATION state. This state can only be reached from the NOT REFERENCED state.
20 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "RS"; // Go to NOT REFERENCED state.
21 std::this_thread::sleep_for(std::chrono::milliseconds(500)); // This takes 500 ms.
22 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW1"; // Go to CONFIGURATION state.
23 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "HT1"; // Set current position to home position.
24 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW0"; // Go to NOT REFERENCED state.
25 std::this_thread::sleep_for(std::chrono::seconds(3)); // This takes 3 s.
26 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "OR"; // Go to READY state.
27 }
28
30 }
31
33 {
34 ExitFuncImpl(dispatch_tag<ExitTask>(), Instance);
35
36 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
37
38 try
39 {
40 // Abort motion.
41 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "ST";
42 }
43 catch (...)
44 {
45 // Swallow any exception which might arise from HardwareAdapter->operator<<() since a failure
46 // of this function is not considered a severe error.
47 }
48
49 Instance.UnlockObject(InstrData->HardwareAdapter);
50 }
51
53 {
54 try
55 {
56 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
57 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
58 bool UpdateError = false;
59
60 try
61 {
62 // Tell status:
63 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "TS";
64 std::stringstream StatusStream(NP_Conex_CC::AnswerToNumberString(InstrData->HardwareAdapter->WaitForLine(1, std::chrono::milliseconds(25)), "TS"));
65 StatusStream.exceptions(std::ofstream::failbit | std::ofstream::badbit);
66
67 char ErrorMapBuffer[5]{ 0 }; // 4 characters + 1 for null terminator
68 StatusStream.read(ErrorMapBuffer, 4); // Read the first 4 characters
69 std::istringstream ErrorMapStream(ErrorMapBuffer);
70
71 uint16_t ErrorMap; // Variable to hold the error map (16 bits)
72 ErrorMapStream >> std::hex >> ErrorMap;
73 InstrData->ErrorCode = static_cast<NP_Conex_CC_StageData::ErrorCodeType>(ErrorMap); // Only 0 is no error
74
75 char StateBuffer[3]{ 0 }; // 2 characters + 1 for null terminator
76 StatusStream.read(StateBuffer, 2); // Read the next 2 characters
77 std::istringstream StateStream(StateBuffer);
78
79 uint16_t State; // The state is only an 8 bit value. However, std::istringstream::operator>> treats single digits as single characters when using uint8_t.
80 StateStream >> std::hex >> State;
81 InstrData->Conex_CCStatus.Set(Util::NumToT<uint8_t>(State)); // The controller state is exactly two hex characters, so it should never exceed 8 bits.
82
83 auto Conex_CCStatus = InstrData->GetConex_CCStatus();
84 // Check if stage is in READY state. If not, set it to READY:
85 if (Conex_CCStatus.NotReferencedFromReset() || Conex_CCStatus.NotReferencedFromHoming() || Conex_CCStatus.NotReferencedFromConfiguration()
86 || Conex_CCStatus.NotReferencedFromDisable() || Conex_CCStatus.NotReferencedFromReady() || Conex_CCStatus.NotReferencedFromMoving()
87 || Conex_CCStatus.NotReferencedNoParams() || Conex_CCStatus.Configuration() || Conex_CCStatus.DisableFromReady()
88 || Conex_CCStatus.DisableFromMoving() || Conex_CCStatus.DisableFromTracking() || Conex_CCStatus.DisableFromReadyT()
89 || Conex_CCStatus.TrackingFromReadyT() || Conex_CCStatus.TrackingFromTracking())
90 {
91 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "VA?";
92 // 2. Set default velocity.
93 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::SetVelocityTask>(Owner->GetDefaultVelocity()));
94 // 1. The stage is set to READY state, before the velocity is set to the default velocity:
95 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::SetReadyTask>());
96 }
97
98 // Tell position:
99 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "TP";
100 auto PositionalAnswer = NP_Conex_CC::AnswerToNumberString(InstrData->HardwareAdapter->WaitForLine(1, std::chrono::milliseconds(25)), "TP");
101 InstrData->SetCurrentPosition(Util::NumToT<PositionerStageData::PositionType>(Util::StrToT<double>(PositionalAnswer) * Owner->GetInputValuePositionTypeRatio()));
102
103 // Tell velocity:
104 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "VA?";
105 auto VelocityAnswer = NP_Conex_CC::AnswerToNumberString(InstrData->HardwareAdapter->WaitForLine(1, std::chrono::milliseconds(25)), "VA");
106 InstrData->SetVelocity(Util::NumToT<PositionerStageData::PositionType>(Util::StrToT<double>(VelocityAnswer) * Owner->GetInputValuePositionTypeRatio()));
107 }
108
109 catch ([[maybe_unused]] const Util::InvalidDataException& e)
110 {
111 UpdateError = true;
112
113 // Swallow if just one or two subsequent updates failed.
114 if (InstrData->NumFailedStatusUpdateAttempts++ >= 3)
115 throw;
116 }
117
118 if (!UpdateError)
119 InstrData->NumFailedStatusUpdateAttempts = 0;
120 }
121 // Issued if a mutex is blocked by another operation.
122 catch (const Util::TimeoutException& e)
123 {
124 Instance.GetOwner().SetWarning(e);
125
126 return;
127 }
128 // Issued by NP_Conex_CC::AnswerToNumberString() or StrToT() if unexpected or no data has been received.
129 catch (const Util::InvalidDataException& e)
130 {
131 Instance.GetOwner().SetWarning(e);
132
133 return;
134 }
135 // Issued by std::stringstream if extracting data fails.
136 catch (const std::stringstream::failure& e)
137 {
138 Instance.GetOwner().SetWarning(e.what(), Util::DynExpErrorCodes::InvalidData);
139
140 return;
141 }
142
143 UpdateFuncImpl(dispatch_tag<UpdateTask>(), Instance);
144 }
145
147 {
148 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
149
150 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "RS"; // This takes 500 ms.
151
152 return {};
153 }
154
156 {
157 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
158
159 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "OR";
160
161 return {};
162 }
163
165 {
166 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
167
168 // 3. After homing, the stage is set to READY state again:
169 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::SetReadyTask>(nullptr,
170 std::chrono::system_clock::now() + std::chrono::milliseconds(3000)));
171 // 2. In the NOT REFERENCED state, the homing commands are applied:
172 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::SetHomeExecutionTask>(nullptr,
173 std::chrono::system_clock::now() + std::chrono::milliseconds(500)));
174 // 1. Go to NOT REFERENCED state:
175 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::ResetTask>());
176
177 return {};
178 }
179
181 {
182 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
183 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
184
185 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW1";
186 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "VA" + Util::ToStr(InstrData->GetVelocity() / Owner->GetInputValuePositionTypeRatio());
187 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "HT1"; // use current position as HOME
188 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW0"; // this takes 3 s.
189
190 return {};
191 }
192
194 {
195 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
196
197 // 3. After homing, the stage is set to READY state again:
198 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::SetReadyTask>(nullptr,
199 std::chrono::system_clock::now() + std::chrono::milliseconds(3000)));
200 // 2. In the NOT REFERENCED state, the referencing commands are applied:
201 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::ReferenceExecutionTask>(nullptr,
202 std::chrono::system_clock::now() + std::chrono::milliseconds(500)));
203 // 1. Go to NOT REFERENCED state:
204 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::ResetTask>());
205
206 return {};
207 }
208
210 {
211 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
212 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
213
214 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW1";
215 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "VA" + Util::ToStr(InstrData->GetVelocity() / Owner->GetInputValuePositionTypeRatio());
216 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "HT2"; // use mechanical zero as HOME
217 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PW0"; // this takes 3 s.
218
219 return {};
220 }
221
223 {
224 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
225 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
226
227 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "VA" + Util::ToStr(Velocity / Owner->GetInputValuePositionTypeRatio());
228
229 return {};
230 }
231
233 {
234 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
235
236 // 2. Move to home position:
237 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::MoveToHomeExecutionTask>(nullptr,
238 std::chrono::system_clock::now() + std::chrono::milliseconds(300)));
239 // 1. Stop the motion:
240 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::StopMotionTask>());
241
242 return {};
243 }
244
246 {
247 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
248
249 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PA0";
250
251 return {};
252 }
253
255 {
256 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
257
258 // 2. Move to absolute position:
259 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::MoveAbsoluteExecutionTask>(Position, nullptr,
260 std::chrono::system_clock::now() + std::chrono::milliseconds(300)));
261 // 1. Stop the motion:
262 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::StopMotionTask>());
263
264 return {};
265 }
266
268 {
269 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
270 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
271
272 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PA" + Util::ToStr(Position / Owner->GetInputValuePositionTypeRatio());
273
274 return {};
275 }
276
278 {
279 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
280
281 // 2. Move to relative position:
282 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::MoveRelativeExecutionTask>(Position, nullptr,
283 std::chrono::system_clock::now() + std::chrono::milliseconds(300)));
284 // 1. Stop the motion:
285 InstrData->EnqueuePriorityTask(DynExp::MakeTask<NP_Conex_CC_Tasks::StopMotionTask>());
286
287 return {};
288 }
289
291 {
292 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
293 auto Owner = DynExp::dynamic_Object_cast<NP_Conex_CC>(&Instance.GetOwner());
294
295 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "PR" + Util::ToStr(Position / Owner->GetInputValuePositionTypeRatio());
296
297 return {};
298 }
299
301 {
302 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(Instance.InstrumentDataGetter());
303
304 // It is not possible to use an if-condition that checks if the stage is currently moving,
305 // since the update of the Conex_CCStatus is too slow.
306 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "ST";
307
308 return DynExp::TaskResultType();
309 }
310
312 {
313 Conex_CCStatus.Set(0);
314 ErrorCode = NoError;
315 NumFailedStatusUpdateAttempts = 0;
316
318 }
319
321 {
322 return Conex_CCStatus.Moving() || Conex_CCStatus.Homing();
323 }
324
326 {
327 return Conex_CCStatus.ReadyFromHoming() || Conex_CCStatus.ReadyFromMoving() || Conex_CCStatus.ReadyFromDisable()
328 || Conex_CCStatus.ReadyTFromReady() || Conex_CCStatus.ReadyTFromTracking() || Conex_CCStatus.ReadyTFromDisableT();
329 }
330
332 {
333 return ErrorCode != 0
334 || Conex_CCStatus.NotReferencedFromReset() || Conex_CCStatus.NotReferencedFromHoming() || Conex_CCStatus.NotReferencedFromConfiguration()
335 || Conex_CCStatus.NotReferencedFromDisable() || Conex_CCStatus.NotReferencedFromReady() || Conex_CCStatus.NotReferencedFromMoving()
336 || Conex_CCStatus.NotReferencedNoParams() || Conex_CCStatus.Configuration() || Conex_CCStatus.DisableFromReady()
337 || Conex_CCStatus.DisableFromMoving() || Conex_CCStatus.DisableFromTracking() || Conex_CCStatus.DisableFromReadyT()
338 || Conex_CCStatus.TrackingFromReadyT() || Conex_CCStatus.TrackingFromTracking();
339 }
340
341 std::string NP_Conex_CC::AnswerToNumberString(std::string&& Answer, const char* StartCode)
342 {
343 auto Pos = Answer.find(StartCode);
344
345 if (Answer.empty())
346 throw Util::InvalidDataException("Received an empty answer.");
347 else if (Pos == std::string::npos)
348 throw Util::InvalidDataException("Received an unexpected answer.");
349
350 return Answer.substr(Pos + 2);
351 }
352
353 NP_Conex_CC::NP_Conex_CC(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType&& Params)
354 : PositionerStage(OwnerThreadID, std::move(Params))
355 {
356 }
357
359 {
360 auto InstrData = DynExp::dynamic_InstrumentData_cast<NP_Conex_CC>(GetInstrumentData());
361
362 // Abort motion.
363 *InstrData->HardwareAdapter << Util::ToStr(InstrData->GetChannel()) + "ST";
364 }
365
370}
Implementation of an instrument to control Newport stages with the Conex-CC controller.
virtual bool HasFailedChild() const noexcept override
Returns whether the stage is in an error state, i.e. moving has failed (result of HasFailedChild())
virtual bool IsMovingChild() const noexcept override
Returns whether the stage is currently moving (result of IsMovingChild())
virtual bool HasArrivedChild() const noexcept override
Returns whether the stage has arrived at its destiny position (result of HasArrivedChild())
void ResetImpl(dispatch_tag< PositionerStageData >) override final
Refer to DynExp::InstrumentDataBase::Reset(). Using tag dispatch mechanism to ensure that ResetImpl()...
void ExitFuncImpl(dispatch_tag< PositionerStageTasks::ExitTask >, DynExp::InstrumentInstance &Instance) override final
Deinitializes the respective instrument within the instrument inheritance hierarchy....
void InitFuncImpl(dispatch_tag< PositionerStageTasks::InitTask >, DynExp::InstrumentInstance &Instance) override final
Initializes the respective instrument within the instrument inheritance hierarchy....
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...
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...
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...
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< PositionerStageTasks::UpdateTask >, DynExp::InstrumentInstance &Instance) override final
Updates the respective instrument within the instrument inheritance hierarchy. Call UpdateFuncImpl() ...
virtual void OnErrorChild() const override
Derived classes can perform critical shutdown actions after an error has occurred....
static std::string AnswerToNumberString(std::string &&Answer, const char *StartCode)
NP_Conex_CC(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
void ResetImpl(dispatch_tag< PositionerStage >) override final
Refer to DynExp::Object::Reset(). Using tag dispatch mechanism to ensure that ResetImpl() of every de...
Implementation of a meta instrument to control single-axis positioner stages.
Definition Stage.h:155
Refer to DynExp::ParamsBase::dispatch_tag.
Refer to DynExp::ParamsBase::dispatch_tag.
InstrumentDataTypeSyncPtrType GetInstrumentData(const std::chrono::milliseconds Timeout=GetInstrumentDataTimeoutDefault)
Locks the mutex of the instrument data class instance InstrumentData assigned to this InstrumentBase ...
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: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 Object::ParamsGetterType ParamsGetter
Invoke to obtain the parameters (derived from ParamsBase) of Owner.
Definition Object.h:3710
void UnlockObject(LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer)
Unlocks an Object instance stored in the LinkedObjectWrapperContainer ObjectWrapperContainer....
Definition Object.h:3609
void LockObject(const ParamsBase::Param< ObjectLink< ObjectT > > &LinkParam, LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer, std::chrono::milliseconds Timeout=ObjectLinkBase::LockObjectTimeoutDefault)
Locks an Object instance referenced by a parameter LinkParam of type ParamsBase::Param< ObjectLink< O...
Definition Object.h:3593
const auto & GetOwner() const noexcept
Returns Owner.
Definition Object.h:3556
Defines the return type of task functions.
Definition Instrument.h:865
Refer to DynExp::ParamsBase::dispatch_tag.
Data to operate on is invalid for a specific purpose. This indicates a corrupted data structure or fu...
Definition Exception.h:164
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
Definition Exception.h:262
DynExp's instrument namespace contains the implementation of DynExp instruments which extend DynExp's...
std::unique_ptr< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
Definition Object.h:1807
std::string ToStr(const T &Value, int Precision=-1)
Converts a (numeric) value of type T to a std::string using operator<< of std::stringstream.
Definition Util.h:688
Accumulates include statements to provide a precompiled header.