/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #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").arg(ksw->geo()->translatedName()).arg(ksw->geo()->translatedCountry())); else locationOut->setText( TQString("%1, %2, %3").arg(ksw->geo()->translatedName()) .arg(ksw->geo()->translatedProvince()) .arg(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->processDeviceStatus(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").arg(ksw->geo()->translatedName()) .arg(ksw->geo()->translatedProvince()) .arg(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->processDeviceStatus(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->processDeviceStatus(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->processDeviceStatus(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->processDeviceStatus(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"