itom  3.0.0
motorAxisController.h
1 /* ********************************************************************
2  itom software
3  URL: http://www.uni-stuttgart.de/ito
4  Copyright (C) 2016, Institut fuer Technische Optik (ITO),
5  Universitaet Stuttgart, Germany
6 
7  This file is part of itom and its software development toolkit (SDK).
8 
9  itom is free software; you can redistribute it and/or modify it
10  under the terms of the GNU Library General Public Licence as published by
11  the Free Software Foundation; either version 2 of the Licence, or (at
12  your option) any later version.
13 
14  In addition, as a special exception, the Institut fuer Technische
15  Optik (ITO) gives you certain additional rights.
16  These rights are described in the ITO LGPL Exception version 1.0,
17  which can be found in the file LGPL_EXCEPTION.txt in this package.
18 
19  itom is distributed in the hope that it will be useful, but
20  WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
22  General Public Licence for more details.
23 
24  You should have received a copy of the GNU Library General Public License
25  along with itom. If not, see <http://www.gnu.org/licenses/>.
26 *********************************************************************** */
27 
28 #ifndef MOTORAXISCONTROLLER_H
29 #define MOTORAXISCONTROLLER_H
30 
31 
32 #include "commonWidgets.h"
33 #include <qwidget.h>
34 #include <qstring.h>
35 #include <qpoint.h>
36 #include <qpointer.h>
37 #include <qstringlist.h>
38 #include "common/retVal.h"
39 #include "common/interval.h"
40 
41 class ItomSharedSemaphore; //forward declaration
42 
43 class MotorAxisControllerPrivate; //forward declaration
44 
45 namespace ito {
46  class AddInActuator; //forward declaration
47 };
48 
49 class ITOMWIDGETS_EXPORT MotorAxisController : public QWidget
50 {
51  Q_OBJECT
52 
53 #if QT_VERSION < 0x050500
54  //for >= Qt 5.5.0 see Q_ENUM definition below
55  Q_ENUMS(AxisUnit)
56  Q_ENUMS(AxisType)
57  Q_ENUMS(MovementType)
58 #endif
59 
60  Q_PROPERTY(QPointer<ito::AddInActuator> actuator READ actuator WRITE setActuator)
61  Q_PROPERTY(int numAxis READ numAxis WRITE setNumAxis)
62  Q_PROPERTY(AxisUnit defaultAxisUnit READ defaultAxisUnit WRITE setDefaultAxisUnit)
63  Q_PROPERTY(AxisType defaultAxisType READ defaultAxisType WRITE setDefaultAxisType)
64  Q_PROPERTY(bool refreshAvailable READ refreshAvailable WRITE setRefreshAvailable)
65  Q_PROPERTY(bool cancelAvailable READ cancelAvailable WRITE setCancelAvailable)
66  Q_PROPERTY(bool startAllAvailable READ startAllAvailable WRITE setStartAllAvailable)
67  Q_PROPERTY(double defaultRelativeStepSize READ defaultRelativeStepSize WRITE setDefaultRelativeStepSize)
68  Q_PROPERTY(QStringList axisNames READ axisNames WRITE setAxisNames)
69  Q_PROPERTY(int defaultDecimals READ defaultDecimals WRITE setDefaultDecimals)
70  Q_PROPERTY(MovementType movementType READ movementType WRITE setMovementType)
71  Q_PROPERTY(bool movementTypeVisible READ movementTypeVisible WRITE setMovementTypeVisible)
72  Q_PROPERTY(QString arbitraryUnit READ arbitraryUnit WRITE setArbitraryUnit)
73 
74  Q_CLASSINFO("prop://actuator", "Actuator instance that is monitored and controlled by this widget (or None in order to remove a previous actuator).")
75  Q_CLASSINFO("prop://numAxis", "Number of axes that are monitored.")
76  Q_CLASSINFO("prop://defaultAxisUnit", "Default unit for all axes. A different unit can be set for distinct axes using the slot 'setAxisUnit'.")
77  Q_CLASSINFO("prop://defaultAxisType", "Default type for all axes. A different type can be set for any axis using the slot 'setAxisType'.")
78  Q_CLASSINFO("prop://refreshAvailable", "Hide or show a button to manually refresh the positions of all covered axes.")
79  Q_CLASSINFO("prop://cancelAvailable", "Hide or show a button to cancel a running movement of any axis (should only be used, if the specific actuator is able to handle interrupts).")
80  Q_CLASSINFO("prop://startAllAvailable", "Hide or show a button to start a simultaneous movement of all covered axes to their current target positions.")
81  Q_CLASSINFO("prop://defaultRelativeStepSize", "Default relative step size for all axes (in mm or degree, depending on their types).")
82  Q_CLASSINFO("prop://axisNames", "Names of all axes as string list.")
83  Q_CLASSINFO("prop://defaultDecimals", "Default number of decimals of all axes. The number of decimals can also be set individually for each axis using the slot 'setAxisDecimals'.")
84  Q_CLASSINFO("prop://movementType", "Style of the widget depending if it should be optimized for an absolute movement, relative movement, both or no movement.")
85  Q_CLASSINFO("prop://movementTypeVisible", "Hide or show a combobox above the axes values that can be used to select an appropriate movement type.")
86  Q_CLASSINFO("prop://arbitraryUnit", "Unit name that is used for axes, whose unit is set to UnitAU (Arbitrary unit).")
87 
88 public:
89  enum AxisUnit {
90  UnitNm = 0,
91  UnitMum,
92  UnitMm,
93  UnitCm,
94  UnitM,
95  UnitDeg,
96  UnitAU /*Arbitrary unit*/
97  };
98 
99  enum AxisType {
100  TypeRotational = 0,
101  TypeLinear = 1
102  };
103 
104  enum MovementType {
105  MovementAbsolute = 0,
106  MovementRelative = 1,
107  MovementBoth = 2,
108  MovementNo = 3
109  };
110 
111 #if QT_VERSION >= 0x050500
112  //Q_ENUM exposes a meta object to the enumeration types, such that the key names for the enumeration
113  //values are always accessible.
114  Q_ENUM(AxisUnit);
115  Q_ENUM(AxisType);
116  Q_ENUM(MovementType);
117 #endif
118 
119  MotorAxisController(QWidget *parent = NULL);
121 
122  void setActuator(const QPointer<ito::AddInActuator> &actuator);
123  QPointer<ito::AddInActuator> actuator() const;
124 
125  int numAxis() const;
126  AxisUnit axisUnit(int axisIndex) const;
127  AxisUnit defaultAxisUnit() const;
128  AxisType axisType(int axisIndex) const;
129  AxisType defaultAxisType() const;
130  bool refreshAvailable() const;
131  bool cancelAvailable() const;
132  bool startAllAvailable() const;
133  double defaultRelativeStepSize() const;
134  QStringList axisNames() const;
135  QString axisName(int axisIndex) const;
136  int defaultDecimals() const;
137  int axisDecimals(int axisIndex) const;
138  MovementType movementType() const;
139  bool movementTypeVisible() const;
140  bool axisEnabled(int axisIndex) const;
141  QString arbitraryUnit() const;
142 
143 private:
144  void retValToMessageBox(const ito::RetVal &retval, const QString &methodName) const;
145  QString suffixFromAxisUnit(const AxisUnit &unit) const;
146  double baseUnitToUnit(const double &value, const AxisUnit &unit) const;
147  double unitToBaseUnit(const double &value, const AxisUnit &unit) const;
148  ito::RetVal observeInvocation(ItomSharedSemaphore *waitCond) const;
149  void moveRelOrAbs(int axis, double value, bool relNotAbs);
150 
152 
153 public slots:
154  virtual void actuatorStatusChanged(QVector<int> status, QVector<double> actPosition);
155  virtual void targetChanged(QVector<double> targetPositions);
156 
157  ito::RetVal setAxisUnit(int axisIndex, AxisUnit unit);
158  ito::RetVal setAxisEnabled(int axisIndex, bool enabled);
159  ito::RetVal setAxisDecimals(int axisIndex, int decimals);
160  ito::RetVal setAxisType(int axisIndex, AxisType type);
161  ito::RetVal setAxisName(int axisIndex, const QString &name);
162 
163  void setDefaultAxisUnit(AxisUnit unit);
164  void setMovementTypeVisible(bool visible);
165  void setMovementType(MovementType type);
166  void setDefaultDecimals(int decimals);
167  void setAxisNames(const QStringList &names);
168  void setDefaultRelativeStepSize(double defaultRelativeStepSize); /*in mm or degree*/
169  void setCancelAvailable(bool available);
170  void setStartAllAvailable(bool available);
171  void setRefreshAvailable(bool available);
172  void setDefaultAxisType(AxisType type);
173  void setNumAxis(int numAxis);
174  void setArbitraryUnit(const QString &unit);
175 
176  ito::AutoInterval stepSizeInterval(int axisIndex) const;
177  ito::AutoInterval targetInterval(int axisIndex) const;
178 
179  ito::RetVal setStepSizeInterval(int axisIndex, const ito::AutoInterval &interval);
180  ito::RetVal setTargetInterval(int axisIndex, const ito::AutoInterval &interval);
181 
182 
183 private slots:
184  void on_btnCancel_clicked();
185  void on_btnStart_clicked();
186  void on_btnRefresh_clicked();
187  void on_comboType_currentIndexChanged(int index);
188  void stepUpClicked(int index);
189  void stepDownClicked(int index);
190  void runSingleClicked(int index);
191  void customContextMenuRequested(const QPoint &pos);
192 };
193 
194 #endif
Class for managing status values (like errors or warning)
Definition: retVal.h:54
Definition: apiFunctionsGraph.cpp:39
Definition: motorAxisController.h:49
semaphore which can be used for asychronous thread communication. By using this class it is possible ...
Definition: sharedStructuresQt.h:57
class for a interval type containing a min-max-range and an auto-flag.
Definition: interval.h:49
Definition: motorAxisController.cpp:47