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.
tdeedu/kstars/kstars/telescopewizardprocess.cpp

384 lines
9.9 KiB

/* Telescope wizard
Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
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.
*/
#include <tqfile.h>
#include <tqpixmap.h>
#include <tqlabel.h>
#include <tqpushbutton.h>
#include <tqwidgetstack.h>
#include <tqstring.h>
#include <tqtimer.h>
#include <tqtable.h>
#include <tqtextedit.h>
#include <tqradiobutton.h>
#include <klistview.h>
#include <klineedit.h>
#include <kmessagebox.h>
#include <kprogress.h>
#include "telescopewizardprocess.h"
#include "Options.h"
#include "kstars.h"
#include "kstarsdata.h"
#include "timedialog.h"
#include "ksutils.h"
#include "libtdeedu/extdate/extdatetime.h"
#include "indimenu.h"
#include "indidriver.h"
#include "indielement.h"
#include "indiproperty.h"
#include "indistd.h"
#include "indidevice.h"
#define TIMEOUT_THRESHHOLD 20
telescopeWizardProcess::telescopeWizardProcess( TQWidget* parent, const char* name ) : telescopeWizard(parent, name)
{
currentPort = -1;
timeOutCount = 0;
indiDev = NULL;
progressScan = NULL;
linkRejected = false;
TQString locStr;
TQFile sideIMG;
if (KSUtils::openDataFile(sideIMG, "wizardside.png"))
wizardPix->setPixmap(TQPixmap(sideIMG.name()));
backB->hide();
currentPage = INTRO_P;
ksw = (KStars *) parent;
ksw->establishINDI();
indimenu = ksw->getINDIMenu();
indidriver = ksw->getINDIDriver();
INDIMessageBar = Options::indiMessages();
Options::setIndiMessages( false );
TQTime newTime( ksw->data()->lt().time() );
ExtDate newDate( ksw->data()->lt().date() );
timeOut->setText( TQString().sprintf("%02d:%02d:%02d", newTime.hour(), newTime.minute(), newTime.second()));
dateOut->setText( TQString().sprintf("%d-%02d-%02d", newDate.year(), newDate.month(), newDate.day()));
if (ksw->geo()->translatedProvince().isEmpty())
locationOut->setText( TQString("%1, %2").tqarg(ksw->geo()->translatedName()).tqarg(ksw->geo()->translatedCountry()));
else
locationOut->setText( TQString("%1, %2, %3").tqarg(ksw->geo()->translatedName())
.tqarg(ksw->geo()->translatedProvince())
.tqarg(ksw->geo()->translatedCountry()));
for (unsigned int i=0; i < indidriver->devices.size(); i++)
if (indidriver->devices[i]->deviceType == KSTARS_TELESCOPE)
telescopeCombo->insertItem(indidriver->devices[i]->label);
if ( !Options::indiTelescopePort().isEmpty())
portList << Options::indiTelescopePort();
portList << "/dev/ttyS0" << "/dev/ttyS1" << "/dev/ttyS2" << "/dev/ttyS3" << "/dev/ttyS4"
<< "/dev/ttyUSB0" << "/dev/ttyUSB1" << "/dev/ttyUSB2" << "/dev/ttyUSB3";// << "/dev/ttyUSB4";
connect(helpB, TQT_SIGNAL(clicked()), parent, TQT_SLOT(appHelpActivated()));
connect(nextB, TQT_SIGNAL(clicked()), this, TQT_SLOT(processNext()));
connect(backB, TQT_SIGNAL(clicked()), this, TQT_SLOT(processBack()));
connect(setTimeB, TQT_SIGNAL(clicked()), this, TQT_SLOT(newTime()));
connect(setLocationB, TQT_SIGNAL(clicked()), this, TQT_SLOT(newLocation()));
newDeviceTimer = new TQTimer(this);
TQObject::connect( newDeviceTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(processPort()) );
}
telescopeWizardProcess::~telescopeWizardProcess()
{
if (progressScan)
if (progressScan->wasCancelled())
indidriver->processDevicetqStatus(1);
Options::setIndiMessages( INDIMessageBar );
Reset();
}
void telescopeWizardProcess::processNext(void)
{
int linkResult=0;
switch (currentPage)
{
case INTRO_P:
currentPage++;
backB->show();
wizardContainer->raiseWidget(currentPage);
break;
case MODEL_P:
currentPage++;
wizardContainer->raiseWidget(currentPage);
break;
case TELESCOPE_P:
currentPage++;
wizardContainer->raiseWidget(currentPage);
break;
case LOCAL_P:
currentPage++;
wizardContainer->raiseWidget(currentPage);
break;
case PORT_P:
linkResult = establishLink();
if ( linkResult == 1)
{
progressScan = new KProgressDialog(this, "autoscan", i18n("Autoscan"), i18n("Please wait while KStars scan communication ports for attached telescopes.\nThis process might take few minutes to complete."), true);
progressScan->setAllowCancel(true);
progressScan->setAutoClose(true);
progressScan->setAutoReset(true);
progressScan->progressBar()->setTotalSteps(portList.count());
progressScan->progressBar()->setValue(0);
progressScan->show();
}
else if (linkResult == 2)
KMessageBox::queuedMessageBox(0, KMessageBox::Information, i18n("Please wait while KStars tries to connect to your telescope..."));
else if (linkResult == -1)
KMessageBox::error(0, i18n("Error. Unable to locate telescope drivers."));
break;
default:
break;
}
}
void telescopeWizardProcess::processBack(void)
{
// for now, just display the next page, and restart once we reached the end
switch (currentPage)
{
case INTRO_P:
// we shouldn't be here!
break;
break;
case MODEL_P:
currentPage--;
backB->hide();
wizardContainer->raiseWidget(currentPage);
break;
case TELESCOPE_P:
currentPage--;
wizardContainer->raiseWidget(currentPage);
break;
case LOCAL_P:
currentPage--;
wizardContainer->raiseWidget(currentPage);
break;
case PORT_P:
currentPage--;
wizardContainer->raiseWidget(currentPage);
break;
default:
break;
}
}
void telescopeWizardProcess::newTime()
{
TimeDialog timedialog (ksw->data()->lt(), ksw);
if ( timedialog.exec() == TQDialog::Accepted )
{
KStarsDateTime dt( timedialog.selectedDate(), timedialog.selectedTime() );
ksw->data()->changeDateTime( dt );
timeOut->setText( TQString().sprintf("%02d:%02d:%02d", dt.time().hour(), dt.time().minute(), dt.time().second()));
dateOut->setText( TQString().sprintf("%d-%02d-%02d", dt.date().year(), dt.date().month(), dt.date().day()));
}
}
void telescopeWizardProcess::newLocation()
{
ksw->slotGeoLocator();
locationOut->setText( TQString("%1, %2, %3").tqarg(ksw->geo()->translatedName())
.tqarg(ksw->geo()->translatedProvince())
.tqarg(ksw->geo()->translatedCountry()));
timeOut->setText( TQString().sprintf("%02d:%02d:%02d", ksw->data()->lt().time().hour(), ksw->data()->lt().time().minute(), ksw->data()->lt().time().second()));
dateOut->setText( TQString().sprintf("%d-%02d-%02d", ksw->data()->lt().date().year(),
ksw->data()->lt().date().month() ,ksw->data()->lt().date().day()));
}
int telescopeWizardProcess::establishLink()
{
if (!indidriver || !indimenu)
return (0);
TQListViewItem *driverItem = NULL;
driverItem = indidriver->localListView->findItem(telescopeCombo->currentText(), 0);
if (driverItem == NULL) return -1;
// If device is already running, we need to shut it down first
if (indidriver->isDeviceRunning(telescopeCombo->currentText()))
{
indidriver->localListView->setSelected(driverItem, true);
indidriver->processDevicetqStatus(1);
}
// Set custome label for device
indimenu->setCustomLabel(telescopeCombo->currentText());
currentDevice = indimenu->currentLabel;
// Select it
indidriver->localListView->setSelected(driverItem, true);
// Make sure we start is locally
indidriver->localR->setChecked(true);
// Run it
indidriver->processDevicetqStatus(0);
if (!indidriver->isDeviceRunning(telescopeCombo->currentText()))
return (3);
newDeviceTimer->start(1500);
if (portIn->text().isEmpty())
return (1);
else
return (2);
}
void telescopeWizardProcess::processPort()
{
INDI_P * pp;
INDI_E * lp;
if (!indidriver || !indimenu)
return;
timeOutCount++;
if (timeOutCount >= TIMEOUT_THRESHHOLD)
{
indidriver->processDevicetqStatus(1);
Reset();
KMessageBox::error(0, i18n("Error: connection timeout. Unable to communicate with an INDI server"));
close();
return;
}
indiDev = indimenu->findDeviceByLabel(currentDevice);
if (!indiDev) return;
// port empty, start autoscan
if (portIn->text().isEmpty())
{
newDeviceTimer->stop();
linkRejected = false;
connect(indiDev->stdDev, TQT_SIGNAL(linkRejected()), this, TQT_SLOT(scanPorts()));
connect(indiDev->stdDev, TQT_SIGNAL(linkAccepted()), this, TQT_SLOT(linkSuccess()));
scanPorts();
return;
}
pp = indiDev->findProp("DEVICE_PORT");
if (!pp) return;
lp = pp->findElement("PORT");
if (!lp) return;
lp->write_w->setText(portIn->text());
pp = indiDev->findProp("CONNECTION");
if (!pp) return;
newDeviceTimer->stop();
Options::setIndiMessages( INDIMessageBar );
pp->newSwitch(0);
timeOutCount = 0;
indimenu->show();
close();
}
void telescopeWizardProcess::scanPorts()
{
INDI_P * pp;
INDI_E *lp;
if (!indiDev || !indidriver || !indimenu || linkRejected)
return;
currentPort++;
progressScan->progressBar()->setValue(currentPort);
if ( (unsigned) currentPort >= portList.count())
{
KMessageBox::sorry(0, i18n("Sorry. KStars failed to detect any attached telescopes, please check your settings and try again."));
linkRejected = true;
indidriver->processDevicetqStatus(1);
Reset();
return;
}
if (indiDev->msgST_w)
indiDev->msgST_w->clear();
pp = indiDev->findProp("DEVICE_PORT");
if (!pp) return;
lp = pp->findElement("PORT");
lp->write_w->setText(portList[currentPort]);
pp->newText();
pp = indiDev->findProp("CONNECTION");
if (!pp) return;
pp->newSwitch(0);
}
void telescopeWizardProcess::linkSuccess()
{
Reset();
indimenu->show();
close();
}
void telescopeWizardProcess::Reset()
{
currentPort = -1;
timeOutCount = 0;
if (progressScan)
progressScan->close();
indiDev = NULL;
}
#include "telescopewizardprocess.moc"