10 #include <config-kstars.h>
14 #include <KMessageBox>
16 #include <KTemporaryFile>
18 #include <basedevice.h>
40 clientManager = cManager;
48 normalImage = focusImage = guideImage = calibrationImage = NULL;
68 return calibrationImage;
97 calibrationImage = image;
109 INumberVectorProperty *frameProp = NULL;
114 frameProp = baseDevice->getNumber(
"CCD_FRAME");
118 frameProp = baseDevice->getNumber(
"GUIDER_FRAME");
123 if (frameProp == NULL)
126 INumber *arg = IUFindNumber(frameProp,
"X");
133 arg = IUFindNumber(frameProp,
"Y");
140 arg = IUFindNumber(frameProp,
"WIDTH");
146 arg = IUFindNumber(frameProp,
"HEIGHT");
158 INumberVectorProperty *frameProp = NULL;
163 frameProp = baseDevice->getNumber(
"CCD_FRAME");
167 frameProp = baseDevice->getNumber(
"GUIDER_FRAME");
172 if (frameProp == NULL)
175 INumber *xarg = IUFindNumber(frameProp,
"X");
176 INumber *yarg = IUFindNumber(frameProp,
"Y");
177 INumber *warg = IUFindNumber(frameProp,
"WIDTH");
178 INumber *harg = IUFindNumber(frameProp,
"HEIGHT");
180 if (xarg && yarg && warg && harg)
182 if (xarg->value == x && yarg->value == y && warg->value == w && harg->value == h)
190 clientManager->sendNewNumber(frameProp);
200 INumberVectorProperty *expProp = NULL;
205 expProp = baseDevice->getNumber(
"CCD_EXPOSURE");
209 expProp = baseDevice->getNumber(
"GUIDER_EXPOSURE");
217 expProp->np[0].value = exposure;
219 clientManager->sendNewNumber(expProp);
226 ISwitchVectorProperty *abortProp = NULL;
231 abortProp = baseDevice->getSwitch(
"CCD_ABORT_EXPOSURE");
235 abortProp = baseDevice->getSwitch(
"GUIDER_ABORT_EXPOSURE");
240 if (abortProp == NULL)
243 ISwitch *abort = IUFindSwitch(abortProp,
"ABORT");
250 clientManager->sendNewSwitch(abortProp);
257 INumberVectorProperty *expProp = NULL;
262 expProp = baseDevice->getNumber(
"CCD_EXPOSURE");
266 expProp = baseDevice->getNumber(
"GUIDER_EXPOSURE");
274 return (expProp->s == IPS_BUSY);
281 if (name ==
"FRAME_LIGHT" || name ==
"Light")
283 else if (name ==
"FRAME_DARK" || name ==
"Dark")
285 else if (name ==
"FRAME_BIAS" || name ==
"Bias")
287 else if (name ==
"FRAME_FLAT" || name ==
"Flat")
291 qDebug() << name <<
" frame type is unknown." << endl;
304 ISwitchVectorProperty *frameProp = baseDevice->getSwitch(
"CCD_FRAME_TYPE");
305 if (frameProp == NULL)
308 ISwitch *ccdFrame = NULL;
311 ccdFrame = IUFindSwitch(frameProp,
"FRAME_LIGHT");
313 ccdFrame = IUFindSwitch(frameProp,
"FRAME_DARK");
315 ccdFrame = IUFindSwitch(frameProp,
"FRAME_BIAS");
317 ccdFrame = IUFindSwitch(frameProp,
"FRAME_FLAT");
319 if (ccdFrame == NULL)
322 if (ccdFrame->s == ISS_ON)
328 IUResetSwitch(frameProp);
329 ccdFrame->s = ISS_ON;
331 clientManager->sendNewSwitch(frameProp);
344 ISwitchVectorProperty *frameProp = baseDevice->getSwitch(
"CCD_FRAME_TYPE");
345 if (frameProp == NULL)
348 ISwitch *ccdFrame = NULL;
350 ccdFrame = IUFindOnSwitch(frameProp);
352 if (ccdFrame == NULL)
354 qDebug() <<
"Cannot find active frame in CCD!" << endl;
359 if (!strcmp(ccdFrame->name,
"FRAME_LIGHT"))
361 else if (!strcmp(ccdFrame->name,
"FRAME_DARK"))
363 else if (!strcmp(ccdFrame->name,
"FRAME_FLAT"))
365 else if (!strcmp(ccdFrame->name,
"FRAME_BIAS"))
397 INumberVectorProperty *binProp;
402 binProp = baseDevice->getNumber(
"CCD_BINNING");
406 binProp = baseDevice->getNumber(
"GUIDE_BINNING");
413 INumber *horBin = NULL, *verBin=NULL;
415 horBin = IUFindNumber(binProp,
"HOR_BIN");
416 verBin = IUFindNumber(binProp,
"VER_BIN");
418 if (!horBin || !verBin)
421 switch ( (
int) horBin->value)
446 INumberVectorProperty *binProp;
451 binProp = baseDevice->getNumber(
"CCD_BINNING");
455 binProp = baseDevice->getNumber(
"GUIDE_BINNING");
463 INumber *horBin = NULL, *verBin=NULL;
465 horBin = IUFindNumber(binProp,
"HOR_BIN");
466 verBin = IUFindNumber(binProp,
"VER_BIN");
468 if (!horBin || !verBin)
471 *bin_x = horBin->value;
472 *bin_y = verBin->value;
480 INumberVectorProperty *binProp;
485 binProp = baseDevice->getNumber(
"CCD_BINNING");
489 binProp = baseDevice->getNumber(
"GUIDE_BINNING");
496 INumber *horBin = NULL, *verBin=NULL;
498 horBin = IUFindNumber(binProp,
"HOR_BIN");
499 verBin = IUFindNumber(binProp,
"VER_BIN");
501 if (!horBin || !verBin)
504 if (horBin->value == bin_x && verBin->value == bin_y)
507 if (bin_x > horBin->max || bin_y > verBin->max)
510 horBin->value = bin_x;
511 verBin->value = bin_y;
513 clientManager->sendNewNumber(binProp);
524 HasGuideHead =
false;
532 normalTabID = calibrationTabID = focusTabID = guideTabID = -1;
539 #ifdef HAVE_CFITSIO_H
542 delete (streamWindow);
543 delete (primaryChip);
549 if (!strcmp(prop->getName(),
"GUIDER_EXPOSURE"))
554 else if (!strcmp(prop->getName(),
"CCD_FRAME_TYPE"))
556 ISwitchVectorProperty *ccdFrame = prop->getSwitch();
558 for (
int i=0; i < ccdFrame->nsp; i++)
572 if (!strcmp(nvp->name,
"CCD_FRAME"))
574 INumber *wd = IUFindNumber(nvp,
"WIDTH");
575 INumber *ht = IUFindNumber(nvp,
"HEIGHT");
577 if (wd && ht && streamWindow)
578 streamWindow->
setSize(wd->value, ht->value);
586 if (!strcmp(nvp->name,
"CCD_EXPOSURE"))
588 if (nvp->s == IPS_BUSY)
590 INumber *np = IUFindNumber(nvp,
"CCD_EXPOSURE_VALUE");
596 if (!strcmp(nvp->name,
"GUIDER_EXPOSURE"))
598 if (nvp->s == IPS_BUSY)
600 INumber *np = IUFindNumber(nvp,
"GUIDER_EXPOSURE_VALUE");
611 if (!strcmp(svp->name,
"VIDEO_STREAM"))
613 if (streamWindow == NULL)
617 INumberVectorProperty *ccdFrame =
baseDevice->getNumber(
"CCD_FRAME");
619 if (ccdFrame == NULL)
622 INumber *wd = IUFindNumber(ccdFrame,
"WIDTH");
623 INumber *ht = IUFindNumber(ccdFrame,
"HEIGHT");
626 streamWindow->
setSize(wd->value, ht->value);
631 if (svp->sp[0].s == ISS_ON)
642 if (!strcmp(svp->name,
"CONNECTION"))
644 ISwitch *dSwitch = IUFindSwitch(svp,
"DISCONNECT");
646 if (dSwitch && dSwitch->s == ISS_ON && streamWindow != NULL)
649 streamWindow->close();
670 if (!strcmp(bp->format,
".stream") && streamWindow)
675 streamWindow->show();
676 streamWindow->
newFrame( (static_cast<unsigned char *> (bp->blob)), bp->size, streamWindow->
getWidth(), streamWindow->
getHeight());
681 if (strcmp(bp->format,
".fits"))
689 if (!strcmp(bp->name,
"CCD2"))
690 targetChip = guideChip;
692 targetChip = primaryChip;
697 KTemporaryFile tmpFile;
699 if (currentDir.endsWith(
'/'))
700 currentDir.truncate(
sizeof(currentDir)-1);
702 QString filename(currentDir +
'/');
708 tmpFile.setPrefix(
"fits");
709 tmpFile.setAutoRemove(
false);
713 qDebug() <<
"Error: Unable to open " << filename << endl;
717 QDataStream out(&tmpFile);
719 for (nr=0; nr < (int) bp->size; nr += n)
720 n = out.writeRawData( static_cast<char *> (bp->blob) + nr, bp->size - nr);
724 filename = tmpFile.fileName();
730 QString ts = QDateTime::currentDateTime().toString(
"yyyy-MM-ddThh:mm:ss");
732 if (ISOMode ==
false)
733 filename += seqPrefix + (seqPrefix.isEmpty() ?
"" :
"_") + QString(
"%1.fits").arg(QString().sprintf(
"%02d", seqCount));
735 filename += seqPrefix + (seqPrefix.isEmpty() ?
"" :
"_") + QString(
"%1_%2.fits").arg(QString().sprintf(
"%02d", seqCount)).arg(ts);
737 QFile fits_temp_file(filename);
738 if (!fits_temp_file.open(QIODevice::WriteOnly))
740 qDebug() <<
"Error: Unable to open " << fits_temp_file.fileName() << endl;
744 QDataStream out(&fits_temp_file);
746 for (nr=0; nr < (int) bp->size; nr += n)
747 n = out.writeRawData( static_cast<char *> (bp->blob) + nr, bp->size - nr);
749 fits_temp_file.close();
752 addFITSKeywords(filename);
755 KStars::Instance()->statusBar()->changeItem( i18n(
"FITS file saved to %1", filename ), 0);
758 #ifdef HAVE_CFITSIO_H
761 KUrl fileURL(filename);
780 if (focusTabID == -1)
782 else if (fv->
updateFITS(&fileURL, focusTabID, captureFilter) ==
false)
789 if (guideTabID == -1)
791 else if (fv->
updateFITS(&fileURL, guideTabID, captureFilter) ==
false)
798 if (calibrationTabID == -1)
800 else if (fv->
updateFITS(&fileURL, calibrationTabID, captureFilter) ==
false)
818 strncpy(bp->label, filename.toLatin1(), MAXINDILABEL);
824 void CCD::addFITSKeywords(QString filename)
826 #ifdef HAVE_CFITSIO_H
829 if (filter.isEmpty() ==
false)
831 QString key_comment(
"Filter name");
832 filter.replace(
" ",
"_");
836 if (fits_open_image(&fptr, filename.toAscii(), READWRITE, &status))
838 fits_report_error(stderr, status);
842 if (fits_update_key_str(fptr,
"FILTER", filter.toLatin1().data(), key_comment.toLatin1().data(), &status))
844 fits_report_error(stderr, status);
848 fits_close_file(fptr, &status);
858 normalTabID = calibrationTabID = focusTabID = guideTabID = -1;
863 delete(streamWindow);
INDI::BaseDevice * baseDevice
CCDFrameType getFrameType()
CCDChip * getChip(CCDChip::ChipType cType)
void newFrame(unsigned char *buffer, int buffSiz, int w, int h)
void processNumber(INumberVectorProperty *nvp)
bool setBinning(int bin_x, int bin_y)
virtual void registerProperty(INDI::Property *prop)
virtual void processNumber(INumberVectorProperty *nvp)
static KStars * Instance()
void StreamWindowDestroyed()
FITSView * getImage(FITSMode imageType)
virtual void processSwitch(ISwitchVectorProperty *svp)
void numberUpdated(INumberVectorProperty *nvp)
void FITSViewerDestroyed()
void processLight(ILightVectorProperty *lvp)
FITSScale getCaptureFilter()
void registerProperty(INDI::Property *prop)
bool capture(double exposure)
void processText(ITextVectorProperty *tvp)
void switchUpdated(ISwitchVectorProperty *svp)
static QString fitsDir()
Get FITS Default directory.
bool setFrameType(CCDFrameType fType)
void processBLOB(IBLOB *bp)
void setImage(FITSView *image, FITSMode imageType)
virtual void processBLOB(IBLOB *bp)
virtual void processText(ITextVectorProperty *tvp)
FITSMode getCaptureMode()
static bool showFITS()
Get Display FITS automatically when an image is captured?
CCDChip(INDI::BaseDevice *bDevice, ClientManager *cManager, ChipType cType)
bool getFrame(int *x, int *y, int *w, int *h)
int addFITS(const KUrl *imageName, FITSMode mode=FITS_NORMAL, FITSScale filter=FITS_NONE)
ClientManager * clientManager
void newExposureValue(ISD::CCDChip *chip, double value)
bool updateFITS(const KUrl *imageName, int fitsUID, FITSScale filter=FITS_NONE)
const int MAX_FILENAME_LEN
void BLOBUpdated(IBLOB *bp)
void enableStream(bool enable)
virtual void processLight(ILightVectorProperty *lvp)
void addFrameLabel(const QString &label)
void setSize(int wd, int ht)
void processSwitch(ISwitchVectorProperty *svp)
FITSView * getImage(int fitsUID)
bool setFrame(int x, int y, int w, int h)