• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • ekos
capture.cpp
Go to the documentation of this file.
1 /* Ekos
2  Copyright (C) 2012 Jasem Mutlaq <mutlaqja@ikarustech.com>
3 
4  This application is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8  */
9 
10 #include "capture.h"
11 #include "Options.h"
12 
13 #include <KMessageBox>
14 
15 #include "indi/driverinfo.h"
16 #include "indi/indifilter.h"
17 #include "fitsviewer/fitsviewer.h"
18 #include "fitsviewer/fitsview.h"
19 
20 #include "QProgressIndicator.h"
21 
22 #include <basedevice.h>
23 
24 namespace Ekos
25 {
26 
27 QStringList SequenceJob::statusStrings = QStringList() << i18n("Idle") << i18n("In progress") << i18n("Error") << i18n("Complete");
28 
29 SequenceJob::SequenceJob()
30 {
31  status = JOB_IDLE;
32  exposure=count=delay=frameType=-1;
33  preview=false;
34  showFITS=false;
35  activeChip=NULL;
36  activeCCD=NULL;
37  activeFilter= NULL;
38 }
39 
40 Capture::Capture()
41 {
42  setupUi(this);
43 
44  currentCCD = NULL;
45  currentFilter = NULL;
46 
47  filterSlot = NULL;
48  filterName = NULL;
49  activeJob = NULL;
50 
51  targetChip = NULL;
52 
53  calibrationState = CALIBRATE_NONE;
54 
55  pi = new QProgressIndicator(this);
56 
57  progressLayout->addWidget(pi, 0, 4, 1, 1);
58 
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()));
64 
65  connect(CCDCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkCCD(int)));
66 
67  connect(FilterCaptureCombo, SIGNAL(activated(int)), this, SLOT(checkFilter(int)));
68 
69  connect(displayCheck, SIGNAL(toggled(bool)), previewB, SLOT(setEnabled(bool)));
70 
71  connect(previewB, SIGNAL(clicked()), this, SLOT(captureOne()));
72 
73  connect( seqLister, SIGNAL(newItems (const KFileItemList & )), this, SLOT(checkSeqBoundary(const KFileItemList &)));
74 
75  connect(addToQueueB, SIGNAL(clicked()), this, SLOT(addJob()));
76  connect(removeFromQueueB, SIGNAL(clicked()), this, SLOT(removeJob()));
77 
78  connect(queueUpB, SIGNAL(clicked()), this, SLOT(moveJobUp()));
79  connect(queueDownB, SIGNAL(clicked()), this, SLOT(moveJobDown()));
80 
81  addToQueueB->setIcon(KIcon("list-add"));
82  removeFromQueueB->setIcon(KIcon("list-remove"));
83  queueUpB->setIcon(KIcon("go-up"));
84  queueDownB->setIcon(KIcon("go-down"));
85 
86  jobIndex = -1;
87  jobCount = 0;
88  seqExpose = 0;
89  seqTotalCount = 0;
90  seqCurrentCount = 0;
91  seqDelay = 0;
92  useGuideHead = false;
93 
94  foreach(QString filter, FITSViewer::filterTypes)
95  filterCombo->addItem(filter);
96 
97  displayCheck->setEnabled(Options::showFITS());
98 }
99 
100 Capture::~Capture()
101 {
102  qDeleteAll(jobs);
103 }
104 
105 void Capture::addCCD(ISD::GDInterface *newCCD)
106 {
107  ISD::CCD *ccd = static_cast<ISD::CCD *> (newCCD);
108 
109  CCDCaptureCombo->addItem(ccd->getDeviceName());
110 
111  connect(ccd, SIGNAL(BLOBUpdated(IBLOB*)), this, SLOT(newFITS(IBLOB*)));
112 
113  connect(ccd, SIGNAL(newExposureValue(ISD::CCDChip*,double)), this, SLOT(updateCaptureProgress(ISD::CCDChip*,double)));
114 
115  CCDs.append(ccd);
116 
117  checkCCD(0);
118 
119 }
120 
121 void Capture::addGuideHead(ISD::GDInterface *newCCD)
122 {
123  QString guiderName = newCCD->getDeviceName() + QString(" Guider");
124 
125  if (CCDCaptureCombo->contains(guiderName) == false)
126  {
127  CCDCaptureCombo->addItem(guiderName);
128  CCDs.append(static_cast<ISD::CCD *> (newCCD));
129  }
130 }
131 
132 void Capture::addFilter(ISD::GDInterface *newFilter)
133 {
134  FilterCaptureCombo->addItem(newFilter->getDeviceName());
135 
136  Filters.append(static_cast<ISD::Filter *>(newFilter));
137 
138  checkFilter(0);
139 
140  FilterCaptureCombo->setCurrentIndex(0);
141 
142 }
143 
144 void Capture::startSequence()
145 {
146  if (displayCheck->isChecked() == false && darkSubCheck->isChecked())
147  {
148  KMessageBox::error(this, i18n("Auto dark subtract is not supported in batch mode."));
149  return;
150  }
151 
152  if (queueTable->rowCount() ==0)
153  addJob();
154 
155  jobCount = jobs.count();
156 
157  SequenceJob *job = jobs.at(0);
158 
159  jobIndex = 0;
160 
161  executeJob(job);
162 
163 
164 }
165 
166 void Capture::stopSequence()
167 {
168 
169  retries = 0;
170  seqTotalCount = 0;
171  seqCurrentCount = 0;
172 
173  targetChip->abortExposure();
174  targetChip->setBatchMode(false);
175 
176  imgProgress->reset();
177  imgProgress->setEnabled(false);
178 
179  fullImgCountOUT->setText(QString());
180  currentImgCountOUT->setText(QString());
181  exposeOUT->setText(QString());
182 
183  startB->setEnabled(true);
184  stopB->setEnabled(false);
185 
186  if (displayCheck->isChecked())
187  previewB->setEnabled(true);
188  else
189  previewB->setEnabled(false);
190 
191  pi->stopAnimation();
192  seqTimer->stop();
193 
194 }
195 
196 void Capture::checkCCD(int ccdNum)
197 {
198  if (ccdNum <= CCDs.count())
199  {
200  int x,y,w,h;
201  int binx,biny;
202  double min,max,step;
203  int xstep=0, ystep=0;
204  QString frameProp = QString("CCD_FRAME");
205 
206  // Check whether main camera or guide head only
207  currentCCD = CCDs.at(ccdNum);
208 
209  if (CCDCaptureCombo->itemText(ccdNum).right(6) == QString("Guider"))
210  {
211  frameProp = QString("GUIDER_FRAME");
212  useGuideHead = true;
213  targetChip = currentCCD->getChip(ISD::CCDChip::GUIDE_CCD);
214  }
215  else
216  {
217  currentCCD = CCDs.at(ccdNum);
218  targetChip = currentCCD->getChip(ISD::CCDChip::PRIMARY_CCD);
219  useGuideHead = false;
220  }
221 
222  if (currentCCD->getMinMaxStep(frameProp, "WIDTH", &min, &max, &step))
223  {
224  if (step == 0)
225  xstep = (int) max * 0.05;
226  else
227  xstep = step;
228 
229  frameWIN->setMinimum(min);
230  frameWIN->setMaximum(max);
231  frameWIN->setSingleStep(xstep);
232  }
233 
234  if (currentCCD->getMinMaxStep(frameProp, "HEIGHT", &min, &max, &step))
235  {
236  if (step == 0)
237  ystep = (int) max * 0.05;
238  else
239  ystep = step;
240 
241  frameHIN->setMinimum(min);
242  frameHIN->setMaximum(max);
243  frameHIN->setSingleStep(ystep);
244  }
245 
246  if (currentCCD->getMinMaxStep(frameProp, "X", &min, &max, &step))
247  {
248  if (step == 0)
249  step = xstep;
250 
251  frameXIN->setMinimum(min);
252  frameXIN->setMaximum(max);
253  frameXIN->setSingleStep(step);
254  }
255 
256  if (currentCCD->getMinMaxStep(frameProp, "Y", &min, &max, &step))
257  {
258  if (step == 0)
259  step = ystep;
260 
261  frameYIN->setMinimum(min);
262  frameYIN->setMaximum(max);
263  frameYIN->setSingleStep(step);
264  }
265 
266 
267 
268  if (targetChip->getFrame(&x,&y,&w,&h))
269  {
270 
271  frameXIN->setValue(x);
272  frameYIN->setValue(y);
273  frameWIN->setValue(w);
274  frameHIN->setValue(h);
275  }
276 
277  if (targetChip->getBinning(&binx, &biny))
278  {
279  binXCombo->setCurrentIndex(binx-1);
280  binYCombo->setCurrentIndex(biny-1);
281  }
282 
283  QStringList frameTypes = targetChip->getFrameTypes();
284 
285  frameTypeCombo->clear();
286 
287  if (frameTypes.isEmpty())
288  frameTypeCombo->setEnabled(false);
289  else
290  {
291  frameTypeCombo->setEnabled(true);
292  frameTypeCombo->addItems(frameTypes);
293  frameTypeCombo->setCurrentIndex(targetChip->getFrameType());
294  }
295 
296  }
297 }
298 
299 void Capture::syncFrameType(ISD::GDInterface *ccd)
300 {
301  if (strcmp(ccd->getDeviceName(), CCDCaptureCombo->currentText().toLatin1()))
302  return;
303 
304  ISD::CCDChip *tChip = NULL;
305  tChip = (static_cast<ISD::CCD *> (ccd) )->getChip(ISD::CCDChip::PRIMARY_CCD);
306 
307  QStringList frameTypes = tChip->getFrameTypes();
308 
309  frameTypeCombo->clear();
310 
311  if (frameTypes.isEmpty())
312  frameTypeCombo->setEnabled(false);
313  else
314  {
315  frameTypeCombo->setEnabled(true);
316  frameTypeCombo->addItems(frameTypes);
317  frameTypeCombo->setCurrentIndex(tChip->getFrameType());
318  }
319 
320 
321 }
322 
323 void Capture::checkFilter(int filterNum)
324 {
325 
326  QStringList filterAlias = Options::filterAlias();
327 
328  if (filterNum <= Filters.count())
329  currentFilter = Filters.at(filterNum);
330 
331  FilterPosCombo->clear();
332 
333  filterName = currentFilter->getBaseDevice()->getText("FILTER_NAME");
334  filterSlot = currentFilter->getBaseDevice()->getNumber("FILTER_SLOT");
335 
336  if (filterSlot == NULL)
337  {
338  KMessageBox::error(0, i18n("Unable to find FILTER_SLOT property in driver %1", currentFilter->getBaseDevice()->getDeviceName()));
339  return;
340  }
341 
342  for (int i=0; i < filterSlot->np[0].max; i++)
343  {
344  QString item;
345 
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);
350  else
351  item = QString("Filter_%1").arg(i+1);
352 
353  FilterPosCombo->addItem(item);
354 
355  }
356 
357  FilterPosCombo->setCurrentIndex( (int) filterSlot->np[0].value-1);
358 
359 }
360 
361 void Capture::newFITS(IBLOB *bp)
362 {
363 
364  ISD::CCDChip *tChip = NULL;
365 
366  if (!strcmp(bp->name, "CCD2"))
367  tChip = currentCCD->getChip(ISD::CCDChip::GUIDE_CCD);
368  else
369  tChip = currentCCD->getChip(ISD::CCDChip::PRIMARY_CCD);
370 
371  if (tChip != targetChip)
372  return;
373 
374  if (targetChip->getCaptureMode() == FITS_FOCUS || targetChip->getCaptureMode() == FITS_GUIDE)
375  return;
376 
377  // If the FITS is not for our device, simply ignore
378  if (QString(bp->bvp->device) != currentCCD->getDeviceName() || (startB->isEnabled() && previewB->isEnabled()))
379  return;
380 
381  if (calibrationState == CALIBRATE_START)
382  {
383  calibrationState = CALIBRATE_DONE;
384  seqTimer->start(seqDelay);
385  return;
386  }
387 
388  if (darkSubCheck->isChecked() && calibrationState == CALIBRATE_DONE)
389  {
390  calibrationState = CALIBRATE_NONE;
391 
392  FITSView *calibrateImage = targetChip->getImage(FITS_CALIBRATE);
393  FITSView *currentImage = targetChip->getImage(FITS_NORMAL);
394 
395  FITSImage *image_data = NULL;
396 
397  if (currentImage)
398  image_data = currentImage->getImageData();
399 
400  if (image_data && calibrateImage && currentImage)
401  image_data->subtract(calibrateImage->getImageData()->getImageBuffer());
402  }
403 
404  if (seqTotalCount < 0)
405  {
406  jobs.removeOne(activeJob);
407  delete (activeJob);
408  activeJob = NULL;
409  stopSequence();
410  return;
411  }
412 
413  seqCurrentCount++;
414  imgProgress->setValue(seqCurrentCount);
415 
416  appendLogText(i18n("Received image %1 out of %2.", seqCurrentCount, seqTotalCount));
417 
418  currentImgCountOUT->setText( QString::number(seqCurrentCount));
419 
420  // if we're done
421  if (seqCurrentCount == seqTotalCount)
422  {
423  stopSequence();
424 
425  activeJob->status = SequenceJob::JOB_DONE;
426 
427  activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]);
428 
429  jobCount--;
430 
431  if (jobCount > 0)
432  {
433  jobIndex++;
434 
435  SequenceJob *job = jobs.at(jobIndex);
436 
437  if (job)
438  executeJob(job);
439  }
440 
441  }
442  else
443  seqTimer->start(seqDelay);
444 
445 
446 }
447 
448 void Capture::captureOne()
449 {
450  addJob(true);
451 
452  executeJob(jobs.last());
453 }
454 
455 void Capture::captureImage()
456 {
457  if (currentCCD == NULL)
458  return;
459 
460  seqTimer->stop();
461 
462  if (activeJob == NULL)
463  return;
464 
465  targetChip = activeJob->activeChip;
466 
467  if (targetChip == NULL)
468  return;
469 
470  if (targetChip->setFrame(activeJob->x, activeJob->y, activeJob->w, activeJob->h) == false)
471  {
472  appendLogText(i18n("Failed to set sub frame."));
473 
474  activeJob->status = SequenceJob::JOB_ERROR;
475 
476  if (activeJob->preview == false)
477  activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]);
478 
479  stopSequence();
480  return;
481 
482  }
483 
484  if (targetChip->setBinning(activeJob->binX, activeJob->binY) == false)
485  {
486  appendLogText(i18n("Failed to set binning."));
487 
488  activeJob->status = SequenceJob::JOB_ERROR;
489 
490  if (activeJob->preview == false)
491  activeJob->statusCell->setText(SequenceJob::statusStrings[activeJob->status]);
492 
493  stopSequence();
494 
495  return;
496  }
497 
498  if (useGuideHead == false && darkSubCheck->isChecked() && calibrationState == CALIBRATE_NONE)
499  {
500  calibrationState = CALIBRATE_START;
501  targetChip->setFrameType(FRAME_DARK);
502  targetChip->setCaptureMode(FITS_CALIBRATE);
503  appendLogText(i18n("Capturing dark frame..."));
504  }
505  else
506  {
507  targetChip->setFrameType(frameTypeCombo->itemText(activeJob->frameType));
508  targetChip->setCaptureMode(FITS_NORMAL);
509  targetChip->setCaptureFilter( (FITSScale) filterCombo->currentIndex());
510  appendLogText(i18n("Capturing image..."));
511  }
512 
513  // If filter is different that CCD, send the filter info
514  if (currentFilter && currentFilter != currentCCD)
515  currentCCD->setFilter(FilterPosCombo->itemText(activeJob->filterPos-1));
516 
517  targetChip->capture(seqExpose);
518 }
519 
520 /*******************************************************************************/
521 /* Update the prefix for the sequence of images to be captured */
522 /*******************************************************************************/
523 void Capture::updateSequencePrefix( const QString &newPrefix)
524 {
525  seqPrefix = newPrefix;
526 
527  seqLister->setNameFilter(QString("*.fits"));
528 
529  seqCount = 1;
530 
531  seqLister->openUrl(Options::fitsDir());
532 
533  checkSeqBoundary(seqLister->items());
534 
535 }
536 
537 /*******************************************************************************/
538 /* Determine the next file number sequence. That is, if we have file1.png */
539 /* and file2.png, then the next sequence should be file3.png */
540 /*******************************************************************************/
541 void Capture::checkSeqBoundary(const KFileItemList & items)
542 {
543  int newFileIndex;
544  QString tempName;
545 
546  KFileItemList::const_iterator it = items.begin();
547  const KFileItemList::const_iterator end = items.end();
548  for ( ; it != end; ++it )
549  {
550  tempName = (*it).name();
551 
552  // find the prefix first
553  if (tempName.startsWith(seqPrefix) == false || tempName.endsWith(".fits") == false)
554  continue;
555 
556  if (seqPrefix.isEmpty() == false)
557  tempName.remove(seqPrefix + '_');
558 
559 
560  int usIndex = tempName.indexOf('_');
561 
562  if (usIndex == -1)
563  usIndex = tempName.indexOf('.');
564 
565  tempName.remove(usIndex, tempName.size() - usIndex);
566 
567  bool indexOK = false;
568 
569  newFileIndex = tempName.toInt(&indexOK);
570 
571 
572  if (indexOK && newFileIndex >= seqCount)
573  seqCount = newFileIndex + 1;
574 
575  //qDebug() << "Now the tempName is " << tempName << " conversion is " << (indexOK ? "OK" : "Failed") << " and valu is " << newFileIndex
576  // << " and seqCount is " << seqCount << endl;
577  }
578 
579  currentCCD->setSeqCount(seqCount);
580 
581 }
582 
583 void Capture::appendLogText(const QString &text)
584 {
585 
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));
587 
588  emit newLog();
589 }
590 
591 void Capture::clearLog()
592 {
593  logText.clear();
594  emit newLog();
595 }
596 
597 void Capture::updateCaptureProgress(ISD::CCDChip * tChip, double value)
598 {
599 
600  if (targetChip != tChip)
601  return;
602 
603  exposeOUT->setText(QString::number(value, 'd', 2));
604 
605  secondsLabel->setText(i18np("second left", "seconds left", value));
606 
607 }
608 
609 void Capture::addJob(bool preview)
610 {
611 
612  SequenceJob *job = NULL;
613  QString imagePrefix;
614 
615  if (preview == false && displayCheck->isChecked() == false && darkSubCheck->isChecked())
616  {
617  KMessageBox::error(this, i18n("Auto dark subtract is not supported in batch mode."));
618  return;
619  }
620 
621  job = new SequenceJob();
622 
623  if (ISOCheck->isChecked())
624  job->isoMode = true;
625  else
626  job->isoMode = false;
627 
628 
629  job->preview = preview;
630 
631  job->showFITS = displayCheck->isChecked();
632 
633  imagePrefix = prefixIN->text();
634 
635  if (frameTypeCheck->isChecked())
636  {
637  if (imagePrefix.isEmpty() == false)
638  imagePrefix += '_';
639 
640  imagePrefix += frameTypeCombo->currentText();
641  }
642  if (filterCheck->isChecked() && FilterPosCombo->currentText().isEmpty() == false)
643  {
644  if (imagePrefix.isEmpty() == false || frameTypeCheck->isChecked())
645  imagePrefix += '_';
646 
647  imagePrefix += FilterPosCombo->currentText();
648  }
649  if (expDurationCheck->isChecked())
650  {
651  if (imagePrefix.isEmpty() == false || frameTypeCheck->isChecked())
652  imagePrefix += '_';
653 
654  imagePrefix += QString::number(exposureIN->value(), 'd', 0) + QString("_secs");
655  }
656 
657  job->frameType = frameTypeCombo->currentIndex();
658  job->prefix = imagePrefix;
659 
660  if (filterSlot != NULL && currentFilter != NULL)
661  {
662  int cindex = FilterPosCombo->currentIndex()+1;
663  job->filterPos = cindex;
664  }
665 
666  job->exposure = exposureIN->value();
667 
668  job->count = countIN->value();
669 
670  job->binX = binXCombo->currentIndex()+1;
671  job->binY = binYCombo->currentIndex()+1;
672 
673  job->delay = delayIN->value() * 1000; /* in ms */
674 
675  job->activeChip = targetChip;
676  job->activeCCD = currentCCD;
677  job->activeFilter = currentFilter;
678 
679  job->x = frameXIN->value();
680  job->y = frameYIN->value();
681  job->w = frameWIN->value();
682  job->h = frameHIN->value();
683 
684  jobs.append(job);
685 
686  jobCount++;
687 
688  // Nothing more to do if preview
689  if (preview)
690  return;
691 
692  int currentRow = queueTable->rowCount();
693 
694  queueTable->insertRow(currentRow);
695 
696  QTableWidgetItem *status = new QTableWidgetItem(SequenceJob::statusStrings[0]);
697  status->setTextAlignment(Qt::AlignHCenter);
698  status->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
699 
700  job->statusCell = status;
701 
702  QTableWidgetItem *type = new QTableWidgetItem(frameTypeCombo->currentText());
703 
704  type->setTextAlignment(Qt::AlignHCenter);
705  type->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
706 
707  QTableWidgetItem *filter = new QTableWidgetItem(FilterPosCombo->currentText());
708 
709  filter->setTextAlignment(Qt::AlignHCenter);
710  filter->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
711 
712  QTableWidgetItem *bin = new QTableWidgetItem(QString("%1x%2").arg(job->binX).arg(job->binY));
713 
714  bin->setTextAlignment(Qt::AlignHCenter);
715  bin->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
716 
717  QTableWidgetItem *exp = new QTableWidgetItem(QString::number(job->exposure));
718 
719  exp->setTextAlignment(Qt::AlignHCenter);
720  exp->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
721 
722  QTableWidgetItem *count = new QTableWidgetItem(QString::number(job->count));
723 
724  count->setTextAlignment(Qt::AlignHCenter);
725  count->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
726 
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);
733 
734  removeFromQueueB->setEnabled(true);
735 
736  if (queueTable->rowCount() > 1)
737  {
738  queueUpB->setEnabled(true);
739  queueDownB->setEnabled(true);
740  }
741 
742 }
743 
744 void Capture::removeJob()
745 {
746  int currentRow = queueTable->currentRow();
747 
748  if (currentRow < 0)
749  return;
750 
751  queueTable->removeRow(currentRow);
752 
753  SequenceJob *job = jobs.at(currentRow);
754  jobs.removeAt(currentRow);
755  delete (job);
756 
757  if (queueTable->rowCount() == 0)
758  removeFromQueueB->setEnabled(false);
759 
760  if (queueTable->rowCount() == 1)
761  {
762  queueUpB->setEnabled(false);
763  queueDownB->setEnabled(false);
764  }
765 
766  for (int i=0; i < jobs.count(); i++)
767  jobs.at(i)->statusCell = queueTable->item(i, 0);
768 
769  queueTable->selectRow(queueTable->currentRow());
770 
771  jobCount = jobs.count();
772 
773 }
774 
775 void Capture::moveJobUp()
776 {
777  int currentRow = queueTable->currentRow();
778 
779  int columnCount = queueTable->columnCount();
780 
781  if (currentRow <= 0 || queueTable->rowCount() == 1)
782  return;
783 
784  int destinationRow = currentRow - 1;
785 
786  for (int i=0; i < columnCount; i++)
787  {
788  QTableWidgetItem *downItem = queueTable->takeItem(currentRow, i);
789  QTableWidgetItem *upItem = queueTable->takeItem(destinationRow, i);
790 
791  queueTable->setItem(destinationRow, i, downItem);
792  queueTable->setItem(currentRow, i, upItem);
793  }
794 
795  SequenceJob *job = jobs.takeAt(currentRow);
796 
797  jobs.removeOne(job);
798  jobs.insert(destinationRow, job);
799 
800  queueTable->selectRow(destinationRow);
801 
802  for (int i=0; i < jobs.count(); i++)
803  jobs.at(i)->statusCell = queueTable->item(i, 0);
804 
805 }
806 
807 void Capture::moveJobDown()
808 {
809  int currentRow = queueTable->currentRow();
810 
811  int columnCount = queueTable->columnCount();
812 
813  if (currentRow+1 >= queueTable->rowCount() || queueTable->rowCount() == 1)
814  return;
815 
816  int destinationRow = currentRow + 1;
817 
818  for (int i=0; i < columnCount; i++)
819  {
820  QTableWidgetItem *downItem = queueTable->takeItem(currentRow, i);
821  QTableWidgetItem *upItem = queueTable->takeItem(destinationRow, i);
822 
823  queueTable->setItem(destinationRow, i, downItem);
824  queueTable->setItem(currentRow, i, upItem);
825  }
826 
827  SequenceJob *job = jobs.takeAt(currentRow);
828 
829  jobs.removeOne(job);
830  jobs.insert(destinationRow, job);
831 
832  queueTable->selectRow(destinationRow);
833 
834  for (int i=0; i < jobs.count(); i++)
835  jobs.at(i)->statusCell = queueTable->item(i, 0);
836 
837 }
838 
839 void Capture::executeJob(SequenceJob *job)
840 {
841  currentCCD = job->activeCCD;
842  currentFilter = job->activeFilter;
843 
844  targetChip = job->activeChip;
845 
846  targetChip->setBatchMode(!job->preview);
847 
848  targetChip->setShowFITS(job->showFITS);
849 
850  currentCCD->setISOMode(job->isoMode);
851 
852  currentCCD->setSeqPrefix(job->prefix);
853 
854  if (job->filterPos != -1 && currentFilter != NULL)
855  currentFilter->runCommand(INDI_SET_FILTER, &(job->filterPos));
856 
857  seqExpose = job->exposure;
858 
859  if (job->preview)
860  seqTotalCount = -1;
861  else
862  seqTotalCount = job->count;
863 
864  seqDelay = job->delay;
865 
866  seqCurrentCount = 0;
867 
868  job->status = SequenceJob::JOB_BUSY;
869 
870  if (job->preview == false)
871  {
872  fullImgCountOUT->setText( QString::number(seqTotalCount));
873  currentImgCountOUT->setText(QString::number(seqCurrentCount));
874 
875  // set the progress info
876  imgProgress->setEnabled(true);
877  imgProgress->setMaximum(seqTotalCount);
878  imgProgress->setValue(seqCurrentCount);
879 
880  updateSequencePrefix(job->prefix);
881  job->statusCell->setText(job->statusStrings[job->status]);
882  }
883 
884  // Update button status
885  startB->setEnabled(false);
886  stopB->setEnabled(true);
887  previewB->setEnabled(false);
888 
889  pi->startAnimation();
890 
891  activeJob = job;
892 
893  useGuideHead = (targetChip->getType() == ISD::CCDChip::PRIMARY_CCD) ? false : true;
894 
895  captureImage();
896 
897 }
898 
899 
900 }
901 
902 #include "capture.moc"
ISD::CCDChip::getFrameType
CCDFrameType getFrameType()
Definition: indiccd.cpp:336
FITSView::getImageData
FITSImage * getImageData()
Definition: fitsview.h:98
Ekos::SequenceJob::statusStrings
static QStringList statusStrings
Definition: capture.h:39
ISD::CCDChip::getFrameTypes
QStringList getFrameTypes()
Definition: indiccd.h:58
ISD::CCD::setSeqCount
void setSeqCount(int count)
Definition: indiccd.h:95
ISD::CCD::getChip
CCDChip * getChip(CCDChip::ChipType cType)
Definition: indiccd.cpp:872
FITSImage
Definition: fitsimage.h:73
Ekos::SequenceJob
Definition: capture.h:33
ISD::CCDChip
Definition: indiccd.h:23
Ekos::Capture::updateSequencePrefix
void updateSequencePrefix(const QString &newPrefix)
Definition: capture.cpp:523
Ekos::SequenceJob::JOB_DONE
Definition: capture.h:37
ISD::CCDChip::setBinning
bool setBinning(int bin_x, int bin_y)
Definition: indiccd.cpp:477
ISD::GDInterface::runCommand
virtual bool runCommand(int command, void *ptr=NULL)=0
Ekos::Capture::newFITS
void newFITS(IBLOB *bp)
Definition: capture.cpp:361
ISD::GDInterface::getBaseDevice
virtual INDI::BaseDevice * getBaseDevice()=0
Ekos::Capture::CALIBRATE_START
Definition: capture.h:75
ISD::CCD::setFilter
void setFilter(const QString &newFilter)
Definition: indiccd.h:96
capture.h
ISD::GDInterface::getDeviceName
virtual const char * getDeviceName()=0
Ekos::Capture::CALIBRATE_NONE
Definition: capture.h:75
FITS_NORMAL
Definition: fitscommon.h:20
Ekos::Capture::checkCCD
void checkCCD(int CCDNum)
Definition: capture.cpp:196
Ekos::Capture::newLog
void newLog()
FITSView
Definition: fitsview.h:81
ISD::DeviceDecorator::getDeviceName
const char * getDeviceName()
Definition: indistd.cpp:703
Ekos::SequenceJob::JOB_ERROR
Definition: capture.h:37
QProgressIndicator.h
ISD::CCDChip::getImage
FITSView * getImage(FITSMode imageType)
Definition: indiccd.cpp:51
fitsview.h
Ekos::Capture::appendLogText
void appendLogText(const QString &)
Definition: capture.cpp:583
QProgressIndicator::startAnimation
void startAnimation()
Definition: QProgressIndicator.cpp:55
Ekos::Capture::updateCaptureProgress
void updateCaptureProgress(ISD::CCDChip *tChip, double value)
Definition: capture.cpp:597
ISD::CCDChip::PRIMARY_CCD
Definition: indiccd.h:26
Ekos::Capture::addJob
void addJob(bool preview=false)
Definition: capture.cpp:609
ISD::CCDChip::abortExposure
bool abortExposure()
Definition: indiccd.cpp:224
Ekos::Capture::addGuideHead
void addGuideHead(ISD::GDInterface *newCCD)
Definition: capture.cpp:121
QProgressIndicator
The QProgressIndicator class lets an application display a progress indicator to show that a lengthy ...
Definition: QProgressIndicator.h:35
ISD::CCDChip::getType
ChipType getType()
Definition: indiccd.h:46
Ekos::Capture::moveJobDown
void moveJobDown()
Definition: capture.cpp:807
ISD::CCD::setISOMode
void setISOMode(bool enable)
Definition: indiccd.h:93
driverinfo.h
Ekos::Capture::startSequence
void startSequence()
Definition: capture.cpp:144
ISD::CCDChip::setShowFITS
void setShowFITS(bool enable)
Definition: indiccd.h:47
ISD::CCDChip::capture
bool capture(double exposure)
Definition: indiccd.cpp:198
indifilter.h
FITSScale
FITSScale
Definition: fitscommon.h:22
Ekos::Capture::~Capture
~Capture()
Definition: capture.cpp:100
ISD::CCDChip::setBatchMode
void setBatchMode(bool enable)
Definition: indiccd.h:57
ISD::CCDChip::GUIDE_CCD
Definition: indiccd.h:26
Options::fitsDir
static QString fitsDir()
Get FITS Default directory.
Definition: Options.h:695
ISD::CCDChip::setFrameType
bool setFrameType(CCDFrameType fType)
Definition: indiccd.cpp:299
Ekos::SequenceJob::JOB_IDLE
Definition: capture.h:37
ISD::DeviceDecorator::getMinMaxStep
bool getMinMaxStep(const QString &propName, const QString &elementName, double *min, double *max, double *step)
Definition: indistd.cpp:734
Ekos::Capture::clearLog
void clearLog()
Definition: capture.cpp:591
Ekos::Capture::syncFrameType
void syncFrameType(ISD::GDInterface *ccd)
Definition: capture.cpp:299
FITS_FOCUS
Definition: fitscommon.h:20
ISD::CCDChip::getCaptureMode
FITSMode getCaptureMode()
Definition: indiccd.h:53
Options::showFITS
static bool showFITS()
Get Display FITS automatically when an image is captured?
Definition: Options.h:562
i18nc
i18nc("string from libindi, used in the config dialog","100x")
Ekos::Capture::checkFilter
void checkFilter(int filterNum)
Definition: capture.cpp:323
Ekos::Capture::captureImage
void captureImage()
Definition: capture.cpp:455
Ekos::Capture::addFilter
void addFilter(ISD::GDInterface *newFilter)
Definition: capture.cpp:132
ISD::CCDChip::getFrame
bool getFrame(int *x, int *y, int *w, int *h)
Definition: indiccd.cpp:106
QProgressIndicator::stopAnimation
void stopAnimation()
Definition: QProgressIndicator.cpp:63
FITSImage::getImageBuffer
float * getImageBuffer()
Definition: fitsimage.h:91
Options.h
Ekos::Capture::removeJob
void removeJob()
Definition: capture.cpp:744
Ekos::Capture::checkSeqBoundary
void checkSeqBoundary(const KFileItemList &items)
Definition: capture.cpp:541
ISD::CCDChip::getBinning
CCDBinType getBinning()
Definition: indiccd.cpp:394
Ekos::Capture::stopSequence
void stopSequence()
Definition: capture.cpp:166
Ekos::SequenceJob::JOB_BUSY
Definition: capture.h:37
Ekos::Capture::moveJobUp
void moveJobUp()
Definition: capture.cpp:775
FITS_CALIBRATE
Definition: fitscommon.h:20
Ekos::Capture::captureOne
void captureOne()
Definition: capture.cpp:448
ISD::CCDChip::setCaptureFilter
void setCaptureFilter(FITSScale fType)
Definition: indiccd.h:33
ISD::CCD::setSeqPrefix
void setSeqPrefix(const QString &preFix)
Definition: indiccd.h:94
ISD::CCDChip::setCaptureMode
void setCaptureMode(FITSMode mode)
Definition: indiccd.h:32
Ekos::Capture::Capture
Capture()
Definition: capture.cpp:40
fitsviewer.h
FITSImage::subtract
void subtract(float *darkFrame)
Definition: fitsimage.cpp:973
ISD::CCD
Definition: indiccd.h:73
Ekos::Capture::addCCD
void addCCD(ISD::GDInterface *newCCD)
Definition: capture.cpp:105
INDI_SET_FILTER
Definition: indicommon.h:72
FITSViewer::filterTypes
static QStringList filterTypes
Definition: fitsviewer.h:71
FRAME_DARK
Definition: indicommon.h:68
ISD::GDInterface
Definition: indistd.h:48
ISD::CCDChip::setFrame
bool setFrame(int x, int y, int w, int h)
Definition: indiccd.cpp:156
Ekos::SequenceJob::SequenceJob
SequenceJob()
Definition: capture.cpp:29
Ekos::Capture::CALIBRATE_DONE
Definition: capture.h:75
Options::filterAlias
static QStringList filterAlias()
Get Aliases for filter wheel slots.
Definition: Options.h:752
FITS_GUIDE
Definition: fitscommon.h:20
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal