void Mount::updateNumber(INumberVectorProperty *nvp) { if (!strcmp(nvp->name, "TELESCOPE_INFO")) { if (nvp->s == IPS_ALERT) { QString newMessage; if (primaryScopeApertureIN->value() == 1 || primaryScopeFocalIN->value() == 1) newMessage = i18n("Error syncing telescope info. Please fill telescope aperture and focal length."); else newMessage = i18n("Error syncing telescope info. Check INDI control panel for more details."); if (newMessage != lastNotificationMessage) { appendLogText(newMessage); lastNotificationMessage = newMessage; } } else { syncTelescopeInfo(); QString newMessage = i18n("Telescope info updated successfully."); if (newMessage != lastNotificationMessage) { appendLogText(newMessage); lastNotificationMessage = newMessage; } } } }
void Focus::capture() { if (currentCCD == NULL) return; ISD::CCDChip *targetChip = currentCCD->getChip(ISD::CCDChip::PRIMARY_CCD); double seqExpose = exposureIN->value(); CCDFrameType ccdFrame = FRAME_LIGHT; if (currentCCD->isConnected() == false) { appendLogText(i18n("Error: Lost connection to CCD.")); return; } targetChip->setCaptureMode(FITS_FOCUS); targetChip->setCaptureFilter( (FITSScale) filterCombo->currentIndex()); connect(currentCCD, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*))); targetChip->setFrameType(ccdFrame); targetChip->capture(seqExpose); if (inFocusLoop == false) appendLogText(i18n("Capturing image...")); }
void Focus::FocusOut(int ms) { if (currentFocuser == NULL) return; if (currentFocuser->isConnected() == false) { appendLogText(i18n("Error: Lost connection to Focuser.")); return; } lastFocusDirection = FOCUS_OUT; if (ms == -1) ms = stepIN->value(); currentFocuser->focusOut(); if (canAbsMove) { currentFocuser->absMoveFocuser(pulseStep-ms); //qDebug() << "Focusing out to position " << pulseStep-ms << endl; } else currentFocuser->moveFocuser(ms); appendLogText(i18n("Focusing outward...")); }
void EkosManager::removeDevice(ISD::GDInterface* devInterface) { switch (devInterface->getType()) { case KSTARS_CCD: removeTabs(); break; case KSTARS_FOCUSER: break; default: break; } appendLogText(i18n("%1 is offline.", devInterface->getDeviceName())); foreach(DriverInfo *drvInfo, managedDevices) { if (drvInfo == devInterface->getDriverInfo()) { managedDevices.removeOne(drvInfo); if (managedDevices.count() == 0) cleanDevices(); break; } } }
void EkosManager::cleanDevices() { INDIListener::Instance()->disconnect(this); if (localMode) DriverManager::Instance()->stopDevices(managedDevices); else if (remote_indi) { DriverManager::Instance()->disconnectRemoteHost(remote_indi); delete (remote_indi); remote_indi = 0; } nDevices = 0; managedDevices.clear(); reset(); processINDIB->setText(i18n("Start INDI")); processINDIB->setEnabled(true); connectB->setEnabled(false); disconnectB->setEnabled(false); controlPanelB->setEnabled(false); appendLogText(i18n("INDI services stopped.")); }
bool Guide::capture() { if (currentCCD == NULL) return false; double seqExpose = exposureSpin->value(); ISD::CCDChip *targetChip = currentCCD->getChip(useGuideHead ? ISD::CCDChip::GUIDE_CCD : ISD::CCDChip::PRIMARY_CCD); CCDFrameType ccdFrame = FRAME_LIGHT; if (currentCCD->isConnected() == false) { appendLogText(i18n("Error: Lost connection to CCD.")); return false; } connect(currentCCD, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*))); targetChip->setCaptureMode(FITS_GUIDE); targetChip->setCaptureFilter( (FITSScale) filterCombo->currentIndex()); targetChip->setFrameType(ccdFrame); targetChip->capture(seqExpose); return true; }
void Focus::startFocus() { lastFocusDirection = FOCUS_NONE; HFR = 0; if (canAbsMove) { absIterations = 0; getAbsFocusPosition(); //pulseDuration = (absMotionMax - absMotionMin) * 0.05; pulseDuration = stepIN->value(); } else /* Start 1000 ms */ pulseDuration=1000; capture(); inAutoFocus = true; resetButtons(); reverseDir = false; qDeleteAll(HFRPoints); HFRPoints.clear(); Options::setFocusTicks(stepIN->value()); Options::setFocusTolerance(toleranceIN->value()); Options::setFocusExposure(exposureIN->value()); appendLogText(i18n("Autofocus in progress...")); }
void EkosManager::setCCD(ISD::GDInterface *ccdDevice) { initCapture(); captureProcess->addCCD(ccdDevice); initFocus(); focusProcess->addCCD(ccdDevice); // If we have a guider and it's the same as the CCD driver, then let's establish it separately. //if (useGuiderFromCCD == false && guider_di && (!strcmp(guider_di->getBaseDevice()->getDeviceName(), ccdDevice->getDeviceName()))) if (useGuiderFromCCD == false && guiderName == QString(ccdDevice->getDeviceName())) { guider = ccdDevice; appendLogText(i18n("%1 is online.", ccdDevice->getDeviceName())); initGuide(); guideProcess->setCCD(guider); if (scope && scope->isConnected()) guideProcess->setTelescope(scope); } else { ccd = ccdDevice; if (ccdStarted == false) appendLogText(i18n("%1 is online.", ccdDevice->getDeviceName())); ccdStarted = true; // If guider is the same driver as the CCD if (useGuiderFromCCD == true) { guider = ccd; initGuide(); guideProcess->setCCD(guider); if (scope && scope->isConnected()) guideProcess->setTelescope(scope); } } }
void EkosManager::setST4(ISD::ST4 * st4Driver) { appendLogText(i18n("Guider port from %1 is ready.", st4Driver->getDeviceName())); useST4=true; initGuide(); guideProcess->addST4(st4Driver); }
void Focus::processFocusProperties(INumberVectorProperty *nvp) { if (!strcmp(nvp->name, "ABS_FOCUS_POSITION")) { INumber *pos = IUFindNumber(nvp, "FOCUS_ABSOLUTE_POSITION"); if (pos) pulseStep = pos->value; if (canAbsMove && inAutoFocus) { if (nvp->s == IPS_OK) capture(); else if (nvp->s == IPS_ALERT) { appendLogText(i18n("Focuser error, check INDI panel.")); stopFocus(); } } return; } if (!strcmp(nvp->name, "FOCUS_TIMER")) { if (canAbsMove == false && inAutoFocus) { if (nvp->s == IPS_OK) capture(); else if (nvp->s == IPS_ALERT) { appendLogText(i18n("Focuser error, check INDI panel.")); stopFocus(); } } return; } }
void EkosManager::setTelescope(ISD::GDInterface *scopeDevice) { scope = scopeDevice; appendLogText(i18n("%1 is online.", scope->getDeviceName())); connect(scopeDevice, SIGNAL(numberUpdated(INumberVectorProperty *)), this, SLOT(processNewNumber(INumberVectorProperty*))); if (guideProcess) guideProcess->setTelescope(scope); }
void EkosManager::setFocuser(ISD::GDInterface *focuserDevice) { focuser = focuserDevice; initFocus(); focusProcess->setFocuser(focuser); appendLogText(i18n("%1 is online.", focuser->getDeviceName())); }
void Focus::startLooping() { inFocusLoop = true; resetButtons(); appendLogText(i18n("Starting continuous exposure...")); capture(); }
Focus::Focus() { setupUi(this); currentFocuser = NULL; currentCCD = NULL; canAbsMove = false; inAutoFocus = false; inFocusLoop = false; HFRInc =0; reverseDir = false; pulseDuration = 1000; connect(startFocusB, SIGNAL(clicked()), this, SLOT(startFocus())); connect(stopFocusB, SIGNAL(clicked()), this, SLOT(stopFocus())); connect(focusOutB, SIGNAL(clicked()), this, SLOT(FocusOut())); connect(focusInB, SIGNAL(clicked()), this, SLOT(FocusIn())); connect(captureB, SIGNAL(clicked()), this, SLOT(capture())); connect(AutoModeR, SIGNAL(toggled(bool)), this, SLOT(toggleAutofocus(bool))); connect(startLoopB, SIGNAL(clicked()), this, SLOT(startLooping())); connect(CCDCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkCCD(int))); lastFocusDirection = FOCUS_NONE; focusType = FOCUS_MANUAL; HFRPlot->axis( KPlotWidget::LeftAxis )->setLabel( i18nc("Half Flux Radius", "HFR") ); HFRPlot->axis( KPlotWidget::BottomAxis )->setLabel( i18n("Absolute Position") ); resetButtons(); appendLogText(i18n("Idle.")); foreach(QString filter, FITSViewer::filterTypes) filterCombo->addItem(filter); exposureIN->setValue(Options::focusExposure()); toleranceIN->setValue(Options::focusTolerance()); stepIN->setValue(Options::focusTicks()); }
void Focus::newFITS(IBLOB *bp) { INDI_UNUSED(bp); QString HFRText; // Ignore guide head if there is any. if (!strcmp(bp->name, "CCD2")) return; ISD::CCDChip *targetChip = currentCCD->getChip(ISD::CCDChip::PRIMARY_CCD); FITSView *targetImage = targetChip->getImage(FITS_FOCUS); FITSImage *image_data = targetImage->getImageData(); currentCCD->disconnect(this); if (targetImage == NULL) { qDebug() << "Error: targetImage is NULL!" << endl; return; } image_data->findStars(); double currentHFR= image_data->getHFR(HFR_MAX); HFRText = QString("%1").arg(currentHFR, 0,'g', 3); if (inFocusLoop == false && focusType == FOCUS_MANUAL && HFR == -1) appendLogText(i18n("FITS received. No stars detected.")); HFROut->setText(HFRText); if (inFocusLoop) { capture(); return; } if (focusType == FOCUS_MANUAL || inAutoFocus==false) return; if (canAbsMove) autoFocusAbs(currentHFR); else autoFocusRel(currentHFR); }
void EkosManager::setFilter(ISD::GDInterface *filterDevice) { if (useFilterFromCCD == false) { filter = filterDevice; appendLogText(i18n("%1 is online.", filter->getDeviceName())); } else filter = ccd; initCapture(); connect(filter, SIGNAL(numberUpdated(INumberVectorProperty *)), this, SLOT(processNewNumber(INumberVectorProperty*))); captureProcess->addFilter(filter); }
void EkosManager::disconnectDevices() { if (scope) scope->Disconnect(); if (ccd) { ccdStarted =false; ccd->Disconnect(); if (captureProcess) captureProcess->setEnabled(false); } if (guider && guider != ccd) guider->Disconnect(); if (guider && guideProcess) guideProcess->setEnabled(false); if (filter && filter != ccd) filter->Disconnect(); if (focuser) { focuser->Disconnect(); if (focusProcess) { disconnect(focuser, SIGNAL(numberUpdated(INumberVectorProperty*)), focusProcess, SLOT(processFocusProperties(INumberVectorProperty*))); focusProcess->setEnabled(false); } } if (aux) aux->Disconnect(); appendLogText(i18n("Disconnecting INDI devices...")); }
void EkosManager::processRemoteDevice(ISD::GDInterface *devInterface) { if (!strcmp(devInterface->getDeviceName(), Options::remoteScopeName().toLatin1())) scope = devInterface; else if (!strcmp(devInterface->getDeviceName(), Options::remoteCCDName().toLatin1())) { ccd = devInterface; if (useGuiderFromCCD) guider = ccd; } else if (!strcmp(devInterface->getDeviceName(), Options::remoteGuiderName().toLatin1())) { guider = devInterface; guiderName = devInterface->getDeviceName(); } else if (!strcmp(devInterface->getDeviceName(), Options::remoteFocuserName().toLatin1())) focuser = devInterface; else if (!strcmp(devInterface->getDeviceName(), Options::remoteFilterName().toLatin1())) filter = devInterface; else if (!strcmp(devInterface->getDeviceName(), Options::remoteAuxName().toLatin1())) aux = devInterface; else return; nDevices--; connect(devInterface, SIGNAL(Connected()), this, SLOT(deviceConnected())); connect(devInterface, SIGNAL(Disconnected()), this, SLOT(deviceDisconnected())); connect(devInterface, SIGNAL(propertyDefined(INDI::Property*)), this, SLOT(processNewProperty(INDI::Property*))); if (nDevices == 0) { connectB->setEnabled(true); disconnectB->setEnabled(false); controlPanelB->setEnabled(true); appendLogText(i18n("Remote devices established. Please connect devices.")); } }
void EkosManager::connectDevices() { if (scope) scope->Connect(); if (ccd) { ccd->Connect(); if (captureProcess) captureProcess->setEnabled(true); } if (guider && guider != ccd) guider->Connect(); if (guider && guideProcess) guideProcess->setEnabled(true); if (filter && filter != ccd) filter->Connect(); if (focuser) { focuser->Connect(); if (focusProcess) focusProcess->setEnabled(true); } if (aux) aux->Connect(); connectB->setEnabled(false); disconnectB->setEnabled(true); appendLogText(i18n("Connecting INDI devices...")); }
void Mount::save() { INumberVectorProperty * nvp = currentTelescope->getBaseDevice()->getNumber("TELESCOPE_INFO"); if (nvp) { primaryScopeGroup->setTitle(currentTelescope->getDeviceName()); guideScopeGroup->setTitle(i18n("%1 guide scope", currentTelescope->getDeviceName())); INumber *np = NULL; np = IUFindNumber(nvp, "TELESCOPE_APERTURE"); if (np) np->value = primaryScopeApertureIN->value(); np = IUFindNumber(nvp, "TELESCOPE_FOCAL_LENGTH"); if (np) np->value = primaryScopeFocalIN->value(); np = IUFindNumber(nvp, "GUIDER_APERTURE"); if (np) np->value = guideScopeApertureIN->value() == 1 ? primaryScopeApertureIN->value() : guideScopeApertureIN->value(); np = IUFindNumber(nvp, "GUIDER_FOCAL_LENGTH"); if (np) np->value = guideScopeFocalIN->value() == 1 ? primaryScopeFocalIN->value() : guideScopeFocalIN->value(); ClientManager *clientManager = currentTelescope->getDriverInfo()->getClientManager(); clientManager->sendNewNumber(nvp); currentTelescope->setConfig(SAVE_CONFIG); //appendLogText(i18n("Saving telescope information...")); } else appendLogText(i18n("Failed to save telescope information.")); }
void Mount::updateTelescopeCoords() { double ra, dec; if (currentTelescope && currentTelescope->getEqCoords(&ra, &dec)) { telescopeCoord.setRA(ra); telescopeCoord.setDec(dec); telescopeCoord.EquatorialToHorizontal(KStarsData::Instance()->lst(), KStarsData::Instance()->geo()->lat()); raOUT->setText(telescopeCoord.ra().toHMSString()); decOUT->setText(telescopeCoord.dec().toDMSString()); azOUT->setText(telescopeCoord.az().toDMSString()); altOUT->setText(telescopeCoord.alt().toDMSString()); dms lst = KStarsData::Instance()->geo()->GSTtoLST( KStarsData::Instance()->clock()->utc().gst() ); dms ha( lst.Degrees() - telescopeCoord.ra().Degrees() ); QChar sgn('+'); if ( ha.Hours() > 12.0 ) { ha.setH( 24.0 - ha.Hours() ); sgn = '-'; } haOUT->setText( QString("%1%2").arg(sgn).arg( ha.toHMSString() ) ); lstOUT->setText(lst.toHMSString()); double currentAlt = telescopeCoord.altRefracted().Degrees(); if (minAltLimit->isEnabled() && ( currentAlt < minAltLimit->value() || currentAlt > maxAltLimit->value())) { if (currentAlt < minAltLimit->value()) { // Only stop if current altitude is less than last altitude indicate worse situation if (currentAlt < lastAlt && (abortDispatch == -1 || (currentTelescope->isInMotion()/* && ++abortDispatch > ABORT_DISPATCH_LIMIT*/))) { appendLogText(i18n("Telescope altitude is below minimum altitude limit of %1. Aborting motion...", QString::number(minAltLimit->value(), 'g', 3))); currentTelescope->Abort(); //KNotification::event( QLatin1String( "OperationFailed" )); KNotification::beep(); abortDispatch++; } } else { // Only stop if current altitude is higher than last altitude indicate worse situation if (currentAlt > lastAlt && (abortDispatch == -1 || (currentTelescope->isInMotion()/* && ++abortDispatch > ABORT_DISPATCH_LIMIT*/))) { appendLogText(i18n("Telescope altitude is above maximum altitude limit of %1. Aborting motion...", QString::number(maxAltLimit->value(), 'g', 3))); currentTelescope->Abort(); //KNotification::event( QLatin1String( "OperationFailed" )); KNotification::beep(); abortDispatch++; } } } else abortDispatch = -1; lastAlt = currentAlt; newCoords(raOUT->text(), decOUT->text(), azOUT->text(), altOUT->text()); newStatus(currentTelescope->getStatus()); if (currentTelescope->isConnected()) QTimer::singleShot(UPDATE_DELAY, this, SLOT(updateTelescopeCoords())); } }
void Focus::autoFocusAbs(double currentHFR) { static int initHFRPos=0, lastHFRPos=0, minHFRPos=0, initSlopePos=0, initPulseDuration=0, focusOutLimit=0, focusInLimit=0, minPos=1e6, maxPos=0; static double initHFR=0, minHFR=0, maxHFR=1,initSlopeHFR=0; double targetPulse=0, delta=0; QString deltaTxt = QString("%1").arg(fabs(currentHFR-minHFR)*100.0, 0,'g', 2); QString HFRText = QString("%1").arg(currentHFR, 0,'g', 3); //qDebug() << "Current HFR: " << currentHFR << " Current Position: " << pulseStep << endl; //qDebug() << "minHFR: " << minHFR << " MinHFR Pos: " << minHFRPos << endl; //qDebug() << "Delta: " << deltaTxt << endl; if (minHFR) appendLogText(i18n("FITS received. HFR %1 @ %2. Delta (%3%)", HFRText, pulseStep, deltaTxt)); else appendLogText(i18n("FITS received. HFR %1 @ %2.", HFRText, pulseStep)); if (++absIterations > MAXIMUM_ABS_ITERATIONS) { appendLogText(i18n("Autofocus failed to reach proper focus. Try increasing tolerance value.")); stopFocus(); return; } // No stars detected, try to capture again if (currentHFR == -1) { appendLogText(i18n("No stars detected, capturing again...")); capture(); return; } if (currentHFR > maxHFR || HFRPoints.empty()) { maxHFR = currentHFR; if (HFRPoints.empty()) { maxPos=1; minPos=1e6; } } if (pulseStep > maxPos) maxPos = pulseStep; if (pulseStep < minPos) minPos = pulseStep; HFRPoint *p = new HFRPoint(); p->HFR = currentHFR; p->pos = pulseStep; HFRPoints.append(p); HFRPlot->removeAllPlotObjects(); //HFRPlot->setLimits(pulseStep-pulseDuration*5, pulseStep+pulseDuration*5, currentHFR/1.5, currentHFR*1.5 ); HFRPlot->setLimits(minPos-pulseDuration, maxPos+pulseDuration, currentHFR/1.5, maxHFR ); KPlotObject *hfrObj = new KPlotObject( Qt::red, KPlotObject::Points, 2 ); foreach(HFRPoint *p, HFRPoints) hfrObj->addPoint(p->pos, p->HFR); HFRPlot->addPlotObject(hfrObj); HFRPlot->update(); switch (lastFocusDirection) { case FOCUS_NONE: HFR = currentHFR; initHFRPos = pulseStep; initHFR=HFR; minHFR=currentHFR; minHFRPos=pulseStep; HFRDec=0; HFRInc=0; focusOutLimit=0; focusInLimit=0; initPulseDuration=pulseDuration; FocusIn(pulseDuration); break; case FOCUS_IN: case FOCUS_OUT: if (reverseDir && focusInLimit && focusOutLimit && fabs(currentHFR - minHFR) < (toleranceIN->value()/100.0) && HFRInc == 0 ) { if (absIterations <= 2) appendLogText(i18n("Change in HFR is too small. Try increasing the step size or decreasing the tolerance.")); else appendLogText(i18n("Autofocus complete.")); stopFocus(); break; } else if (currentHFR < HFR) { double slope=0; // Let's try to calculate slope of the V curve. if (initSlopeHFR == 0 && HFRInc == 0 && HFRDec >= 1) { initSlopeHFR = HFR; initSlopePos = lastHFRPos; } // Let's now limit the travel distance of the focuser if (lastFocusDirection == FOCUS_OUT && lastHFRPos < focusInLimit) focusInLimit = lastHFRPos; else if (lastFocusDirection == FOCUS_IN && lastHFRPos > focusOutLimit) focusOutLimit = lastHFRPos; // If we have slope, get next target position if (initSlopeHFR) { slope = (currentHFR - initSlopeHFR) / (pulseStep - initSlopePos); targetPulse = pulseStep + (currentHFR*0.5 - currentHFR)/slope; } // Otherwise proceed iteratively else { if (lastFocusDirection == FOCUS_IN) targetPulse = pulseStep + pulseDuration; else targetPulse = pulseStep - pulseDuration; } HFR = currentHFR; // Let's keep track of the minimum HFR if (HFR < minHFR) { minHFR = HFR; minHFRPos = pulseStep; } lastHFRPos = pulseStep; // HFR is decreasing, we are on the right direction HFRDec++; HFRInc=0; } else { // HFR increased, let's deal with it. HFRInc++; HFRDec=0; reverseDir = true; // Reality Check: If it's first time, let's capture again and see if it changes. if (HFRInc <= 1) { capture(); return; } // Looks like we're going away from optimal HFR else { HFR = currentHFR; lastHFRPos = pulseStep; initSlopeHFR=0; HFRInc=0; // Let's set new limits if (lastFocusDirection == FOCUS_IN) focusInLimit = pulseStep; else focusOutLimit = pulseStep; // Decrease pulse pulseDuration = pulseDuration * 0.75; // Let's get close to the minimum HFR position so far detected if (lastFocusDirection == FOCUS_OUT) targetPulse = minHFRPos+pulseDuration/2; else targetPulse = minHFRPos-pulseDuration/2; } } // Limit target Pulse to algorithm limits if (focusInLimit != 0 && lastFocusDirection == FOCUS_IN && targetPulse > focusInLimit) targetPulse = focusInLimit; else if (focusOutLimit != 0 && lastFocusDirection == FOCUS_OUT && targetPulse < focusOutLimit) targetPulse = focusOutLimit; // Limit target pulse to focuser limits if (targetPulse < absMotionMin) targetPulse = absMotionMin; else if (targetPulse > absMotionMax) targetPulse = absMotionMax; // Ops, we can't go any further, we're done. if (targetPulse == pulseStep) { appendLogText(i18n("Autofocus complete.")); stopFocus(); return; } // Ops, deadlock if (focusOutLimit && focusOutLimit == focusInLimit) { appendLogText(i18n("Deadlock reached. Please try again with different settings.")); stopFocus(); return; } // Get delta for next move delta = (targetPulse - pulseStep); // Now cross your fingers and wait if (delta > 0) FocusIn(delta); else FocusOut(fabs(delta)); break; } }
void Capture::captureImage() { if (currentCCD == NULL) return; seqTimer->stop(); if (activeJob == NULL) return; targetChip = activeJob->activeChip; if (targetChip->setFrame(activeJob->x, activeJob->y, activeJob->w, activeJob->h) == false) { appendLogText(i18n("Failed to set sub frame.")); activeJob->status = SequenceJob::JOB_ERROR; if (activeJob->preview == false) activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]); stopSequence(); return; } if (useGuideHead == false && targetChip->setBinning(activeJob->binX, activeJob->binY) == false) { appendLogText(i18n("Failed to set binning.")); activeJob->status = SequenceJob::JOB_ERROR; if (activeJob->preview == false) activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]); stopSequence(); return; } if (useGuideHead == false && darkSubCheck->isChecked() && calibrationState == CALIBRATE_NONE) { calibrationState = CALIBRATE_START; targetChip->setFrameType(FRAME_DARK); targetChip->setCaptureMode(FITS_CALIBRATE); appendLogText(i18n("Capturing dark frame...")); } else { if (useGuideHead == false) targetChip->setFrameType(frameTypeCombo->itemText(activeJob->frameType)); targetChip->setCaptureMode(FITS_NORMAL); targetChip->setCaptureFilter( (FITSScale) filterCombo->currentIndex()); appendLogText(i18n("Capturing image...")); } // If filter is different that CCD, send the filter info if (currentFilter && currentFilter != currentCCD) currentCCD->setFilter(FilterPosCombo->itemText(activeJob->filterPos-1)); targetChip->capture(seqExpose); }
void Capture::newFITS(IBLOB *bp) { ISD::CCDChip *tChip = NULL; if (!strcmp(bp->name, "CCD2")) tChip = currentCCD->getChip(ISD::CCDChip::GUIDE_CCD); else tChip = currentCCD->getChip(ISD::CCDChip::PRIMARY_CCD); if (tChip != targetChip) return; if (targetChip->getCaptureMode() == FITS_FOCUS || targetChip->getCaptureMode() == FITS_GUIDE) return; // If the FITS is not for our device, simply ignore if (QString(bp->bvp->device) != currentCCD->getDeviceName() || (startB->isEnabled() && previewB->isEnabled())) return; if (calibrationState == CALIBRATE_START) { calibrationState = CALIBRATE_DONE; seqTimer->start(seqDelay); return; } if (darkSubCheck->isChecked() && calibrationState == CALIBRATE_DONE) { calibrationState = CALIBRATE_NONE; FITSView *calibrateImage = targetChip->getImage(FITS_CALIBRATE); FITSView *currentImage = targetChip->getImage(FITS_NORMAL); FITSImage *image_data = currentImage->getImageData(); if (calibrateImage && currentImage) image_data->subtract(calibrateImage->getImageData()->getImageBuffer()); } if (seqTotalCount < 0) { jobs.removeOne(activeJob); delete (activeJob); activeJob = NULL; stopSequence(); return; } seqCurrentCount++; imgProgress->setValue(seqCurrentCount); appendLogText(i18n("Received image %1 out of %2.", seqCurrentCount, seqTotalCount)); currentImgCountOUT->setText( QString::number(seqCurrentCount)); // if we're done if (seqCurrentCount == seqTotalCount) { stopSequence(); activeJob->status = SequenceJob::JOB_DONE; activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]); jobCount--; if (jobCount > 0) { jobIndex++; SequenceJob *job = jobs.at(jobIndex); executeJob(job); } } else seqTimer->start(seqDelay); }
void Focus::autoFocusRel(double currentHFR) { QString deltaTxt = QString("%1").arg(fabs(currentHFR-HFR)*100.0, 0,'g', 2); QString HFRText = QString("%1").arg(currentHFR, 0,'g', 3); appendLogText(i18n("FITS received. HFR %1. Delta (%2%)", HFRText, deltaTxt)); if (pulseDuration <= 32) { appendLogText(i18n("Autofocus failed to reach proper focus. Try adjusting the tolerance value.")); stopFocus(); return; } if (currentHFR == -1) { appendLogText(i18n("No stars detected, capturing again...")); capture(); return; } switch (lastFocusDirection) { case FOCUS_NONE: HFR = currentHFR; FocusIn(pulseDuration); break; case FOCUS_IN: if (fabs(currentHFR - HFR) < (toleranceIN->value()/100.0) && HFRInc == 0) { appendLogText(i18n("Autofocus complete.")); stopFocus(); break; } else if (currentHFR < HFR) { HFR = currentHFR; FocusIn(pulseDuration); HFRInc=0; } else { HFRInc++; if (HFRInc < 1) { capture(); return; } else { HFR = currentHFR; HFRInc=0; if (reverseDir) pulseDuration /= 2; if (canAbsMove) { if (reverseDir) FocusOut(pulseDuration*3); else { reverseDir = true; FocusOut(pulseDuration*2); } } else FocusOut(pulseDuration); } } break; case FOCUS_OUT: if (fabs(currentHFR - HFR) < (toleranceIN->value()/100.0) && HFRInc == 0) { appendLogText(i18n("Autofocus complete.")); stopFocus(); break; } else if (currentHFR < HFR) { HFR = currentHFR; FocusOut(pulseDuration); HFRInc=0; } else { HFRInc++; if (HFRInc < 1) capture(); else { HFR = currentHFR; HFRInc=0; if (reverseDir) pulseDuration /= 2; if (canAbsMove) { if (reverseDir) FocusIn(pulseDuration*3); else { reverseDir = true; FocusIn(pulseDuration*2); } } else FocusIn(pulseDuration); } } break; } }
Focus::Focus() { setupUi(this); currentFocuser = NULL; currentCCD = NULL; currentFilter = NULL; filterName = NULL; filterSlot = NULL; canAbsMove = false; inAutoFocus = false; inFocusLoop = false; captureInProgress = false; inSequenceFocus = false; starSelected = false; HFRInc =0; noStarCount=0; reverseDir = false; pulseDuration = 1000; fx=fy=fw=fh=0; lastLockFilterPos=-1; deltaHFR = 0; connect(startFocusB, SIGNAL(clicked()), this, SLOT(startFocus())); connect(stopFocusB, SIGNAL(clicked()), this, SLOT(checkStopFocus())); connect(focusOutB, SIGNAL(clicked()), this, SLOT(FocusOut())); connect(focusInB, SIGNAL(clicked()), this, SLOT(FocusIn())); connect(captureB, SIGNAL(clicked()), this, SLOT(capture())); connect(AutoModeR, SIGNAL(toggled(bool)), this, SLOT(toggleAutofocus(bool))); connect(startLoopB, SIGNAL(clicked()), this, SLOT(startLooping())); connect(kcfg_subFrame, SIGNAL(toggled(bool)), this, SLOT(subframeUpdated(bool))); connect(resetFrameB, SIGNAL(clicked()), this, SLOT(resetFocusFrame())); connect(CCDCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkCCD(int))); connect(focuserCombo, SIGNAL(activated(int)), this, SLOT(checkFocuser(int))); connect(FilterCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkFilter(int))); connect(FilterPosCombo, SIGNAL(activated(int)), this, SLOT(updateFilterPos(int))); connect(lockFilterCheck, SIGNAL(toggled(bool)), this, SLOT(filterLockToggled(bool))); connect(filterCombo, SIGNAL(activated(int)), this, SLOT(filterChangeWarning(int))); lastFocusDirection = FOCUS_NONE; focusType = FOCUS_MANUAL; HFRPlot->axis( KPlotWidget::LeftAxis )->setLabel( i18nc("Half Flux Radius", "HFR") ); HFRPlot->axis( KPlotWidget::BottomAxis )->setLabel( i18n("Absolute Position") ); resetButtons(); appendLogText(i18n("Idle.")); foreach(QString filter, FITSViewer::filterTypes) filterCombo->addItem(filter); exposureIN->setValue(Options::focusExposure()); toleranceIN->setValue(Options::focusTolerance()); stepIN->setValue(Options::focusTicks()); kcfg_autoSelectStar->setChecked(Options::autoSelectStar()); kcfg_focusBoxSize->setValue(Options::focusBoxSize()); kcfg_focusXBin->setValue(Options::focusXBin()); kcfg_focusYBin->setValue(Options::focusYBin()); maxTravel->setValue(Options::focusMaxTravel()); kcfg_subFrame->setChecked(Options::focusSubFrame()); suspendGuideCheck->setChecked(Options::suspendGuiding()); lockFilterCheck->setChecked(Options::lockFocusFilter()); }
void EkosManager::processINDI() { if (managedDevices.count() > 0 || remote_indi != NULL) { cleanDevices(); return; } managedDevices.clear(); reset(); if (localMode) { scope_di = driversList.value(telescopeCombo->currentText()); ccd_di = driversList.value(ccdCombo->currentText()); guider_di = driversList.value(guiderCombo->currentText()); filter_di = driversList.value(filterCombo->currentText()); focuser_di = driversList.value(focuserCombo->currentText()); aux_di = driversList.value(auxCombo->currentText()); if (guider_di) { if (guider_di == ccd_di) { useGuiderFromCCD = true; guider_di = NULL; } } if (filter_di) { if (filter_di == ccd_di) { useFilterFromCCD = true; filter_di = NULL; } } if (scope_di != NULL) managedDevices.append(scope_di); if (ccd_di != NULL) managedDevices.append(ccd_di); if (guider_di != NULL) managedDevices.append(guider_di); if (filter_di != NULL) managedDevices.append(filter_di); if (focuser_di != NULL) managedDevices.append(focuser_di); if (aux_di != NULL) managedDevices.append(aux_di); if (managedDevices.empty()) return; if (ccd_di == NULL && guider_di == NULL) { KMessageBox::error(this, i18n("Ekos requires at least one CCD or Guider to operate.")); managedDevices.clear(); return; } nDevices = managedDevices.count(); saveDefaultDrivers(); } else { delete (remote_indi); remote_indi = new DriverInfo(QString("Ekos Remote Host")); remote_indi->setHostParameters(Options::remoteHost(), Options::remotePort()); remote_indi->setDriverSource(HOST_SOURCE); if (telescopeCombo->currentText() != "--") nDevices++; if (ccdCombo->currentText() != "--") nDevices++; if (guiderCombo->currentText() != "--") { if (guiderCombo->currentText() != ccdCombo->currentText()) nDevices++; else useGuiderFromCCD = true; } if (focuserCombo->currentText() != "--") nDevices++; if (filterCombo->currentText() != "--") { if (filterCombo->currentText() != ccdCombo->currentText()) nDevices++; else useFilterFromCCD = true; } if (auxCombo->currentText() != "--") nDevices++; } connect(INDIListener::Instance(), SIGNAL(newDevice(ISD::GDInterface*)), this, SLOT(processNewDevice(ISD::GDInterface*))); connect(INDIListener::Instance(), SIGNAL(newTelescope(ISD::GDInterface*)), this, SLOT(setTelescope(ISD::GDInterface*))); connect(INDIListener::Instance(), SIGNAL(newCCD(ISD::GDInterface*)), this, SLOT(setCCD(ISD::GDInterface*))); connect(INDIListener::Instance(), SIGNAL(newFilter(ISD::GDInterface*)), this, SLOT(setFilter(ISD::GDInterface*))); connect(INDIListener::Instance(), SIGNAL(newFocuser(ISD::GDInterface*)), this, SLOT(setFocuser(ISD::GDInterface*))); connect(INDIListener::Instance(), SIGNAL(newST4(ISD::ST4*)), this, SLOT(setST4(ISD::ST4*))); connect(INDIListener::Instance(), SIGNAL(deviceRemoved(ISD::GDInterface*)), this, SLOT(removeDevice(ISD::GDInterface*))); if (localMode) { if (DriverManager::Instance()->startDevices(managedDevices) == false) { INDIListener::Instance()->disconnect(this); return; } appendLogText(i18n("INDI services started. Please connect devices.")); } else { if (DriverManager::Instance()->connectRemoteHost(remote_indi) == false) { INDIListener::Instance()->disconnect(this); delete (remote_indi); remote_indi=0; return; } appendLogText(i18n("INDI services started. Connection to %1 at %2 is successful.", Options::remoteHost(), Options::remotePort())); QTimer::singleShot(MAX_REMOTE_INDI_TIMEOUT, this, SLOT(checkINDITimeout())); } connectB->setEnabled(false); disconnectB->setEnabled(false); controlPanelB->setEnabled(false); processINDIB->setText(i18n("Stop INDI")); }