diff --git a/kstars/ekos/auxiliary/dome.h b/kstars/ekos/auxiliary/dome.h --- a/kstars/ekos/auxiliary/dome.h +++ b/kstars/ekos/auxiliary/dome.h @@ -31,6 +31,7 @@ Q_PROPERTY(ISD::ParkStatus parkStatus READ parkStatus NOTIFY newParkStatus) Q_PROPERTY(bool canPark READ canPark) Q_PROPERTY(bool canAbsoluteMove READ canAbsoluteMove) + Q_PROPERTY(bool canRelativeMove READ canRelativeMove) Q_PROPERTY(bool isMoving READ isMoving) Q_PROPERTY(double azimuthPosition READ azimuthPosition WRITE setAzimuthPosition NOTIFY azimuthPositionChanged) @@ -63,6 +64,11 @@ */ Q_SCRIPTABLE bool canAbsoluteMove(); + /** + * DBUS interface function. + * Can dome move to an relative azimuth position? + */ + Q_SCRIPTABLE bool canRelativeMove(); /** * DBUS interface function. * Park dome @@ -90,6 +96,10 @@ Q_SCRIPTABLE double azimuthPosition(); Q_SCRIPTABLE void setAzimuthPosition(double position); + Q_SCRIPTABLE void setRelativePosition(double position); + + Q_SCRIPTABLE bool isAutoSync(); + Q_SCRIPTABLE bool setAutoSync(bool activate); Q_SCRIPTABLE bool hasShutter(); Q_SCRIPTABLE bool controlShutter(bool open); @@ -116,6 +126,7 @@ void newStatus(ISD::Dome::Status status); void newParkStatus(ISD::ParkStatus status); void newShutterStatus(ISD::Dome::ShutterStatus status); + void newAutoSyncStatus(bool enabled); void azimuthPositionChanged(double position); void ready(); // Signal when the underlying ISD::Dome signals a Disconnected() diff --git a/kstars/ekos/auxiliary/dome.cpp b/kstars/ekos/auxiliary/dome.cpp --- a/kstars/ekos/auxiliary/dome.cpp +++ b/kstars/ekos/auxiliary/dome.cpp @@ -41,6 +41,7 @@ connect(currentDome, &ISD::Dome::newParkStatus, [&](ISD::ParkStatus status) {m_ParkStatus = status;}); connect(currentDome, &ISD::Dome::newShutterStatus, this, &Dome::newShutterStatus); connect(currentDome, &ISD::Dome::newShutterStatus, [&](ISD::Dome::ShutterStatus status) {m_ShutterStatus = status;}); + connect(currentDome, &ISD::Dome::newAutoSyncStatus, this, &Dome::newAutoSyncStatus); connect(currentDome, &ISD::Dome::azimuthPositionChanged, this, &Dome::azimuthPositionChanged); connect(currentDome, &ISD::Dome::ready, this, &Dome::ready); connect(currentDome, &ISD::Dome::Disconnected, this, &Dome::disconnected); @@ -111,6 +112,14 @@ return false; } +bool Dome::canRelativeMove() +{ + if (currentDome) + return currentDome->canRelMove(); + + return false; +} + double Dome::azimuthPosition() { if (currentDome) @@ -124,6 +133,28 @@ currentDome->setAzimuthPosition(position); } +void Dome::setRelativePosition(double position) +{ + if (currentDome) + currentDome->setRelativePosition(position); +} + +bool Dome::isAutoSync() +{ + if (currentDome) + return currentDome->isAutoSync(); + // value could not be determined + return false; +} + +bool Dome::setAutoSync(bool activate) +{ + if (currentDome) + return currentDome->setAutoSync(activate); + // not succeeded + return false; +} + bool Dome::hasShutter() { if (currentDome) diff --git a/kstars/ekos/observatory/observatory.h b/kstars/ekos/observatory/observatory.h --- a/kstars/ekos/observatory/observatory.h +++ b/kstars/ekos/observatory/observatory.h @@ -63,6 +63,13 @@ void setDomeModel(ObservatoryDomeModel *model); void setWeatherModel(ObservatoryWeatherModel *model); + // motion control + void enableMotionControl(bool enabled); + + // slaving control + void enableAutoSync(bool enabled); + void showAutoSync(bool enabled); + // Logging QStringList m_LogText; void appendLogText(const QString &); @@ -90,6 +97,7 @@ // reacting on observatory status changes void observatoryStatusChanged(bool ready); + void domeAzimuthChanged(double position); void initDome(); void shutdownDome(); diff --git a/kstars/ekos/observatory/observatory.cpp b/kstars/ekos/observatory/observatory.cpp --- a/kstars/ekos/observatory/observatory.cpp +++ b/kstars/ekos/observatory/observatory.cpp @@ -34,11 +34,10 @@ statusDefinitionBox->setVisible(true); statusDefinitionBox->setEnabled(true); // make invisible, since not implemented yet - angleLabel->setVisible(false); - domeAngleSpinBox->setVisible(false); - setDomeAngleButton->setVisible(false); weatherWarningSchedulerCB->setVisible(false); weatherAlertSchedulerCB->setVisible(false); + motionCWButton->setVisible(false); + motionCCWButton->setVisible(false); } void Observatory::setObseratoryStatusControl(ObservatoryStatusControl control) @@ -61,7 +60,24 @@ connect(model, &Ekos::ObservatoryDomeModel::disconnected, this, &Ekos::Observatory::shutdownDome); connect(model, &Ekos::ObservatoryDomeModel::newStatus, this, &Ekos::Observatory::setDomeStatus); connect(model, &Ekos::ObservatoryDomeModel::newShutterStatus, this, &Ekos::Observatory::setShutterStatus); + connect(model, &Ekos::ObservatoryDomeModel::azimuthPositionChanged, this, &Ekos::Observatory::domeAzimuthChanged); + connect(model, &Ekos::ObservatoryDomeModel::newAutoSyncStatus, this, &Ekos::Observatory::showAutoSync); + // motion controls + connect(motionMoveAbsButton, &QCheckBox::clicked, [this]() + { + mObservatoryModel->getDomeModel()->setAzimuthPosition(absoluteMotionSB->value()); + }); + + connect(motionMoveRelButton, &QCheckBox::clicked, [this]() + { + mObservatoryModel->getDomeModel()->setRelativePosition(relativeMotionSB->value()); + }); + + // abort button + connect(motionAbortButton, &QPushButton::clicked, model, &ObservatoryDomeModel::abort); + + // weather controls connect(weatherWarningShutterCB, &QCheckBox::clicked, this, &Observatory::weatherWarningSettingsChanged); connect(weatherWarningDomeCB, &QCheckBox::clicked, this, &Observatory::weatherWarningSettingsChanged); connect(weatherWarningDelaySB, static_cast(&QSpinBox::valueChanged), [this](int i) @@ -83,12 +99,6 @@ shutdownDome(); - // JM 2019-06-11: You cannot disconnect a nullptr here. - // disconnect(model, &Ekos::ObservatoryDomeModel::newShutterStatus, this, &Ekos::Observatory::setShutterStatus); - // disconnect(model, &Ekos::ObservatoryDomeModel::newStatus, this, &Ekos::Observatory::setDomeStatus); - // disconnect(model, &Ekos::ObservatoryDomeModel::ready, this, &Ekos::Observatory::initDome); - // disconnect(model, &Ekos::ObservatoryDomeModel::disconnected, this, &Ekos::Observatory::shutdownDome); - disconnect(weatherWarningShutterCB, &QCheckBox::clicked, this, &Observatory::weatherWarningSettingsChanged); disconnect(weatherWarningDomeCB, &QCheckBox::clicked, this, &Observatory::weatherWarningSettingsChanged); connect(weatherWarningDelaySB, static_cast(&QSpinBox::valueChanged), [this](int i) @@ -128,6 +138,9 @@ domeUnpark->setEnabled(false); } + // initialize the dome motion controls + domeAzimuthChanged(getDomeModel()->azimuthPosition()); + if (getDomeModel()->hasShutter()) { shutterBox->setVisible(true); @@ -144,8 +157,23 @@ weatherAlertShutterCB->setVisible(false); } + motionAbortButton->setEnabled(true); + + // slaving + connect(slavingEnableButton, &QPushButton::clicked, this, [this]() + { + enableAutoSync(true); + }); + connect(slavingDisableButton, &QPushButton::clicked, this, [this]() + { + enableAutoSync(false); + }); + + setDomeStatus(getDomeModel()->status()); setShutterStatus(getDomeModel()->shutterStatus()); + + enableAutoSync(getDomeModel()->isAutoSync()); } } @@ -159,9 +187,6 @@ domeUnpark->setEnabled(false); shutterClosed->setEnabled(false); shutterOpen->setEnabled(false); - angleLabel->setEnabled(false); - domeAngleSpinBox->setEnabled(false); - setDomeAngleButton->setEnabled(false); disconnect(domePark, &QPushButton::clicked, getDomeModel(), &Ekos::ObservatoryDomeModel::park); disconnect(domeUnpark, &QPushButton::clicked, getDomeModel(), &Ekos::ObservatoryDomeModel::unpark); @@ -178,29 +203,35 @@ domePark->setText(i18n("Park")); domeUnpark->setChecked(true); domeUnpark->setText(i18n("UnParked")); - appendLogText(i18n("Dome is unparked.")); + enableMotionControl(true); + appendLogText(i18n("Dome is idle.")); break; case ISD::Dome::DOME_MOVING: + enableMotionControl(false); appendLogText(i18n("Dome is moving...")); break; case ISD::Dome::DOME_PARKED: domePark->setChecked(true); domePark->setText(i18n("Parked")); domeUnpark->setChecked(false); domeUnpark->setText(i18n("UnPark")); + enableMotionControl(false); appendLogText(i18n("Dome is parked.")); break; case ISD::Dome::DOME_PARKING: domePark->setText(i18n("Parking")); domeUnpark->setText(i18n("UnPark")); + enableMotionControl(false); appendLogText(i18n("Dome is parking...")); break; case ISD::Dome::DOME_UNPARKING: domePark->setText(i18n("Park")); domeUnpark->setText(i18n("UnParking")); + enableMotionControl(false); appendLogText(i18n("Dome is unparking...")); break; case ISD::Dome::DOME_TRACKING: + enableMotionControl(true); appendLogText(i18n("Dome is tracking.")); break; } @@ -262,19 +293,57 @@ }); } else - { shutdownWeather(); +} + +void Observatory::enableMotionControl(bool enabled) +{ + MotionBox->setEnabled(enabled); + + // absolute motion controls + if (getDomeModel()->canAbsoluteMove()) + { + motionMoveAbsButton->setEnabled(enabled); + absoluteMotionSB->setEnabled(enabled); + } + else + { + motionMoveAbsButton->setEnabled(false); + absoluteMotionSB->setEnabled(false); + } + + // relative motion controls + if (getDomeModel()->canRelativeMove()) + { + motionMoveRelButton->setEnabled(enabled); + relativeMotionSB->setEnabled(enabled); + } + else + { + motionMoveRelButton->setEnabled(false); + relativeMotionSB->setEnabled(false); + } - // 2019-06-11 JM: Cannot disconnect a nullptr - // disconnect(model, &Ekos::ObservatoryWeatherModel::newStatus, this, &Ekos::Observatory::setWeatherStatus); - // disconnect(model, &Ekos::ObservatoryWeatherModel::disconnected, this, &Ekos::Observatory::shutdownWeather); - // disconnect(model, &Ekos::ObservatoryWeatherModel::ready, this, &Ekos::Observatory::initWeather); - //disconnect(weatherWarningBox, &QGroupBox::clicked, model, &ObservatoryWeatherModel::setWarningActionsActive); - //disconnect(weatherAlertBox, &QGroupBox::clicked, model, &ObservatoryWeatherModel::setAlertActionsActive); +} + +void Observatory::enableAutoSync(bool enabled) +{ + if (getDomeModel() == nullptr) + showAutoSync(false); + else + { + getDomeModel()->setAutoSync(enabled); + showAutoSync(enabled); } } +void Observatory::showAutoSync(bool enabled) +{ + slavingEnableButton->setChecked(enabled); + slavingDisableButton->setChecked(! enabled); +} + void Observatory::initWeather() { weatherBox->setEnabled(true); @@ -351,6 +420,11 @@ emit newStatus(ready); } +void Observatory::domeAzimuthChanged(double position) +{ + domeAzimuthPosition->setText(QString::number(position, 'f', 2)); +} + void Observatory::setWarningActions(WeatherActions actions) { diff --git a/kstars/ekos/observatory/observatory.ui b/kstars/ekos/observatory/observatory.ui --- a/kstars/ekos/observatory/observatory.ui +++ b/kstars/ekos/observatory/observatory.ui @@ -6,8 +6,8 @@ 0 0 - 730 - 284 + 873 + 494 @@ -50,10 +50,7 @@ Dome - - - 3 - + 3 @@ -66,141 +63,439 @@ 3 - - - - false - - - - 96 - 36 - - - - - 96 - 36 - - - - <html><head/><body><p>Park the dome. For advanced control of the dome please use the INDI tab.</p></body></html> - - - QPushButton:checked + + + + + + + + false + + + + 96 + 36 + + + + + 96 + 36 + + + + <html><head/><body><p>Park the dome. For advanced control of the dome please use the INDI tab.</p></body></html> + + + QPushButton:checked { background-color: maroon; border: 1px outset; font-weight:bold; } - - - Park - - - - 32 - 16 - - - - true - - - - - - - false - - - - 96 - 36 - - - - - 96 - 36 - - - - <html><head/><body><p>Unpark the dome. For advanced control of the dome please use the INDI tab.</p></body></html> - - - QPushButton:checked + + + Park + + + + 32 + 16 + + + + true + + + + + + + false + + + + 96 + 36 + + + + + 96 + 36 + + + + <html><head/><body><p>Unpark the dome. For advanced control of the dome please use the INDI tab.</p></body></html> + + + QPushButton:checked { background-color: maroon; border: 1px outset; font-weight:bold; } - - - UnPark - - - true - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - + + + UnPark + + + true + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + 96 + 36 + + + + + 96 + 36 + + + + Abort dome motion + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + + + Abort + + + + + + + + + + + false + + + Relative position the dome should move. + + + -999.990000000000009 + + + 999.990000000000009 + + + + + + + false + + + + 96 + 36 + + + + + 96 + 36 + + + + Move the dome for the given degrees and direction. + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + + + Move (rel) + + + + + + + false + + + Absolute position the dome should move. + + + 999.990000000000009 + + + + + + + false + + + + 96 + 36 + + + + + 96 + 36 + + + + Move the dome to the given absolute position. + + + Move (abs) + + + + + + + + + + 160 + 0 + + + + + 320 + 16777215 + + + + + 24 + 75 + true + + + + 0 + + + Qt::AlignCenter + + + + + false + + + 96 + 36 + + + + + 96 + 36 + + + + Rotate counter clockwise + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + - Azimuth: + CCW - - + + false + + Motion: + + + + + + + + + + + + + + Position + - - + + false - 72 - 24 + 96 + 36 - 72 - 24 + 96 + 36 + + Rotate clockwise + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + - Set + &CW + + + + + + Slaving + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 96 + 36 + + + + + 96 + 36 + + + + <html><head/><body><p>Enable slaving, dome motion <span style=" font-weight:600;">follows telescope motion</span></p></body></html> + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + + + Enable + + + true + + + + + + + + 96 + 36 + + + + + 96 + 36 + + + + <html><head/><body><p>Disable slaving, dome <span style=" font-weight:600;">does not follow telescope motion</span>.</p></body></html> + + + QPushButton:checked +{ +background-color: maroon; +border: 1px outset; +font-weight:bold; +} + + + Disable + + + true + + + + + @@ -230,6 +525,19 @@ 3 + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -311,19 +619,6 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - @@ -399,7 +694,13 @@ - <html><head/><body><p>Close the shutter of the dome. For advanced control of the dome please use the INDI tab.</p></body></html> + <html><head/><body><p>Observatory status. Select the observatory elements that are relevant for the status:</p> +<ul> +<li><b>Dome</b>: unparked &rarr; ready</li> +<li><b>Shutter</b>: open &rarr; ready</li> +<li><b>Weather</b>: OK &rarr; ready</li> +</ul> +</body></html> QPushButton:checked @@ -455,57 +756,6 @@ 3 - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - - - Display the weather status. The warning and alert limits are set in the INDI tab. - - - Weather Status: - - - - - - - - 0 - 0 - - - - - 48 - 48 - - - - - 48 - 48 - - - - - - - @@ -622,7 +872,7 @@ - + Ale&rt @@ -717,6 +967,57 @@ + + + + + 0 + 0 + + + + + 48 + 48 + + + + + 48 + 48 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Display the weather status. The warning and alert limits are set in the INDI tab. + + + Weather Status: + + + diff --git a/kstars/ekos/observatory/observatorydomemodel.h b/kstars/ekos/observatory/observatorydomemodel.h --- a/kstars/ekos/observatory/observatorydomemodel.h +++ b/kstars/ekos/observatory/observatorydomemodel.h @@ -37,6 +37,40 @@ } void park(); void unpark(); + + double azimuthPosition() + { + return mDome->azimuthPosition(); + } + void setAzimuthPosition(double position) + { + mDome->setAzimuthPosition(position); + } + + bool canAbsoluteMove() + { + return (mDome != nullptr && mDome->canAbsoluteMove()); + } + + void setRelativePosition(double position) + { + mDome->setRelativePosition(position); + } + + bool canRelativeMove() + { + return (mDome != nullptr && mDome->canRelativeMove()); + } + + bool isAutoSync() + { + return (mDome != nullptr && mDome->isAutoSync()); + } + + void setAutoSync(bool activate); + + void abort(); + bool hasShutter() { return (mDome != nullptr && mDome->hasShutter()); @@ -54,6 +88,8 @@ signals: void newStatus(ISD::Dome::Status state); void newShutterStatus(ISD::Dome::ShutterStatus status); + void newAutoSyncStatus(bool enabled); + void azimuthPositionChanged(double position); void ready(); void disconnected(); void newLog(const QString &text); diff --git a/kstars/ekos/observatory/observatorydomemodel.cpp b/kstars/ekos/observatory/observatorydomemodel.cpp --- a/kstars/ekos/observatory/observatorydomemodel.cpp +++ b/kstars/ekos/observatory/observatorydomemodel.cpp @@ -21,6 +21,8 @@ connect(mDome, &Dome::disconnected, this, &ObservatoryDomeModel::disconnected); connect(mDome, &Dome::newStatus, this, &ObservatoryDomeModel::newStatus); connect(mDome, &Dome::newShutterStatus, this, &ObservatoryDomeModel::newShutterStatus); + connect(mDome, &Dome::azimuthPositionChanged, this, &ObservatoryDomeModel::azimuthPositionChanged); + connect(mDome, &Dome::newAutoSyncStatus, this, &ObservatoryDomeModel::newAutoSyncStatus); } @@ -60,6 +62,25 @@ mDome->unpark(); } +void ObservatoryDomeModel::setAutoSync(bool activate) +{ + if (mDome == nullptr) + return; + + if (mDome->setAutoSync(activate)) + emit newLog(i18n(activate ? "Slaving activated." : "Slaving deactivated.")); + +} + +void ObservatoryDomeModel::abort() +{ + if (mDome == nullptr) + return; + + emit newLog(i18n("Aborting...")); + mDome->abort(); +} + void ObservatoryDomeModel::openShutter() { if (mDome == nullptr) diff --git a/kstars/ekos/observatory/observatorymodel.cpp b/kstars/ekos/observatory/observatorymodel.cpp --- a/kstars/ekos/observatory/observatorymodel.cpp +++ b/kstars/ekos/observatory/observatorymodel.cpp @@ -73,7 +73,9 @@ bool ObservatoryModel::isReady() { // dome relevant for the status and dome is ready - if (mStatusControl.useDome && (getDomeModel() == nullptr || getDomeModel()->status() != ISD::Dome::DOME_IDLE)) + if (mStatusControl.useDome && (getDomeModel() == nullptr || + (getDomeModel()->status() != ISD::Dome::DOME_IDLE && + getDomeModel()->status() != ISD::Dome::DOME_TRACKING))) return false; // shutter relevant for the status and shutter open diff --git a/kstars/indi/indidome.h b/kstars/indi/indidome.h --- a/kstars/indi/indidome.h +++ b/kstars/indi/indidome.h @@ -68,6 +68,10 @@ { return m_CanAbsMove; } + bool canRelMove() const + { + return m_CanRelMove; + } bool canAbort() const { return m_CanAbort; @@ -80,12 +84,18 @@ double azimuthPosition() const; bool setAzimuthPosition(double position); + bool setRelativePosition(double position); bool hasShutter() const { return m_HasShutter; } + + // slaving + bool isAutoSync(); + bool setAutoSync(bool activate); + Status status() const { return m_Status; @@ -105,14 +115,16 @@ void newStatus(Status status); void newParkStatus(ParkStatus status); void newShutterStatus(ShutterStatus status); + void newAutoSyncStatus(bool enabled); void azimuthPositionChanged(double Az); void ready(); private: ParkStatus m_ParkStatus { PARK_UNKNOWN }; ShutterStatus m_ShutterStatus { SHUTTER_UNKNOWN }; Status m_Status { DOME_IDLE }; bool m_CanAbsMove { false }; + bool m_CanRelMove { false }; bool m_CanPark { false }; bool m_CanAbort { false }; bool m_HasShutter { false }; diff --git a/kstars/indi/indidome.cpp b/kstars/indi/indidome.cpp --- a/kstars/indi/indidome.cpp +++ b/kstars/indi/indidome.cpp @@ -81,6 +81,10 @@ { m_CanAbsMove = true; } + else if (!strcmp(prop->getName(), "REL_DOME_POSITION")) + { + m_CanRelMove = true; + } else if (!strcmp(prop->getName(), "DOME_ABORT_MOTION")) { m_CanAbort = true; @@ -289,6 +293,12 @@ return; } + else if (!strcmp(svp->name, "DOME_AUTOSYNC")) + { + ISwitch *sp = IUFindSwitch(svp, "DOME_AUTOSYNC_ENABLE"); + if (sp != nullptr) + emit newAutoSyncStatus(sp->s == ISS_ON); + } DeviceDecorator::processSwitch(svp); } @@ -388,6 +398,51 @@ return true; } +bool Dome::setRelativePosition(double position) +{ + INumberVectorProperty *azDiff = baseDevice->getNumber("REL_DOME_POSITION"); + + if (azDiff == nullptr) + return false; + + azDiff->np[0].value = position; + clientManager->sendNewNumber(azDiff); + return true; +} + +bool Dome::isAutoSync() +{ + ISwitchVectorProperty *autosync = baseDevice->getSwitch("DOME_AUTOSYNC"); + + if (autosync == nullptr) + return false; + + ISwitch *autosyncSW = IUFindSwitch(autosync, "DOME_AUTOSYNC_ENABLE"); + + if (autosync == nullptr) + return false; + else + return (autosyncSW->s == ISS_ON); +} + +bool Dome::setAutoSync(bool activate) +{ + ISwitchVectorProperty *autosync = baseDevice->getSwitch("DOME_AUTOSYNC"); + + if (autosync == nullptr) + return false; + + ISwitch *autosyncSW = IUFindSwitch(autosync, activate ? "DOME_AUTOSYNC_ENABLE" : "DOME_AUTOSYNC_DISABLE"); + if (autosyncSW == nullptr) + return false; + + IUResetSwitch(autosync); + autosyncSW->s = ISS_ON; + clientManager->sendNewSwitch(autosync); + + return true; +} + bool Dome::ControlShutter(bool open) { ISwitchVectorProperty *shutterSP = baseDevice->getSwitch("DOME_SHUTTER"); diff --git a/kstars/org.kde.kstars.Ekos.Dome.xml b/kstars/org.kde.kstars.Ekos.Dome.xml --- a/kstars/org.kde.kstars.Ekos.Dome.xml +++ b/kstars/org.kde.kstars.Ekos.Dome.xml @@ -10,6 +10,7 @@ +