DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
HardwareAdapterZILabOne.h
Go to the documentation of this file.
1// This file is part of DynExp.
2
9#pragma once
10
11#include "stdafx.h"
12#include "HardwareAdapter.h"
13#include "../MetaInstruments/LockinAmplifier.h"
14
15#undef DEPRECATED
17{
18 #include "../include/ZI/ziAPI.h"
19}
20
21namespace DynExpHardware
22{
24
26 {
27 public:
28 ZILabOneException(std::string Description, const int ErrorCode,
29 const std::source_location Location = std::source_location::current()) noexcept
30 : Exception(std::move(Description), Util::ErrorType::Error, ErrorCode, Location)
31 {}
32 };
33
35 {
36 public:
38 virtual ~ZILabOneHardwareAdapterParams() = default;
39
40 virtual const char* GetParamClassTag() const noexcept override { return "ZILabOneHardwareAdapterParams"; }
41
42 Param<TextList> DeviceDescriptor = { *this, {}, "DeviceDescriptor", "Device descriptor",
43 "Descriptor of the ZI instrument to connect with" };
44 Param<TextList> Interface = { *this, { "1GbE", "USB", "PCIe"}, "Interface", "Interface",
45 "Interface to use for establishing a connection to the ZI instrument's data server. This is only used if the connection to the data server is not established automatically." };
46
47 private:
48 void ConfigureParamsImpl(dispatch_tag<HardwareAdapterParamsBase>) override final;
50 };
51
53 {
54 public:
57
60
61 private:
62 virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override { return DynExp::MakeParams<ZILabOneHardwareAdapterConfigurator>(ID, Core); }
63 };
64
66 {
67 public:
70
72
73 constexpr static bool DetermineOverload(double PosInputLoad, double NegInputLoad) { return PosInputLoad > 0.95 || NegInputLoad < -0.95; }
74
75 constexpr static auto Name() noexcept { return "ZI LabOne"; }
76 constexpr static auto Category() noexcept { return "I/O"; }
77 static auto Enumerate();
78
81
82 virtual std::string GetName() const override { return Name(); }
83 virtual std::string GetCategory() const override { return Category(); }
84
85 bool IsOpened() const noexcept { return Opened; }
86
87 void ConfigureInput(SignalInputType SignalInput, uint8_t Demodulator) const;
88
89 // Returns duration per run in seconds
90 double StartAcquisition(uint8_t Demodulator, size_t NumSamples, size_t NumRuns = 1, bool AverageRuns = false) const;
91
92 void StopAcquisition() const;
93 bool HasFinishedAcquisition() const;
94 double GetAcquisitionProgress() const;
95 void ForceTrigger() const;
96
97 void ClearAcquiredData() const;
98 std::vector<DynExpInstr::LockinAmplifierDefs::LockinSample> GetAcquiredData() const;
99
100 double GetInputRange(SignalInputType SignalInput) const;
101 void SetInputRange(SignalInputType SignalInput, double InputRange) const;
102 void AutoAdjustInputRange(SignalInputType SignalInput) const;
103 bool IsInputOverload(SignalInputType SignalInput) const;
104 double GetNegInputLoad(SignalInputType SignalInput) const;
105 double GetPosInputLoad(SignalInputType SignalInput) const;
106
107 // in rad
108 double GetDemodPhase(uint8_t Demodulator) const;
109 void SetDemodPhase(uint8_t Demodulator, double Phase) const;
110 void AutoAdjustDemodPhase(uint8_t Demodulator) const;
111
112 // in s
113 double GetDemodTimeConstant(uint8_t Demodulator) const;
114 void SetDemodTimeConstant(uint8_t Demodulator, double TimeConstant) const;
115
116 uint8_t GetDemodFilterOrder(uint8_t Demodulator) const;
117 void SetDemodFilterOrder(uint8_t Demodulator, uint8_t FilterOrder) const;
118
120 void SetTriggerMode(DynExpInstr::LockinAmplifierDefs::TriggerModeType TriggerMode, uint8_t Demodulator = 0, uint8_t TriggerChannel = 1) const;
121
124
125 // in samples/s
126 double GetDemodSamplingRate(uint8_t Demodulator) const;
127 void SetDemodSamplingRate(uint8_t Demodulator, double SamplingRate) const;
128
129 bool GetEnabled(uint8_t Demodulator) const;
130 void SetEnabled(uint8_t Demodulator, bool Enabled) const;
131
132 // in Hz
133 double GetOscillatorFrequency(uint8_t Oscillator) const;
134
135 private:
136 void Init();
137
138 void ResetImpl(dispatch_tag<HardwareAdapterBase>) override final;
140
141 void EnsureReadyStateChild() override final;
142 bool IsReadyChild() const override final;
143 bool IsConnectedChild() const noexcept override final;
144
145 // Not thread-safe, must be called from function calling AcquireLock().
146 void CheckError(const ZILabOneHardwareAdapterSyms::ZIResult_enum Result,
147 const std::source_location Location = std::source_location::current()) const;
148
149 void OpenUnsafe();
150 void CloseUnsafe();
151
152 void ConfigureInputUnsafe(SignalInputType SignalInput, uint8_t Demodulator) const;
153
154 void StartAcquisitionUnsafe(uint8_t Demodulator, size_t NumSamples, size_t NumRuns, bool AverageRuns) const;
155 void StopAcquisitionUnsafe() const;
156 bool HasFinishedAcquisitionUnsafe() const;
157 double GetAcquisitionProgressUnsafe() const;
158 void ForceTriggerUnsafe() const;
159
160 void ClearAcquiredDataUnsafe() const;
161 std::vector<DynExpInstr::LockinAmplifierDefs::LockinSample> GetAcquiredDataUnsafe() const;
162
163 std::string SignalInputTypeToCmdStr(SignalInputType SignalInput) const;
164 double GetInputRangeUnsafe(SignalInputType SignalInput) const;
165 void SetInputRangeUnsafe(SignalInputType SignalInput, double InputRange) const;
166 void AutoAdjustInputRangeUnsafe(SignalInputType SignalInput) const;
167 bool IsInputOverloadUnsafe(SignalInputType SignalInput) const;
168 double GetNegInputLoadUnsafe(SignalInputType SignalInput) const;
169 double GetPosInputLoadUnsafe(SignalInputType SignalInput) const;
170
171 double GetDemodPhaseUnsafe(uint8_t Demodulator) const;
172 void SetDemodPhaseUnsafe(uint8_t Demodulator, double Phase) const;
173 void AutoAdjustDemodPhaseUnsafe(uint8_t Demodulator) const;
174
175 double GetDemodTimeConstantUnsafe(uint8_t Demodulator) const;
176 void SetDemodTimeConstantUnsafe(uint8_t Demodulator, double TimeConstant) const;
177
178 uint8_t GetDemodFilterOrderUnsafe(uint8_t Demodulator) const;
179 void SetDemodFilterOrderUnsafe(uint8_t Demodulator, uint8_t FilterOrder) const;
180
181 DynExpInstr::LockinAmplifierDefs::TriggerModeType GetTriggerModeUnsafe() const;
182 void SetTriggerModeUnsafe(DynExpInstr::LockinAmplifierDefs::TriggerModeType TriggerMode, uint8_t Demodulator, uint8_t TriggerChannel) const;
183
184 DynExpInstr::LockinAmplifierDefs::TriggerEdgeType GetTriggerEdgeUnsafe() const;
185 void SetTriggerEdgeUnsafe(DynExpInstr::LockinAmplifierDefs::TriggerEdgeType TriggerEdge) const;
186
187 double GetDemodSamplingRateUnsafe(uint8_t Demodulator) const;
188 void SetDemodSamplingRateUnsafe(uint8_t Demodulator, double SamplingRate) const;
189
190 bool GetEnabledUnsafe(uint8_t Demodulator) const;
191 void SetEnabledUnsafe(uint8_t Demodulator, bool Enabled) const;
192
193 double GetOscillatorFrequencyUnsafe(uint8_t Oscillator) const;
194
195 double ReadDoubleUnsafe(const std::string& Path) const;
196 long long ReadIntUnsafe(const std::string& Path) const;
197 void WriteDoubleUnsafe(const std::string& Path, double Value) const;
198 void WriteIntUnsafe(const std::string& Path, long long Value) const;
199
200 ZILabOneHardwareAdapterSyms::ZIConnection ZIConnection;
201 ZILabOneHardwareAdapterSyms::ZIModuleHandle DAQModuleHandle;
202
203 std::atomic<bool> Opened;
204 std::string DeviceDescriptor;
205 std::string Interface;
207 };
208}
Implementation of DynExp hardware adapter objects.
ZILabOneException(std::string Description, const int ErrorCode, const std::source_location Location=std::source_location::current()) noexcept
virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core) const override
Override to make derived classes call DynExp::MakeParams with the correct configurator type derived f...
ZILabOneHardwareAdapterParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
virtual const char * GetParamClassTag() const noexcept override
This function is intended to be overridden once in each derived class returning the name of the respe...
void ConfigureParamsImpl(dispatch_tag< HardwareAdapterParamsBase >) override final
virtual void ConfigureParamsImpl(dispatch_tag< ZILabOneHardwareAdapterParams >)
double GetDemodPhaseUnsafe(uint8_t Demodulator) const
double GetOscillatorFrequency(uint8_t Oscillator) const
bool IsInputOverloadUnsafe(SignalInputType SignalInput) const
void SetTriggerModeUnsafe(DynExpInstr::LockinAmplifierDefs::TriggerModeType TriggerMode, uint8_t Demodulator, uint8_t TriggerChannel) const
bool IsReadyChild() const override final
Returns wheter this Object instance is ready (e.g. it is running or connected to a hardware device) a...
double GetDemodTimeConstantUnsafe(uint8_t Demodulator) const
void SetDemodPhaseUnsafe(uint8_t Demodulator, double Phase) const
double GetDemodSamplingRateUnsafe(uint8_t Demodulator) const
bool IsInputOverload(SignalInputType SignalInput) const
virtual void ResetImpl(dispatch_tag< ZILabOneHardwareAdapter >)
ZILabOneHardwareAdapterSyms::ZIModuleHandle DAQModuleHandle
double GetDemodSamplingRate(uint8_t Demodulator) const
double ReadDoubleUnsafe(const std::string &Path) const
double GetDemodPhase(uint8_t Demodulator) const
ZILabOneHardwareAdapterSyms::ZIConnection ZIConnection
virtual std::string GetName() const override
Returns the name of this Object type.
double GetOscillatorFrequencyUnsafe(uint8_t Oscillator) const
void EnsureReadyStateChild() override final
Ensures that this Object instance is ready by possibly starting its worker thread or by opening conne...
void SetTriggerEdgeUnsafe(DynExpInstr::LockinAmplifierDefs::TriggerEdgeType TriggerEdge) const
long long ReadIntUnsafe(const std::string &Path) const
void AutoAdjustDemodPhase(uint8_t Demodulator) const
void ResetImpl(dispatch_tag< HardwareAdapterBase >) override final
double GetDemodTimeConstant(uint8_t Demodulator) const
double GetPosInputLoad(SignalInputType SignalInput) const
void ConfigureInput(SignalInputType SignalInput, uint8_t Demodulator) const
double GetInputRangeUnsafe(SignalInputType SignalInput) const
void AutoAdjustDemodPhaseUnsafe(uint8_t Demodulator) const
double GetInputRange(SignalInputType SignalInput) const
void AutoAdjustInputRangeUnsafe(SignalInputType SignalInput) const
void SetDemodFilterOrder(uint8_t Demodulator, uint8_t FilterOrder) const
std::vector< DynExpInstr::LockinAmplifierDefs::LockinSample > GetAcquiredDataUnsafe() const
void SetTriggerEdge(DynExpInstr::LockinAmplifierDefs::TriggerEdgeType TriggerEdge) const
uint8_t GetDemodFilterOrder(uint8_t Demodulator) const
double GetPosInputLoadUnsafe(SignalInputType SignalInput) const
DynExpInstr::LockinAmplifierDefs::TriggerModeType GetTriggerMode() const
void SetDemodTimeConstantUnsafe(uint8_t Demodulator, double TimeConstant) const
bool GetEnabledUnsafe(uint8_t Demodulator) const
virtual std::string GetCategory() const override
Returns the category of this Object type.
void WriteDoubleUnsafe(const std::string &Path, double Value) const
DynExpInstr::LockinAmplifierDefs::TriggerEdgeType GetTriggerEdgeUnsafe() const
void SetDemodTimeConstant(uint8_t Demodulator, double TimeConstant) const
void AutoAdjustInputRange(SignalInputType SignalInput) const
static constexpr auto Category() noexcept
void SetTriggerMode(DynExpInstr::LockinAmplifierDefs::TriggerModeType TriggerMode, uint8_t Demodulator=0, uint8_t TriggerChannel=1) const
void SetDemodPhase(uint8_t Demodulator, double Phase) const
void SetDemodSamplingRate(uint8_t Demodulator, double SamplingRate) const
void SetEnabledUnsafe(uint8_t Demodulator, bool Enabled) const
double StartAcquisition(uint8_t Demodulator, size_t NumSamples, size_t NumRuns=1, bool AverageRuns=false) const
double GetNegInputLoadUnsafe(SignalInputType SignalInput) const
double GetNegInputLoad(SignalInputType SignalInput) const
void SetDemodSamplingRateUnsafe(uint8_t Demodulator, double SamplingRate) const
DynExpInstr::LockinAmplifierDefs::TriggerEdgeType GetTriggerEdge() const
DynExpInstr::LockinAmplifierDefs::TriggerModeType GetTriggerModeUnsafe() const
void CheckError(const ZILabOneHardwareAdapterSyms::ZIResult_enum Result, const std::source_location Location=std::source_location::current()) const
void SetInputRangeUnsafe(SignalInputType SignalInput, double InputRange) const
std::vector< DynExpInstr::LockinAmplifierDefs::LockinSample > GetAcquiredData() const
void SetDemodFilterOrderUnsafe(uint8_t Demodulator, uint8_t FilterOrder) const
bool IsConnectedChild() const noexcept override final
Determines the connection status of the hardware interface.
std::string SignalInputTypeToCmdStr(SignalInputType SignalInput) const
void ConfigureInputUnsafe(SignalInputType SignalInput, uint8_t Demodulator) const
uint8_t GetDemodFilterOrderUnsafe(uint8_t Demodulator) const
void StartAcquisitionUnsafe(uint8_t Demodulator, size_t NumSamples, size_t NumRuns, bool AverageRuns) const
void SetInputRange(SignalInputType SignalInput, double InputRange) const
void WriteIntUnsafe(const std::string &Path, long long Value) const
static constexpr bool DetermineOverload(double PosInputLoad, double NegInputLoad)
void SetEnabled(uint8_t Demodulator, bool Enabled) const
DynExp's core class acts as the interface between the user interface and DynExp's internal data like ...
Definition DynExpCore.h:127
Defines the base class for a hardware adapter object. Hardware adapters describe interfaces/connectio...
Configurator class for HardwareAdapterBase.
Parameter class for HardwareAdapterBase.
HardwareAdapterParamsBase(ItemIDType ID, const DynExpCore &Core)
Constructs the parameters for a HardwareAdapterBase instance.
const std::thread::id OwnerThreadID
Thread id of the thread which has constructed (and owns) this Object instance.
Definition Object.h:2302
const ParamsBasePtrType Params
Pointer to the parameter class instance belonging to this Object instance.
Definition Object.h:2303
Refer to ParamsBase::dispatch_tag.
Definition Object.h:2018
const ItemIDType ID
ID of the Object this parameter class instance belongs to.
Definition Object.h:1779
const DynExpCore & Core
Reference to DynExp's core.
Definition Object.h:1780
Tag for function dispatching mechanism within this class used when derived classes are not intended t...
Definition Object.h:349
DynExp exceptions are derived from this class. It contains basic information about the cause of the e...
Definition Exception.h:51
Exception(std::string Description, const ErrorType Type=ErrorType::Error, const int ErrorCode=-1, const std::source_location Location=std::source_location::current()) noexcept
Constructs an exception. Constructor is noexcept, although std::runtime_error() might throw std::bad_...
Definition Exception.cpp:8
const int ErrorCode
DynExp error code from DynExpErrorCodes::DynExpErrorCodes
Definition Exception.h:106
DynExp's hardware namespace contains the implementation of DynExp hardware adapters which extend DynE...
TriggerEdgeType
Type to determine at which edge of a trigger signal to trigger. Not a strongly-typed enum to allow us...
TriggerModeType
Type to determine the trigger mode. Not a strongly-typed enum to allow using the enumeration in a Dyn...
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
size_t ItemIDType
ID type of objects/items managed by DynExp.
DynExp's Util namespace contains commonly used functions and templates as well as extensions to Qt an...
Accumulates include statements to provide a precompiled header.