DynExp
Highly flexible laboratory automation for dynamically changing experiments.
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 
21 namespace 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 
80  virtual ~ZILabOneHardwareAdapter();
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...
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...
ZILabOneHardwareAdapterParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
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
constexpr static bool DetermineOverload(double PosInputLoad, double NegInputLoad)
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
constexpr static auto Name() noexcept
double GetDemodSamplingRate(uint8_t Demodulator) const
double ReadDoubleUnsafe(const std::string &Path) const
double GetDemodPhase(uint8_t Demodulator) const
ZILabOneHardwareAdapter(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
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
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
constexpr static auto Category() noexcept
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
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...
Definition: Instrument.h:1254
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...
Definition: circularbuf.cpp:7
ErrorType
DynExp's error types
Definition: Exception.h:15
Accumulates include statements to provide a precompiled header.