File indexing completed on 2024-05-05 15:55:31
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 }