File indexing completed on 2024-04-21 03:44:07
0001 /* 0002 SPDX-FileCopyrightText: 2015 Jasem Mutlaq <mutlaqja@ikarustech.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <memory> 0010 #include <QTimer> 0011 0012 #include "indiconcretedevice.h" 0013 0014 namespace ISD 0015 { 0016 /** 0017 * @class Dome 0018 * Class handles control of INDI dome devices. Both open and closed loop (sensor feedback) domes are supported. 0019 * 0020 * @author Jasem Mutlaq 0021 */ 0022 class Dome : public ConcreteDevice 0023 { 0024 Q_OBJECT 0025 Q_CLASSINFO("D-Bus Interface", "org.kde.kstars.INDI.Dome") 0026 Q_PROPERTY(bool canPark READ canPark) 0027 Q_PROPERTY(bool canAbsoluteMove READ canAbsoluteMove) 0028 Q_PROPERTY(bool canRelativeMove READ canRelativeMove) 0029 Q_PROPERTY(bool canAbort READ canAbort) 0030 Q_PROPERTY(bool isMoving READ isMoving) 0031 Q_PROPERTY(ISD::Dome::Status status READ status NOTIFY newStatus) 0032 Q_PROPERTY(ISD::Dome::ShutterStatus shutterStatus READ shutterStatus NOTIFY newShutterStatus) 0033 Q_PROPERTY(ISD::ParkStatus parkStatus READ parkStatus NOTIFY newParkStatus) 0034 Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged) 0035 0036 public: 0037 explicit Dome(GenericDevice *parent); 0038 0039 // DBUS 0040 const QString &name() 0041 { 0042 return m_Parent->getDeviceName(); 0043 } 0044 // DBus 0045 bool connected() 0046 { 0047 return m_Parent->isConnected(); 0048 } 0049 0050 typedef enum 0051 { 0052 DOME_IDLE, 0053 DOME_MOVING_CW, 0054 DOME_MOVING_CCW, 0055 DOME_TRACKING, 0056 DOME_PARKING, 0057 DOME_UNPARKING, 0058 DOME_PARKED, 0059 DOME_ERROR 0060 } Status; 0061 0062 typedef enum 0063 { 0064 SHUTTER_UNKNOWN, 0065 SHUTTER_OPEN, 0066 SHUTTER_CLOSED, 0067 SHUTTER_OPENING, 0068 SHUTTER_CLOSING, 0069 SHUTTER_ERROR 0070 } ShutterStatus; 0071 0072 typedef enum 0073 { 0074 DOME_CW, 0075 DOME_CCW 0076 } DomeDirection; 0077 0078 typedef enum 0079 { 0080 MOTION_START, 0081 MOTION_STOP 0082 } DomeMotionCommand; 0083 0084 0085 void processSwitch(INDI::Property prop) override; 0086 void processNumber(INDI::Property prop) override; 0087 void registerProperty(INDI::Property prop) override; 0088 0089 Q_SCRIPTABLE bool canPark() const 0090 { 0091 return m_CanPark; 0092 } 0093 Q_SCRIPTABLE bool canAbsoluteMove() const 0094 { 0095 return m_CanAbsMove; 0096 } 0097 Q_SCRIPTABLE bool canRelativeMove() const 0098 { 0099 return m_CanRelMove; 0100 } 0101 Q_SCRIPTABLE bool canAbort() const 0102 { 0103 return m_CanAbort; 0104 } 0105 Q_SCRIPTABLE bool isParked() const 0106 { 0107 return m_ParkStatus == PARK_PARKED; 0108 } 0109 bool isMoving() const; 0110 0111 /** 0112 * @return position Dome Azimuth position in degrees 0113 */ 0114 Q_SCRIPTABLE double position() const; 0115 /** 0116 * @brief setPosition Set azimuth absolute position. 0117 * @param position Position in degrees 0 to +360 0118 * @return true if successful, false otherwise 0119 */ 0120 Q_SCRIPTABLE bool setPosition(double position); 0121 0122 bool setRelativePosition(double position); 0123 0124 bool moveDome(DomeDirection dir, DomeMotionCommand operation); 0125 0126 /** DBus Interface Function 0127 * @brief moveCW Start motion in clock-wise direction. 0128 * @return True if command is successful, false otherwise. 0129 */ 0130 Q_SCRIPTABLE bool moveCW() 0131 { 0132 return moveDome(DOME_CW, MOTION_START); 0133 } 0134 0135 /** DBus Interface Function 0136 * @brief moveCCW Start motion in counter-clock-wise direction. 0137 * @return True if command is successful, false otherwise. 0138 */ 0139 Q_SCRIPTABLE bool moveCCW() 0140 { 0141 return moveDome(DOME_CCW, MOTION_START); 0142 } 0143 0144 Q_SCRIPTABLE bool hasShutter() const 0145 { 0146 return m_HasShutter; 0147 } 0148 0149 /** 0150 * @brief isRolloffRoof Do we have a roll off structure? 0151 * @return True if we do, false otherwise. 0152 */ 0153 bool isRolloffRoof() 0154 { 0155 return (canAbsoluteMove() == false && canRelativeMove() == false); 0156 } 0157 0158 // slaving 0159 bool isAutoSync(); 0160 bool setAutoSync(bool activate); 0161 0162 Status status() const 0163 { 0164 return m_Status; 0165 } 0166 ISD::ParkStatus parkStatus() const 0167 { 0168 return m_ParkStatus; 0169 } 0170 static const QString getStatusString (Status status, bool translated = true); 0171 0172 ShutterStatus shutterStatus(); 0173 ShutterStatus parseShutterStatus(INDI::Property prop); 0174 0175 Q_SCRIPTABLE bool abort(); 0176 Q_SCRIPTABLE bool park(); 0177 Q_SCRIPTABLE bool unpark(); 0178 0179 Q_SCRIPTABLE bool controlShutter(bool open); 0180 bool openShutter() 0181 { 0182 return controlShutter(true); 0183 } 0184 bool closeShutter() 0185 { 0186 return controlShutter(false); 0187 } 0188 0189 signals: 0190 void newStatus(ISD::Dome::Status status); 0191 void newParkStatus(ISD::ParkStatus status); 0192 void newShutterStatus(ISD::Dome::ShutterStatus status); 0193 void newAutoSyncStatus(bool enabled); 0194 void positionChanged(double degrees); 0195 0196 private: 0197 ParkStatus m_ParkStatus { PARK_UNKNOWN }; 0198 ShutterStatus m_ShutterStatus { SHUTTER_UNKNOWN }; 0199 Status m_Status { DOME_IDLE }; 0200 bool m_CanAbsMove { false }; 0201 bool m_CanRelMove { false }; 0202 bool m_CanPark { false }; 0203 bool m_CanAbort { false }; 0204 bool m_HasShutter { false }; 0205 static const QList<const char *> domeStates; 0206 }; 0207 } 0208 0209 Q_DECLARE_METATYPE(ISD::Dome::Status) 0210 QDBusArgument &operator<<(QDBusArgument &argument, const ISD::Dome::Status &source); 0211 const QDBusArgument &operator>>(const QDBusArgument &argument, ISD::Dome::Status &dest); 0212 0213 Q_DECLARE_METATYPE(ISD::Dome::ShutterStatus) 0214 QDBusArgument &operator<<(QDBusArgument &argument, const ISD::Dome::ShutterStatus &source); 0215 const QDBusArgument &operator>>(const QDBusArgument &argument, ISD::Dome::ShutterStatus &dest);