summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/indimenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/indimenu.cpp')
-rw-r--r--kstars/kstars/indimenu.cpp247
1 files changed, 247 insertions, 0 deletions
diff --git a/kstars/kstars/indimenu.cpp b/kstars/kstars/indimenu.cpp
new file mode 100644
index 00000000..9ecd6e61
--- /dev/null
+++ b/kstars/kstars/indimenu.cpp
@@ -0,0 +1,247 @@
+/* INDI frontend for KStars
+ Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
+ Elwood C. Downey
+
+ This application is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ JM Changelog:
+ 2003-04-28 Used indimenu.c as a template. C --> C++, Xm --> KDE/Qt
+ 2003-05-01 Added tab for devices and a group feature
+ 2003-05-02 Added scrolling area. Most things are rewritten
+ 2003-05-05 Adding INDI Conf
+ 2003-05-06 Drivers XML reader
+ 2003-05-07 Device manager integration
+ 2003-05-21 Full client support
+
+ */
+
+#include "indimenu.h"
+#include "indiproperty.h"
+#include "indigroup.h"
+#include "indidevice.h"
+#include "devicemanager.h"
+
+#include <stdlib.h>
+
+#include <qlineedit.h>
+#include <qtextedit.h>
+#include <qframe.h>
+#include <qtabwidget.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qsocketnotifier.h>
+#include <qdatetime.h>
+#include <qvbox.h>
+#include <qtimer.h>
+
+#include <kled.h>
+#include <klineedit.h>
+#include <klistbox.h>
+#include <kpushbutton.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+#include <kdebug.h>
+#include <kcombobox.h>
+#include <knuminput.h>
+#include <kdialogbase.h>
+
+#include "kstars.h"
+#include "indidriver.h"
+
+/*******************************************************************
+** INDI Menu: Handles communication to server and fetching basic XML
+** data.
+*******************************************************************/
+INDIMenu::INDIMenu(QWidget *parent, const char *name ) : KDialogBase(KDialogBase::Tabbed, i18n("INDI Control Panel"), 0, KDialogBase::Default, parent, name, false)
+{
+
+ ksw = (KStars *) parent;
+
+ mgrCounter = 0;
+
+ mgr.setAutoDelete(true);
+
+ currentLabel = "";
+
+ resize( 640, 480);
+}
+
+INDIMenu::~INDIMenu()
+{
+ mgr.clear();
+}
+
+/*********************************************************************
+** Traverse the drivers list, check for updated drivers and take
+** appropriate action
+*********************************************************************/
+void INDIMenu::updateStatus()
+{
+ INDIDriver *drivers = ksw->getINDIDriver();
+
+ // Local/Server
+ processServer();
+
+ if (drivers)
+ {
+ if (drivers->activeDriverCount() == 0)
+ {
+ KMessageBox::error(0, i18n("No INDI devices currently running. To run devices, please select devices from the Device Manager in the devices menu."));
+ return;
+ }
+ }
+ else if (mgr.count() == 0)
+ {
+ KMessageBox::error(0, i18n("No INDI devices currently running. To run devices, please select devices from the Device Manager in the devices menu."));
+ return;
+ }
+
+ show();
+
+}
+
+bool INDIMenu::processServer()
+{
+
+INDIDriver *drivers = ksw->getINDIDriver();
+DeviceManager *dev;
+
+ if (drivers == NULL)
+ return false;
+
+ for (unsigned int i=0; i < drivers->devices.size(); i++)
+ {
+ // Devices ready to run but not yet managed
+ if (drivers->devices[i]->state && drivers->devices[i]->managed == false && drivers->devices[i]->mode == IDevice::M_LOCAL)
+ {
+ dev = new DeviceManager(this, mgrCounter);
+ if (dev->indiConnect("localhost", QString("%1").arg(drivers->devices[i]->indiPort)))
+ {
+ drivers->devices[i]->mgrID = mgrCounter;
+ drivers->devices[i]->managed = true;
+ mgr.append(dev);
+ connect(dev, SIGNAL(newDevice()), drivers, SLOT(updateMenuActions()));
+ connect(dev, SIGNAL(newDevice()), this, SLOT(discoverDevice()));
+
+ mgrCounter++;
+
+ }
+ else
+ {
+ delete (dev);
+ return false;
+ }
+ }
+ // Devices running and they need to be shutdown
+ else if (!drivers->devices[i]->state && drivers->devices[i]->managed == true && drivers->devices[i]->mode == IDevice::M_LOCAL)
+ {
+ drivers->devices[i]->managed = false;
+ removeDeviceMgr(drivers->devices[i]->mgrID);
+ return true;
+
+ }
+ }
+
+ return true;
+
+ }
+
+int INDIMenu::processClient(QString hostname, QString portnumber)
+{
+
+ DeviceManager *dev;
+ INDIDriver *drivers = ksw->getINDIDriver();
+
+ dev = new DeviceManager(this, mgrCounter);
+ if (dev->indiConnect(hostname, portnumber))
+ {
+ mgr.append(dev);
+ if (drivers)
+ {
+ connect(dev, SIGNAL(newDevice()), drivers, SLOT(updateMenuActions()));
+ connect(dev, SIGNAL(newDevice()), this, SLOT(discoverDevice()));
+ }
+ }
+ else
+ {
+ delete (dev);
+ return (-1);
+ }
+
+ mgrCounter++;
+ return (mgrCounter - 1);
+}
+
+void INDIMenu::removeDeviceMgr(int mgrID)
+{
+
+ for (unsigned int i=0; i < mgr.count(); i++)
+ {
+ if (mgrID == mgr.at(i)->mgrID)
+ mgr.remove(i);
+
+ emit driverDisconnected(mgrID);
+ }
+}
+
+INDI_D * INDIMenu::findDevice(QString deviceName)
+{
+ for (unsigned int i=0; i < mgr.count(); i++)
+ {
+ for (unsigned int j=0; j < mgr.at(i)->indi_dev.count(); j++)
+ if (mgr.at(i)->indi_dev.at(j)->name == deviceName)
+ return mgr.at(i)->indi_dev.at(j);
+ }
+ return NULL;
+}
+
+INDI_D * INDIMenu::findDeviceByLabel(QString label)
+{
+ for (unsigned int i=0; i < mgr.count(); i++)
+ {
+ for (unsigned int j=0; j < mgr.at(i)->indi_dev.count(); j++)
+ if (mgr.at(i)->indi_dev.at(j)->label == label)
+ return mgr.at(i)->indi_dev.at(j);
+ }
+
+ return NULL;
+}
+
+
+void INDIMenu::setCustomLabel(QString deviceName)
+{
+
+ int nset=0;
+
+for (unsigned int i=0; i < mgr.count(); i++)
+ for (unsigned int j=0; j < mgr.at(i)->indi_dev.count(); j++)
+ if (mgr.at(i)->indi_dev.at(j)->label.find(deviceName) >= 0)
+ nset++;
+
+if (nset)
+ currentLabel = deviceName + QString(" %1").arg(nset+1);
+else
+ currentLabel = deviceName;
+
+}
+
+void INDIMenu::discoverDevice()
+{
+ QTimer::singleShot( 1000, this, SLOT(announceDevice()) );
+}
+
+void INDIMenu::announceDevice()
+{
+ newDevice();
+}
+
+
+
+#include "indimenu.moc"