4 #include "moc_LockinAmplifierControl.cpp"
18 ui.SBRange->setSuffix(
" m" + QString::fromStdString(ModuleData->SensitivityUnitString));
19 ui.LEOscillatorFreq->setFocus();
57 auto InstrData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::LockinAmplifier>(
ModuleData->GetLockinAmplifier()->GetInstrumentData());
59 ModuleData->CurrentSensitivity = InstrData->GetSensitivity();
60 ModuleData->CurrentPhase = InstrData->GetPhase();
61 ModuleData->CurrentTimeConstant = InstrData->GetTimeConstant();
62 ModuleData->CurrentFilterOrder = InstrData->GetFilterOrder();
63 ModuleData->CurrentTriggerMode = InstrData->GetTriggerMode();
64 ModuleData->CurrentTriggerEdge = InstrData->GetTriggerEdge();
65 ModuleData->CurrentSignal = InstrData->GetSignalType();
66 ModuleData->CurrentSamplingRate = InstrData->GetSamplingRate();
67 ModuleData->CurrentEnable = InstrData->IsEnabled();
68 ModuleData->CurrentOverload = InstrData->IsOverloaded();
69 std::tie(
ModuleData->CurrentNegInputLoad,
ModuleData->CurrentPosInputLoad) = InstrData->GetInputLoad();
70 ModuleData->CurrentOscillatorFrequency = InstrData->GetOscillatorFrequency();
71 ModuleData->CurrentAcquisitionProgress = InstrData->GetAcquisitionProgress();
91 auto Widget = std::make_unique<LockinAmplifierControlWidget>(*
this);
113 auto Widget = GetWidget<LockinAmplifierControlWidget>();
114 auto ModuleData = DynExp::dynamic_ModuleData_cast<LockinAmplifierControl>(ModuleDataGetter());
118 if (!
Widget->GetUI().SBRange->hasFocus())
120 const QSignalBlocker Blocker(
Widget->GetUI().SBRange);
126 Widget->GetUI().PBInputNegLoad->setVisible(
true);
127 Widget->GetUI().PBInputNegLoad->setValue(
ModuleData->CurrentNegInputLoad * 100);
132 Widget->GetUI().PBInputNegLoad->setVisible(
false);
136 Widget->GetUI().PBInputPosLoad->setVisible(
true);
137 Widget->GetUI().PBInputPosLoad->setValue(
ModuleData->CurrentPosInputLoad * 100);
142 Widget->GetUI().PBInputPosLoad->setVisible(
false);
144 Widget->GetUI().LInputOverload->setText(
ModuleData->CurrentOverload ?
"Overload" :
"");
146 Widget->GetUI().LOscillatorFreq->setVisible(
ModuleData->CurrentOscillatorFrequency > 0);
147 Widget->GetUI().LEOscillatorFreq->setVisible(
ModuleData->CurrentOscillatorFrequency > 0);
148 if (
ModuleData->CurrentOscillatorFrequency > 0)
151 if (!
Widget->GetUI().SBPhase->hasFocus())
153 const QSignalBlocker Blocker(
Widget->GetUI().SBPhase);
154 Widget->GetUI().SBPhase->setValue(
ModuleData->CurrentPhase / std::numbers::pi * 180.0);
157 if (!
Widget->GetUI().SBTimeConstant->hasFocus())
159 const QSignalBlocker Blocker(
Widget->GetUI().SBTimeConstant);
160 Widget->GetUI().SBTimeConstant->setValue(
ModuleData->CurrentTimeConstant * 1e6);
163 if (!
Widget->GetUI().SBFilterOrder->hasFocus())
165 const QSignalBlocker Blocker(
Widget->GetUI().SBFilterOrder);
169 if (!
Widget->GetUI().CBTriggerMode->hasFocus())
171 const QSignalBlocker Blocker(
Widget->GetUI().CBTriggerMode);
172 Widget->GetUI().CBTriggerMode->setCurrentIndex(
ModuleData->CurrentTriggerMode - 1);
175 if (!
Widget->GetUI().CBTriggerEdge->hasFocus())
177 const QSignalBlocker Blocker(
Widget->GetUI().CBTriggerEdge);
178 Widget->GetUI().CBTriggerEdge->setCurrentIndex(
ModuleData->CurrentTriggerEdge - 1);
181 if (!
Widget->GetUI().CBQuantity->hasFocus())
183 const QSignalBlocker Blocker(
Widget->GetUI().CBQuantity);
187 if (!
Widget->GetUI().SBSamplingRate->hasFocus())
189 const QSignalBlocker Blocker(
Widget->GetUI().SBSamplingRate);
193 if (!
Widget->GetUI().CBEnable->hasFocus())
195 const QSignalBlocker Blocker(
Widget->GetUI().CBEnable);
199 Widget->GetUI().LProgress->setVisible(
ModuleData->CurrentAcquisitionProgress >= 0);
200 Widget->GetUI().PProgress->setVisible(
ModuleData->CurrentAcquisitionProgress >= 0);
201 if (
ModuleData->CurrentAcquisitionProgress >= 0)
202 Widget->GetUI().PProgress->setValue(
ModuleData->CurrentAcquisitionProgress * 100);
207 auto ModuleParams = DynExp::dynamic_Params_cast<LockinAmplifierControl>(Instance->
ParamsGetter());
212 ModuleData->SensitivityUnitString =
ModuleData->GetLockinAmplifier()->GetSensitivityUnitString();
225 ModuleData->GetLockinAmplifier()->SetSensitivity(Value / 1e3);
231 ModuleData->GetLockinAmplifier()->AutoAdjustSensitivity();
237 ModuleData->GetLockinAmplifier()->SetPhase(Value / 180.0 * std::numbers::pi);
243 ModuleData->GetLockinAmplifier()->AutoAdjustPhase();
249 ModuleData->GetLockinAmplifier()->SetTimeConstant(Value / 1e6);
255 ModuleData->GetLockinAmplifier()->SetFilterOrder(Value);
273 ModuleData->GetLockinAmplifier()->ForceTrigger();
285 ModuleData->GetLockinAmplifier()->SetSamplingRate(Value);
291 ModuleData->GetLockinAmplifier()->SetEnable(Value);
297 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 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 OnEnableClicked(DynExp::ModuleInstance *Instance, int Value) const
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.