13 #include <KMessageBox>
22 #include <basedevice.h>
27 QStringList
SequenceJob::statusStrings = QStringList() << i18n(
"Idle") << i18n(
"In progress") << i18n(
"Error") << i18n(
"Complete");
32 exposure=count=delay=frameType=-1;
57 progressLayout->addWidget(pi, 0, 4, 1, 1);
59 seqLister =
new KDirLister();
60 seqTimer =
new QTimer(
this);
61 connect(startB, SIGNAL(clicked()),
this, SLOT(
startSequence()));
62 connect(stopB, SIGNAL(clicked()),
this, SLOT(
stopSequence()));
63 connect(seqTimer, SIGNAL(timeout()),
this, SLOT(
captureImage()));
65 connect(CCDCaptureCombo, SIGNAL(activated(
int)),
this, SLOT(
checkCCD(
int)));
67 connect(FilterCaptureCombo, SIGNAL(activated(
int)),
this, SLOT(
checkFilter(
int)));
69 connect(displayCheck, SIGNAL(toggled(
bool)), previewB, SLOT(setEnabled(
bool)));
71 connect(previewB, SIGNAL(clicked()),
this, SLOT(
captureOne()));
73 connect( seqLister, SIGNAL(newItems (
const KFileItemList & )),
this, SLOT(
checkSeqBoundary(
const KFileItemList &)));
75 connect(addToQueueB, SIGNAL(clicked()),
this, SLOT(
addJob()));
76 connect(removeFromQueueB, SIGNAL(clicked()),
this, SLOT(
removeJob()));
78 connect(queueUpB, SIGNAL(clicked()),
this, SLOT(
moveJobUp()));
79 connect(queueDownB, SIGNAL(clicked()),
this, SLOT(
moveJobDown()));
81 addToQueueB->setIcon(KIcon(
"list-add"));
82 removeFromQueueB->setIcon(KIcon(
"list-remove"));
83 queueUpB->setIcon(KIcon(
"go-up"));
84 queueDownB->setIcon(KIcon(
"go-down"));
95 filterCombo->addItem(filter);
111 connect(ccd, SIGNAL(BLOBUpdated(IBLOB*)),
this, SLOT(
newFITS(IBLOB*)));
123 QString guiderName = newCCD->
getDeviceName() + QString(
" Guider");
125 if (CCDCaptureCombo->contains(guiderName) ==
false)
127 CCDCaptureCombo->addItem(guiderName);
128 CCDs.append(static_cast<ISD::CCD *> (newCCD));
136 Filters.append(static_cast<ISD::Filter *>(newFilter));
140 FilterCaptureCombo->setCurrentIndex(0);
146 if (displayCheck->isChecked() ==
false && darkSubCheck->isChecked())
148 KMessageBox::error(
this, i18n(
"Auto dark subtract is not supported in batch mode."));
152 if (queueTable->rowCount() ==0)
155 jobCount = jobs.count();
176 imgProgress->reset();
177 imgProgress->setEnabled(
false);
179 fullImgCountOUT->setText(QString());
180 currentImgCountOUT->setText(QString());
181 exposeOUT->setText(QString());
183 startB->setEnabled(
true);
184 stopB->setEnabled(
false);
186 if (displayCheck->isChecked())
187 previewB->setEnabled(
true);
189 previewB->setEnabled(
false);
198 if (ccdNum <= CCDs.count())
203 int xstep=0, ystep=0;
204 QString frameProp = QString(
"CCD_FRAME");
207 currentCCD = CCDs.at(ccdNum);
209 if (CCDCaptureCombo->itemText(ccdNum).right(6) == QString(
"Guider"))
211 frameProp = QString(
"GUIDER_FRAME");
217 currentCCD = CCDs.at(ccdNum);
219 useGuideHead =
false;
222 if (currentCCD->
getMinMaxStep(frameProp,
"WIDTH", &min, &max, &step))
225 xstep = (int) max * 0.05;
229 frameWIN->setMinimum(min);
230 frameWIN->setMaximum(max);
231 frameWIN->setSingleStep(xstep);
234 if (currentCCD->
getMinMaxStep(frameProp,
"HEIGHT", &min, &max, &step))
237 ystep = (int) max * 0.05;
241 frameHIN->setMinimum(min);
242 frameHIN->setMaximum(max);
243 frameHIN->setSingleStep(ystep);
246 if (currentCCD->
getMinMaxStep(frameProp,
"X", &min, &max, &step))
251 frameXIN->setMinimum(min);
252 frameXIN->setMaximum(max);
253 frameXIN->setSingleStep(step);
256 if (currentCCD->
getMinMaxStep(frameProp,
"Y", &min, &max, &step))
261 frameYIN->setMinimum(min);
262 frameYIN->setMaximum(max);
263 frameYIN->setSingleStep(step);
268 if (targetChip->
getFrame(&x,&y,&w,&h))
271 frameXIN->setValue(x);
272 frameYIN->setValue(y);
273 frameWIN->setValue(w);
274 frameHIN->setValue(h);
279 binXCombo->setCurrentIndex(binx-1);
280 binYCombo->setCurrentIndex(biny-1);
285 frameTypeCombo->clear();
287 if (frameTypes.isEmpty())
288 frameTypeCombo->setEnabled(
false);
291 frameTypeCombo->setEnabled(
true);
292 frameTypeCombo->addItems(frameTypes);
293 frameTypeCombo->setCurrentIndex(targetChip->
getFrameType());
301 if (strcmp(ccd->
getDeviceName(), CCDCaptureCombo->currentText().toLatin1()))
309 frameTypeCombo->clear();
311 if (frameTypes.isEmpty())
312 frameTypeCombo->setEnabled(
false);
315 frameTypeCombo->setEnabled(
true);
316 frameTypeCombo->addItems(frameTypes);
328 if (filterNum <= Filters.count())
329 currentFilter = Filters.at(filterNum);
331 FilterPosCombo->clear();
333 filterName = currentFilter->
getBaseDevice()->getText(
"FILTER_NAME");
334 filterSlot = currentFilter->
getBaseDevice()->getNumber(
"FILTER_SLOT");
336 if (filterSlot == NULL)
338 KMessageBox::error(0, i18n(
"Unable to find FILTER_SLOT property in driver %1", currentFilter->
getBaseDevice()->getDeviceName()));
342 for (
int i=0; i < filterSlot->np[0].max; i++)
346 if (filterName != NULL && (i < filterName->ntp))
347 item = filterName->tp[i].text;
348 else if (i < filterAlias.count() && filterAlias[i].isEmpty() ==
false)
349 item = filterAlias.at(i);
351 item = QString(
"Filter_%1").arg(i+1);
353 FilterPosCombo->addItem(item);
357 FilterPosCombo->setCurrentIndex( (
int) filterSlot->np[0].value-1);
366 if (!strcmp(bp->name,
"CCD2"))
371 if (tChip != targetChip)
378 if (QString(bp->bvp->device) != currentCCD->
getDeviceName() || (startB->isEnabled() && previewB->isEnabled()))
384 seqTimer->start(seqDelay);
388 if (darkSubCheck->isChecked() && calibrationState ==
CALIBRATE_DONE)
400 if (image_data && calibrateImage && currentImage)
404 if (seqTotalCount < 0)
406 jobs.removeOne(activeJob);
414 imgProgress->setValue(seqCurrentCount);
416 appendLogText(i18n(
"Received image %1 out of %2.", seqCurrentCount, seqTotalCount));
418 currentImgCountOUT->setText( QString::number(seqCurrentCount));
421 if (seqCurrentCount == seqTotalCount)
443 seqTimer->start(seqDelay);
452 executeJob(jobs.last());
457 if (currentCCD == NULL)
462 if (activeJob == NULL)
465 targetChip = activeJob->activeChip;
467 if (targetChip == NULL)
470 if (targetChip->
setFrame(activeJob->x, activeJob->y, activeJob->w, activeJob->h) ==
false)
476 if (activeJob->preview ==
false)
484 if (targetChip->
setBinning(activeJob->binX, activeJob->binY) ==
false)
490 if (activeJob->preview ==
false)
498 if (useGuideHead ==
false && darkSubCheck->isChecked() && calibrationState ==
CALIBRATE_NONE)
507 targetChip->
setFrameType(frameTypeCombo->itemText(activeJob->frameType));
514 if (currentFilter && currentFilter != currentCCD)
515 currentCCD->
setFilter(FilterPosCombo->itemText(activeJob->filterPos-1));
517 targetChip->
capture(seqExpose);
525 seqPrefix = newPrefix;
527 seqLister->setNameFilter(QString(
"*.fits"));
546 KFileItemList::const_iterator it = items.begin();
547 const KFileItemList::const_iterator end = items.end();
548 for ( ; it != end; ++it )
550 tempName = (*it).name();
553 if (tempName.startsWith(seqPrefix) ==
false || tempName.endsWith(
".fits") ==
false)
556 if (seqPrefix.isEmpty() ==
false)
557 tempName.remove(seqPrefix +
'_');
560 int usIndex = tempName.indexOf(
'_');
563 usIndex = tempName.indexOf(
'.');
565 tempName.remove(usIndex, tempName.size() - usIndex);
567 bool indexOK =
false;
569 newFileIndex = tempName.toInt(&indexOK);
572 if (indexOK && newFileIndex >= seqCount)
573 seqCount = newFileIndex + 1;
586 logText.insert(0,
i18nc(
"log entry; %1 is the date, %2 is the text",
"%1 %2", QDateTime::currentDateTime().toString(
"yyyy-MM-ddThh:mm:ss"), text));
600 if (targetChip != tChip)
603 exposeOUT->setText(QString::number(value,
'd', 2));
605 secondsLabel->setText(i18np(
"second left",
"seconds left", value));
615 if (preview ==
false && displayCheck->isChecked() ==
false && darkSubCheck->isChecked())
617 KMessageBox::error(
this, i18n(
"Auto dark subtract is not supported in batch mode."));
623 if (ISOCheck->isChecked())
626 job->isoMode =
false;
629 job->preview = preview;
631 job->showFITS = displayCheck->isChecked();
633 imagePrefix = prefixIN->text();
635 if (frameTypeCheck->isChecked())
637 if (imagePrefix.isEmpty() ==
false)
640 imagePrefix += frameTypeCombo->currentText();
642 if (filterCheck->isChecked() && FilterPosCombo->currentText().isEmpty() ==
false)
644 if (imagePrefix.isEmpty() ==
false || frameTypeCheck->isChecked())
647 imagePrefix += FilterPosCombo->currentText();
649 if (expDurationCheck->isChecked())
651 if (imagePrefix.isEmpty() ==
false || frameTypeCheck->isChecked())
654 imagePrefix += QString::number(exposureIN->value(),
'd', 0) + QString(
"_secs");
657 job->frameType = frameTypeCombo->currentIndex();
658 job->prefix = imagePrefix;
660 if (filterSlot != NULL && currentFilter != NULL)
662 int cindex = FilterPosCombo->currentIndex()+1;
663 job->filterPos = cindex;
666 job->exposure = exposureIN->value();
668 job->count = countIN->value();
670 job->binX = binXCombo->currentIndex()+1;
671 job->binY = binYCombo->currentIndex()+1;
673 job->delay = delayIN->value() * 1000;
675 job->activeChip = targetChip;
676 job->activeCCD = currentCCD;
677 job->activeFilter = currentFilter;
679 job->x = frameXIN->value();
680 job->y = frameYIN->value();
681 job->w = frameWIN->value();
682 job->h = frameHIN->value();
692 int currentRow = queueTable->rowCount();
694 queueTable->insertRow(currentRow);
697 status->setTextAlignment(Qt::AlignHCenter);
698 status->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
700 job->statusCell = status;
702 QTableWidgetItem *type =
new QTableWidgetItem(frameTypeCombo->currentText());
704 type->setTextAlignment(Qt::AlignHCenter);
705 type->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
707 QTableWidgetItem *filter =
new QTableWidgetItem(FilterPosCombo->currentText());
709 filter->setTextAlignment(Qt::AlignHCenter);
710 filter->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
712 QTableWidgetItem *bin =
new QTableWidgetItem(QString(
"%1x%2").arg(job->binX).arg(job->binY));
714 bin->setTextAlignment(Qt::AlignHCenter);
715 bin->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
717 QTableWidgetItem *exp =
new QTableWidgetItem(QString::number(job->exposure));
719 exp->setTextAlignment(Qt::AlignHCenter);
720 exp->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
722 QTableWidgetItem *count =
new QTableWidgetItem(QString::number(job->count));
724 count->setTextAlignment(Qt::AlignHCenter);
725 count->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
727 queueTable->setItem(currentRow, 0, status);
728 queueTable->setItem(currentRow, 1, filter);
729 queueTable->setItem(currentRow, 2, type);
730 queueTable->setItem(currentRow, 3, bin);
731 queueTable->setItem(currentRow, 4, exp);
732 queueTable->setItem(currentRow, 5, count);
734 removeFromQueueB->setEnabled(
true);
736 if (queueTable->rowCount() > 1)
738 queueUpB->setEnabled(
true);
739 queueDownB->setEnabled(
true);
746 int currentRow = queueTable->currentRow();
751 queueTable->removeRow(currentRow);
754 jobs.removeAt(currentRow);
757 if (queueTable->rowCount() == 0)
758 removeFromQueueB->setEnabled(
false);
760 if (queueTable->rowCount() == 1)
762 queueUpB->setEnabled(
false);
763 queueDownB->setEnabled(
false);
766 for (
int i=0; i < jobs.count(); i++)
767 jobs.at(i)->statusCell = queueTable->item(i, 0);
769 queueTable->selectRow(queueTable->currentRow());
771 jobCount = jobs.count();
777 int currentRow = queueTable->currentRow();
779 int columnCount = queueTable->columnCount();
781 if (currentRow <= 0 || queueTable->rowCount() == 1)
784 int destinationRow = currentRow - 1;
786 for (
int i=0; i < columnCount; i++)
788 QTableWidgetItem *downItem = queueTable->takeItem(currentRow, i);
789 QTableWidgetItem *upItem = queueTable->takeItem(destinationRow, i);
791 queueTable->setItem(destinationRow, i, downItem);
792 queueTable->setItem(currentRow, i, upItem);
798 jobs.insert(destinationRow, job);
800 queueTable->selectRow(destinationRow);
802 for (
int i=0; i < jobs.count(); i++)
803 jobs.at(i)->statusCell = queueTable->item(i, 0);
809 int currentRow = queueTable->currentRow();
811 int columnCount = queueTable->columnCount();
813 if (currentRow+1 >= queueTable->rowCount() || queueTable->rowCount() == 1)
816 int destinationRow = currentRow + 1;
818 for (
int i=0; i < columnCount; i++)
820 QTableWidgetItem *downItem = queueTable->takeItem(currentRow, i);
821 QTableWidgetItem *upItem = queueTable->takeItem(destinationRow, i);
823 queueTable->setItem(destinationRow, i, downItem);
824 queueTable->setItem(currentRow, i, upItem);
830 jobs.insert(destinationRow, job);
832 queueTable->selectRow(destinationRow);
834 for (
int i=0; i < jobs.count(); i++)
835 jobs.at(i)->statusCell = queueTable->item(i, 0);
841 currentCCD = job->activeCCD;
842 currentFilter = job->activeFilter;
844 targetChip = job->activeChip;
854 if (job->filterPos != -1 && currentFilter != NULL)
857 seqExpose = job->exposure;
862 seqTotalCount = job->count;
864 seqDelay = job->delay;
870 if (job->preview ==
false)
872 fullImgCountOUT->setText( QString::number(seqTotalCount));
873 currentImgCountOUT->setText(QString::number(seqCurrentCount));
876 imgProgress->setEnabled(
true);
877 imgProgress->setMaximum(seqTotalCount);
878 imgProgress->setValue(seqCurrentCount);
885 startB->setEnabled(
false);
886 stopB->setEnabled(
true);
887 previewB->setEnabled(
false);
902 #include "capture.moc"
CCDFrameType getFrameType()
FITSImage * getImageData()
static QStringList statusStrings
QStringList getFrameTypes()
void setSeqCount(int count)
CCDChip * getChip(CCDChip::ChipType cType)
void updateSequencePrefix(const QString &newPrefix)
bool setBinning(int bin_x, int bin_y)
virtual bool runCommand(int command, void *ptr=NULL)=0
virtual INDI::BaseDevice * getBaseDevice()=0
void setFilter(const QString &newFilter)
virtual const char * getDeviceName()=0
void checkCCD(int CCDNum)
const char * getDeviceName()
FITSView * getImage(FITSMode imageType)
void appendLogText(const QString &)
void updateCaptureProgress(ISD::CCDChip *tChip, double value)
void addJob(bool preview=false)
void addGuideHead(ISD::GDInterface *newCCD)
The QProgressIndicator class lets an application display a progress indicator to show that a lengthy ...
void setISOMode(bool enable)
void setShowFITS(bool enable)
bool capture(double exposure)
void setBatchMode(bool enable)
static QString fitsDir()
Get FITS Default directory.
bool setFrameType(CCDFrameType fType)
bool getMinMaxStep(const QString &propName, const QString &elementName, double *min, double *max, double *step)
void syncFrameType(ISD::GDInterface *ccd)
FITSMode getCaptureMode()
static bool showFITS()
Get Display FITS automatically when an image is captured?
i18nc("string from libindi, used in the config dialog","100x")
void checkFilter(int filterNum)
void addFilter(ISD::GDInterface *newFilter)
bool getFrame(int *x, int *y, int *w, int *h)
void checkSeqBoundary(const KFileItemList &items)
void setCaptureFilter(FITSScale fType)
void setSeqPrefix(const QString &preFix)
void setCaptureMode(FITSMode mode)
void subtract(float *darkFrame)
void addCCD(ISD::GDInterface *newCCD)
static QStringList filterTypes
bool setFrame(int x, int y, int w, int h)
static QStringList filterAlias()
Get Aliases for filter wheel slots.