DynExp
Highly flexible laboratory automation for dynamically changing experiments.
Loading...
Searching...
No Matches
Stage1D.cpp
Go to the documentation of this file.
1// This file is part of DynExp.
2
3#include "stdafx.h"
4#include "moc_Stage1D.cpp"
5#include "ui_Stage1D.h"
6#include "Stage1D.h"
7
8namespace DynExpModule
9{
10 Stage1DWidget::Stage1DWidget(Stage1D& Owner, QModuleWidget* parent)
11 : QModuleWidget(Owner, parent),
12 ui(std::make_unique<Ui::Stage1D>())
13 {
14 ui->setupUi(this);
15 ui->SBPosition->blockSignals(true);
16
17 // For shortcuts
18 this->addAction(ui->action_Stop_current_action);
19 }
20
25
27 {
28 Velocity = 0;
29 Position = 0;
30 IsUsingSIUnits = true;
31 IsMoving = false;
32 HasFailed = false;
33 LabelsUpdated = false;
34 }
35
37 {
38 try
39 {
40 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance.ModuleDataGetter());
41 auto StageData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(ModuleData->PositionerStage->GetInstrumentData());
42
43 ModuleData->Velocity = StageData->GetVelocity() * ModuleData->PositionerStage->GetStepNanoMeterRatio();
44 ModuleData->Position = StageData->GetCurrentPosition() * ModuleData->PositionerStage->GetStepNanoMeterRatio();
45 ModuleData->IsUsingSIUnits = ModuleData->PositionerStage->IsUsingSIUnits();
46 ModuleData->IsMoving = StageData->IsMoving();
47 ModuleData->HasFailed = StageData->HasFailed();
48
50 } // ModuleData and StageData unlocked here.
51 catch (const Util::TimeoutException& e)
52 {
53 if (NumFailedUpdateAttempts++ >= 3)
54 Instance.GetOwner().SetWarning(e);
55 }
56
58 }
59
64
65 std::unique_ptr<DynExp::QModuleWidget> Stage1D::MakeUIWidget()
66 {
67 auto Widget = std::make_unique<Stage1DWidget>(*this);
68
69 Connect(Widget->ui->action_Stop_current_action, &QAction::triggered, this, &Stage1D::OnStopClicked);
70 Connect(Widget->ui->ButtonReference, &QPushButton::clicked, this, &Stage1D::OnFindReferenceClicked);
71 Connect(Widget->ui->ButtonSetHome, &QPushButton::clicked, this, &Stage1D::OnSetHomeClicked);
72 Connect(Widget->ui->ButtonCalibrate, &QPushButton::clicked, this, &Stage1D::OnCalibrateClicked);
73 Connect(Widget->ui->ButtonFirst, &QPushButton::clicked, this, &Stage1D::OnMoveFirstClicked);
74 Connect(Widget->ui->ButtonLast, &QPushButton::clicked, this, &Stage1D::OnMoveLastClicked);
75 Connect(Widget->ui->ButtonLeft, &QPushButton::clicked, this, &Stage1D::OnMoveLeftClicked);
76 Connect(Widget->ui->ButtonRight, &QPushButton::clicked, this, &Stage1D::OnMoveRightClicked);
77 Connect(Widget->ui->ButtonHome, &QPushButton::clicked, this, &Stage1D::OnMoveHomeClicked);
78 Connect(Widget->ui->ButtonStop, &QPushButton::clicked, this, &Stage1D::OnStopClicked);
79 Connect(Widget->ui->SBVelocity, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &Stage1D::OnVelocityValueChanged);
80 Connect(Widget->ui->SBPosition, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &Stage1D::OnPositionValueChanged);
81
82 return Widget;
83 }
84
85 void Stage1D::UpdateUIChild(const ModuleBase::ModuleDataGetterType& ModuleDataGetter)
86 {
87 auto Widget = GetWidget<Stage1DWidget>();
88 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(ModuleDataGetter());
89
90 if (!Widget->ui->SBVelocity->hasFocus())
91 {
92 const QSignalBlocker Blocker(Widget->ui->SBVelocity);
93 Widget->ui->SBVelocity->setValue(ModuleData->Velocity);
94 }
95 if (!Widget->ui->SBPosition->hasFocus())
96 {
97 const QSignalBlocker Blocker(Widget->ui->SBPosition);
98 Widget->ui->SBPosition->setValue(ModuleData->Position);
99 }
100
101 Widget->ui->CBMoving->setChecked(ModuleData->IsMoving);
102 Widget->ui->CBErrorState->setChecked(ModuleData->HasFailed);
103
104 if (!ModuleData->LabelsUpdated)
105 {
106 ModuleData->LabelsUpdated = true;
107 Widget->ui->LVelocity->setText("Velocity (" + QString(ModuleData->IsUsingSIUnits ? "nm/s" : "steps/s") + ")");
108 Widget->ui->SBVelocity->setMaximum(ModuleData->PositionerStage->GetMaxVelocity());
109 Widget->ui->SBVelocity->setMinimum(ModuleData->PositionerStage->GetMinVelocity());
110 Widget->ui->SBVelocity->setDecimals(0);
111 Widget->ui->SBVelocity->setValue(ModuleData->PositionerStage->GetDefaultVelocity());
112 Widget->ui->LPosition->setText("Position (" + QString(ModuleData->IsUsingSIUnits ? "nm" : "steps") + ")");
113 Widget->ui->SBPosition->setMaximum(ModuleData->PositionerStage->GetMaxPosition());
114 Widget->ui->SBPosition->setMinimum(ModuleData->PositionerStage->GetMinPosition());
115 Widget->ui->SBPosition->setDecimals(0);
116
117 // Now unblock signals (if they weren't blocked initially, stage would move to 0)
118 Widget->ui->SBPosition->blockSignals(false);
119 }
120 }
121
123 {
124 auto ModuleParams = DynExp::dynamic_Params_cast<Stage1D>(Instance->ParamsGetter());
125 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
126
127 Instance->LockObject(ModuleParams->PositionerStage, ModuleData->PositionerStage);
128 }
129
131 {
132 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
133
134 Instance->UnlockObject(ModuleData->PositionerStage);
135 }
136
138 {
139 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
140 ModuleData->PositionerStage->Reference();
141 }
142
144 {
145 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
146 ModuleData->PositionerStage->SetHome();
147 }
148
150 {
151 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
152 ModuleData->PositionerStage->Calibrate();
153 }
154
156 {
157 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
158 ModuleData->PositionerStage->MoveAbsolute(ModuleData->PositionerStage->GetMinPosition());
159 }
160
162 {
163 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
164 ModuleData->PositionerStage->MoveAbsolute(ModuleData->PositionerStage->GetMaxPosition());
165 }
166
168 {
169 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
170 ModuleData->PositionerStage->MoveRelative(-ModuleData->Velocity / ModuleData->PositionerStage->GetStepNanoMeterRatio() * .1);
171 }
172
174 {
175 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
176 ModuleData->PositionerStage->MoveRelative(ModuleData->Velocity / ModuleData->PositionerStage->GetStepNanoMeterRatio() * .1);
177 }
178
180 {
181 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
182 ModuleData->PositionerStage->MoveToHome();
183 }
184
186 {
187 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
188 ModuleData->PositionerStage->StopMotion();
189 }
190
191 void Stage1D::OnVelocityValueChanged(DynExp::ModuleInstance* Instance, const double Value) const
192 {
193 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
194 ModuleData->PositionerStage->SetVelocity(Value / ModuleData->PositionerStage->GetStepNanoMeterRatio());
195 }
196
197 void Stage1D::OnPositionValueChanged(DynExp::ModuleInstance* Instance, const double Value) const
198 {
199 auto ModuleData = DynExp::dynamic_ModuleData_cast<Stage1D>(Instance->ModuleDataGetter());
200 ModuleData->PositionerStage->MoveAbsolute(Value / ModuleData->PositionerStage->GetStepNanoMeterRatio());
201 }
202}
Implementation of a module to control a 1D positioner stage.
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
Definition Stage1D.cpp:21
Stage1DWidget(Stage1D &Owner, QModuleWidget *parent=nullptr)
Definition Stage1D.cpp:10
std::unique_ptr< Ui::Stage1D > ui
Definition Stage1D.h:33
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
Definition Stage1D.cpp:85
void OnSetHomeClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:143
void ResetImpl(dispatch_tag< QModuleBase >) override final
Definition Stage1D.cpp:60
void OnMoveFirstClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:155
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...
Definition Stage1D.cpp:65
void OnVelocityValueChanged(DynExp::ModuleInstance *Instance, const double Value) const
Definition Stage1D.cpp:191
void OnMoveLastClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:161
void OnCalibrateClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:149
void OnFindReferenceClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:137
void OnStopClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:185
void OnMoveRightClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:173
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...
Definition Stage1D.cpp:122
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
Definition Stage1D.cpp:130
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...
Definition Stage1D.cpp:36
void OnMoveLeftClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:167
void OnPositionValueChanged(DynExp::ModuleInstance *Instance, const double Value) const
Definition Stage1D.cpp:197
size_t NumFailedUpdateAttempts
Definition Stage1D.h:128
void OnMoveHomeClicked(DynExp::ModuleInstance *Instance, bool) const
Definition Stage1D.cpp:179
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Definition Module.h:788
Refer to ParamsBase::dispatch_tag.
Definition Module.h:191
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
Definition Module.h:840
const ModuleBase::ModuleDataGetterType ModuleDataGetter
Getter for module's data. Refer to ModuleBase::ModuleDataGetterType.
Definition Module.h:872
Refer to ParamsBase::dispatch_tag.
Definition Object.h:2018
QModuleWidget * Widget
User interface widget belonging to the module.
Definition Module.h:1807
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....
Definition Module.h:1816
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
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
Definition Exception.h:262
DynExp's module namespace contains the implementation of DynExp modules which extend DynExp's core fu...
DynExpErrorCodes
DynExp's error codes
Definition Exception.h:22
Accumulates include statements to provide a precompiled header.