12 #include "driverinfo.h"
13 #include "clientmanager.h"
16 #include "kstars_debug.h"
18 #include <basedevice.h>
20 #include <KLocalizedString>
21 #include <KMessageBox>
25 #include <QPushButton>
26 #include <QFileDialog>
28 #include <QSocketNotifier>
33 #include <QPaintEvent>
34 #include <QCloseEvent>
35 #include <QImageWriter>
36 #include <QImageReader>
55 connect(selectDirB, SIGNAL(clicked()),
this, SLOT(selectRecordDirectory()));
58 void RecordOptions::selectRecordDirectory()
62 dirPath.toLocalFile());
67 recordDirectoryEdit->setText(dir);
74 streamWidth = streamHeight = -1;
75 processStream = colorFrame = isRecording =
false;
77 options =
new RecordOptions(
this);
79 connect(optionsB, SIGNAL(clicked()), options, SLOT(show()));
82 ccd->getSERNameDirectory(filename, directory);
84 double duration = 0.1;
85 bool hasStreamExposure = m_Camera->getStreamExposure(&duration);
86 if (hasStreamExposure)
87 targetFrameDurationSpin->setValue(duration);
90 targetFrameDurationSpin->setEnabled(
false);
91 changeFPSB->setEnabled(
false);
94 options->recordFilenameEdit->setText(filename);
95 options->recordDirectoryEdit->setText(directory);
97 setWindowTitle(
i18nc(
"@title:window",
"%1 Live Video", ccd->getDeviceName()));
110 connect(resetFrameB, SIGNAL(clicked()),
this, SLOT(resetFrame()));
112 recordB->setIcon(recordIcon);
114 connect(recordB, SIGNAL(clicked()),
this, SLOT(toggleRecord()));
115 connect(ccd, SIGNAL(videoRecordToggled(
bool)),
this, SLOT(updateRecordStatus(
bool)));
117 connect(videoFrame, &VideoWG::newSelection,
this, &StreamWG::setStreamingFrame);
118 connect(videoFrame, &VideoWG::imageChanged,
this, &StreamWG::imageChanged);
120 resize(Options::streamWindowWidth(), Options::streamWindowHeight());
122 eoszoom = m_Camera->getProperty(
"eoszoom");
123 if (eoszoom ==
nullptr)
125 zoomLevelCombo->hide();
131 auto tvp = eoszoom->getText();
132 QString zoomLevel = zoomLevelCombo->currentText().
remove(
"x");
134 handLabel->setEnabled(
true);
135 NSSlider->setEnabled(
true);
136 WESlider->setEnabled(
true);
138 m_Camera->sendNewText(tvp);
141 m_Camera->sendNewText(tvp);
147 eoszoomposition = m_Camera->getProperty(
"eoszoomposition");
148 if (eoszoomposition ==
nullptr)
160 auto tvp = eoszoomposition->getText();
163 m_Camera->sendNewText(tvp);
168 auto tvp = eoszoomposition->getText();
171 m_Camera->sendNewText(tvp);
177 connect(m_Camera, SIGNAL(newFPS(
double,
double)),
this, SLOT(updateFPS(
double,
double)));
178 connect(m_Camera, &ISD::Camera::numberUpdated,
this, [
this](INumberVectorProperty * nvp)
180 if (!strcmp(nvp->name,
"CCD_INFO") || !strcmp(nvp->name,
"CCD_CFA"))
181 syncDebayerParameters();
187 m_Camera->setStreamExposure(targetFrameDurationSpin->value());
188 m_Camera->setVideoStreamEnabled(
false);
191 m_Camera->setVideoStreamEnabled(true);
196 debayerB->setIcon(
QIcon(
":/icons/cfa.svg"));
199 m_DebayerActive = !m_DebayerActive;
201 syncDebayerParameters();
204 void StreamWG::syncDebayerParameters()
206 m_DebayerSupported = queryDebayerParameters();
207 debayerB->setEnabled(m_DebayerSupported);
208 m_DebayerActive = m_DebayerSupported;
211 bool StreamWG::queryDebayerParameters()
216 ISD::CameraChip *targetChip = m_Camera->getChip(ISD::CameraChip::PRIMARY_CCD);
222 if (targetChip->getISOList().
isEmpty() ==
false)
228 if (targetChip->getImageInfo(w, h, pixelX, pixelY, m_BBP) ==
false)
237 if (targetChip->getBayerInfo(offsetX, offsetY, pattern) ==
false)
240 m_DebayerParams.method = DC1394_BAYER_METHOD_NEAREST;
241 m_DebayerParams.filter = DC1394_COLOR_FILTER_RGGB;
243 if (pattern ==
"GBRG")
244 m_DebayerParams.filter = DC1394_COLOR_FILTER_GBRG;
245 else if (pattern ==
"GRBG")
246 m_DebayerParams.filter = DC1394_COLOR_FILTER_GRBG;
247 else if (pattern ==
"BGGR")
248 m_DebayerParams.filter = DC1394_COLOR_FILTER_BGGR;
255 QSize size(Options::streamWindowWidth(), Options::streamWindowHeight());
265 zoomLevelCombo->setCurrentIndex(0);
273 processStream =
false;
275 Options::setStreamWindowWidth(width());
276 Options::setStreamWindowHeight(height());
283 void StreamWG::setColorFrame(
bool color)
288 void StreamWG::enableStream(
bool enable)
292 processStream =
true;
297 processStream =
false;
299 avgFPS->setText(
"--");
304 void StreamWG::setSize(
int wd,
int ht)
306 if (wd != streamWidth || ht != streamHeight)
311 NSSlider->setMaximum(ht);
312 NSSlider->setSingleStep(ht / 30);
313 WESlider->setMaximum(wd);
314 WESlider->setSingleStep(wd / 30);
316 videoFrame->setSize(wd, ht);
326 void StreamWG::updateRecordStatus(
bool enabled)
328 if ((enabled && isRecording) || (!enabled && !isRecording))
331 isRecording = enabled;
335 recordB->setIcon(stopIcon);
336 recordB->setToolTip(
i18n(
"Stop recording"));
340 recordB->setIcon(recordIcon);
341 recordB->setToolTip(
i18n(
"Start recording"));
345 void StreamWG::toggleRecord()
349 recordB->setIcon(recordIcon);
351 recordB->setToolTip(
i18n(
"Start recording"));
353 m_Camera->stopRecording();
358 m_Camera->getSERNameDirectory(filename, directory);
359 if (filename != options->recordFilenameEdit->text() ||
360 directory != options->recordDirectoryEdit->text())
362 m_Camera->setSERNameDirectory(options->recordFilenameEdit->text(), options->recordDirectoryEdit->text());
364 m_Camera->setConfig(SAVE_CONFIG);
367 if (options->recordUntilStoppedR->isChecked())
369 isRecording = m_Camera->startRecording();
371 else if (options->recordDurationR->isChecked())
373 isRecording = m_Camera->startDurationRecording(options->durationSpin->value());
377 isRecording = m_Camera->startFramesRecording(options->framesSpin->value());
382 recordB->setIcon(stopIcon);
383 recordB->setToolTip(
i18n(
"Stop recording"));
388 void StreamWG::newFrame(IBLOB *bp)
390 bool rc = (m_DebayerActive
391 && !strcmp(bp->format,
".stream")) ? videoFrame->newBayerFrame(bp, m_DebayerParams) : videoFrame->newFrame(bp);
394 qCWarning(KSTARS) <<
"Failed to load video frame.";
397 void StreamWG::resetFrame()
399 m_Camera->resetStreamingFrame();
402 void StreamWG::setStreamingFrame(
QRect newFrame)
413 int w = newFrame.
width();
420 m_Camera->setStreamingFrame(newFrame.
x(), newFrame.
y(), w, newFrame.
height());
423 void StreamWG::updateFPS(
double instantFPS,
double averageFPS)