You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
5.9 KiB
248 lines
5.9 KiB
/* 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/TQt
|
|
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 <tqlineedit.h>
|
|
#include <tqtextedit.h>
|
|
#include <tqframe.h>
|
|
#include <tqtabwidget.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqlayout.h>
|
|
#include <tqsocketnotifier.h>
|
|
#include <tqdatetime.h>
|
|
#include <tqvbox.h>
|
|
#include <tqtimer.h>
|
|
|
|
#include <kled.h>
|
|
#include <klineedit.h>
|
|
#include <tdelistbox.h>
|
|
#include <kpushbutton.h>
|
|
#include <tdeapplication.h>
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
#include <tdelistview.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(TQWidget *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", TQString("%1").arg(drivers->devices[i]->indiPort)))
|
|
{
|
|
drivers->devices[i]->mgrID = mgrCounter;
|
|
drivers->devices[i]->managed = true;
|
|
mgr.append(dev);
|
|
connect(dev, TQ_SIGNAL(newDevice()), drivers, TQ_SLOT(updateMenuActions()));
|
|
connect(dev, TQ_SIGNAL(newDevice()), this, TQ_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(TQString hostname, TQString portnumber)
|
|
{
|
|
|
|
DeviceManager *dev;
|
|
INDIDriver *drivers = ksw->getINDIDriver();
|
|
|
|
dev = new DeviceManager(this, mgrCounter);
|
|
if (dev->indiConnect(hostname, portnumber))
|
|
{
|
|
mgr.append(dev);
|
|
if (drivers)
|
|
{
|
|
connect(dev, TQ_SIGNAL(newDevice()), drivers, TQ_SLOT(updateMenuActions()));
|
|
connect(dev, TQ_SIGNAL(newDevice()), this, TQ_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(TQString 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(TQString 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(TQString 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 + TQString(" %1").arg(nset+1);
|
|
else
|
|
currentLabel = deviceName;
|
|
|
|
}
|
|
|
|
void INDIMenu::discoverDevice()
|
|
{
|
|
TQTimer::singleShot( 1000, this, TQ_SLOT(announceDevice()) );
|
|
}
|
|
|
|
void INDIMenu::announceDevice()
|
|
{
|
|
newDevice();
|
|
}
|
|
|
|
|
|
|
|
#include "indimenu.moc"
|