kstars
indimenu.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "indimenu.h"
00022 #include "indiproperty.h"
00023 #include "indigroup.h"
00024 #include "indidevice.h"
00025 #include "devicemanager.h"
00026
00027 #include <stdlib.h>
00028
00029 #include <QLineEdit>
00030 #include <QTextEdit>
00031 #include <QFrame>
00032 #include <QCheckBox>
00033 #include <QLabel>
00034 #include <QPushButton>
00035 #include <QLayout>
00036 #include <QSocketNotifier>
00037 #include <QDateTime>
00038 #include <QTimer>
00039
00040 #include <kled.h>
00041 #include <klineedit.h>
00042 #include <kpushbutton.h>
00043 #include <klocale.h>
00044 #include <kmessagebox.h>
00045 #include <kdebug.h>
00046 #include <kcombobox.h>
00047 #include <knuminput.h>
00048 #include <kdialog.h>
00049 #include <ktabwidget.h>
00050
00051 #include "kstars.h"
00052 #include "indidriver.h"
00053
00054
00055
00056
00057
00058 INDIMenu::INDIMenu(QWidget *parent) : QWidget(parent, Qt::Window)
00059
00060 {
00061
00062 ksw = (KStars *) parent;
00063
00064
00065
00066 mainLayout = new QVBoxLayout(this);
00067 mainLayout->setMargin(10);
00068 mainLayout->setSpacing(10);
00069
00070 mainTabWidget = new KTabWidget(this);
00071
00072 mainLayout->addWidget(mainTabWidget);
00073
00074
00075
00076 setWindowTitle(i18n("INDI Control Panel"));
00077 setAttribute(Qt::WA_ShowModal, false);
00078
00079
00080 resize( 640, 480);
00081 }
00082
00083 INDIMenu::~INDIMenu()
00084 {
00085 while ( ! managers.isEmpty() ) delete managers.takeFirst();
00086 }
00087
00088
00089
00090
00091
00092 void INDIMenu::updateStatus()
00093 {
00094 if (managers.size() == 0)
00095 {
00096 KMessageBox::error(0, i18n("No INDI devices currently running. To run devices, please select devices from the Device Manager in the devices menu."));
00097 return;
00098 }
00099
00100 show();
00101 }
00102
00103 DeviceManager* INDIMenu::initDeviceManager(QString inHost, uint inPort, DeviceManager::ManagerMode inMode)
00104 {
00105 DeviceManager *deviceManager;
00106
00107 deviceManager = new DeviceManager(this, inHost, inPort, inMode);
00108 managers.append(deviceManager);
00109
00110 connect(deviceManager, SIGNAL(newDevice(INDI_D *)), ksw->indiDriver(), SLOT(enableDevice(INDI_D *)));
00111 connect(deviceManager, SIGNAL(deviceManagerError(DeviceManager *)), this, SLOT(removeDeviceManager(DeviceManager*)));
00112
00113 return deviceManager;
00114 }
00115
00116 void INDIMenu::stopDeviceManager(QList<IDevice *> &processed_devices)
00117 {
00118
00119 foreach(IDevice *device, processed_devices)
00120 {
00121 if (device->deviceManager != NULL)
00122 removeDeviceManager(device->deviceManager);
00123 }
00124 }
00125
00126
00127 #if 0
00128 void INDIMenu::processServer(IDevice *device)
00129 {
00130
00131 DeviceManager *deviceManager;
00132
00133
00134 if (device->state && device->managed == false && device->mode == DeviceManager::M_LOCAL)
00135 {
00136 deviceManager = new DeviceManager(this);
00137 connect(deviceManager, SIGNAL(newDevice(INDI_D *)), device, SLOT(startDeivceManager(DeviceManager *)));
00138 connect(deviceManager, SIGNAL(deviceManagerError(DeviceManager *)), this, SLOT(removeDeviceManager(DeivceManager*)));
00139 connect(deviceManager, SIGNAL(newDevice(DeviceManager *)), this, SLOT(discoverDevice()));
00140
00141 dev->indiConnect("localhost", QString::number(device->indiPort));
00142 }
00143
00144 else if (!device->state && device->managed == true && device->mode == DeviceManager::M_LOCAL)
00145 {
00146 device->managed = false;
00147 removeDeviceManager(device->DeviceManager);
00148 return true;
00149
00150 }
00151 }
00152
00153 int INDIMenu::processClient(const QString &hostname, const QString &portnumber)
00154 {
00155
00156 DeviceManager *dev;
00157 INDIDriver *drivers = ksw->indiDriver();
00158
00159 dev = new DeviceManager(this, managersCounter);
00160 if (dev->indiConnect(hostname, portnumber))
00161 {
00162 managers.append(dev);
00163 if (drivers)
00164 {
00165 connect(dev, SIGNAL(newDevice(DeviceManager *)), drivers, SLOT(updateMenuActions()));
00166 connect(dev, SIGNAL(newDevice(DeviceManager *)), this, SLOT(discoverDevice(DeviceManager *)));
00167 }
00168 }
00169 else
00170 {
00171 delete (dev);
00172 return (-1);
00173 }
00174
00175 managersCounter++;
00176 return (managersCounter - 1);
00177 }
00178
00179 void INDIMenu::removeDeviceMgr(int managersID)
00180 {
00181
00182 for (int i=0; i < managers.size(); i++)
00183 {
00184 if (managersID == managers.at(i)->managersID)
00185 {
00186 delete managers.takeAt(i);
00187 emit driverDisconnected(managersID);
00188 }
00189 }
00190
00191
00192
00193
00194
00195 }
00196
00197 #endif
00198
00199 void INDIMenu::removeDeviceManager(DeviceManager *deviceManager)
00200 {
00201 if (deviceManager == NULL)
00202 {
00203 kWarning() << "Warning: trying to remove a null device manager detected.";
00204 return;
00205 }
00206
00207 for (int i=0; i < managers.size(); i++)
00208 {
00209 if (deviceManager == managers.at(i))
00210 {
00211 foreach(INDI_D *device, deviceManager->indi_dev)
00212 ksw->indiDriver()->disableDevice(device);
00213
00214 delete managers.takeAt(i);
00215 }
00216 }
00217
00218 ksw->indiDriver()->updateMenuActions();
00219 }
00220
00221 INDI_D * INDIMenu::findDevice(const QString &deviceName)
00222 {
00223 for (int i=0; i < managers.size(); i++)
00224 for (int j=0; j < managers[i]->indi_dev.size(); j++)
00225 if (managers[i]->indi_dev[j]->name == deviceName)
00226 return managers[i]->indi_dev[j];
00227
00228 return NULL;
00229 }
00230
00231 INDI_D * INDIMenu::findDeviceByLabel(const QString &label)
00232 {
00233 for (int i=0; i < managers.size(); i++)
00234 for (int j=0; j < managers[i]->indi_dev.size(); j++)
00235 if (managers[i]->indi_dev[j]->label == label)
00236 return managers[i]->indi_dev[j];
00237
00238 return NULL;
00239 }
00240
00241
00242 QString INDIMenu::getUniqueDeviceLabel(const QString &deviceName)
00243 {
00244 int nset=0;
00245
00246 for (int i=0; i < managers.size(); i++)
00247 {
00248 for (int j=0; j < managers[i]->indi_dev.size(); j++)
00249 if (managers[i]->indi_dev[j]->label.indexOf(deviceName) >= 0)
00250 nset++;
00251 }
00252
00253 if (nset)
00254 return (deviceName + QString(" %1").arg(nset+1));
00255 else
00256 return (deviceName);
00257
00258 }
00259
00260 #include "indimenu.moc"