File indexing completed on 2024-04-28 03:43:41

0001 /*  Ekos Observatory Module
0002     SPDX-FileCopyrightText: Wolfgang Reissenberger <sterne-jaeger@t-online.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "observatorymodel.h"
0008 #include "Options.h"
0009 
0010 namespace Ekos
0011 {
0012 
0013 ObservatoryModel::ObservatoryModel()
0014 {
0015 
0016     mStatusControl.useDome = Options::observatoryStatusUseDome();
0017     mStatusControl.useShutter = Options::observatoryStatusUseShutter();
0018     mStatusControl.useWeather = Options::observatoryStatusUseWeather();
0019 
0020     setDomeModel(new ObservatoryDomeModel());
0021     setWeatherModel(new ObservatoryWeatherModel());
0022 }
0023 
0024 void ObservatoryModel::setDomeModel(ObservatoryDomeModel *model)
0025 {
0026     mDomeModel = model;
0027     if (model != nullptr)
0028     {
0029         connect(mDomeModel, &ObservatoryDomeModel::newStatus, [this](ISD::Dome::Status s)
0030         {
0031             Q_UNUSED(s);
0032             updateStatus();
0033         });
0034         connect(mDomeModel, &ObservatoryDomeModel::newParkStatus, [this](ISD::ParkStatus s)
0035         {
0036             Q_UNUSED(s);
0037             updateStatus();
0038         });
0039         connect(mDomeModel, &ObservatoryDomeModel::newShutterStatus, [this](ISD::Dome::ShutterStatus s)
0040         {
0041             Q_UNUSED(s);
0042             updateStatus();
0043         });
0044         if (mWeatherModel != nullptr)
0045             connect(mWeatherModel, &ObservatoryWeatherModel::execute, mDomeModel, &ObservatoryDomeModel::execute);
0046     }
0047     else
0048     {
0049         if (mWeatherModel != nullptr)
0050             disconnect(mWeatherModel, &ObservatoryWeatherModel::execute, mDomeModel, &ObservatoryDomeModel::execute);
0051     }
0052 
0053     updateStatus();
0054 }
0055 
0056 void ObservatoryModel::setWeatherModel(ObservatoryWeatherModel *model)
0057 {
0058     mWeatherModel = model;
0059     if (model != nullptr)
0060     {
0061         connect(mWeatherModel, &ObservatoryWeatherModel::newStatus, [this](ISD::Weather::Status s)
0062         {
0063             Q_UNUSED(s);
0064             updateStatus();
0065         });
0066         if (mDomeModel != nullptr)
0067         {
0068             connect(mWeatherModel, &ObservatoryWeatherModel::execute, mDomeModel, &ObservatoryDomeModel::execute);
0069         }
0070     }
0071     else
0072     {
0073         if (mDomeModel != nullptr)
0074             disconnect(mWeatherModel, &ObservatoryWeatherModel::execute, mDomeModel, &ObservatoryDomeModel::execute);
0075     }
0076     updateStatus();
0077 }
0078 
0079 
0080 void ObservatoryModel::setStatusControl(ObservatoryStatusControl control)
0081 {
0082     mStatusControl = control;
0083     Options::setObservatoryStatusUseDome(control.useDome);
0084     Options::setObservatoryStatusUseShutter(control.useShutter);
0085     Options::setObservatoryStatusUseWeather(control.useWeather);
0086     updateStatus();
0087 }
0088 
0089 bool ObservatoryModel::isReady()
0090 {
0091     // dome relevant for the status and dome is ready
0092     if (mStatusControl.useDome && (getDomeModel() == nullptr || getDomeModel()->parkStatus() != ISD::PARK_UNPARKED))
0093         return false;
0094 
0095     // shutter relevant for the status and shutter open
0096     if (mStatusControl.useShutter && (getDomeModel() == nullptr ||
0097                                       (getDomeModel()->hasShutter() && getDomeModel()->shutterStatus() != ISD::Dome::SHUTTER_OPEN)))
0098         return false;
0099 
0100     // weather relevant for the status and weather is OK
0101     if (mStatusControl.useWeather && (getWeatherModel() == nullptr || getWeatherModel()->status() != ISD::Weather::WEATHER_OK))
0102         return false;
0103 
0104     return true;
0105 }
0106 
0107 void ObservatoryModel::updateStatus()
0108 {
0109     emit newStatus(isReady());
0110 }
0111 
0112 void ObservatoryModel::makeReady()
0113 {
0114     // dome relevant for the status and dome is ready
0115     if (mStatusControl.useDome && (getDomeModel() == nullptr || getDomeModel()->status() != ISD::Dome::DOME_IDLE))
0116         getDomeModel()->unpark();
0117 
0118     // shutter relevant for the status and shutter open
0119     if (mStatusControl.useShutter && (getDomeModel() == nullptr ||
0120                                       (getDomeModel()->hasShutter() && getDomeModel()->shutterStatus() != ISD::Dome::SHUTTER_OPEN)))
0121         getDomeModel()->openShutter();
0122 
0123     // weather relevant for the status and weather is OK
0124     // Haha, weather we can't change
0125 }
0126 
0127 }