@@ -190,194 +190,193 @@ MainWindow::MainWindow(QWidget *parent)
QObject::connect(&recordPanel, &RecordPanel::recordPausedChanged,
[this](bool enabled)
{
if (ui->actionPause->isChecked() && enabled)
dataFormatPanel.pause(false);
}
});
connect(&serialPort, &QIODevice::aboutToClose,
&recordPanel, &RecordPanel::onPortClose);
// init data arrays and plot
numOfSamples = plotControlPanel.numOfSamples();
unsigned numOfChannels = dataFormatPanel.numOfChannels();
channelMan.setNumOfSamples(numOfSamples);
channelMan.setNumOfChannels(dataFormatPanel.numOfChannels());
connect(&dataFormatPanel, &DataFormatPanel::numOfChannelsChanged,
&channelMan, &ChannelManager::setNumOfChannels);
connect(&channelMan, &ChannelManager::numOfChannelsChanged,
this, &MainWindow::onNumOfChannelsChanged);
plotControlPanel.setChannelInfoModel(channelMan.infoModel());
// init curve list
for (unsigned int i = 0; i < numOfChannels; i++)
plotMan->addCurve(channelMan.channelName(i), channelMan.channelBuffer(i));
// init scales
plotMan->setYAxis(plotControlPanel.autoScale(),
plotControlPanel.yMin(), plotControlPanel.yMax());
plotMan->setXAxis(plotControlPanel.xAxisAsIndex(),
plotControlPanel.xMin(), plotControlPanel.xMax());
plotMan->setNumOfSamples(numOfSamples);
// Init sps (sample per second) counter
spsLabel.setText("0sps");
spsLabel.setToolTip("samples per second (per channel)");
ui->statusBar->addPermanentWidget(&spsLabel);
QObject::connect(&dataFormatPanel,
&DataFormatPanel::samplesPerSecondChanged,
this, &MainWindow::onSpsChanged);
// init demo
QObject::connect(ui->actionDemoMode, &QAction::toggled,
this, &MainWindow::enableDemo);
plotMan, &PlotManager::showDemoIndicator);
// load default settings
QSettings settings("serialplot", "serialplot");
loadAllSettings(&settings);
// ensure command panel has 1 command if none loaded
if (!commandPanel.numOfCommands())
commandPanel.newCommandAction()->trigger();
// Important: This should be after newCommandAction is triggered
// (above) we don't want user to be greeted with command panel on
// the very first run.
connect(commandPanel.newCommandAction(), &QAction::triggered, [this]()
this->ui->tabWidget->setCurrentWidget(&commandPanel);
this->ui->tabWidget->showTabs();
MainWindow::~MainWindow()
if (serialPort.isOpen())
serialPort.close();
delete plotMan;
delete ui;
ui = NULL; // we check if ui is deleted in messageHandler
void MainWindow::closeEvent(QCloseEvent * event)
// save snapshots
if (!snapshotMan.isAllSaved())
auto clickedButton = QMessageBox::warning(
this, "Closing SerialPlot",
"There are un-saved snapshots. If you close you will loose the data.",
QMessageBox::Discard | QMessageBox::Discard,
QMessageBox::Cancel);
QMessageBox::Discard, QMessageBox::Cancel);
if (clickedButton == QMessageBox::Cancel)
event->ignore();
return;
// save settings
saveAllSettings(&settings);
settings.sync();
if (settings.status() != QSettings::NoError)
QString errorText;
if (settings.status() == QSettings::AccessError)
QString file = settings.fileName();
errorText = QString("Serialplot cannot save settings due to access error. \
This happens if you have run serialplot as root (with sudo for ex.) previously. \
Try fixing the permissions of file: %1, or just delete it.").arg(file);
else
errorText = QString("Serialplot cannot save settings due to unknown error: %1").\
arg(settings.status());
auto button = QMessageBox::critical(
NULL,
"Failed to save settings!", errorText,
QMessageBox::Cancel | QMessageBox::Ok);
if (button == QMessageBox::Cancel)
QMainWindow::closeEvent(event);
void MainWindow::setupAboutDialog()
Ui_AboutDialog uiAboutDialog;
uiAboutDialog.setupUi(&aboutDialog);
QObject::connect(uiAboutDialog.pbAboutQt, &QPushButton::clicked,
[](){ QApplication::aboutQt();});
QString aboutText = uiAboutDialog.lbAbout->text();
aboutText.replace("$VERSION_STRING$", VERSION_STRING);
aboutText.replace("$VERSION_REVISION$", VERSION_REVISION);
uiAboutDialog.lbAbout->setText(aboutText);
void MainWindow::onPortToggled(bool open)
// make sure demo mode is disabled
if (open && isDemoRunning()) enableDemo(false);
ui->actionDemoMode->setEnabled(!open);
void MainWindow::onPortError(QSerialPort::SerialPortError error)
switch(error)
case QSerialPort::NoError :
break;
case QSerialPort::ResourceError :
qWarning() << "Port error: resource unavaliable; most likely device removed.";
qWarning() << "Closing port on resource error: " << serialPort.portName();
portControl.togglePort();
portControl.loadPortList();
case QSerialPort::DeviceNotFoundError:
qCritical() << "Device doesn't exists: " << serialPort.portName();
case QSerialPort::PermissionError:
qCritical() << "Permission denied. Either you don't have \
required privileges or device is already opened by another process.";
case QSerialPort::OpenError:
qWarning() << "Device is already opened!";
case QSerialPort::NotOpenError:
qCritical() << "Device is not open!";
case QSerialPort::ParityError:
qCritical() << "Parity error detected.";
Status change: