@@ -157,48 +157,49 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}
# Enable C++11 support, fail if not supported
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
# default version
set(VERSION_STRING "0.10.0")
set(VERSION_REVISION "0")
# get revision number from mercurial and parse version string
include(GetVersion)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_STRING=\\\"${VERSION_STRING}\\\" ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_MAJOR=${VERSION_MAJOR} ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_MINOR=${VERSION_MINOR} ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_PATCH=${VERSION_PATCH} ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION_REVISION=\\\"${VERSION_REVISION}\\\" ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPROGRAM_NAME=\\\"${PROGRAM_NAME}\\\" ")
# add make run target
add_custom_target(run
COMMAND ${PROGRAM_NAME}
DEPENDS ${PROGRAM_NAME}
WORKING_DIRECTORY ${CMAKE_PROJECT_DIR}
)
# installing
install(TARGETS ${PROGRAM_NAME} DESTINATION bin)
# for windows put libraries to install directory
if (WIN32)
file(GLOB WINDOWS_INSTALL_LIBRARIES
"${CMAKE_BINARY_DIR}/windows_install_libraries/*.*")
install(FILES ${WINDOWS_INSTALL_LIBRARIES} DESTINATION bin)
endif (WIN32)
# prepare menu item and icon
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/misc/program_name.desktop.in"
"${CMAKE_BINARY_DIR}/${PROGRAM_NAME}.desktop")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/misc/program_name.png"
"${CMAKE_BINARY_DIR}/${PROGRAM_NAME}.png" COPYONLY)
/*
Copyright © 2017 Hasan Yavuz Özderya
This file is part of serialplot.
serialplot is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
serialplot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with serialplot. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QApplication>
#include <QtGlobal>
#include <iostream>
#include "mainwindow.h"
#include "tooltipfilter.h"
#include "version.h"
MainWindow* pMainWindow;
MainWindow* pMainWindow = nullptr;
void messageHandler(QtMsgType type, const QMessageLogContext &context,
const QString &msg)
{
// TODO: don't call MainWindow::messageHandler if window is destroyed
pMainWindow->messageHandler(type, context, msg);
QString logString;
switch (type)
#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
case QtInfoMsg:
logString = "[Info] " + msg;
break;
#endif
case QtDebugMsg:
logString = "[Debug] " + msg;
case QtWarningMsg:
logString = "[Warning] " + msg;
case QtCriticalMsg:
logString = "[Error] " + msg;
case QtFatalMsg:
logString = "[Fatal] " + msg;
}
std::cerr << logString.toStdString() << std::endl;
if (pMainWindow != nullptr)
pMainWindow->messageHandler(type, logString, msg);
if (type == QtFatalMsg)
__builtin_trap();
int main(int argc, char *argv[])
QApplication a(argc, argv);
QApplication::setApplicationName(PROGRAM_NAME);
QApplication::setApplicationVersion(VERSION_STRING);
qInstallMessageHandler(messageHandler);
MainWindow w;
pMainWindow = &w;
ToolTipFilter ttf;
a.installEventFilter(&ttf);
// log application information
qDebug() << "SerialPlot" << VERSION_STRING;
qDebug() << "Revision" << VERSION_REVISION;
w.show();
return a.exec();
@@ -8,52 +8,55 @@
#include "ui_mainwindow.h"
#include <QByteArray>
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>
#include <QTextStream>
#include <QMenu>
#include <QDesktopServices>
#include <QMap>
#include <QtDebug>
#include <QCommandLineParser>
#include <QFileInfo>
#include <qwt_plot.h>
#include <limits.h>
#include <cmath>
#include <cstdlib>
#include <plot.h>
#include <barplot.h>
#include "framebufferseries.h"
#include "utils.h"
#include "defines.h"
#include "setting_defines.h"
#if defined(Q_OS_WIN) && defined(QT_STATIC)
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
// TODO: depends on tab insertion order, a better solution would be to use object names
const QMap<int, QString> panelSettingMap({
{0, "Port"},
{1, "DataFormat"},
{2, "Plot"},
{3, "Commands"},
{4, "Record"},
{5, "TextView"},
{6, "Log"}
@@ -230,98 +233,100 @@ MainWindow::MainWindow(QWidget *parent)
plotControlPanel.xMin(), plotControlPanel.xMax());
plotMan->setNumOfSamples(numOfSamples);
plotMan->setPlotWidth(plotControlPanel.plotWidth());
// Init sps (sample per second) counter
spsLabel.setText("0sps");
spsLabel.setToolTip("samples per second (per channel)");
ui->statusBar->addPermanentWidget(&spsLabel);
connect(&sampleCounter, &SampleCounter::spsChanged,
this, &MainWindow::onSpsChanged);
// init demo
QObject::connect(ui->actionDemoMode, &QAction::toggled,
this, &MainWindow::enableDemo);
plotMan, &PlotManager::showDemoIndicator);
// init stream connections
connect(&dataFormatPanel, &DataFormatPanel::sourceChanged,
this, &MainWindow::onSourceChanged);
onSourceChanged(dataFormatPanel.activeSource());
// load default settings
QSettings settings("serialplot", "serialplot");
QSettings settings(PROGRAM_NAME, PROGRAM_NAME);
loadAllSettings(&settings);
handleCommandLineOptions(*QApplication::instance());
// 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::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);
@@ -453,86 +458,58 @@ void MainWindow::onExportCsv()
bool wasPaused = ui->actionPause->isChecked();
ui->actionPause->setChecked(true); // pause plotting
QString fileName = QFileDialog::getSaveFileName(this, tr("Export CSV File"));
if (fileName.isNull()) // user canceled export
ui->actionPause->setChecked(wasPaused);
Snapshot* snapshot = snapshotMan.makeSnapshot();
snapshot->save(fileName);
delete snapshot;
PlotViewSettings MainWindow::viewSettings() const
return plotMenu.viewSettings();
void MainWindow::messageHandler(QtMsgType type,
const QMessageLogContext &context,
const QString &logString,
if (ui != NULL) ui->ptLog->appendPlainText(logString);
if (ui != NULL)
ui->ptLog->appendPlainText(logString);
if (type != QtDebugMsg && ui != NULL)
ui->statusBar->showMessage(msg, 5000);
void MainWindow::saveAllSettings(QSettings* settings)
saveMWSettings(settings);
portControl.saveSettings(settings);
dataFormatPanel.saveSettings(settings);
stream.saveSettings(settings);
plotControlPanel.saveSettings(settings);
plotMenu.saveSettings(settings);
commandPanel.saveSettings(settings);
recordPanel.saveSettings(settings);
textView.saveSettings(settings);
updateCheckDialog.saveSettings(settings);
void MainWindow::loadAllSettings(QSettings* settings)
loadMWSettings(settings);
portControl.loadSettings(settings);
dataFormatPanel.loadSettings(settings);
stream.loadSettings(settings);
plotControlPanel.loadSettings(settings);
plotMenu.loadSettings(settings);
@@ -595,24 +572,77 @@ void MainWindow::loadMWSettings(QSetting
void MainWindow::onSaveSettings()
QString fileName = QFileDialog::getSaveFileName(
this, tr("Save Settings"), QString(), "INI (*.ini)");
if (!fileName.isNull()) // user canceled
QSettings settings(fileName, QSettings::IniFormat);
void MainWindow::onLoadSettings()
QString fileName = QFileDialog::getOpenFileName(
this, tr("Load Settings"), QString(), "INI (*.ini)");
void MainWindow::handleCommandLineOptions(const QCoreApplication &app)
QCommandLineParser parser;
parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsCompactedShortOptions);
parser.setApplicationDescription("Small and simple software for plotting data from serial port in realtime.");
parser.addHelpOption();
parser.addVersionOption();
QCommandLineOption configOpt({"c", "config"}, "Load configuration from file.", "filename");
QCommandLineOption portOpt({"p", "port"}, "Set port name.", "port name");
QCommandLineOption baudrateOpt({"b" ,"baudrate"}, "Set port baud rate.", "baud rate");
QCommandLineOption openPortOpt({"o", "open"}, "Open serial port.");
parser.addOption(configOpt);
parser.addOption(portOpt);
parser.addOption(baudrateOpt);
parser.addOption(openPortOpt);
parser.process(app);
if (parser.isSet(configOpt))
QString fileName = parser.value(configOpt);
QFileInfo fileInfo(fileName);
if (fileInfo.exists() && fileInfo.isFile())
qCritical() << "Configuration file not exist. Closing application.";
std::exit(1);
if (parser.isSet(portOpt))
portControl.selectPort(parser.value(portOpt));
if (parser.isSet(baudrateOpt))
portControl.selectBaudrate(parser.value(baudrateOpt));
if (parser.isSet(openPortOpt))
portControl.openPort();
@@ -41,79 +41,80 @@
#include "recordpanel.h"
#include "ui_about_dialog.h"
#include "stream.h"
#include "snapshotmanager.h"
#include "plotmanager.h"
#include "plotmenu.h"
#include "updatecheckdialog.h"
#include "samplecounter.h"
#include "datatextview.h"
namespace Ui {
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
PlotViewSettings viewSettings() const;
const QString &msg);
void messageHandler(QtMsgType type, const QString &logString, const QString &msg);
private:
Ui::MainWindow *ui;
QDialog aboutDialog;
void setupAboutDialog();
QSerialPort serialPort;
PortControl portControl;
unsigned int numOfSamples;
QList<QwtPlotCurve*> curves;
// ChannelManager channelMan;
Stream stream;
PlotManager* plotMan;
QWidget* secondaryPlot;
SnapshotManager snapshotMan;
SampleCounter sampleCounter;
QLabel spsLabel;
CommandPanel commandPanel;
DataFormatPanel dataFormatPanel;
RecordPanel recordPanel;
PlotControlPanel plotControlPanel;
PlotMenu plotMenu;
DataTextView textView;
UpdateCheckDialog updateCheckDialog;
void handleCommandLineOptions(const QCoreApplication &app);
/// Returns true if demo is running
bool isDemoRunning();
/// Display a secondary plot in the splitter, removing and
/// deleting previous one if it exists
void showSecondary(QWidget* wid);
/// Hide secondary plot
void hideSecondary();
/// Stores settings for all modules
void saveAllSettings(QSettings* settings);
/// Load settings for all modules
void loadAllSettings(QSettings* settings);
/// Stores main window settings into a `QSettings`
void saveMWSettings(QSettings* settings);
/// Loads main window settings from a `QSettings`
void loadMWSettings(QSettings* settings);
/// `QWidget::closeEvent` handler
void closeEvent(QCloseEvent * event);
private slots:
void onPortToggled(bool open);
void onSourceChanged(Source* source);
void onNumOfSamplesChanged(int value);
@@ -58,61 +58,61 @@ PortControl::PortControl(QSerialPort* po
QObject::connect(&openAction, &QAction::triggered,
this, &PortControl::openActionTriggered);
loadPortListAction.setToolTip("Reload port list");
QObject::connect(&loadPortListAction, &QAction::triggered,
[this](bool checked){loadPortList();});
// setup toolbar
portToolBar.addWidget(&tbPortList);
portToolBar.addAction(&loadPortListAction);
portToolBar.addAction(&openAction);
// setup port selection widgets
tbPortList.setMinimumWidth(TBPORTLIST_MINWIDTH);
tbPortList.setModel(&portList);
ui->cbPortList->setModel(&portList);
QObject::connect(ui->cbPortList,
SELECT<int>::OVERLOAD_OF(&QComboBox::activated),
this, &PortControl::onCbPortListActivated);
QObject::connect(&tbPortList,
this, &PortControl::onTbPortListActivated);
SELECT<const QString&>::OVERLOAD_OF(&QComboBox::activated),
this, &PortControl::selectPort);
this, &PortControl::selectListedPort);
// setup buttons
ui->pbOpenPort->setDefaultAction(&openAction);
ui->pbReloadPorts->setDefaultAction(&loadPortListAction);
// setup baud rate selection widget
QObject::connect(ui->cbBaudRate,
this, &PortControl::selectBaudRate);
this, &PortControl::_selectBaudRate);
// setup parity selection buttons
parityButtons.addButton(ui->rbNoParity, (int) QSerialPort::NoParity);
parityButtons.addButton(ui->rbEvenParity, (int) QSerialPort::EvenParity);
parityButtons.addButton(ui->rbOddParity, (int) QSerialPort::OddParity);
QObject::connect(&parityButtons,
SELECT<int>::OVERLOAD_OF(&QButtonGroup::buttonClicked),
this, &PortControl::selectParity);
// setup data bits selection buttons
dataBitsButtons.addButton(ui->rb8Bits, (int) QSerialPort::Data8);
dataBitsButtons.addButton(ui->rb7Bits, (int) QSerialPort::Data7);
dataBitsButtons.addButton(ui->rb6Bits, (int) QSerialPort::Data6);
dataBitsButtons.addButton(ui->rb5Bits, (int) QSerialPort::Data5);
QObject::connect(&dataBitsButtons,
this, &PortControl::selectDataBits);
// setup stop bits selection buttons
stopBitsButtons.addButton(ui->rb1StopBit, (int) QSerialPort::OneStop);
stopBitsButtons.addButton(ui->rb2StopBit, (int) QSerialPort::TwoStop);
@@ -177,49 +177,49 @@ PortControl::~PortControl()
void PortControl::loadPortList()
QString currentSelection = ui->cbPortList->currentData(PortNameRole).toString();
portList.loadPortList();
int index = portList.indexOf(currentSelection);
if (index >= 0)
ui->cbPortList->setCurrentIndex(index);
tbPortList.setCurrentIndex(index);
void PortControl::loadBaudRateList()
ui->cbBaudRate->clear();
for (auto baudRate : QSerialPortInfo::standardBaudRates())
ui->cbBaudRate->addItem(QString::number(baudRate));
void PortControl::selectBaudRate(QString baudRate)
void PortControl::_selectBaudRate(QString baudRate)
if (serialPort->isOpen())
if (!serialPort->setBaudRate(baudRate.toInt()))
qCritical() << "Can't set baud rate!";
void PortControl::selectParity(int parity)
if(!serialPort->setParity((QSerialPort::Parity) parity))
qCritical() << "Can't set parity option!";
void PortControl::selectDataBits(int dataBits)
@@ -268,73 +268,80 @@ void PortControl::togglePort()
// in the portList if user hasn't pressed Enter
// Also note that, portText may not be the `portName`
QString portText = ui->cbPortList->currentText();
QString portName;
int portIndex = portList.indexOf(portText);
if (portIndex < 0) // not in list, add to model and update the selections
portList.appendRow(new PortListItem(portText));
ui->cbPortList->setCurrentIndex(portList.rowCount()-1);
tbPortList.setCurrentIndex(portList.rowCount()-1);
portName = portText;
// get the port name from the data field
portName = static_cast<PortListItem*>(portList.item(portIndex))->portName();
serialPort->setPortName(ui->cbPortList->currentData(PortNameRole).toString());
// open port
if (serialPort->open(QIODevice::ReadWrite))
// set port settings
selectBaudRate(ui->cbBaudRate->currentText());
_selectBaudRate(ui->cbBaudRate->currentText());
selectParity((QSerialPort::Parity) parityButtons.checkedId());
selectDataBits((QSerialPort::DataBits) dataBitsButtons.checkedId());
selectStopBits((QSerialPort::StopBits) stopBitsButtons.checkedId());
selectFlowControl((QSerialPort::FlowControl) flowControlButtons.checkedId());
// set output signals
serialPort->setDataTerminalReady(ui->ledDTR->isOn());
serialPort->setRequestToSend(ui->ledRTS->isOn());
// update pin signals
updatePinLeds();
pinUpdateTimer.start();
qDebug() << "Opened port:" << serialPort->portName();
emit portToggled(true);
openAction.setChecked(serialPort->isOpen());
void PortControl::selectPort(QString portName)
void PortControl::selectListedPort(QString portName)
// portName may be coming from combobox
portName = portName.split(" ")[0];
QSerialPortInfo portInfo(portName);
if (portInfo.isNull())
qWarning() << "Device doesn't exists:" << portName;
// has selection actually changed
if (portName != serialPort->portName())
// if another port is already open, close it by toggling
togglePort();
// open new selection by toggling
QString PortControl::selectedPortName()
if (portIndex < 0) // not in the list yet
// return the displayed name as port name
return portText;
@@ -449,90 +456,127 @@ void PortControl::updatePinLeds(void)
QString PortControl::currentParityText()
return paritySettingMap.value(
(QSerialPort::Parity) parityButtons.checkedId());
QString PortControl::currentFlowControlText()
if (flowControlButtons.checkedId() == QSerialPort::HardwareControl)
return "hardware";
else if (flowControlButtons.checkedId() == QSerialPort::SoftwareControl)
return "software";
else // no parity
return "none";
int portIndex = portList.indexOfName(portName);
portList.appendRow(new PortListItem(portName));
portIndex = portList.rowCount()-1;
ui->cbPortList->setCurrentIndex(portIndex);
tbPortList.setCurrentIndex(portIndex);
selectListedPort(portName);
void PortControl::selectBaudrate(QString baudRate)
int baudRateIndex = ui->cbBaudRate->findText(baudRate);
if (baudRateIndex < 0)
ui->cbBaudRate->setCurrentText(baudRate);
ui->cbBaudRate->setCurrentIndex(baudRateIndex);
_selectBaudRate(baudRate);
void PortControl::openPort()
if (!serialPort->isOpen())
openAction.trigger();
void PortControl::saveSettings(QSettings* settings)
settings->beginGroup(SettingGroup_Port);
settings->setValue(SG_Port_SelectedPort, selectedPortName());
settings->setValue(SG_Port_BaudRate, ui->cbBaudRate->currentText());
settings->setValue(SG_Port_Parity, currentParityText());
settings->setValue(SG_Port_DataBits, dataBitsButtons.checkedId());
settings->setValue(SG_Port_StopBits, stopBitsButtons.checkedId());
settings->setValue(SG_Port_FlowControl, currentFlowControlText());
settings->endGroup();
void PortControl::loadSettings(QSettings* settings)
// make sure the port is closed
if (serialPort->isOpen()) togglePort();
// set port name if it exists in the current list otherwise ignore
QString portName = settings->value(SG_Port_SelectedPort, QString()).toString();
if (!portName.isEmpty())
int index = portList.indexOfName(portName);
if (index > -1) ui->cbPortList->setCurrentIndex(index);
// load baud rate setting if it exists in baud rate list
QString baudSetting = settings->value(
SG_Port_BaudRate, ui->cbBaudRate->currentText()).toString();
int baudIndex = ui->cbBaudRate->findText(baudSetting);
if (baudIndex > -1) ui->cbBaudRate->setCurrentIndex(baudIndex);
// load parity setting
QString parityText =
settings->value(SG_Port_Parity, currentParityText()).toString();
QSerialPort::Parity paritySetting = paritySettingMap.key(
parityText, (QSerialPort::Parity) parityButtons.checkedId());
parityButtons.button(paritySetting)->setChecked(true);
// load number of bits
int dataBits = settings->value(SG_Port_Parity, dataBitsButtons.checkedId()).toInt();
int dataBits = settings->value(SG_Port_DataBits, dataBitsButtons.checkedId()).toInt();
if (dataBits >=5 && dataBits <= 8)
dataBitsButtons.button((QSerialPort::DataBits) dataBits)->setChecked(true);
// load stop bits
int stopBits = settings->value(SG_Port_StopBits, stopBitsButtons.checkedId()).toInt();
if (stopBits == QSerialPort::OneStop)
ui->rb1StopBit->setChecked(true);
else if (stopBits == QSerialPort::TwoStop)
ui->rb2StopBit->setChecked(true);
// load flow control
QString flowControlSetting =
settings->value(SG_Port_FlowControl, currentFlowControlText()).toString();
if (flowControlSetting == "hardware")
ui->rbHardwareControl->setChecked(true);
else if (flowControlSetting == "software")
@@ -26,77 +26,80 @@
#include <QStringList>
#include <QToolBar>
#include <QAction>
#include <QComboBox>
#include <QSettings>
#include <QTimer>
#include "portlist.h"
class PortControl;
class PortControl : public QWidget
explicit PortControl(QSerialPort* port, QWidget* parent = 0);
~PortControl();
QSerialPort* serialPort;
QToolBar* toolBar();
void selectPort(QString portName);
void selectBaudrate(QString baudRate);
void openPort();
/// Stores port settings into a `QSettings`
void saveSettings(QSettings* settings);
/// Loads port settings from a `QSettings`. If open serial port is closed.
void loadSettings(QSettings* settings);
Ui::PortControl *ui;
QButtonGroup parityButtons;
QButtonGroup dataBitsButtons;
QButtonGroup stopBitsButtons;
QButtonGroup flowControlButtons;
QToolBar portToolBar;
QAction openAction;
QAction loadPortListAction;
QComboBox tbPortList;
PortList portList;
/// Used to refresh pinout signal leds periodically
QTimer pinUpdateTimer;
/// Returns the currently selected (entered) "portName" in the UI
QString selectedPortName();
/// Returns currently selected parity as text to be saved in settings
QString currentParityText();
/// Returns currently selected flow control as text to be saved in settings
QString currentFlowControlText();
public slots:
void loadPortList();
void loadBaudRateList();
void togglePort();
void selectListedPort(QString portName);
void selectBaudRate(QString baudRate);
void _selectBaudRate(QString baudRate);
void selectParity(int parity); // parity must be one of QSerialPort::Parity
void selectDataBits(int dataBits); // bits must be one of QSerialPort::DataBits
void selectStopBits(int stopBits); // stopBits must be one of QSerialPort::StopBits
void selectFlowControl(int flowControl); // flowControl must be one of QSerialPort::FlowControl
void openActionTriggered(bool checked);
void onCbPortListActivated(int index);
void onTbPortListActivated(int index);
void onPortError(QSerialPort::SerialPortError error);
void updatePinLeds(void);
signals:
void portToggled(bool open);
};
#endif // PORTCONTROL_H
Status change: