Skip to content

Commit

Permalink
V1.2.0
Browse files Browse the repository at this point in the history
oscilloscope模块改用Qt Charts做波形显示。修复了oscilloscope的一些bug。增加一些功能。
gztss committed Mar 13, 2018
1 parent f5db6f8 commit 3ff9739
Showing 37 changed files with 835 additions and 37,531 deletions.
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -24,15 +24,21 @@ SerialTool是一个实用的串口调试工具,这款工具支持串口调试

## 项目信息

* 下位机示例代码在[.\SerialTool\slave](https://github.com/Le-Seul/SerialTool/tree/master/SerialTool/slave)目录下,该目录有两个文件:
* [sendwave.c](https://github.com/Le-Seul/SerialTool/blob/master/SerialTool/slave/sendwave.c)
* [sendwave.h](https://github.com/Le-Seul/SerialTool/blob/master/SerialTool/slave/sendwave.h)
* 本项目使用的Qt库为Qt 5.6.1 for Visual Studio 2015和Qt 5.6.2 for MinGW
* 下位机示例代码在[./SerialTool/slave](./SerialTool/slave)目录下,该目录有两个文件:
* [sendwave.c](./SerialTool/slave/sendwave.c)
* [sendwave.h](./SerialTool/slave/sendwave.h)
* 跟随本项目发布的可执行文件安装包使用Qt 5.6.3 for MinGW编译。
* 使用的插件:
* QScintilla: [Documentation](http://pyqt.sourceforge.net/Docs/QScintilla2), [Download](https://riverbankcomputing.com/software/qscintilla/download)
* [QCustomPlot](http://www.qcustomplot.com/): 源码已经包含到项目中
* Qt Charts: 此插件在Qt 5.7以及更高的版本中包含在Qt安装文件中,使用Qt 5.6时需要自行编译。
* 其他信息参看[readme.txt](https://github.com/Le-Seul/SerialTool/blob/master/readme.txt)文件

## 开源协议

本程序使用GPL协议发布,但是[./SerialTool/slave](./SerialTool/slave)目录下的源码受该协议约束,用户可以随意使用。

[License](./LICENSE)

## 文档

[SerialTool使用说明](./SerialTool/doc/index.md)
12 changes: 6 additions & 6 deletions SerialTool/SerialTool.pro
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
#
#-------------------------------------------------

QT += core widgets printsupport serialport gui network
QT += core gui widgets serialport network charts

TARGET = SerialTool
TEMPLATE = app
@@ -34,7 +34,6 @@ SOURCES += \
source/main.cpp \
source/optionsbox.cpp \
source/portsetbox.cpp \
source/qcustomplot.cpp \
source/serialtool.cpp\
source/textedit.cpp \
source/wavedecode.cpp \
@@ -48,14 +47,14 @@ SOURCES += \
source/oscopetimestamp.cpp \
source/terminalview.cpp \
source/serialport.cpp \
source/docmentdialog.cpp
source/docmentdialog.cpp \
source/pointdatabuffer.cpp

HEADERS += \
include/aboutbox.h \
include/channelitem.h \
include/optionsbox.h \
include/portsetbox.h \
include/qcustomplot.h \
include/serialtool.h \
include/textedit.h \
include/version.h \
@@ -71,7 +70,8 @@ HEADERS += \
include/oscopetimestamp.h \
include/terminalview.h \
include/serialport.h \
include/docmentdialog.h
include/docmentdialog.h \
include/pointdatabuffer.h

DISTFILES += \
resource/images/clear.png \
@@ -101,4 +101,4 @@ FORMS += \
ui/serialport.ui \
ui/docmentdialog.ui

LIBS += -lqscintilla2
LIBS += -lqscintilla2_qt5
4 changes: 2 additions & 2 deletions SerialTool/doc/plot_protocol.html
Original file line number Diff line number Diff line change
@@ -81,7 +81,7 @@ <h2 id="时间戳">时间戳</h2>
<a class="sourceLine" id="cb6-5" data-line-number="5"> <span class="dt">uint8_t</span> hour; <span class="co">// hour, 0 ~ 23</span></a>
<a class="sourceLine" id="cb6-6" data-line-number="6"> <span class="dt">uint8_t</span> min; <span class="co">// minute, 0 ~ 59</span></a>
<a class="sourceLine" id="cb6-7" data-line-number="7"> <span class="dt">uint8_t</span> sec; <span class="co">// second, 0 ~ 59</span></a>
<a class="sourceLine" id="cb6-8" data-line-number="8"> <span class="dt">uint16_t</span> msec; <span class="co">// millisecond, 0 ~ 1000</span></a>
<a class="sourceLine" id="cb6-8" data-line-number="8"> <span class="dt">uint16_t</span> msec; <span class="co">// millisecond, 0 ~ 999</span></a>
<a class="sourceLine" id="cb6-9" data-line-number="9"> <span class="dt">uint32_t</span> sampleRate; <span class="co">// sample rate, 0 ~ 2000000</span></a>
<a class="sourceLine" id="cb6-10" data-line-number="10">} ws_timestamp_t;</a></code></pre></div>
<p>发送时间戳的例程如下:</p>
@@ -151,6 +151,6 @@ <h2 id="移植">移植</h2>
<a class="sourceLine" id="cb9-3" data-line-number="3"><span class="kw">typedef</span> <span class="dt">signed</span> <span class="dt">char</span> <span class="dt">int8_t</span>;</a>
<a class="sourceLine" id="cb9-4" data-line-number="4"><span class="kw">typedef</span> <span class="dt">signed</span> <span class="dt">short</span> <span class="dt">int16_t</span>;</a>
<a class="sourceLine" id="cb9-5" data-line-number="5"><span class="kw">typedef</span> <span class="dt">signed</span> <span class="dt">long</span> <span class="dt">int32_t</span>;</a></code></pre></div>
<p>用户一般不会使用到所有的API,例如您可能不需要使用<code>ws_point_float()</code>以及<code>ws_add_float()</code>函数。通常,编译器不会连接未用到的函数。编译器如果会连接从未被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。</p>
<p>用户一般不会使用到所有的API,例如您可能不需要使用<code>ws_point_float()</code>以及<code>ws_add_float()</code>函数。通常,编译器不会链接未用到的函数。编译器如果会链接从未被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。</p>
<p>如果您在移植串口示波器的协议时遇到了任何问题,您也可以向作者咨询。</p>
<p><a href="./doc/index.html">Return to Index</a></p>
4 changes: 2 additions & 2 deletions SerialTool/doc/plot_protocol.md
Original file line number Diff line number Diff line change
@@ -106,7 +106,7 @@ typedef struct {
uint8_t hour; // hour, 0 ~ 23
uint8_t min; // minute, 0 ~ 59
uint8_t sec; // second, 0 ~ 59
uint16_t msec; // millisecond, 0 ~ 1000
uint16_t msec; // millisecond, 0 ~ 999
uint32_t sampleRate; // sample rate, 0 ~ 2000000
} ws_timestamp_t;
```
@@ -188,7 +188,7 @@ typedef signed short int16_t;
typedef signed long int32_t;
```

用户一般不会使用到所有的API,例如您可能不需要使用`ws_point_float()`以及`ws_add_float()`函数。通常,编译器不会连接未用到的函数。编译器如果会连接从未被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。
用户一般不会使用到所有的API,例如您可能不需要使用`ws_point_float()`以及`ws_add_float()`函数。通常,编译器不会链接未用到的函数。编译器如果会链接从未被调用的函数,并且要保证目标代码最少,您应当删除这些函数的源码。

如果您在移植串口示波器的协议时遇到了任何问题,您也可以向作者咨询。

4 changes: 0 additions & 4 deletions SerialTool/include/channelitem.h
Original file line number Diff line number Diff line change
@@ -32,10 +32,6 @@ class ChannelItem : public QWidget {
return Channel;
}

void setCheckState(Qt::CheckState state) {
checkBox->setCheckState(state);
}

void setChecked(bool stats) {
checkBox->setChecked(stats);
}
2 changes: 1 addition & 1 deletion SerialTool/include/filetransferview.h
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ private slots:
private:
Ui_FileTransferView ui;
FileThread thread;
QByteArray receiveArray; // ½ÓÊÕ»º³åÇø
QByteArray receiveArray; // 接收缓冲区
};

#endif
1 change: 1 addition & 0 deletions SerialTool/include/optionsbox.h
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@ private slots:
void onCmdNewClick();
void onCmdEditClick();
void onCmdDeleteClick();
void onUseOpenGLClick(bool status);
void setCmdItemColor();
void setLanguage(int index);

33 changes: 21 additions & 12 deletions SerialTool/include/oscilloscope.h
Original file line number Diff line number Diff line change
@@ -3,13 +3,21 @@

#include "ui_oscilloscope.h"

#include <QTimer>

#ifndef CH_NUM
#define CH_NUM 16
#endif

struct WaveDataType;
class OscopeTimeStamp;
class PointDataBuffer;
class ChannelItem;
class QSettings;
namespace QtCharts {
class QLineSeries;
class QChart;
}

class Oscilloscope : public QWidget {
Q_OBJECT
@@ -26,26 +34,26 @@ class Oscilloscope : public QWidget {
void stop();
bool holdReceive();

void setPlotAntialiased(bool status);
void setGridAntialiased(bool status);
void setUseOpenGL(bool status);
void setUseAntialiased(bool status);
void setBackground(QColor color);
void setGridColor(QColor color);
void setChannelColor(int channel, const QColor &color);
void setUpdateInterval(int msec);
void addData(const WaveDataType& data);
void clear();

void savePng(const QString &fileName);
void saveBmp(const QString &fileName);
void savePdf(const QString &fileName);
void saveText(const QString &fname);
void saveWave(const QString &fname);
void loadWave(const QString &fname);

private:
void setupPlot();
void setupChannel();
void listViewInit();
uint64_t maxCount();
void setChannelVisible(int channel, bool visible);

bool loadWave_p(const QString &fname);
QStringList csvSplitLine(const QString &line) {
return line.split(", ");
}
ChannelItem* channelWidget(int channel) {
return (ChannelItem *)(ui.channelList->itemWidget(ui.channelList->item(channel)));
}
@@ -55,17 +63,18 @@ private slots:
void yRangeChanged(double range);
void xRangeChanged(const QString &str);
void channelStyleChanged(ChannelItem *item);
void xAxisChanged(QCPRange range);
void yAxisChanged(QCPRange range);
void horzScrollBarChanged(int value);
void timeUpdata();

private:
Ui_Oscilloscope ui;
bool replotFlag = 1;
uint64_t count[CH_NUM], _xRange;
QVector<QtCharts::QLineSeries*> m_series;
QtCharts::QChart *m_chart;
int m_count, m_xRange;
QTimer updataTimer;
OscopeTimeStamp* timeStamp;
PointDataBuffer *m_buffer;
};

#endif
2 changes: 1 addition & 1 deletion SerialTool/include/oscopetimestamp.h
Original file line number Diff line number Diff line change
@@ -11,8 +11,8 @@ class OscopeTimeStamp {
public:
OscopeTimeStamp() { timeStamp.clear(); }
void printTextStream(QTextStream &stream, uint64_t count);

void append(const WaveDataType &data, uint64_t count);
void append(const QString &string, uint64_t count);
void clear() { timeStamp.clear(); }

private:
27 changes: 27 additions & 0 deletions SerialTool/include/pointdatabuffer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#ifndef POINTDATABUFFER_H
#define POINTDATABUFFER_H

#include <QVector>
#include <QList>
#include <QPointF>

namespace QtCharts {
class QLineSeries;
}

class PointDataBuffer
{
public:
PointDataBuffer(const QVector<QtCharts::QLineSeries*> *series);
void append(int channel, double value);
int update();
int maximumCount();
void clear();

private:
const QVector<QtCharts::QLineSeries*> *m_series;
QVector<QList<QPointF>> m_data;
QVector<int> m_count;
};

#endif // POINTDATABUFFER_H
6,662 changes: 0 additions & 6,662 deletions SerialTool/include/qcustomplot.h

This file was deleted.

4 changes: 4 additions & 0 deletions SerialTool/include/serialtool.h
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@
class TcpUdpPort;
class WaveDecode;
class SerialPort;
class DocmentDialog;

class SerialTool : public QMainWindow
{
@@ -46,10 +47,12 @@ private slots:
void cleanData();
void setOptions();
void saveFile();
void openFile();
void about();
void docment();
void onVedioBoxTriggered();
void onVedioBoxDelete();
void onDocDialogDelete();
void currentTabChanged(int index);
void dispPortStatus();

@@ -73,6 +76,7 @@ private slots:
QLabel *rxCntLabel, *txCntLabel, *portInfoLabel;
QVector<QTranslator*> translator;
VedioBox *vedioBox = NULL;
DocmentDialog *m_docDialog = NULL;
PortType portType;
WaveDecode* waveDecode;
SerialPort *serialPort;
1 change: 1 addition & 0 deletions SerialTool/include/terminalview.h
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@ class TerminalView : public QWidget
void setFontFamily(QString fonts, int size, QString style);
void setEnabled(bool status);
void setPaused(bool status);
void saveText(const QString &fname);

signals:
void sendDataRequest(const QByteArray &array);
4 changes: 2 additions & 2 deletions SerialTool/include/version.h
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
#ifndef __VERSION_H
#define __VERSION_H

#define MAIN_VERSION 1.1.8
#define MAIN_VERSION 1.2.0

#define SOFTWARE_NAME "SerialTool"
#define COPYRIGHT "Copyleft 2017 by Wenliang"

#define _STR_(s) #s
#define __STR(s) _STR_(s)

#define BUILD_VERSION _STR_(384f0)
#define BUILD_VERSION _STR_(393a3M)
#define SOFTWARE_VERSION __STR(MAIN_VERSION)

#endif
444 changes: 253 additions & 191 deletions SerialTool/language/serialtool_zh_CN.ts

Large diffs are not rendered by default.

Binary file modified SerialTool/language/zh_cn/serialtool.qm
Binary file not shown.
4 changes: 2 additions & 2 deletions SerialTool/resource/default.ini
Original file line number Diff line number Diff line change
@@ -6,9 +6,9 @@ ReceiveTextColor=
TransmitTextColor=
PlotBackground=#053846
AxisColor=#9499a3
PlotAntialiased=true
GridAntialiased=false
UpdateInterval=25
UseOpenGL=false
UseAntialias=false
PortType=0
Language=en
Theme=default
7 changes: 0 additions & 7 deletions SerialTool/resource/doc/index.html

This file was deleted.

153 changes: 0 additions & 153 deletions SerialTool/resource/doc/plot_protocol.html

This file was deleted.

67 changes: 0 additions & 67 deletions SerialTool/resource/doc/style.css

This file was deleted.

21 changes: 0 additions & 21 deletions SerialTool/resource/doc/vedio_box.html

This file was deleted.

Binary file added SerialTool/resource/images/open.ico
Binary file not shown.
1 change: 1 addition & 0 deletions SerialTool/resource/serialtool.qrc
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
<file>images/port config.png</file>
<file>images/save.ico</file>
<file>images/start.ico</file>
<file>images/open.ico</file>
</qresource>
<qresource prefix="/license">
<file>license.html</file>
4 changes: 2 additions & 2 deletions SerialTool/slave/sendwave.h
Original file line number Diff line number Diff line change
@@ -49,8 +49,8 @@ typedef struct {
uint8_t hour; // 0 ~ 23, 5 bit
uint8_t min; // 0 ~ 59, 6 bit
uint8_t sec; // 0 ~ 59, 6 bit
uint16_t msec; // 0 ~ 1000, 10 bit
uint32_t sampleRate; // 21 bit
uint16_t msec; // 0 ~ 999, 10 bit
uint32_t sampleRate; // 0 ~ 2000000,21 bit
} ws_timestamp_t;

/* 公共函数声明 */
27 changes: 22 additions & 5 deletions SerialTool/source/optionsbox.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#include "optionsbox.h"
#include "optionsbox.h"
#include <QFontDialog>
#include <QColorDialog>
#include <QDir>
#include <QFileInfo>
#include <QStandardPaths>
#include <QTextStream>
#include "serialtool.h"

static QString languageName(const QString &path)
@@ -74,6 +78,7 @@ OptionsBox::OptionsBox(SerialTool *parent) : QDialog(parent)
connect(ui.cmdDelete, SIGNAL(clicked()), this, SLOT(onCmdDeleteClick()));
connect(ui.cmdList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(setCmdItemColor()));
connect(ui.languageBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setLanguage(int)));
connect(ui.useOpenGLBox, SIGNAL(clicked(bool)), this, SLOT(onUseOpenGLClick(bool)));
}

OptionsBox::~OptionsBox()
@@ -96,8 +101,9 @@ void OptionsBox::setup()
txColor = config->value("TransmitTextColor").toString();
bgColor = config->value("PlotBackground").toString();
axColor = config->value("AxisColor").toString();
ui.plotAntiBox->setChecked(config->value("PlotAntialiased").toBool());
ui.gridAntiBox->setChecked(config->value("GridAntialiased").toBool());
ui.useOpenGLBox->setChecked(config->value("UseOpenGL").toBool());
ui.useAntiBox->setChecked(config->value("UseAntialias").toBool());
ui.updateIntervalBox->setValue(config->value("UpdateInterval").toInt());
ui.portTypeBox->setCurrentIndex(config->value("PortType").toInt());
language = config->value("Language").toString();
theme = config->value("Theme").toString();
@@ -115,6 +121,11 @@ void OptionsBox::setup()

ui.languageBox->setCurrentText(languageName("language/" + language));
ui.themeBox->setCurrentText(theme);

// 使用OpenGL时不能使用抗锯齿
if (ui.useOpenGLBox->isChecked()) {
ui.useAntiBox->setEnabled(false);
}
}

// 保存配置
@@ -135,8 +146,9 @@ void OptionsBox::processOptions(QAbstractButton *button)
config->setValue("TransmitTextColor", QVariant(txColor));
config->setValue("PlotBackground", QVariant(bgColor));
config->setValue("AxisColor", QVariant(axColor));
config->setValue("PlotAntialiased", QVariant(ui.plotAntiBox->isChecked()));
config->setValue("GridAntialiased", QVariant(ui.gridAntiBox->isChecked()));
config->setValue("UseOpenGL", QVariant(ui.useOpenGLBox->isChecked()));
config->setValue("UseAntialias", QVariant(ui.useAntiBox->isChecked()));
config->setValue("UpdateInterval", QVariant(ui.updateIntervalBox->value()));
config->setValue("PortType", QVariant(ui.portTypeBox->currentIndex()));
config->setValue("Language", QVariant(language));
config->setValue("Theme", QVariant(ui.themeBox->currentText()));
@@ -253,6 +265,11 @@ void OptionsBox::onCmdDeleteClick()
setCmdItemColor(); // 上色
}

void OptionsBox::onUseOpenGLClick(bool status)
{
ui.useAntiBox->setEnabled(!status);
}

void OptionsBox::setCmdItemColor()
{
int i, count = ui.cmdList->count();
412 changes: 225 additions & 187 deletions SerialTool/source/oscilloscope.cpp

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions SerialTool/source/oscopetimestamp.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include "oscopetimestamp.h"
#include "wavedecode.h"
#include <QDate>
#include <QTime>

void OscopeTimeStamp::append(const WaveDataType &data, uint64_t count)
{
@@ -18,6 +20,27 @@ void OscopeTimeStamp::append(const WaveDataType &data, uint64_t count)
timeStamp.append(ts);
}


void OscopeTimeStamp::append(const QString &string, uint64_t count)
{
TimeStamp_p ts;
QStringList strList = string.split(' ');
QDate date(QDate::fromString(strList[0], "yyyy-M-d"));
QTime time(QTime::fromString(strList[1], "h:m:s.z"));

ts.count = count;
ts.year = (uint8_t)(date.year() - 2000);
ts.month = (uint8_t)(date.month());
ts.day = (uint8_t)(date.day());
ts.hour = (uint8_t)(time.hour());
ts.day = (uint8_t)(time.minute());
ts.day = (uint8_t)(time.second());
ts.day = (uint8_t)(time.msec());
ts.sampleRate = (uint32_t)strList[2].replace("bps", "").toInt();

timeStamp.append(ts);
}

void OscopeTimeStamp::printTextStream(QTextStream &stream, uint64_t count)
{
size_t i, size = timeStamp.size();
55 changes: 55 additions & 0 deletions SerialTool/source/pointdatabuffer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include "pointdatabuffer.h"
#include <QVector>
#include <QLineSeries>

QT_CHARTS_USE_NAMESPACE

PointDataBuffer::PointDataBuffer(const QVector<QLineSeries*> *series)
{
m_series = series;
m_data.resize(series->size());
m_count.resize(series->size());
clear();
}

void PointDataBuffer::append(int channel, double value)
{
m_data[channel].append(QPointF(m_count[channel]++, value));
}

int PointDataBuffer::update()
{
int size = m_data.size();

for (int i = 0; i < size; ++i) {
if (m_data[i].size()) {
m_series->at(i)->append(m_data[i]); // append data
m_data[i].clear(); // clear buffer
}
}
return maximumCount();
}

int PointDataBuffer::maximumCount()
{
int max = 0;
int size = m_count.size();

for (int i = 0; i < size; ++i) {
if (m_count[i] > max) {
max = m_count[i];
}
}
return max;
}

void PointDataBuffer::clear()
{
int size = m_data.size();

for (int i = 0; i < size; ++i) {
m_series->at(i)->clear(); // clear series data
m_data[i].clear(); // clear buffer
m_count[i] = 0; // clear count
}
}
30,121 changes: 0 additions & 30,121 deletions SerialTool/source/qcustomplot.cpp

This file was deleted.

72 changes: 51 additions & 21 deletions SerialTool/source/serialtool.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#include "serialtool.h"
#include <QStandardPaths>
#include <QDir>
#include <QFileInfo>
#include <QTranslator>
#include <QFileDialog>
#include "portsetbox.h"
#include "optionsbox.h"
#include "aboutbox.h"
@@ -58,6 +63,7 @@ SerialTool::SerialTool(QWidget *parent)
connect(ui.portSetAction, SIGNAL(triggered()), this, SLOT(openSetPortInfoBox()));
connect(ui.actionOption, SIGNAL(triggered()), this, SLOT(setOptions()));
connect(ui.actionSave, SIGNAL(triggered()), this, SLOT(saveFile()));
connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(openFile()));
connect(ui.actionClose, SIGNAL(triggered()), this, SLOT(close()));
connect(ui.actionVisibleToolbar, SIGNAL(triggered(bool)), ui.toolBar1, SLOT(setVisible(bool)));
connect(ui.actionVisibleStatusBar, SIGNAL(triggered(bool)), ui.statusBar, SLOT(setVisible(bool)));
@@ -90,13 +96,10 @@ SerialTool::~SerialTool()
}

// 关闭事件
#ifdef __GNUC__
void SerialTool::closeEvent(__attribute__((unused)) QCloseEvent *event)
#else
void SerialTool::closeEvent(QCloseEvent *event)
#endif
{
saveConfig();
QMainWindow::closeEvent(event);
}

// 加载语言
@@ -154,10 +157,12 @@ void SerialTool::loadSettings()

ui.oscPlot->setBackground(QColor(config->value("PlotBackground").toString()));
ui.oscPlot->setGridColor(QColor(config->value("AxisColor").toString()));
// 绘制时波形抗锯齿
ui.oscPlot->setPlotAntialiased(config->value("PlotAntialiased").toBool());
// 绘制时网格抗锯齿
ui.oscPlot->setGridAntialiased(config->value("GridAntialiased").toBool());
// 绘制使用OpenGL加速
ui.oscPlot->setUseOpenGL(config->value("UseOpenGL").toBool());
// 绘制时抗锯齿
ui.oscPlot->setUseAntialiased(config->value("UseAntialias").toBool());
// 示波器刷新速度
ui.oscPlot->setUpdateInterval(config->value("UpdateInterval").toInt());
PortType type = (PortType)config->value("PortType").toInt();

// 语言设置
@@ -253,24 +258,40 @@ void SerialTool::setOptions()
void SerialTool::saveFile()
{
QString filter;
QString fname = QFileDialog::getSaveFileName(this, "Save", docPath,
tr("Portable Network Graphic Format (*.png);;"
"Bitmap (*.bmp);;"
"Portable Document Format (*.pdf);;"
"Wave Plain Text File (*.txt)"), &filter,
QString fname = QFileDialog::getSaveFileName(this, tr("Save"), docPath,
tr("Portable Network Graphic Format (*.png)") + ";;" +
tr("Bitmap (*.bmp)") + ";;" +
tr("Wave Plain Text File (*.txt)") + ";;" +
tr("Terminal Text File (*.txt)"), &filter,
QFileDialog::HideNameFilterDetails);
if (fname.isNull()) {
return;
}
docPath = QFileInfo(fname).path();
if (filter.indexOf("(*.png)", 0) != -1) {
if (filter == tr("Portable Network Graphic Format (*.png)")) {
ui.oscPlot->savePng(fname);
} else if (filter.indexOf("(*.bmp)", 0) != -1) {
} else if (filter == tr("Bitmap (*.bmp)")) {
ui.oscPlot->saveBmp(fname);
} else if (filter.indexOf("(*.pdf)", 0) != -1) {
ui.oscPlot->savePdf(fname);
} else if (filter.indexOf("(*.txt)", 0) != -1) {
ui.oscPlot->saveText(fname);
} else if (filter == tr("Wave Plain Text File (*.txt)")) {
ui.oscPlot->saveWave(fname);
} else if (filter == tr("Terminal Text File (*.txt)")) {
ui.terminal->saveText(fname);
}
}

// 打开文件
void SerialTool::openFile()
{
QString filter;
QString fname = QFileDialog::getOpenFileName(this, tr("Open"), docPath,
tr("Wave Plain Text File (*.txt)"), &filter,
QFileDialog::HideNameFilterDetails);
if (fname.isNull()) {
return;
}
docPath = QFileInfo(fname).path();
if (filter.indexOf("(*.txt)", 0) != -1) {
ui.oscPlot->loadWave(fname);
}
}

@@ -515,9 +536,18 @@ void SerialTool::about()

void SerialTool::docment()
{
DocmentDialog doc(this);
if (m_docDialog == NULL) {
m_docDialog = new DocmentDialog(this);
m_docDialog->setModal(false);
m_docDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(m_docDialog, SIGNAL(destroyed()), this, SLOT(onDocDialogDelete()));
m_docDialog->show();
}
}

doc.exec();
void SerialTool::onDocDialogDelete()
{
m_docDialog = NULL;
}

void SerialTool::loadPortTool()
11 changes: 11 additions & 0 deletions SerialTool/source/terminalview.cpp
Original file line number Diff line number Diff line change
@@ -286,3 +286,14 @@ void TerminalView::arrayToAscii(QString &str, const QByteArray &array)
asciiBuf->clear();
}
}

// 保存文件
void TerminalView::saveText(const QString &fname)
{
QFile file(fname);

if (file.open(QFile::WriteOnly)) {
file.write(ui->textEditRx->text().toUtf8());
file.close();
}
}
76 changes: 38 additions & 38 deletions SerialTool/source/textedit.cpp
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ void TextEdit::append(const QString &text)
{
bool posEnd = SendScintilla(SCI_GETLENGTH) == SendScintilla(SCI_GETCURRENTPOS);
QsciScintilla::append(text);
// 如果光标之前就在末尾时将光标移动到最后
// 如果光标之前就在末尾时将光标移动到最后
if (posEnd) {
long pos = SendScintilla(SCI_GETLENGTH);
SendScintilla(SCI_SETANCHOR, pos);
@@ -37,26 +37,26 @@ void TextEdit::setFonts(QString fonts, int size, QColor color, QString style)
fontFamily = fonts;
fontSize = size;
lineNumFont = QFont(fonts.section(',', 0, 0), size);
// 文本显示
// 文本显示
SendScintilla(SCI_STYLESETFONT, STYLE_DEFAULT, fonts.toStdString().c_str());
SendScintilla(SCI_STYLESETSIZE, STYLE_DEFAULT, size);
SendScintilla(SCI_STYLESETFORE, STYLE_DEFAULT, color);
if (style.indexOf("bold") != -1) { // 粗体字
if (style.indexOf("bold") != -1) { // 粗体字
SendScintilla(SCI_STYLESETBOLD, (int)0, true);
} else {
SendScintilla(SCI_STYLESETBOLD, (int)0, (long)false);
}
if (style.indexOf("italic") != -1) { // 斜体字
if (style.indexOf("italic") != -1) { // 斜体字
SendScintilla(SCI_STYLESETITALIC, (int)0, true);
} else {
SendScintilla(SCI_STYLESETITALIC, (int)0, (long)false);
}
SendScintilla(SCI_STYLECLEARALL); // 设置全局风格
SendScintilla(SCI_STYLECLEARALL); // 设置全局风格

// 光标颜色
// 光标颜色
SendScintilla(SCI_SETCARETFORE, color);

// 页边显示行号
// 页边显示行号
SendScintilla(SCI_STYLESETFONT, STYLE_LINENUMBER,
fonts.section(',', 0, 0).toStdString().c_str());
SendScintilla(SCI_STYLESETSIZE, STYLE_LINENUMBER, size);
@@ -71,7 +71,7 @@ void TextEdit::setFonts(QString fonts, int size, QColor color, QString style)
*/
SendScintilla(SCI_SETSCROLLWIDTHTRACKING, true);

if (highLight) { // 重新设置语法高亮
if (highLight) { // 重新设置语法高亮
setHighLight(true);
}
}
@@ -89,15 +89,15 @@ void TextEdit::onTextChanged()
if (text().isEmpty()) {
SendScintilla(SCI_SETSCROLLWIDTH, 1);
}
// 如果使用了自动换行功能并且滚动条在底部则把滚动条重新移动到底部
// 如果使用了自动换行功能并且滚动条在底部则把滚动条重新移动到底部
if (scrollEnd && isWrap) {
int lineEnd = lineCount - 1; // 末行
int lineEnd = lineCount - 1; // 末行
int lineLen = SendScintilla(SCI_LINELENGTH, lineEnd);
SendScintilla(SCI_LINESCROLL, lineLen, lineEnd);
}
}

// 计算一个十进制数字的位数
// 计算一个十进制数字的位数
static int countOrder(int value)
{
int order = 0;
@@ -148,7 +148,7 @@ void TextEdit::setWrap(bool wrap)
isWrap = wrap;
}

// 设置语法高亮
// 设置语法高亮
void TextEdit::setHighLight(bool mode)
{
if (mode) {
@@ -170,17 +170,17 @@ void TextEdit::setHighLight(bool mode)
file.close();
}
//NULL
SendScintilla(SCI_SETLEXER, SCLEX_BASH); // bash解析器
SendScintilla(SCI_SETKEYWORDS, (unsigned long)0, keyWords.data());// 设置关键字
// 下面设置各种语法元素前景色
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Default, 0x38312A); // 默认
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Keyword, 0x8B8B00); // 关键字
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::DoubleQuotedString, 0x6666D4); // 字符串
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::SingleQuotedString, 0x6666D4); // 字符
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Operator, 0xB48246); // 运算符
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Number, 0x006F7F); // 数字
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Comment, 0x008000); // 行注释
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Identifier, 0x38312A); // 识别符
SendScintilla(SCI_SETLEXER, SCLEX_BASH); // bash解析器
SendScintilla(SCI_SETKEYWORDS, (unsigned long)0, keyWords.data());// 设置关键字
// 下面设置各种语法元素前景色
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Default, 0x38312A); // 默认
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Keyword, 0x8B8B00); // 关键字
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::DoubleQuotedString, 0x6666D4); // 字符串
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::SingleQuotedString, 0x6666D4); // 字符
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Operator, 0xB48246); // 运算符
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Number, 0x006F7F); // 数字
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Comment, 0x008000); // 行注释
SendScintilla(SCI_STYLESETFORE, QsciLexerBash::Identifier, 0x38312A); // 识别符
#else
const char* g_szKeywords =
"asm auto bool break case catch char class const "
@@ -194,23 +194,23 @@ void TextEdit::setHighLight(bool mode)
"union unsigned using virtual void volatile "
"wchar_t while";
SendScintilla(SCI_SETLEXER, SCLEX_CPP); // C++解析器
SendScintilla(SCI_SETKEYWORDS, (unsigned long)0, g_szKeywords);// 设置关键字
// 下面设置各种语法元素前景色
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Keyword, 0xFF4030); // 关键字
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::DoubleQuotedString, 0x1515A3); // 字符串
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::SingleQuotedString, 0x1515A3); // 字符
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Operator, 0xB48246); // 运算符
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Number, 0x4F4F2F); // 数字
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::PreProcessor, 0x808080); // 预处理指令
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Comment, 0x008000); // 块注释
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::CommentLine, 0x008000); // 行注释
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::CommentDoc, 0x008000); // 文档注释(/**开头)
SendScintilla(SCI_SETLEXER, SCLEX_CPP); // C++解析器
SendScintilla(SCI_SETKEYWORDS, (unsigned long)0, g_szKeywords);// 设置关键字
// 下面设置各种语法元素前景色
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Keyword, 0xFF4030); // 关键字
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::DoubleQuotedString, 0x1515A3); // 字符串
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::SingleQuotedString, 0x1515A3); // 字符
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Operator, 0xB48246); // 运算符
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Number, 0x4F4F2F); // 数字
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::PreProcessor, 0x808080); // 预处理指令
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::Comment, 0x008000); // 块注释
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::CommentLine, 0x008000); // 行注释
SendScintilla(SCI_STYLESETFORE, QsciLexerCPP::CommentDoc, 0x008000); // 文档注释(/**开头)
#endif

SendScintilla(SCI_SETTABWIDTH, 4); // Tab宽度
// 当前行高亮
SendScintilla(SCI_SETTABWIDTH, 4); // Tab宽度
// 当前行高亮
SendScintilla(SCI_SETCARETLINEVISIBLE, true);
SendScintilla(SCI_SETCARETLINEBACK, 0xE0E0E0);
}
56 changes: 49 additions & 7 deletions SerialTool/ui/optionsbox.ui
Original file line number Diff line number Diff line change
@@ -373,21 +373,63 @@
<property name="title">
<string>Graphics Options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QCheckBox" name="plotAntiBox">
<layout class="QGridLayout" name="gridLayout_5">
<property name="horizontalSpacing">
<number>16</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Plot Antialias</string>
<string>Update Interval (ms)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="gridAntiBox">
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="useAntiBox">
<property name="text">
<string>Grid Antialias</string>
<string>Use Antialias</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="useOpenGLBox">
<property name="text">
<string>Use OpenGL</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="updateIntervalBox">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>10000</number>
</property>
<property name="value">
<number>30</number>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
12 changes: 6 additions & 6 deletions SerialTool/ui/oscilloscope.ui
Original file line number Diff line number Diff line change
@@ -48,10 +48,13 @@
<number>0</number>
</property>
<item>
<widget class="QCustomPlot" name="customPlot" native="true"/>
<widget class="QtCharts::QChartView" name="chartView" native="true"/>
</item>
<item>
<widget class="QScrollBar" name="horizontalScrollBar">
<property name="maximum">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -157,9 +160,6 @@
<property name="editable">
<bool>true</bool>
</property>
<property name="currentText">
<string notr="true">10</string>
</property>
<property name="maxVisibleItems">
<number>20</number>
</property>
@@ -252,9 +252,9 @@
</widget>
<customwidgets>
<customwidget>
<class>QCustomPlot</class>
<class>QtCharts::QChartView</class>
<extends>QWidget</extends>
<header>qcustomplot.h</header>
<header location="global">QtCharts/QChartView.h</header>
<container>1</container>
</customwidget>
</customwidgets>
18 changes: 17 additions & 1 deletion SerialTool/ui/serialtool.ui
Original file line number Diff line number Diff line change
@@ -139,13 +139,14 @@
<x>0</x>
<y>0</y>
<width>600</width>
<height>21</height>
<height>23</height>
</rect>
</property>
<widget class="QMenu" name="menu">
<property name="title">
<string>File</string>
</property>
<addaction name="actionOpen"/>
<addaction name="actionSave"/>
<addaction name="separator"/>
<addaction name="actionClose"/>
@@ -359,6 +360,21 @@
<string>Docment</string>
</property>
</action>
<action name="actionOpen">
<property name="icon">
<iconset resource="../resource/serialtool.qrc">
<normaloff>:/SerialTool/images/open.ico</normaloff>:/SerialTool/images/open.ico</iconset>
</property>
<property name="text">
<string>Open</string>
</property>
<property name="toolTip">
<string>Open</string>
</property>
<property name="shortcut">
<string>Ctrl+O</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
2 changes: 1 addition & 1 deletion SerialTool/ver_temp.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef __VERSION_H
#define __VERSION_H

#define MAIN_VERSION 1.1.8
#define MAIN_VERSION 1.2.0

#define SOFTWARE_NAME "SerialTool"
#define COPYRIGHT "Copyleft 2017 by Wenliang"
4 changes: 0 additions & 4 deletions readme.txt

This file was deleted.

0 comments on commit 3ff9739

Please sign in to comment.