4#include "moc_LockinAmplifierControl.cpp"
5#include "ui_LockinAmplifierControl.h"
11 : QModuleWidget(Owner, parent),
21 ui->SBRange->setSuffix(
" m" + QString::fromStdString(ModuleData->SensitivityUnitString));
22 ui->LEOscillatorFreq->setFocus();
60 auto InstrData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::LockinAmplifier>(
ModuleData->GetLockinAmplifier()->GetInstrumentData());
62 ModuleData->CurrentSensitivity = InstrData->GetSensitivity();
63 ModuleData->CurrentPhase = InstrData->GetPhase();
64 ModuleData->CurrentTimeConstant = InstrData->GetTimeConstant();
65 ModuleData->CurrentFilterOrder = InstrData->GetFilterOrder();
66 ModuleData->CurrentTriggerMode = InstrData->GetTriggerMode();
67 ModuleData->CurrentTriggerEdge = InstrData->GetTriggerEdge();
68 ModuleData->CurrentSignal = InstrData->GetSignalType();
69 ModuleData->CurrentSamplingRate = InstrData->GetSamplingRate();
70 ModuleData->CurrentEnable = InstrData->IsEnabled();
71 ModuleData->CurrentOverload = InstrData->IsOverloaded();
72 std::tie(
ModuleData->CurrentNegInputLoad,
ModuleData->CurrentPosInputLoad) = InstrData->GetInputLoad();
73 ModuleData->CurrentOscillatorFrequency = InstrData->GetOscillatorFrequency();
74 ModuleData->CurrentAcquisitionProgress = InstrData->GetAcquisitionProgress();
94 auto Widget = std::make_unique<LockinAmplifierControlWidget>(*
this);
116 auto Widget = GetWidget<LockinAmplifierControlWidget>();
117 auto ModuleData = DynExp::dynamic_ModuleData_cast<LockinAmplifierControl>(ModuleDataGetter());
121 if (!
Widget->GetUI()->SBRange->hasFocus())
123 const QSignalBlocker Blocker(
Widget->GetUI()->SBRange);
129 Widget->GetUI()->PBInputNegLoad->setVisible(
true);
130 Widget->GetUI()->PBInputNegLoad->setValue(
ModuleData->CurrentNegInputLoad * 100);
135 Widget->GetUI()->PBInputNegLoad->setVisible(
false);
139 Widget->GetUI()->PBInputPosLoad->setVisible(
true);
140 Widget->GetUI()->PBInputPosLoad->setValue(
ModuleData->CurrentPosInputLoad * 100);
145 Widget->GetUI()->PBInputPosLoad->setVisible(
false);
147 Widget->GetUI()->LInputOverload->setText(
ModuleData->CurrentOverload ?
"Overload" :
"");
149 Widget->GetUI()->LOscillatorFreq->setVisible(
ModuleData->CurrentOscillatorFrequency > 0);
150 Widget->GetUI()->LEOscillatorFreq->setVisible(
ModuleData->CurrentOscillatorFrequency > 0);
151 if (
ModuleData->CurrentOscillatorFrequency > 0)
152 Widget->GetUI()->LEOscillatorFreq->setText(QString::fromStdString(
Util::ToStr(
ModuleData->CurrentOscillatorFrequency, 2) +
" Hz"));
154 if (!
Widget->GetUI()->SBPhase->hasFocus())
156 const QSignalBlocker Blocker(
Widget->GetUI()->SBPhase);
157 Widget->GetUI()->SBPhase->setValue(
ModuleData->CurrentPhase / std::numbers::pi * 180.0);
160 if (!
Widget->GetUI()->SBTimeConstant->hasFocus())
162 const QSignalBlocker Blocker(
Widget->GetUI()->SBTimeConstant);
163 Widget->GetUI()->SBTimeConstant->setValue(
ModuleData->CurrentTimeConstant * 1e6);
166 if (!
Widget->GetUI()->SBFilterOrder->hasFocus())
168 const QSignalBlocker Blocker(
Widget->GetUI()->SBFilterOrder);
172 if (!
Widget->GetUI()->CBTriggerMode->hasFocus())
174 const QSignalBlocker Blocker(
Widget->GetUI()->CBTriggerMode);
175 Widget->GetUI()->CBTriggerMode->setCurrentIndex(
ModuleData->CurrentTriggerMode - 1);
178 if (!
Widget->GetUI()->CBTriggerEdge->hasFocus())
180 const QSignalBlocker Blocker(
Widget->GetUI()->CBTriggerEdge);
181 Widget->GetUI()->CBTriggerEdge->setCurrentIndex(
ModuleData->CurrentTriggerEdge - 1);
184 if (!
Widget->GetUI()->CBQuantity->hasFocus())
186 const QSignalBlocker Blocker(
Widget->GetUI()->CBQuantity);
190 if (!
Widget->GetUI()->SBSamplingRate->hasFocus())
192 const QSignalBlocker Blocker(
Widget->GetUI()->SBSamplingRate);
196 if (!
Widget->GetUI()->CBEnable->hasFocus())
198 const QSignalBlocker Blocker(
Widget->GetUI()->CBEnable);
202 Widget->GetUI()->LProgress->setVisible(
ModuleData->CurrentAcquisitionProgress >= 0);
203 Widget->GetUI()->PProgress->setVisible(
ModuleData->CurrentAcquisitionProgress >= 0);
204 if (
ModuleData->CurrentAcquisitionProgress >= 0)
205 Widget->GetUI()->PProgress->setValue(
ModuleData->CurrentAcquisitionProgress * 100);
210 auto ModuleParams = DynExp::dynamic_Params_cast<LockinAmplifierControl>(Instance->
ParamsGetter());
215 ModuleData->SensitivityUnitString =
ModuleData->GetLockinAmplifier()->GetSensitivityUnitString();
228 ModuleData->GetLockinAmplifier()->SetSensitivity(Value / 1e3);
234 ModuleData->GetLockinAmplifier()->AutoAdjustSensitivity();
240 ModuleData->GetLockinAmplifier()->SetPhase(Value / 180.0 * std::numbers::pi);
246 ModuleData->GetLockinAmplifier()->AutoAdjustPhase();
252 ModuleData->GetLockinAmplifier()->SetTimeConstant(Value / 1e6);
258 ModuleData->GetLockinAmplifier()->SetFilterOrder(Value);
276 ModuleData->GetLockinAmplifier()->ForceTrigger();
288 ModuleData->GetLockinAmplifier()->SetSamplingRate(Value);
294 ModuleData->GetLockinAmplifier()->SetEnable(State == Qt::CheckState::Checked);
300 ModuleData->GetLockinAmplifier()->PersistDataToParams();
Implementation of a module to control a lock-in amplifier.
uint8_t CurrentFilterOrder
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
double CurrentSensitivity
std::string SensitivityUnitString
double CurrentSamplingRate
double CurrentAcquisitionProgress
double CurrentTimeConstant
DynExpInstr::LockinAmplifierDefs::TriggerEdgeType CurrentTriggerEdge
double CurrentPosInputLoad
double CurrentNegInputLoad
double CurrentOscillatorFrequency
DynExpInstr::LockinAmplifierDefs::TriggerModeType CurrentTriggerMode
DynExpInstr::LockinAmplifierDefs::SignalType CurrentSignal
void OnSignalTypeChanged(DynExp::ModuleInstance *Instance, int Index) const
static const char * ProgressBarRedStylesheet
void OnEnableClicked(DynExp::ModuleInstance *Instance, Qt::CheckState State) const
void OnAutoPhaseClicked(DynExp::ModuleInstance *Instance, bool) const
void OnTimeConstantChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnPersistParamsClicked(DynExp::ModuleInstance *Instance, bool) const
void OnFilterOrderChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnPhaseChanged(DynExp::ModuleInstance *Instance, double Value) const
static const char * ProgressBarGreenStylesheet
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
void OnInit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread starts. Override it to lock instruments this m...
Util::DynExpErrorCodes::DynExpErrorCodes ModuleMainLoop(DynExp::ModuleInstance &Instance) override final
Module main loop. The function is executed periodically by the module thread. Also refer to GetMainLo...
void OnTriggerModeChanged(DynExp::ModuleInstance *Instance, int Index) const
void ResetImpl(dispatch_tag< QModuleBase >) override final
void OnForceTriggerClicked(DynExp::ModuleInstance *Instance, bool) const
void OnAutoRangeClicked(DynExp::ModuleInstance *Instance, bool) const
std::unique_ptr< DynExp::QModuleWidget > MakeUIWidget() override final
Used by InitUI() as a factory function for the module's user interface widget. Create the widget here...
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
size_t NumFailedUpdateAttempts
void OnTriggerEdgeChanged(DynExp::ModuleInstance *Instance, int Index) const
void OnSamplingRateChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnSensitivityChanged(DynExp::ModuleInstance *Instance, double Value) const
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Refer to ParamsBase::dispatch_tag.
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
const ModuleBase::ModuleDataGetterType ModuleDataGetter
Getter for module's data. Refer to ModuleBase::ModuleDataGetterType.
Refer to ParamsBase::dispatch_tag.
QModuleWidget * Widget
User interface widget belonging to the module.
void Connect(SenderType *Sender, SignalType Signal, ReceiverType *Receiver, EventType Event)
Uses Qt's connect mechanism to connect a QObject's signal to a DynExp module's event....
const Object::ParamsGetterType ParamsGetter
Invoke to obtain the parameters (derived from ParamsBase) of Owner.
void UnlockObject(LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer)
Unlocks an Object instance stored in the LinkedObjectWrapperContainer ObjectWrapperContainer....
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...
const auto & GetOwner() const noexcept
Returns Owner.
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
TriggerEdgeType
Type to determine at which edge of a trigger signal to trigger. Not a strongly-typed enum to allow us...
@ Fall
Trigger on falling edge.
SignalType
Type specifying different signal coordinates a lock-in amplifier can record. Not a strongly-typed enu...
@ R
Radial component of the signal in polar coordinates.
TriggerModeType
Type to determine the trigger mode. Not a strongly-typed enum to allow using the enumeration in a Dyn...
@ ExternSingle
Run once after an external trigger signal has been detected.
DynExp's module namespace contains the implementation of DynExp modules which extend DynExp's core fu...
DynExpErrorCodes
DynExp's error codes
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.
Accumulates include statements to provide a precompiled header.